commit 524c089a748d87be6b0bd17066499d38053725e9 Author: Alexander Wang Date: Thu Nov 3 06:54:49 2022 -0700 oss Co-authored-by: Anmol Sethi diff --git a/.github/issue_request_template.md b/.github/issue_request_template.md new file mode 100644 index 000000000..7a937c4b4 --- /dev/null +++ b/.github/issue_request_template.md @@ -0,0 +1,2 @@ + + diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md new file mode 100644 index 000000000..e61c2ae64 --- /dev/null +++ b/.github/pull_request_template.md @@ -0,0 +1,2 @@ + + diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 000000000..dcb32898e --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,97 @@ +name: ci +on: [push] +concurrency: + group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }} + cancel-in-progress: true + +jobs: + assert-linear: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + with: + submodules: recursive + - run: ./make.sh assert-linear + env: + GITHUB_TOKEN: ${{ secrets._GITHUB_TOKEN }} + DISCORD_WEBHOOK_URL: ${{ secrets.DISCORD_WEBHOOK_URL }} + fmt: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + with: + submodules: recursive + - uses: actions/setup-go@v3 + with: + go-version-file: ./go.mod + cache: true + - run: ./make.sh fmt + env: + GITHUB_TOKEN: ${{ secrets._GITHUB_TOKEN }} + DISCORD_WEBHOOK_URL: ${{ secrets.DISCORD_WEBHOOK_URL }} + lint: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + with: + submodules: recursive + - uses: actions/setup-go@v3 + with: + go-version-file: ./go.mod + cache: true + - run: ./make.sh lint + env: + GITHUB_TOKEN: ${{ secrets._GITHUB_TOKEN }} + DISCORD_WEBHOOK_URL: ${{ secrets.DISCORD_WEBHOOK_URL }} + build: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + with: + submodules: recursive + - uses: actions/setup-go@v3 + with: + go-version-file: ./go.mod + cache: true + - run: ./make.sh build + env: + GITHUB_TOKEN: ${{ secrets._GITHUB_TOKEN }} + DISCORD_WEBHOOK_URL: ${{ secrets.DISCORD_WEBHOOK_URL }} + test: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + with: + submodules: recursive + - uses: actions/setup-go@v3 + with: + go-version-file: ./go.mod + cache: true + - run: ./make.sh test + env: + GITHUB_TOKEN: ${{ secrets._GITHUB_TOKEN }} + DISCORD_WEBHOOK_URL: ${{ secrets.DISCORD_WEBHOOK_URL }} + - uses: actions/upload-artifact@v3 + if: always() + with: + name: d2chaos-test + path: ./d2chaos/out + race: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + with: + submodules: recursive + - uses: actions/setup-go@v3 + with: + go-version-file: ./go.mod + cache: true + - run: ./make.sh race + env: + GITHUB_TOKEN: ${{ secrets._GITHUB_TOKEN }} + DISCORD_WEBHOOK_URL: ${{ secrets.DISCORD_WEBHOOK_URL }} + - uses: actions/upload-artifact@v3 + if: always() + with: + name: d2chaos-race + path: ./d2chaos/out diff --git a/.github/workflows/daily.yml b/.github/workflows/daily.yml new file mode 100644 index 000000000..95a82e32c --- /dev/null +++ b/.github/workflows/daily.yml @@ -0,0 +1,26 @@ +name: daily +on: + workflow_dispatch: + schedule: + # daily at 00:42 to avoid hourly loads in GitHub actions + # https://docs.github.com/en/actions/using-workflows/events-that-trigger-workflows#schedule + - cron: '42 0 * * *' +concurrency: + group: ${{ github.workflow }} + cancel-in-progress: true + +jobs: + all: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + with: + submodules: recursive + - uses: actions/setup-go@v3 + with: + go-version-file: ./go.mod + cache: true + - run: CI_ALL=1 ./make.sh + env: + GITHUB_TOKEN: ${{ secrets._GITHUB_TOKEN }} + DISCORD_WEBHOOK_URL: ${{ secrets.DISCORD_WEBHOOK_URL }} diff --git a/.gitignore b/.gitignore new file mode 100644 index 000000000..67d08864e --- /dev/null +++ b/.gitignore @@ -0,0 +1,6 @@ +.make-log +.changed-files +.make-log.txt +*.got.json +*.got.svg +e2e_report.html diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 000000000..746c9e5b7 --- /dev/null +++ b/.gitmodules @@ -0,0 +1,3 @@ +[submodule "ci/sub"] + path = ci/sub + url = https://github.com/terrastruct/ci diff --git a/LICENSE.txt b/LICENSE.txt new file mode 100644 index 000000000..cfaf2c6df --- /dev/null +++ b/LICENSE.txt @@ -0,0 +1,375 @@ +Copyright 2022 Terrastruct Inc. + +Mozilla Public License Version 2.0 +================================== + +1. Definitions +-------------- + +1.1. "Contributor" + means each individual or legal entity that creates, contributes to + the creation of, or owns Covered Software. + +1.2. "Contributor Version" + means the combination of the Contributions of others (if any) used + by a Contributor and that particular Contributor's Contribution. + +1.3. "Contribution" + means Covered Software of a particular Contributor. + +1.4. "Covered Software" + means Source Code Form to which the initial Contributor has attached + the notice in Exhibit A, the Executable Form of such Source Code + Form, and Modifications of such Source Code Form, in each case + including portions thereof. + +1.5. "Incompatible With Secondary Licenses" + means + + (a) that the initial Contributor has attached the notice described + in Exhibit B to the Covered Software; or + + (b) that the Covered Software was made available under the terms of + version 1.1 or earlier of the License, but not also under the + terms of a Secondary License. + +1.6. "Executable Form" + means any form of the work other than Source Code Form. + +1.7. "Larger Work" + means a work that combines Covered Software with other material, in + a separate file or files, that is not Covered Software. + +1.8. "License" + means this document. + +1.9. "Licensable" + means having the right to grant, to the maximum extent possible, + whether at the time of the initial grant or subsequently, any and + all of the rights conveyed by this License. + +1.10. "Modifications" + means any of the following: + + (a) any file in Source Code Form that results from an addition to, + deletion from, or modification of the contents of Covered + Software; or + + (b) any new file in Source Code Form that contains any Covered + Software. + +1.11. "Patent Claims" of a Contributor + means any patent claim(s), including without limitation, method, + process, and apparatus claims, in any patent Licensable by such + Contributor that would be infringed, but for the grant of the + License, by the making, using, selling, offering for sale, having + made, import, or transfer of either its Contributions or its + Contributor Version. + +1.12. "Secondary License" + means either the GNU General Public License, Version 2.0, the GNU + Lesser General Public License, Version 2.1, the GNU Affero General + Public License, Version 3.0, or any later versions of those + licenses. + +1.13. "Source Code Form" + means the form of the work preferred for making modifications. + +1.14. "You" (or "Your") + means an individual or a legal entity exercising rights under this + License. For legal entities, "You" includes any entity that + controls, is controlled by, or is under common control with You. For + purposes of this definition, "control" means (a) the power, direct + or indirect, to cause the direction or management of such entity, + whether by contract or otherwise, or (b) ownership of more than + fifty percent (50%) of the outstanding shares or beneficial + ownership of such entity. + +2. License Grants and Conditions +-------------------------------- + +2.1. Grants + +Each Contributor hereby grants You a world-wide, royalty-free, +non-exclusive license: + +(a) under intellectual property rights (other than patent or trademark) + Licensable by such Contributor to use, reproduce, make available, + modify, display, perform, distribute, and otherwise exploit its + Contributions, either on an unmodified basis, with Modifications, or + as part of a Larger Work; and + +(b) under Patent Claims of such Contributor to make, use, sell, offer + for sale, have made, import, and otherwise transfer either its + Contributions or its Contributor Version. + +2.2. Effective Date + +The licenses granted in Section 2.1 with respect to any Contribution +become effective for each Contribution on the date the Contributor first +distributes such Contribution. + +2.3. Limitations on Grant Scope + +The licenses granted in this Section 2 are the only rights granted under +this License. No additional rights or licenses will be implied from the +distribution or licensing of Covered Software under this License. +Notwithstanding Section 2.1(b) above, no patent license is granted by a +Contributor: + +(a) for any code that a Contributor has removed from Covered Software; + or + +(b) for infringements caused by: (i) Your and any other third party's + modifications of Covered Software, or (ii) the combination of its + Contributions with other software (except as part of its Contributor + Version); or + +(c) under Patent Claims infringed by Covered Software in the absence of + its Contributions. + +This License does not grant any rights in the trademarks, service marks, +or logos of any Contributor (except as may be necessary to comply with +the notice requirements in Section 3.4). + +2.4. Subsequent Licenses + +No Contributor makes additional grants as a result of Your choice to +distribute the Covered Software under a subsequent version of this +License (see Section 10.2) or under the terms of a Secondary License (if +permitted under the terms of Section 3.3). + +2.5. Representation + +Each Contributor represents that the Contributor believes its +Contributions are its original creation(s) or it has sufficient rights +to grant the rights to its Contributions conveyed by this License. + +2.6. Fair Use + +This License is not intended to limit any rights You have under +applicable copyright doctrines of fair use, fair dealing, or other +equivalents. + +2.7. Conditions + +Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted +in Section 2.1. + +3. Responsibilities +------------------- + +3.1. Distribution of Source Form + +All distribution of Covered Software in Source Code Form, including any +Modifications that You create or to which You contribute, must be under +the terms of this License. You must inform recipients that the Source +Code Form of the Covered Software is governed by the terms of this +License, and how they can obtain a copy of this License. You may not +attempt to alter or restrict the recipients' rights in the Source Code +Form. + +3.2. Distribution of Executable Form + +If You distribute Covered Software in Executable Form then: + +(a) such Covered Software must also be made available in Source Code + Form, as described in Section 3.1, and You must inform recipients of + the Executable Form how they can obtain a copy of such Source Code + Form by reasonable means in a timely manner, at a charge no more + than the cost of distribution to the recipient; and + +(b) You may distribute such Executable Form under the terms of this + License, or sublicense it under different terms, provided that the + license for the Executable Form does not attempt to limit or alter + the recipients' rights in the Source Code Form under this License. + +3.3. Distribution of a Larger Work + +You may create and distribute a Larger Work under terms of Your choice, +provided that You also comply with the requirements of this License for +the Covered Software. If the Larger Work is a combination of Covered +Software with a work governed by one or more Secondary Licenses, and the +Covered Software is not Incompatible With Secondary Licenses, this +License permits You to additionally distribute such Covered Software +under the terms of such Secondary License(s), so that the recipient of +the Larger Work may, at their option, further distribute the Covered +Software under the terms of either this License or such Secondary +License(s). + +3.4. Notices + +You may not remove or alter the substance of any license notices +(including copyright notices, patent notices, disclaimers of warranty, +or limitations of liability) contained within the Source Code Form of +the Covered Software, except that You may alter any license notices to +the extent required to remedy known factual inaccuracies. + +3.5. Application of Additional Terms + +You may choose to offer, and to charge a fee for, warranty, support, +indemnity or liability obligations to one or more recipients of Covered +Software. However, You may do so only on Your own behalf, and not on +behalf of any Contributor. You must make it absolutely clear that any +such warranty, support, indemnity, or liability obligation is offered by +You alone, and You hereby agree to indemnify every Contributor for any +liability incurred by such Contributor as a result of warranty, support, +indemnity or liability terms You offer. You may include additional +disclaimers of warranty and limitations of liability specific to any +jurisdiction. + +4. Inability to Comply Due to Statute or Regulation +--------------------------------------------------- + +If it is impossible for You to comply with any of the terms of this +License with respect to some or all of the Covered Software due to +statute, judicial order, or regulation then You must: (a) comply with +the terms of this License to the maximum extent possible; and (b) +describe the limitations and the code they affect. Such description must +be placed in a text file included with all distributions of the Covered +Software under this License. Except to the extent prohibited by statute +or regulation, such description must be sufficiently detailed for a +recipient of ordinary skill to be able to understand it. + +5. Termination +-------------- + +5.1. The rights granted under this License will terminate automatically +if You fail to comply with any of its terms. However, if You become +compliant, then the rights granted under this License from a particular +Contributor are reinstated (a) provisionally, unless and until such +Contributor explicitly and finally terminates Your grants, and (b) on an +ongoing basis, if such Contributor fails to notify You of the +non-compliance by some reasonable means prior to 60 days after You have +come back into compliance. Moreover, Your grants from a particular +Contributor are reinstated on an ongoing basis if such Contributor +notifies You of the non-compliance by some reasonable means, this is the +first time You have received notice of non-compliance with this License +from such Contributor, and You become compliant prior to 30 days after +Your receipt of the notice. + +5.2. If You initiate litigation against any entity by asserting a patent +infringement claim (excluding declaratory judgment actions, +counter-claims, and cross-claims) alleging that a Contributor Version +directly or indirectly infringes any patent, then the rights granted to +You by any and all Contributors for the Covered Software under Section +2.1 of this License shall terminate. + +5.3. In the event of termination under Sections 5.1 or 5.2 above, all +end user license agreements (excluding distributors and resellers) which +have been validly granted by You or Your distributors under this License +prior to termination shall survive termination. + +************************************************************************ +* * +* 6. Disclaimer of Warranty * +* ------------------------- * +* * +* Covered Software is provided under this License on an "as is" * +* basis, without warranty of any kind, either expressed, implied, or * +* statutory, including, without limitation, warranties that the * +* Covered Software is free of defects, merchantable, fit for a * +* particular purpose or non-infringing. The entire risk as to the * +* quality and performance of the Covered Software is with You. * +* Should any Covered Software prove defective in any respect, You * +* (not any Contributor) assume the cost of any necessary servicing, * +* repair, or correction. This disclaimer of warranty constitutes an * +* essential part of this License. No use of any Covered Software is * +* authorized under this License except under this disclaimer. * +* * +************************************************************************ + +************************************************************************ +* * +* 7. Limitation of Liability * +* -------------------------- * +* * +* Under no circumstances and under no legal theory, whether tort * +* (including negligence), contract, or otherwise, shall any * +* Contributor, or anyone who distributes Covered Software as * +* permitted above, be liable to You for any direct, indirect, * +* special, incidental, or consequential damages of any character * +* including, without limitation, damages for lost profits, loss of * +* goodwill, work stoppage, computer failure or malfunction, or any * +* and all other commercial damages or losses, even if such party * +* shall have been informed of the possibility of such damages. This * +* limitation of liability shall not apply to liability for death or * +* personal injury resulting from such party's negligence to the * +* extent applicable law prohibits such limitation. Some * +* jurisdictions do not allow the exclusion or limitation of * +* incidental or consequential damages, so this exclusion and * +* limitation may not apply to You. * +* * +************************************************************************ + +8. Litigation +------------- + +Any litigation relating to this License may be brought only in the +courts of a jurisdiction where the defendant maintains its principal +place of business and such litigation shall be governed by laws of that +jurisdiction, without reference to its conflict-of-law provisions. +Nothing in this Section shall prevent a party's ability to bring +cross-claims or counter-claims. + +9. Miscellaneous +---------------- + +This License represents the complete agreement concerning the subject +matter hereof. If any provision of this License is held to be +unenforceable, such provision shall be reformed only to the extent +necessary to make it enforceable. Any law or regulation which provides +that the language of a contract shall be construed against the drafter +shall not be used to construe this License against a Contributor. + +10. Versions of the License +--------------------------- + +10.1. New Versions + +Mozilla Foundation is the license steward. Except as provided in Section +10.3, no one other than the license steward has the right to modify or +publish new versions of this License. Each version will be given a +distinguishing version number. + +10.2. Effect of New Versions + +You may distribute the Covered Software under the terms of the version +of the License under which You originally received the Covered Software, +or under the terms of any subsequent version published by the license +steward. + +10.3. Modified Versions + +If you create software not governed by this License, and you want to +create a new license for such software, you may create and use a +modified version of this License if you rename the license and remove +any references to the name of the license steward (except to note that +such modified license differs from this License). + +10.4. Distributing Source Code Form that is Incompatible With Secondary +Licenses + +If You choose to distribute Source Code Form that is Incompatible With +Secondary Licenses under the terms of this version of the License, the +notice described in Exhibit B of this License must be attached. + +Exhibit A - Source Code Form License Notice +------------------------------------------- + + This Source Code Form is subject to the terms of the Mozilla Public + License, v. 2.0. If a copy of the MPL was not distributed with this + file, You can obtain one at http://mozilla.org/MPL/2.0/. + +If it is not possible or desirable to put the notice in a particular +file, then You may include the notice in a location (such as a LICENSE +file in a relevant directory) where a recipient would be likely to look +for such a notice. + +You may add additional accurate notices of copyright ownership. + +Exhibit B - "Incompatible With Secondary Licenses" Notice +--------------------------------------------------------- + + This Source Code Form is "Incompatible With Secondary Licenses", as + defined by the Mozilla Public License, v. 2.0. \ No newline at end of file diff --git a/Makefile b/Makefile new file mode 100644 index 000000000..46577c730 --- /dev/null +++ b/Makefile @@ -0,0 +1,26 @@ +.POSIX: + +.PHONY: all +all: fmt lint build test +ifdef CI +all: assert-linear +endif + +.PHONY: fmt +fmt: + prefix "$@" ./ci/sub/fmt/make.sh +.PHONY: lint +lint: + prefix "$@" go vet --composites=false ./... +.PHONY: build +build: + prefix "$@" go build ./... +.PHONY: test +test: + prefix "$@" ./ci/test.sh +.PHONY: race +race: + prefix "$@" ./ci/test.sh --race ./... +.PHONY: assert-linear +assert-linear: + prefix "$@" ./ci/sub/assert_linear.sh diff --git a/README.md b/README.md new file mode 100644 index 000000000..988d4319d --- /dev/null +++ b/README.md @@ -0,0 +1,201 @@ +
+

+ D2 +

+

A modern DSL that turns text into diagrams.

+ +Language docs: [https://d2-lang.com](https://d2-lang.com) + +[![ci](https://github.com/terrastruct/d2/actions/workflows/ci.yml/badge.svg)](https://github.com/terrastruct/d2/actions/workflows/ci.yml) +[![release](https://img.shields.io/github/v/release/terrastruct/d2)](https://github.com/terrastruct/d2/releases) +[![discord](https://img.shields.io/discord/976899413542830181?label=discord)](https://discord.gg/h9VFkAKTsT) +![twitter](https://img.shields.io/twitter/follow/terrastruct?style=social) +[![license](https://img.shields.io/github/license/terrastruct/d2?color=9cf)](./LICENSE.txt) +[![godoc](https://pkg.go.dev/badge/oss.terrastruct.com/d2.svg)](https://pkg.go.dev/oss.terrastruct.com/d2) + +D2 CLI + +
+ +# Table of Contents + + + +- [Quickstart (CLI)](#quickstart-cli) + * [MacOS](#macos) + * [Linux/Windows](#linuxwindows) +- [Quickstart (library)](#quickstart-library) +- [Themes](#themes) +- [Fonts](#fonts) +- [Export file types](#export-file-types) +- [Language tooling](#language-tooling) +- [Layout engine](#layout-engine) +- [Comparison](#comparison) +- [Contributing](#contributing) +- [License](#license) +- [Dependencies](#dependencies) +- [Related](#related) + * [VSCode extension](#vscode-extension) + * [Vim extension](#vim-extension) + * [Misc](#misc) + + + +## Quickstart (CLI) +The most convenient way to use D2 is to just run it as a CLI executable to +produce SVGs from `.d2` files. + +```sh +go install oss.terrastruct.com/d2 + +echo 'x -> y -> z' > in.d2 +d2 --watch in.d2 out.svg +``` + +A browser window will open with `out.svg` and live-reload on changes to `in.d2`. + +### MacOS + +Homebrew package coming soon. + +### Linux/Windows + +We have precompiled binaries on the [releases](https://github.com/terrastruct/d2/releases) +page. D2 will be added to OS-respective package managers soon. + + +## Quickstart (library) +In addition to being a runnable CLI tool, D2 can also be used to produce diagrams from +Go programs. + +```go +import ( + "github.com/terrastruct/d2/d2compiler" + "github.com/terrastruct/d2/d2exporter" + "github.com/terrastruct/d2/d2layouts/d2dagrelayout" + "github.com/terrastruct/d2/d2renderers/textmeasure" + "github.com/terrastruct/d2/d2themes/d2themescatalog" +) + +func main() { + graph, err := d2compiler.Compile("", strings.NewReader("x -> y"), &d2compiler.CompileOptions{ UTF16: true }) + ruler, err := textmeasure.NewRuler() + err = graph.SetDimensions(nil, ruler) + err = d2dagrelayout.Layout(ctx, graph) + diagram, err := d2exporter.Export(ctx, graph, d2themescatalog.NeutralDefault) + ioutil.WriteFile(filepath.Join("out.svg"), d2svg.Render(*diagram), 0600) +} +``` + +D2 is built to be hackable -- the language has an API built on top of it to make edits +programmatically. + +```go +import ( + "github.com/terrastruct/d2/d2oracle" + "github.com/terrastruct/d2/d2format" +) + +// ...modifying the diagram `x -> y` from above +// Create a shape with the ID, "meow" +graph, err = d2oracle.Create(graph "meow") +// Style the shape green +graph, err = d2oracle.Set(graph "meow.style.fill", "green") +// Create a shape with the ID, "cat" +graph, err = d2oracle.Create(graph "cat") +// Move the shape "meow" inside the container "cat" +graph, err = d2oracle.Move(graph "meow", "cat.meow") +// Prints formatted D2 code +println(d2format.Format(graph.AST)) +``` + +This makes it easy to build functionality on top of D2. Terrastruct uses the above API to +implement editing of D2 from mouse actions in a visual interface. + +## Themes + +D2 includes a variety of official themes to style your diagrams beautifully right out of +the box. See [./d2themes](./d2themes) to browse the available themes and make or +contribute your own creation. + +## Fonts + +D2 ships with "Source Sans Pro" as the font in renders. If you wish to use a different +one, please see [./d2renderers/d2fonts](./d2renderers/d2fonts). + +## Export file types + +D2 currently supports SVG exports. More coming soon. + +## Language tooling + +D2 is designed with language tooling in mind. D2's parser can parse multiple errors from a +broken program, has an autoformatter, syntax highlighting, and we have plans for LSP's and +more. Good language tooling is necessary for creating and maintaining large diagrams. + +The extensions for VSCode and Vim can be found in the [Related](#related) section. + +## Layout engine + +D2 currently uses the open-source library [dagre](https://github.com/dagrejs/dagre) as its +default layout engine. D2 includes a wrapper around dagre to work around one of its +biggest limitations -- the inability to make container-to-container edges. + +Dagre was chosen due to its popularity in other tools, but D2 intends to integrate with a +variety of layout engines, e.g. `dot`, as well as single-purpose layout types like +sequence diagrams. You can choose whichever layout engine you like and works best for the +diagram you're making. + +Terrastruct has created a proprietary layout engine called +[TALA](https://terrastruct.com/tala). It has been designed specifically for software +architecture diagrams, though it's good for other domains too. TALA has many advantages +over other layout engines, the biggest being that it isn't constrained to hierarchies, or +any single type like "radial" or "tree" (as almost all layout engines are). For more +information and to download & try TALA, see +[https://github.com/terrastruct/TALA](https://github.com/terrastruct/TALA). + +## Comparison + +For a comparison against other popular text-to-diagram tools, see +[https://text-to-diagram.com](https://text-to-diagram.com). + +## Contributing + +Contributions are welcome! See [./docs/CONTRIBUTING.md](./docs/CONTRIBUTING.md). + +## License + +Copyright © 2022 Terrastruct, Inc. Open-source licensed under the Mozilla Public License +2.0. + +## Dependencies + +D2 is light on third-party dependencies in the source code. Note that these are bundled +with D2, you do not have to separately install anything. + +| Dependency | What it does | +| ----------- | ----------- | +| [slog](https://cdr.dev/slog) | logging (deprecating it is a TODO) | +| [goldmark](https://github.com/yuin/goldmark), [goquery](https://github.com/PuerkitoBio/goquery) | Markdown rendering | +| [chroma](https://github.com/alecthomas/chroma) | syntax highlighting code snippets | +| [pflag](https://github.com/spf13/pflag), [fsnotify](https://github.com/fsnotify/fsnotify), [websocket](https://nhooyr.io/websocket) | CLI functions | +| [v8go](https://rogchap.com/v8go) | Run Javascript (e.g. Dagre layout engine) | +| [gonum](https://gonum.org/v1/plot) | Bezier curve stuff (rendering) | + +The rest are helpers we've open-sourced. E.g. [diff](https://oss.terrastruct.com/diff) for +our testing framework. + +## Related + +### VSCode extension + +[https://github.com/terrastruct/d2-vscode](https://github.com/terrastruct/d2-vscode) + +### Vim extension + +[https://github.com/terrastruct/d2-vim](https://github.com/terrastruct/d2-vim) + +### Misc + +- [https://github.com/terrastruct/d2-docs](https://github.com/terrastruct/d2-docs) +- [https://github.com/terrastruct/text-to-diagram-com](https://github.com/terrastruct/text-to-diagram-com) diff --git a/c.go b/c.go new file mode 100644 index 000000000..1fa3fc225 --- /dev/null +++ b/c.go @@ -0,0 +1,9 @@ +//go:build cgo + +package d2 + +import "oss.terrastruct.com/d2/d2layouts/d2dagrelayout" + +func init() { + dagreLayout = d2dagrelayout.Layout +} diff --git a/ci/sub/README.md b/ci/sub/README.md new file mode 100644 index 000000000..cafebe4fa --- /dev/null +++ b/ci/sub/README.md @@ -0,0 +1,3 @@ +# ci + +Terrastruct's CI scripts. diff --git a/ci/sub/assert_linear.sh b/ci/sub/assert_linear.sh new file mode 100755 index 000000000..ef53a4b96 --- /dev/null +++ b/ci/sub/assert_linear.sh @@ -0,0 +1,24 @@ +#!/bin/sh +set -eu +. "$(dirname "$0")/lib.sh" +cd -- "$(dirname "$0")/.." + +# assert_linear.sh ensures that the current commit does not contain any PR merge commits +# compared to master as if it does, then that means our diffing mechanisms will be +# incorrect. We want all changes compared to master to be checked, not all changed +# relative to the previous PR into this branch. + +if [ "$(git rev-parse --is-shallow-repository)" = true ]; then + git fetch --unshallow origin master +fi + +merge_base="$(git merge-base HEAD origin/master)" +merges="$(git --no-pager log --merges --grep="Merge pull request" --grep="\[ci-base\]" --format=%h "$merge_base"..HEAD)" + +if [ -n "$merges" ]; then + echoerr <"$fifo" 2>&1 +} + +main "$@" diff --git a/ci/sub/bin/xargsd b/ci/sub/bin/xargsd new file mode 100755 index 000000000..8c64cd8c3 --- /dev/null +++ b/ci/sub/bin/xargsd @@ -0,0 +1,10 @@ +#!/bin/sh +set -eu +. "$(dirname "$0")/../lib.sh" + +set_changed_files + +pattern="$1" +shift + +< "$CHANGED_FILES" grep "$pattern" | hide xargs ${CI:+-r} -t -P16 "-n${XARGS_N:-256}" -- "$@" diff --git a/ci/sub/fmt/Makefile b/ci/sub/fmt/Makefile new file mode 100644 index 000000000..3e1e8e4aa --- /dev/null +++ b/ci/sub/fmt/Makefile @@ -0,0 +1,49 @@ +.POSIX: + +.PHONY: all +all: +ifdef CI + git -c color.ui=always diff --exit-code +endif + +ifdef CI_FMT_GO +all: go +endif +.PHONY: go +go: gofmt goimports +.PHONY: gofmt +gofmt: + prefix "$@" xargsd '\.go$$' gofmt -s -w +.PHONY: goimports +goimports: gofmt + prefix "$@" xargsd '\.go$$' go run golang.org/x/tools/cmd/goimports@v0.1.12 \ + -w -local="$$CI_GOIMPORTS_LOCAL" + +ifdef CI_FMT_PRETTIER +all: prettier +endif +.PHONY: prettier +prettier: + prefix "$@" xargsd '\.\(js\|jsx\|ts\|tsx\|scss\|css\|html\)$$' \ + npx prettier@2.7.1 --print-width=90 --write + +ifdef CI_FMT_MARKDOWN +all: markdown-toc +endif +.PHONY: markdown-toc +markdown-toc: + XARGS_N=1 prefix "$@" xargsd '\.md$$' npx markdown-toc@1.2.0 -i + +ifdef CI_FMT_GO_MODULE +all: gomodtidy +endif +.PHONY: gomodtidy +gomodtidy: + prefix "$@" go mod tidy + +ifdef CI_FMT_NODE_MODULE +all: yarn +endif +.PHONY: yarn +yarn: + prefix "$@" yarn $${CI:+--immutable} $${CI:+--immutable-cache} diff --git a/ci/sub/fmt/make.sh b/ci/sub/fmt/make.sh new file mode 100755 index 000000000..7e98b475f --- /dev/null +++ b/ci/sub/fmt/make.sh @@ -0,0 +1,32 @@ +#!/bin/sh +set -eu +. "$(dirname "$0")/../lib.sh" +PATH="$(cd -- "$(dirname "$0")" && pwd)/../bin:$PATH" + +set_changed_files +gomod_path="$(search_up go.mod || true)" +if [ "$gomod_path" ]; then + export CI_FMT_GO_MODULE=1 + module_name="$(cat "$gomod_path" | head -n1 | cut -d' ' -f2 )" + if [ "${CI_GOIMPORTS_LOCAL:-}" ]; then + export CI_GOIMPORTS_LOCAL="$CI_GOIMPORTS_LOCAL,$module_name" + else + export CI_GOIMPORTS_LOCAL="$module_name" + fi +fi +if search_up package.json > /dev/null; then + export CI_FMT_NODE_MODULE=1 +fi +if < "$CHANGED_FILES" grep -qm1 '\.go$'; then + export CI_FMT_GO=1 +fi +if < "$CHANGED_FILES" grep -qm1 '\.md$'; then + if [ -z "${CI:-}" ]; then + # Only locally for now. + export CI_FMT_MARKDOWN=1 + fi +fi +if < "$CHANGED_FILES" grep -qm1 '\.\(js\|jsx\|ts\|tsx\|scss\|css\|html\)$'; then + export CI_FMT_PRETTIER=1 +fi +_make -f "$(dirname "$0")/Makefile" "$@" diff --git a/ci/sub/lib.sh b/ci/sub/lib.sh new file mode 100644 index 000000000..940f22409 --- /dev/null +++ b/ci/sub/lib.sh @@ -0,0 +1,340 @@ +#!/bin/sh + +if [ "${CI_DEBUG:-}" ]; then + set -x +fi + +# *** +# logging +# *** + +_echo() { + printf '%s\n' "$*" +} + +setaf() { + if [ -z "${TERM:-}" ]; then + export TERM=xterm-256color + fi + tput setaf "$1" + shift + printf '%s' "$*" + tput sgr0 +} + +echoerr() { + printf '%s ' "$(setaf 1 err:)" >&2 + if [ "$#" -gt 0 ]; then + printf '%s\n' "$*" >&2 + else + cat >&2 + fi +} + +sh_c() { + printf '%s %s\n' "$(setaf 3 exec:)" "$*" + "$@" +} + +get_rand_color() { + # 1-6 are regular and 9-14 are bright. + # 1,2 and 9,10 are red and green but we use those for success and failure. + pick "$*" 3 4 5 6 11 12 13 14 +} + +hide() { + out="$(mktemp)" + set +e + "$@" >"$out" 2>&1 + code="$?" + set -e + if [ "$code" -eq 0 -a -z "${CI_DEBUG:-}" ]; then + return + fi + cat "$out" >&2 + exit "$code" +} + +echo_dur() { + local dur=$1 + local h=$((dur/60/60)) + local m=$((dur/60%60)) + local s=$((dur%60)) + printf '%dh%dm%ds' "$h" "$m" "$s" +} + +sponge() { + dst="$1" + tmp="$(mktemp)" + cat > "$tmp" + cat "$tmp" > "$dst" +} + +stripansi() { + # First regex gets rid of standard xterm escape sequences for controlling + # visual attributes. + # The second regex I'm not 100% sure, the reference says it selects the US + # encoding but I'm not sure why that's necessary or why it always occurs + # in tput sgr0 before the standard escape sequence. + # See tput sgr0 | xxd + sed -e $'s/\x1b\[[0-9;]*m//g' -e $'s/\x1b(.//g' +} + +runtty() { + case "$(uname)" in + Darwin) + script -q /dev/null "$@" + ;; + Linux) + script -eqc "$*" + ;; + *) + echoerr "runtty: unsupported OS $(uname)" + esac +} + +# *** +# rand +# *** + +rand() {( + seed="$1" + range="$2" + + seed_file="$(mktemp)" + _echo "$seed" | md5sum > "$seed_file" + shuf -i "$range" -n 1 --random-source="$seed_file" +)} + +pick() {( + seed="$1" + shift + i="$(rand "$seed" "1-$#")" + eval "_echo \$$i" +)} + +# *** +# git +# *** + +set_git_base() { + if [ -n "${GIT_BASE_DONE:-}" ]; then + return + fi + + if [ -n "${CI_ALL:-}" ]; then + return + fi + + if git show --no-patch --format=%s%n%b | grep -qiF '\[ci-all\]'; then + return + fi + + if [ "$(git rev-parse --is-shallow-repository)" = true ]; then + git fetch --unshallow origin master + fi + + # Unfortunately --grep searches the whole commit message but we just want the header + # searched. Should fix by using grep directly later. + export GIT_BASE="$(git log --merges --grep="Merge pull request" --grep="\[ci-base\]" --format=%h HEAD~1 | head -n1)" + export GIT_BASE_DONE=1 + if [ -n "$GIT_BASE" ]; then + echop make "GIT_BASE=$GIT_BASE" + fi +} + +is_changed() { + set_git_base + if [ -z "${GIT_BASE:-}" ]; then + return + fi + + ! git diff --quiet "$GIT_BASE" -- "$@" || + [ -n "$(git ls-files --other --exclude-standard -- "$@")" ] +} + +set_changed_files() { + set_git_base + + filter_exists() { + while read -r p; do + if [ -e "$p" ]; then + printf '%s\n' "$p" + fi + done + } + + if [ -n "${CHANGED_FILES:-}" ]; then + return + fi + + CHANGED_FILES=./.changed-files + git ls-files --other --exclude-standard > "$CHANGED_FILES" + if [ -n "${GIT_BASE:-}" ]; then + git diff --relative --name-only "$GIT_BASE" | filter_exists >> "$CHANGED_FILES" + else + git ls-files >> "$CHANGED_FILES" + fi + export CHANGED_FILES +} + +# *** +# make +# *** + +_make() { + if [ "${CI:-}" ]; then + if ! is_changed .; then + return + fi + if [ "${GITHUB_TOKEN:-}" ]; then + git config --global credential.helper store + cat > ~/.git-credentials < "$MAKE_LOG.txt" + else + CI_MAKE_ROOT=0 + set +e + make -sj8 "$@" 2>&1 + fi + + code="$?" + set -e + if [ "$code" -ne 0 ]; then + notify "$code" + return "$code" + fi + # make doesn't return a nonsuccess exit code on recipe failures. + if <"$MAKE_LOG" grep -q 'make.* \*\*\* .* Error'; then + notify 1 + return 1 + fi + if [ -n "${CI:-}" ]; then + # Make sure nothing has changed + if ! git -c color.ui=always diff --exit-code; then + notify 1 + return 1 + fi + fi + notify 0 +} + +# *** +# misc +# *** + +search_up() {( + file="$1" + git_root="$(git rev-parse --show-toplevel)" + while true; do + if [ -e "$file" ]; then + _echo "$file" + return + fi + if [ "$PWD" = "$git_root" ]; then + break + fi + cd .. + done + return 1 +)} + +# *** +# integrations +# *** + +aws() { + # Without the redirection aws's cli will write directly to /dev/tty bypassing prefix. + command aws "$@" > /dev/stdout +} + +notify() { + if [ "$CI_MAKE_ROOT" -eq 0 -o -z "${CI:-}" ]; then + return + fi + if [ -z "${SLACK_WEBHOOK_URL:-}" -a -z "${DISCORD_WEBHOOK_URL:-}" ]; then + # Not all repos need CI failure notifications. + return + fi + + if [ -z "${GITHUB_RUN_ID:-}" ]; then + # For testing. + GITHUB_WORKFLOW=ci + GITHUB_JOB=fmt + GITHUB_REPOSITORY=terrastruct/src + GITHUB_RUN_ID=3086720699 + GITHUB_JOB=all + elif [ "$GITHUB_REF_PROTECTED" != true ]; then + # We only want to notify on protected branch failures. + return + fi + + code="$1" + if [ "$code" -eq 0 ]; then + status=success + emoji=🟢 + else + status='failure' + emoji=🛑 + if [ "${SLACK_WEBHOOK_URL:-}" ]; then + status="$status " + fi + fi + + GITHUB_JOB_URL="$(curl -fsSL -H "Authorization: token $GITHUB_TOKEN" "https://api.github.com/repos/$GITHUB_REPOSITORY/actions/runs/$GITHUB_RUN_ID/jobs?per_page=100" | \ + jq -r ".jobs[] | select( .name == \"$GITHUB_JOB\") | .html_url")" + if [ -z "$GITHUB_JOB_URL" ]; then + status="failed to query github job URL " + emoji=🛑 + GITHUB_JOB_URL="https://github.com/$GITHUB_REPOSITORY/actions/runs/$GITHUB_RUN_ID" + fi + + commit_sha="$(git rev-parse --short HEAD)" + commit_title="$(git show --no-patch '--format=%s')" + + # We need to escape any & < > in $commit_title. + # See https://api.slack.com/reference/surfaces/formatting#escaping + commit_title="$(_echo "$commit_title" | sed -e 's/&/\&/g' )" + commit_title="$(_echo "$commit_title" | sed -e 's//\>/g' )" + + # Three differences. + # 1. @here doesn't work in discord code blocks but do in slack. + # 2. URLs don't work in discord code blocks but do in slack. + # 3. content vs text for the request JSON payload. + # 4. Discord handles spacing in and around code blocks really weirdly. If $GITHUB_JOB_URL + # has a newline between it and the end of the code block, it's rendered as a separate + # paragraph instead of just below the code block. + if [ "${DISCORD_WEBHOOK_URL:-}" ]; then + msg="---" + if [ "$code" -ne 0 ]; then + msg="$msg @here" + fi + msg="$msg\`\`\` +$emoji $commit_sha - $commit_title | $GITHUB_WORKFLOW/$GITHUB_JOB: $status +\`\`\`$GITHUB_JOB_URL" + json="{\"content\":$(printf %s "$msg" | jq -sR .)}" + url="$DISCORD_WEBHOOK_URL" + elif [ "${SLACK_WEBHOOK_URL:-}" ]; then + msg="\`\`\` +$emoji $commit_sha - $commit_title | $GITHUB_WORKFLOW/$GITHUB_JOB: $status + $GITHUB_JOB_URL +\`\`\`" + json="{\"text\":$(printf %s "$msg" | jq -sR .)}" + url="$SLACK_WEBHOOK_URL" + fi + sh_c curl -fsSL -X POST -H 'Content-type: application/json' --data "$json" "$url" > /dev/null +} diff --git a/ci/test.sh b/ci/test.sh new file mode 100755 index 000000000..da523b72d --- /dev/null +++ b/ci/test.sh @@ -0,0 +1,12 @@ +#!/bin/sh +set -eu +cd "$(dirname "$0")/.." + +if [ "$*" = "" ]; then + set ./... +fi + +if [ "${CI:-}" ]; then + export FORCE_COLOR=1 +fi +go test --timeout=30m "$@" diff --git a/cmd/d2/help.go b/cmd/d2/help.go new file mode 100644 index 000000000..2d1224829 --- /dev/null +++ b/cmd/d2/help.go @@ -0,0 +1,118 @@ +package main + +import ( + "context" + "errors" + "fmt" + "os" + "os/exec" + "path/filepath" + "strings" + + "oss.terrastruct.com/d2/d2plugin" + "oss.terrastruct.com/d2/lib/xmain" +) + +func help(ms *xmain.State) { + fmt.Fprintf(ms.Stdout, `Usage: + %s [--watch=false] [--theme=0] file.d2 [file.svg] + +%[1]s compiles and renders file.d2 to file.svg +Use - to have d2 read from stdin or write to stdout. + +Flags: +%s + +Subcommands: + %[1]s layout - Lists available layout engine options with short help + %[1]s layout [layout name] - Display long help for a particular layout engine + +See more docs at https://oss.terrastruct.com/d2 +`, ms.Name, ms.FlagHelp()) +} + +func layoutHelp(ctx context.Context, ms *xmain.State) error { + if len(ms.FlagSet.Args()) == 1 { + return shortLayoutHelp(ctx, ms) + } else if len(ms.FlagSet.Args()) == 2 { + return longLayoutHelp(ctx, ms) + } else { + return xmain.UsageErrorf("too many arguments passed") + } +} + +func shortLayoutHelp(ctx context.Context, ms *xmain.State) error { + var pluginLines []string + plugins, err := d2plugin.ListPlugins(ctx) + if err != nil { + return err + } + for _, p := range plugins { + pluginLines = append(pluginLines, p.Name+" - "+p.ShortHelp) + } + fmt.Fprintf(ms.Stdout, `Available layout engines found: + +%s + +Usage: + To use a particular layout engine, set the environment variable D2_LAYOUT=[layout name]. + +Example: + D2_LAYOUT=dagre d2 in.d2 out.svg + +Subcommands: + %s layout [layout name] - Display long help for a particular layout engine + +See more docs at https://oss.terrastruct.com/d2 +`, strings.Join(pluginLines, "\n"), ms.Name) + return nil +} + +func longLayoutHelp(ctx context.Context, ms *xmain.State) error { + layout := ms.FlagSet.Arg(1) + plugin, path, err := d2plugin.FindPlugin(ctx, layout) + if errors.Is(err, exec.ErrNotFound) { + return layoutNotFound(ctx, layout) + } + + pluginLocation := "bundled" + if path != "" { + pluginLocation = fmt.Sprintf("executable plugin at %s", humanPath(path)) + } + + pluginInfo, err := plugin.Info(ctx) + if err != nil { + return err + } + + fmt.Fprintf(ms.Stdout, `%s (%s): + +%s +`, pluginInfo.Name, pluginLocation, pluginInfo.LongHelp) + + return nil +} + +func layoutNotFound(ctx context.Context, layout string) error { + var names []string + plugins, err := d2plugin.ListPlugins(ctx) + if err != nil { + return err + } + for _, p := range plugins { + names = append(names, p.Name) + } + + return xmain.UsageErrorf(`D2_LAYOUT "%s" is not bundled and could not be found in your $PATH. +The available options are: %s. For details on each option, run "d2 layout". + +For more information on setup, please visit https://github.com/terrastruct/d2.`, + layout, strings.Join(names, ", ")) +} + +func humanPath(fp string) string { + if strings.HasPrefix(fp, os.Getenv("HOME")) { + return filepath.Join("~", strings.TrimPrefix(fp, os.Getenv("HOME"))) + } + return fp +} diff --git a/cmd/d2/main.go b/cmd/d2/main.go new file mode 100644 index 000000000..0f5d066dc --- /dev/null +++ b/cmd/d2/main.go @@ -0,0 +1,188 @@ +package main + +import ( + "context" + "errors" + "fmt" + "os/exec" + "path/filepath" + "strconv" + "strings" + "time" + + _ "embed" + + "github.com/spf13/pflag" + + "oss.terrastruct.com/d2" + "oss.terrastruct.com/d2/cmd/version" + "oss.terrastruct.com/d2/d2plugin" + "oss.terrastruct.com/d2/d2renderers/d2svg" + "oss.terrastruct.com/d2/d2renderers/textmeasure" + "oss.terrastruct.com/d2/d2themes" + "oss.terrastruct.com/d2/d2themes/d2themescatalog" + "oss.terrastruct.com/d2/lib/xmain" +) + +func main() { + xmain.Main(run) +} + +func run(ctx context.Context, ms *xmain.State) (err error) { + // :( + ctx = xmain.DiscardSlog(ctx) + + watchFlag := ms.FlagSet.BoolP("watch", "w", false, "watch for changes to input and live reload. Use $PORT and $HOST to specify the listening address.\n$D2_PORT and $D2_HOST are also accepted and take priority. Default is localhost:0") + themeFlag := ms.FlagSet.Int64P("theme", "t", 0, "set the diagram theme. For a list of available options, see https://oss.terrastruct.com/d2") + bundleFlag := ms.FlagSet.BoolP("bundle", "b", true, "bundle all assets and layers into the output svg") + versionFlag := ms.FlagSet.BoolP("version", "v", false, "get the version and check for updates") + debugFlag := ms.FlagSet.BoolP("debug", "d", false, "print debug logs") + err = ms.FlagSet.Parse(ms.Args) + + if !errors.Is(err, pflag.ErrHelp) && err != nil { + return fmt.Errorf("failed to parse flags: %w", err) + } + + if len(ms.FlagSet.Args()) > 0 { + switch ms.FlagSet.Arg(0) { + case "layout": + return layoutHelp(ctx, ms) + } + } + + if errors.Is(err, pflag.ErrHelp) { + help(ms) + return nil + } + + if *debugFlag { + ms.Env.Setenv("DEBUG", "1") + } + + var inputPath string + var outputPath string + + if len(ms.FlagSet.Args()) == 0 { + if versionFlag != nil && *versionFlag { + version.CheckVersion(ctx, ms.Log) + return nil + } + help(ms) + return nil + } else if len(ms.FlagSet.Args()) >= 3 { + return xmain.UsageErrorf("too many arguments passed") + } + if len(ms.FlagSet.Args()) >= 1 { + if ms.FlagSet.Arg(0) == "version" { + version.CheckVersion(ctx, ms.Log) + return nil + } + inputPath = ms.FlagSet.Arg(0) + } + if len(ms.FlagSet.Args()) >= 2 { + outputPath = ms.FlagSet.Arg(1) + } else { + if inputPath == "-" { + outputPath = "-" + } else { + outputPath = renameExt(inputPath, ".svg") + } + } + + match := d2themescatalog.Find(*themeFlag) + if match == (d2themes.Theme{}) { + return xmain.UsageErrorf("-t[heme] could not be found. The available options are:\n%s\nYou provided: %d", d2themescatalog.CLIString(), *themeFlag) + } + ms.Env.Setenv("D2_THEME", fmt.Sprintf("%d", *themeFlag)) + + envD2Layout := ms.Env.Getenv("D2_LAYOUT") + if envD2Layout == "" { + envD2Layout = "dagre" + } + + plugin, path, err := d2plugin.FindPlugin(ctx, envD2Layout) + if errors.Is(err, exec.ErrNotFound) { + return layoutNotFound(ctx, envD2Layout) + } else if err != nil { + return err + } + + pluginLocation := "bundled" + if path != "" { + pluginLocation = fmt.Sprintf("executable plugin at %s", humanPath(path)) + } + ms.Log.Debug.Printf("using layout plugin %s (%s)", envD2Layout, pluginLocation) + + if *watchFlag { + if inputPath == "-" { + return xmain.UsageErrorf("-w[atch] cannot be combined with reading input from stdin") + } + ms.Env.Setenv("LOG_TIMESTAMPS", "1") + w, err := newWatcher(ctx, ms, plugin, inputPath, outputPath) + if err != nil { + return err + } + return w.run() + } + + ctx, cancel := context.WithTimeout(ctx, time.Minute*2) + defer cancel() + + if *bundleFlag { + _ = 343 + } + + _, err = compile(ctx, ms, plugin, inputPath, outputPath) + if err != nil { + return err + } + ms.Log.Success.Printf("successfully compiled %v to %v", inputPath, outputPath) + return nil +} + +func compile(ctx context.Context, ms *xmain.State, plugin d2plugin.Plugin, inputPath, outputPath string) ([]byte, error) { + input, err := ms.ReadPath(inputPath) + if err != nil { + return nil, err + } + + ruler, err := textmeasure.NewRuler() + if err != nil { + return nil, err + } + + themeID, _ := strconv.ParseInt(ms.Env.Getenv("D2_THEME"), 10, 64) + d, err := d2.Compile(ctx, string(input), &d2.CompileOptions{ + Layout: plugin.Layout, + Ruler: ruler, + ThemeID: themeID, + }) + if err != nil { + return nil, err + } + + svg, err := d2svg.Render(d) + if err != nil { + return nil, err + } + svg, err = plugin.PostProcess(ctx, svg) + if err != nil { + return nil, err + } + + err = ms.WritePath(outputPath, svg) + if err != nil { + return nil, err + } + return svg, nil +} + +// newExt must include leading . +func renameExt(fp string, newExt string) string { + ext := filepath.Ext(fp) + if ext == "" { + return fp + newExt + } else { + return strings.TrimSuffix(fp, ext) + newExt + } +} diff --git a/cmd/d2/main_test.go b/cmd/d2/main_test.go new file mode 100644 index 000000000..bca361510 --- /dev/null +++ b/cmd/d2/main_test.go @@ -0,0 +1,12 @@ +package main_test + +import "testing" + +// TODO: Use virtual file system with fs.FS in xmain.State when fs.FS supports writes. +// See https://github.com/golang/go/issues/45757. Or modify. +// We would need to abstract out fsnotify as well to work with the virtual test file system. +// See also https://pkg.go.dev/testing/fstest +// For now cleaning up temp directories after running tests is enough. +func TestRun(t *testing.T) { + t.Parallel() +} diff --git a/cmd/d2/static/watch.css b/cmd/d2/static/watch.css new file mode 100644 index 000000000..8c5bccc9a --- /dev/null +++ b/cmd/d2/static/watch.css @@ -0,0 +1,9 @@ +#d2c-err { + /* This style was copied from Chrome's svg parser error style. */ + white-space: pre-wrap; + border: 2px solid #c77; + padding: 15px; + margin: 15px; + background-color: #fdd; + color: black; +} diff --git a/cmd/d2/static/watch.js b/cmd/d2/static/watch.js new file mode 100644 index 000000000..e2c9adaf3 --- /dev/null +++ b/cmd/d2/static/watch.js @@ -0,0 +1,53 @@ +"use strict"; +window.addEventListener("DOMContentLoaded", () => { + init(1000); +}); + +function init(reconnectDelay) { + const devMode = document.body.dataset.d2DevMode === "true"; + const ws = new WebSocket( + `ws://${window.location.host}${window.location.pathname}watch` + ); + ws.onopen = () => { + reconnectDelay = 1000; + console.info("watch websocket opened"); + }; + ws.onmessage = (ev) => { + const msg = JSON.parse(ev.data); + if (devMode) { + console.debug("watch websocket received data", ev); + } else { + console.debug("watch websocket received data"); + } + const d2ErrDiv = window.document.querySelector("#d2-err"); + if (msg.err) { + d2ErrDiv.innerText = msg.err; + d2ErrDiv.style.display = "block"; + d2ErrDiv.scrollIntoView(); + } else { + const d2SVG = window.document.querySelector("#d2-svg"); + // We could turn d2SVG into an actual SVG element and use outerHTML to fully replace it + // with the result from the renderer but unfortunately that overwrites the #d2-svg ID. + // Even if you add another line to set it afterwards. The parsing/interpretation of outerHTML must be async. + // + // There's no way around that short of parsing out the top level svg tag in the msg and + // setting innerHTML to only the actual svg innards. However then you also need to parse + // out the width, height and viewbox out of the top level SVG tag and update those manually. + d2SVG.innerHTML = msg.svg; + d2ErrDiv.style.display = "none"; + } + }; + ws.onerror = (ev) => { + console.error("watch websocket connection error", ev); + }; + ws.onclose = (ev) => { + console.error(`watch websocket closed with code`, ev.code, `and reason`, ev.reason); + console.info(`reconnecting in ${reconnectDelay / 1000} seconds`); + setTimeout(() => { + if (reconnectDelay < 16000) { + reconnectDelay *= 2; + } + init(reconnectDelay); + }, reconnectDelay); + }; +} diff --git a/cmd/d2/watch.go b/cmd/d2/watch.go new file mode 100644 index 000000000..f9570da66 --- /dev/null +++ b/cmd/d2/watch.go @@ -0,0 +1,534 @@ +package main + +import ( + "context" + "embed" + _ "embed" + "errors" + "fmt" + "io/fs" + "net" + "net/http" + "os" + "path/filepath" + "runtime" + "sync" + "time" + + "github.com/fsnotify/fsnotify" + "nhooyr.io/websocket" + "nhooyr.io/websocket/wsjson" + + "oss.terrastruct.com/d2/d2plugin" + "oss.terrastruct.com/d2/lib/xbrowser" + "oss.terrastruct.com/d2/lib/xhttp" + "oss.terrastruct.com/d2/lib/xmain" +) + +// Enabled with the build tag "dev". +// See watch_dev.go +// Controls whether the embedded staticFS is used or if files are served directly from the +// file system. Useful for quick iteration in development. +var devMode = false + +//go:embed static +var staticFS embed.FS + +type watcher struct { + ctx context.Context + cancel context.CancelFunc + wg sync.WaitGroup + devMode bool + + ms *xmain.State + layoutPlugin d2plugin.Plugin + inputPath string + outputPath string + + compileCh chan struct{} + + fw *fsnotify.Watcher + l net.Listener + staticFileServer http.Handler + + wsclientsMu sync.Mutex + closing bool + wsclientsWG sync.WaitGroup + wsclients map[*wsclient]struct{} + + errMu sync.Mutex + err error + + resMu sync.Mutex + res *compileResult +} + +type compileResult struct { + Err string `json:"err"` + SVG string `json:"svg"` +} + +func newWatcher(ctx context.Context, ms *xmain.State, layoutPlugin d2plugin.Plugin, inputPath, outputPath string) (*watcher, error) { + ctx, cancel := context.WithCancel(ctx) + + w := &watcher{ + ctx: ctx, + cancel: cancel, + devMode: devMode, + + ms: ms, + layoutPlugin: layoutPlugin, + inputPath: inputPath, + outputPath: outputPath, + + compileCh: make(chan struct{}, 1), + wsclients: make(map[*wsclient]struct{}), + } + err := w.init() + if err != nil { + return nil, err + } + return w, nil +} + +func (w *watcher) init() error { + fw, err := fsnotify.NewWatcher() + if err != nil { + return err + } + w.fw = fw + err = w.initStaticFileServer() + if err != nil { + return err + } + return w.listen() +} + +func (w *watcher) initStaticFileServer() error { + // Serve files directly in dev mode for fast iteration. + if w.devMode { + _, file, _, ok := runtime.Caller(0) + if !ok { + return errors.New("d2: runtime failed to provide path of watch.go") + } + + staticFilesDir := filepath.Join(filepath.Dir(file), "./static") + w.staticFileServer = http.FileServer(http.Dir(staticFilesDir)) + return nil + } + + sfs, err := fs.Sub(staticFS, "static") + if err != nil { + return err + } + w.staticFileServer = http.FileServer(http.FS(sfs)) + return nil +} + +func (w *watcher) run() error { + defer w.close() + + w.goFunc(w.watchLoop) + w.goFunc(w.compileLoop) + + err := w.goServe() + if err != nil { + return err + } + + w.wg.Wait() + w.close() + return w.err +} + +func (w *watcher) close() { + w.wsclientsMu.Lock() + if w.closing { + w.wsclientsMu.Unlock() + return + } + w.closing = true + w.wsclientsMu.Unlock() + + w.cancel() + if w.fw != nil { + err := w.fw.Close() + w.setErr(err) + } + if w.l != nil { + err := w.l.Close() + w.setErr(err) + } + + w.wsclientsWG.Wait() +} + +func (w *watcher) setErr(err error) { + w.errMu.Lock() + if w.err == nil { + w.err = err + } + w.errMu.Unlock() +} + +func (w *watcher) goFunc(fn func(context.Context) error) { + w.wg.Add(1) + go func() { + defer w.wg.Done() + defer w.cancel() + + err := fn(w.ctx) + w.setErr(err) + }() +} + +/* + * IMPORTANT + * + * Do not touch watchLoop or ensureAddWatch without consulting @nhooyr + * fsnotify and file system watching APIs in general are notoriously hard + * to use correctly. + * + * This issue is a good summary though it too contains confusion and misunderstandings: + * https://github.com/fsnotify/fsnotify/issues/372 + * + * The code was thoroughly considered and experimentally vetted. + * + * TODO: Abstract out file system and fsnotify to test this with 100% coverage. See comment in main_test.go + */ +func (w *watcher) watchLoop(ctx context.Context) error { + lastModified, err := w.ensureAddWatch(ctx) + if err != nil { + return err + } + w.ms.Log.Info.Printf("compiling %v...", w.inputPath) + w.requestCompile() + + eatBurstTimer := time.NewTimer(0) + <-eatBurstTimer.C + pollTicker := time.NewTicker(time.Second * 10) + defer pollTicker.Stop() + + for { + select { + case <-pollTicker.C: + // In case we missed an event indicating the path is unwatchable and we won't be + // getting any more events. + // File notification APIs are notoriously unreliable. I've personally experienced + // many quirks and so feel this check is justified even if excessive. + mt, err := w.ensureAddWatch(ctx) + if err != nil { + return err + } + if !mt.Equal(lastModified) { + // We missed changes. + lastModified = mt + w.requestCompile() + } + case ev, ok := <-w.fw.Events: + if !ok { + return errors.New("fsnotify watcher closed") + } + w.ms.Log.Debug.Printf("received file system event %v", ev) + mt, err := w.ensureAddWatch(ctx) + if err != nil { + return err + } + if ev.Op == fsnotify.Chmod { + if mt.Equal(lastModified) { + // Benign Chmod. + // See https://github.com/fsnotify/fsnotify/issues/15 + continue + } + // We missed changes. + lastModified = mt + } + // The purpose of eatBurstTimer is to wait at least 32 milliseconds after a sequence of + // events to ensure that whomever is editing the file is now done. + // + // For example, On macOS editing with neovim, every write I see a chmod immediately + // followed by a write followed by another chmod. We don't want the three events to + // be treated as two or three compilations, we want them to be batched into one. + // + // Another example would be a very large file where one logical edit becomes write + // events. We wouldn't want to try to compile an incomplete file and then report a + // misleading error. + eatBurstTimer.Reset(time.Millisecond * 32) + case <-eatBurstTimer.C: + w.ms.Log.Info.Printf("detected change in %v: recompiling...", w.inputPath) + w.requestCompile() + case err, ok := <-w.fw.Errors: + if !ok { + return errors.New("fsnotify watcher closed") + } + w.ms.Log.Error.Printf("fsnotify error: %v", err) + case <-ctx.Done(): + return ctx.Err() + } + } +} + +func (w *watcher) requestCompile() { + select { + case w.compileCh <- struct{}{}: + default: + } +} + +func (w *watcher) ensureAddWatch(ctx context.Context) (time.Time, error) { + interval := time.Second + tc := time.NewTimer(0) + <-tc.C + for { + mt, err := w.addWatch(ctx) + if err == nil { + return mt, nil + } + w.ms.Log.Error.Printf("failed to watch inputPath %q: %v (retrying in %v)", w.inputPath, err, interval) + + tc.Reset(interval) + select { + case <-tc.C: + if interval < time.Second*16 { + interval *= 2 + } + case <-ctx.Done(): + return time.Time{}, ctx.Err() + } + } +} + +func (w *watcher) addWatch(ctx context.Context) (time.Time, error) { + err := w.fw.Add(w.inputPath) + if err != nil { + return time.Time{}, err + } + var d os.FileInfo + d, err = os.Stat(w.inputPath) + if err != nil { + return time.Time{}, err + } + return d.ModTime(), nil +} + +func (w *watcher) compileLoop(ctx context.Context) error { + firstCompile := true + for { + select { + case <-w.compileCh: + case <-ctx.Done(): + return ctx.Err() + } + + recompiledPrefix := "" + if !firstCompile { + recompiledPrefix = "re" + } + + b, err := compile(ctx, w.ms, w.layoutPlugin, w.inputPath, w.outputPath) + if err != nil { + err = fmt.Errorf("failed to %scompile: %w", recompiledPrefix, err) + w.ms.Log.Error.Print(err) + w.broadcast(&compileResult{ + Err: err.Error(), + }) + } else { + w.ms.Log.Success.Printf("successfully %scompiled %v to %v", recompiledPrefix, w.inputPath, w.outputPath) + w.broadcast(&compileResult{ + SVG: string(b), + }) + } + + if firstCompile { + firstCompile = false + url := fmt.Sprintf("http://%s", w.l.Addr()) + err = xbrowser.OpenURL(ctx, w.ms.Env, url) + if err != nil { + w.ms.Log.Warn.Printf("failed to open browser to %v: %v", url, err) + } + } + } +} + +func (w *watcher) listen() error { + host := "localhost" + port := "0" + hostEnv := w.ms.Env.Getenv("HOST") + if hostEnv != "" { + host = hostEnv + } + portEnv := w.ms.Env.Getenv("PORT") + if portEnv != "" { + port = portEnv + } + + l, err := net.Listen("tcp", net.JoinHostPort(host, port)) + if err != nil { + return err + } + w.l = l + w.ms.Log.Success.Printf("listening on http://%v", w.l.Addr()) + return nil +} + +func (w *watcher) goServe() error { + m := http.NewServeMux() + // TODO: Add cmdlog logging and error reporting middleware + // TODO: Add standard debug/profiling routes + m.HandleFunc("/", w.handleRoot) + m.Handle("/static/", http.StripPrefix("/static", w.staticFileServer)) + m.Handle("/watch", xhttp.HandlerFuncAdapter{w.ms.Log, w.handleWatch}) + + s := xhttp.NewServer(w.ms.Log.Warn, xhttp.Log(w.ms.Log, m)) + w.goFunc(func(ctx context.Context) error { + return xhttp.Serve(ctx, time.Second*30, s, w.l) + }) + + return nil +} + +func (w *watcher) getRes() *compileResult { + w.resMu.Lock() + defer w.resMu.Unlock() + return w.res +} + +func (w *watcher) handleRoot(hw http.ResponseWriter, r *http.Request) { + hw.Header().Set("Content-Type", "text/html; charset=utf-8") + fmt.Fprintf(hw, ` + + + + + %s + + + + + +
+ +`, w.outputPath, w.devMode) +} + +func (w *watcher) handleWatch(hw http.ResponseWriter, r *http.Request) error { + w.wsclientsMu.Lock() + if w.closing { + w.wsclientsMu.Unlock() + return xhttp.Errorf(http.StatusServiceUnavailable, "server shutting down...", "server shutting down...") + } + // We must register ourselves before we even upgrade the connection to ensure that + // w.close() will wait for us. If we instead registered afterwards, then there is a + // brief period between the hijack and the registration where close may return without + // waiting for us to finish. + w.wsclientsWG.Add(1) + w.wsclientsMu.Unlock() + + c, err := websocket.Accept(hw, r, &websocket.AcceptOptions{ + CompressionMode: websocket.CompressionDisabled, + }) + if err != nil { + w.wsclientsWG.Done() + return err + } + + go func() { + defer w.wsclientsWG.Done() + defer c.Close(websocket.StatusInternalError, "the sky is falling") + + ctx, cancel := context.WithTimeout(w.ctx, time.Hour) + defer cancel() + + cl := &wsclient{ + w: w, + resultsCh: make(chan struct{}, 1), + c: c, + } + + w.wsclientsMu.Lock() + w.wsclients[cl] = struct{}{} + w.wsclientsMu.Unlock() + defer func() { + w.wsclientsMu.Lock() + delete(w.wsclients, cl) + w.wsclientsMu.Unlock() + }() + + ctx = cl.c.CloseRead(ctx) + go wsHeartbeat(ctx, cl.c) + _ = cl.writeLoop(ctx) + }() + return nil +} + +type wsclient struct { + w *watcher + resultsCh chan struct{} + c *websocket.Conn +} + +func (cl *wsclient) writeLoop(ctx context.Context) error { + for { + res := cl.w.getRes() + if res != nil { + err := cl.write(ctx, res) + if err != nil { + return err + } + } + + select { + case <-cl.resultsCh: + case <-ctx.Done(): + cl.c.Close(websocket.StatusGoingAway, "server shutting down...") + return ctx.Err() + } + } +} + +func (cl *wsclient) write(ctx context.Context, res *compileResult) error { + ctx, cancel := context.WithTimeout(ctx, time.Second*30) + defer cancel() + + return wsjson.Write(ctx, cl.c, res) +} + +func (w *watcher) broadcast(res *compileResult) { + w.resMu.Lock() + w.res = res + w.resMu.Unlock() + + w.wsclientsMu.Lock() + defer w.wsclientsMu.Unlock() + clientsSuffix := "" + if len(w.wsclients) != 1 { + clientsSuffix = "s" + } + w.ms.Log.Info.Printf("broadcasting update to %d client%s", len(w.wsclients), clientsSuffix) + for cl := range w.wsclients { + select { + case cl.resultsCh <- struct{}{}: + default: + } + } +} + +func wsHeartbeat(ctx context.Context, c *websocket.Conn) { + defer c.Close(websocket.StatusInternalError, "the sky is falling") + + t := time.NewTimer(0) + <-t.C + for { + err := c.Ping(ctx) + if err != nil { + return + } + + t.Reset(time.Second * 30) + select { + case <-t.C: + case <-ctx.Done(): + return + } + } +} diff --git a/cmd/d2/watch_dev.go b/cmd/d2/watch_dev.go new file mode 100644 index 000000000..c55afde43 --- /dev/null +++ b/cmd/d2/watch_dev.go @@ -0,0 +1,8 @@ +//go:build dev +// +build dev + +package main + +func init() { + devMode = true +} diff --git a/cmd/d2plugin-dagre/main.go b/cmd/d2plugin-dagre/main.go new file mode 100644 index 000000000..20cb9af5a --- /dev/null +++ b/cmd/d2plugin-dagre/main.go @@ -0,0 +1,12 @@ +//go:build cgo && !nodagre + +package main + +import ( + "oss.terrastruct.com/d2/d2plugin" + "oss.terrastruct.com/d2/lib/xmain" +) + +func main() { + xmain.Main(d2plugin.Serve(d2plugin.DagrePlugin)) +} diff --git a/cmd/version/version.go b/cmd/version/version.go new file mode 100644 index 000000000..ef7703a06 --- /dev/null +++ b/cmd/version/version.go @@ -0,0 +1,38 @@ +package version + +import ( + "context" + + "github.com/google/go-github/github" + "oss.terrastruct.com/cmdlog" +) + +// Pre-built binaries will have version set during build time. +var Version = "master (built from source)" + +func CheckVersion(ctx context.Context, logger *cmdlog.Logger) { + logger.Info.Printf("D2 version: %s\n", Version) + + if Version == "master (built from source)" { + return + } + + logger.Info.Printf("Checking for updates...") + latest, err := getLatestVersion(ctx) + if err != nil { + logger.Debug.Printf("Error reaching Github for latest version: %s", err.Error()) + } else if Version != "master" && Version != latest { + logger.Info.Printf("A new version of D2 is available: %s -> %s", Version, latest) + } +} + +func getLatestVersion(ctx context.Context) (string, error) { + client := github.NewClient(nil) + rep, _, err := client.Repositories.GetLatestRelease(ctx, "terrastruct", "d2") + + if err != nil { + return "", err + } + + return *rep.TagName, nil +} diff --git a/d2.go b/d2.go new file mode 100644 index 000000000..d6fdfe8a2 --- /dev/null +++ b/d2.go @@ -0,0 +1,58 @@ +package d2 + +import ( + "context" + "errors" + "os" + "strings" + + "oss.terrastruct.com/d2/d2compiler" + "oss.terrastruct.com/d2/d2exporter" + "oss.terrastruct.com/d2/d2graph" + "oss.terrastruct.com/d2/d2renderers/textmeasure" + "oss.terrastruct.com/d2/d2target" +) + +type CompileOptions struct { + UTF16 bool + MeasuredTexts []*d2target.MText + Ruler *textmeasure.Ruler + Layout func(context.Context, *d2graph.Graph) error + + ThemeID int64 +} + +func Compile(ctx context.Context, input string, opts *CompileOptions) (*d2target.Diagram, error) { + if opts == nil { + opts = &CompileOptions{} + } + + g, err := d2compiler.Compile("", strings.NewReader(input), &d2compiler.CompileOptions{ + UTF16: opts.UTF16, + }) + if err != nil { + return nil, err + } + + err = g.SetDimensions(opts.MeasuredTexts, opts.Ruler) + if err != nil { + return nil, err + } + + if opts.Layout != nil { + err = opts.Layout(ctx, g) + } else if os.Getenv("D2_LAYOUT") == "dagre" && dagreLayout != nil { + err = dagreLayout(ctx, g) + } else { + err = errors.New("no available layout") + } + if err != nil { + return nil, err + } + + diagram, err := d2exporter.Export(ctx, g, opts.ThemeID) + return diagram, err +} + +// See c.go +var dagreLayout func(context.Context, *d2graph.Graph) error diff --git a/d2ast/d2ast.go b/d2ast/d2ast.go new file mode 100644 index 000000000..69fa544fe --- /dev/null +++ b/d2ast/d2ast.go @@ -0,0 +1,972 @@ +// d2ast implements the d2 language's abstract syntax tree. +// +// https://github.com/terrastruct/d2-vscode +// https://terrastruct.com/docs/d2/tour/intro/ +// +// Special characters to think about in parser: +// # +// """ +// ; +// [] +// {} +// | +// $ +// ' +// " +// \ +// : +// . +// -- +// <> +// * +// & +// () +package d2ast + +import ( + "bytes" + "encoding" + "errors" + "fmt" + "math/big" + "strconv" + "strings" + "unicode" + "unicode/utf16" + "unicode/utf8" + + "oss.terrastruct.com/xdefer" +) + +// Node is the base interface implemented by all d2 AST nodes. +// TODO: add error node for autofmt of incomplete AST +type Node interface { + node() + + // Type returns the user friendly name of the node. + Type() string + + // GetRange returns the range a node occupies in its file. + GetRange() Range + + // TODO: add Children() for walking AST + // Children() []Node +} + +var _ Node = &Comment{} +var _ Node = &BlockComment{} + +var _ Node = &Null{} +var _ Node = &Boolean{} +var _ Node = &Number{} +var _ Node = &UnquotedString{} +var _ Node = &DoubleQuotedString{} +var _ Node = &SingleQuotedString{} +var _ Node = &BlockString{} +var _ Node = &Substitution{} + +var _ Node = &Array{} +var _ Node = &Map{} +var _ Node = &Key{} +var _ Node = &KeyPath{} +var _ Node = &Edge{} +var _ Node = &EdgeIndex{} + +// Range represents a range between Start and End in Path. +// It's also used in the d2parser package to represent the range of an error. +// +// note: See docs on Position. +// +// It has a custom JSON string encoding with encoding.TextMarshaler and +// encoding.TextUnmarshaler to keep it compact as the JSON struct encoding is too verbose, +// especially with json.MarshalIndent. +// +// It looks like path,start-end +type Range struct { + Path string + Start Position + End Position +} + +var _ fmt.Stringer = Range{} +var _ encoding.TextMarshaler = Range{} +var _ encoding.TextUnmarshaler = &Range{} + +func MakeRange(s string) Range { + var r Range + _ = r.UnmarshalText([]byte(s)) + return r +} + +// String returns a string representation of the range including only the path and start. +// +// If path is empty, it will be omitted. +// +// The format is path:start +func (r Range) String() string { + var s strings.Builder + if r.Path != "" { + s.WriteString(r.Path) + s.WriteByte(':') + } + + s.WriteString(r.Start.String()) + return s.String() +} + +// OneLine returns true if the Range starts and ends on the same line. +func (r Range) OneLine() bool { + return r.Start.Line == r.End.Line +} + +// See docs on Range. +func (r Range) MarshalText() ([]byte, error) { + start, _ := r.Start.MarshalText() + end, _ := r.End.MarshalText() + return []byte(fmt.Sprintf("%s,%s-%s", r.Path, start, end)), nil +} + +// See docs on Range. +func (r *Range) UnmarshalText(b []byte) (err error) { + defer xdefer.Errorf(&err, "failed to unmarshal Range from %q", b) + + i := bytes.LastIndexByte(b, '-') + if i == -1 { + return errors.New("missing End field") + } + end := b[i+1:] + b = b[:i] + + i = bytes.LastIndexByte(b, ',') + if i == -1 { + return errors.New("missing Start field") + } + start := b[i+1:] + b = b[:i] + + r.Path = string(b) + err = r.Start.UnmarshalText(start) + if err != nil { + return err + } + return r.End.UnmarshalText(end) +} + +// Position represents a line:column and byte position in a file. +// +// note: Line and Column are zero indexed. +// note: Column and Byte are UTF-8 byte indexes unless byUTF16 was passed to Position.Advance in +// which they are UTF-16 code unit indexes. +// If intended for Javascript consumption like in the browser or via LSP, byUTF16 is +// set to true. +type Position struct { + Line int + Column int + Byte int +} + +var _ fmt.Stringer = Position{} +var _ encoding.TextMarshaler = Position{} +var _ encoding.TextUnmarshaler = &Position{} + +// String returns a line:column representation of the position suitable for error messages. +// +// note: Should not normally be used directly, see Range.String() +func (p Position) String() string { + return fmt.Sprintf("%d:%d", p.Line+1, p.Column+1) +} + +// See docs on Range. +func (p Position) MarshalText() ([]byte, error) { + return []byte(fmt.Sprintf("%d:%d:%d", p.Line, p.Column, p.Byte)), nil +} + +// See docs on Range. +func (p *Position) UnmarshalText(b []byte) (err error) { + defer xdefer.Errorf(&err, "failed to unmarshal Position from %q", b) + + fields := bytes.Split(b, []byte{':'}) + if len(fields) != 3 { + return errors.New("expected three fields") + } + + p.Line, err = strconv.Atoi(string(fields[0])) + if err != nil { + return err + } + p.Column, err = strconv.Atoi(string(fields[1])) + if err != nil { + return err + } + p.Byte, err = strconv.Atoi(string(fields[2])) + return err +} + +// From copies src into p. It's used in the d2parser package to set a node's Range.End to +// the parser's current pos on all return paths with defer. +func (p *Position) From(src *Position) { + *p = *src +} + +// Advance advances p's Line, Column and Byte by r and returns +// the new Position. +// Set byUTF16 to advance the position as though r represents +// a UTF-16 codepoint. +func (p Position) Advance(r rune, byUTF16 bool) Position { + size := utf8.RuneLen(r) + if byUTF16 { + size = 1 + r1, r2 := utf16.EncodeRune(r) + if r1 != '\uFFFD' && r2 != '\uFFFD' { + size = 2 + } + } + + if r == '\n' { + p.Line++ + p.Column = 0 + } else { + p.Column += size + } + p.Byte += size + + return p +} + +func (p Position) Subtract(r rune, byUTF16 bool) Position { + size := utf8.RuneLen(r) + if byUTF16 { + size = 1 + r1, r2 := utf16.EncodeRune(r) + if r1 != '\uFFFD' && r2 != '\uFFFD' { + size = 2 + } + } + + if r == '\n' { + panic("d2ast: cannot subtract newline from Position") + } else { + p.Column -= size + } + p.Byte -= size + + return p +} + +func (p Position) SubtractString(s string, byUTF16 bool) Position { + for _, r := range s { + p = p.Subtract(r, byUTF16) + } + return p +} + +// MapNode is implemented by nodes that may be children of Maps. +type MapNode interface { + Node + mapNode() +} + +var _ MapNode = &Comment{} +var _ MapNode = &BlockComment{} +var _ MapNode = &Key{} +var _ MapNode = &Substitution{} + +// ArrayNode is implemented by nodes that may be children of Arrays. +type ArrayNode interface { + Node + arrayNode() +} + +// See Value for the rest. +var _ ArrayNode = &Comment{} +var _ ArrayNode = &BlockComment{} +var _ ArrayNode = &Substitution{} + +// Value is implemented by nodes that may be values of a key. +type Value interface { + ArrayNode + value() +} + +// See Scalar for rest. +var _ Value = &Array{} +var _ Value = &Map{} + +// Scalar is implemented by nodes that represent scalar values. +type Scalar interface { + Value + scalar() + ScalarString() string +} + +// See String for rest. +var _ Scalar = &Null{} +var _ Scalar = &Boolean{} +var _ Scalar = &Number{} + +// String is implemented by nodes that represent strings. +type String interface { + Scalar + SetString(string) + Copy() String + _string() +} + +var _ String = &UnquotedString{} +var _ String = &SingleQuotedString{} +var _ String = &DoubleQuotedString{} +var _ String = &BlockString{} + +func (c *Comment) node() {} +func (c *BlockComment) node() {} +func (n *Null) node() {} +func (b *Boolean) node() {} +func (n *Number) node() {} +func (s *UnquotedString) node() {} +func (s *DoubleQuotedString) node() {} +func (s *SingleQuotedString) node() {} +func (s *BlockString) node() {} +func (s *Substitution) node() {} +func (a *Array) node() {} +func (m *Map) node() {} +func (k *Key) node() {} +func (k *KeyPath) node() {} +func (e *Edge) node() {} +func (i *EdgeIndex) node() {} + +func (c *Comment) Type() string { return "comment" } +func (c *BlockComment) Type() string { return "block comment" } +func (n *Null) Type() string { return "null" } +func (b *Boolean) Type() string { return "boolean" } +func (n *Number) Type() string { return "number" } +func (s *UnquotedString) Type() string { return "unquoted string" } +func (s *DoubleQuotedString) Type() string { return "double quoted string" } +func (s *SingleQuotedString) Type() string { return "single quoted string" } +func (s *BlockString) Type() string { return s.Tag + " block string" } +func (s *Substitution) Type() string { return "substitution" } +func (a *Array) Type() string { return "array" } +func (m *Map) Type() string { return "map" } +func (k *Key) Type() string { return "map key" } +func (k *KeyPath) Type() string { return "key path" } +func (e *Edge) Type() string { return "edge" } +func (i *EdgeIndex) Type() string { return "edge index" } + +func (c *Comment) GetRange() Range { return c.Range } +func (c *BlockComment) GetRange() Range { return c.Range } +func (n *Null) GetRange() Range { return n.Range } +func (b *Boolean) GetRange() Range { return b.Range } +func (n *Number) GetRange() Range { return n.Range } +func (s *UnquotedString) GetRange() Range { return s.Range } +func (s *DoubleQuotedString) GetRange() Range { return s.Range } +func (s *SingleQuotedString) GetRange() Range { return s.Range } +func (s *BlockString) GetRange() Range { return s.Range } +func (s *Substitution) GetRange() Range { return s.Range } +func (a *Array) GetRange() Range { return a.Range } +func (m *Map) GetRange() Range { return m.Range } +func (k *Key) GetRange() Range { return k.Range } +func (k *KeyPath) GetRange() Range { return k.Range } +func (e *Edge) GetRange() Range { return e.Range } +func (i *EdgeIndex) GetRange() Range { return i.Range } + +func (c *Comment) mapNode() {} +func (c *BlockComment) mapNode() {} +func (k *Key) mapNode() {} +func (s *Substitution) mapNode() {} + +func (c *Comment) arrayNode() {} +func (c *BlockComment) arrayNode() {} +func (n *Null) arrayNode() {} +func (b *Boolean) arrayNode() {} +func (n *Number) arrayNode() {} +func (s *UnquotedString) arrayNode() {} +func (s *DoubleQuotedString) arrayNode() {} +func (s *SingleQuotedString) arrayNode() {} +func (s *BlockString) arrayNode() {} +func (s *Substitution) arrayNode() {} +func (a *Array) arrayNode() {} +func (m *Map) arrayNode() {} + +func (n *Null) value() {} +func (b *Boolean) value() {} +func (n *Number) value() {} +func (s *UnquotedString) value() {} +func (s *DoubleQuotedString) value() {} +func (s *SingleQuotedString) value() {} +func (s *BlockString) value() {} +func (a *Array) value() {} +func (m *Map) value() {} + +func (n *Null) scalar() {} +func (b *Boolean) scalar() {} +func (n *Number) scalar() {} +func (s *UnquotedString) scalar() {} +func (s *DoubleQuotedString) scalar() {} +func (s *SingleQuotedString) scalar() {} +func (s *BlockString) scalar() {} + +// TODO: mistake, move into parse.go +func (n *Null) ScalarString() string { return n.Type() } +func (b *Boolean) ScalarString() string { return strconv.FormatBool(b.Value) } +func (n *Number) ScalarString() string { return n.Raw } +func (s *UnquotedString) ScalarString() string { + if len(s.Value) == 0 { + return "" + } + if s.Value[0].String == nil { + return "" + } + return *s.Value[0].String +} +func (s *DoubleQuotedString) ScalarString() string { + if len(s.Value) == 0 { + return "" + } + if s.Value[0].String == nil { + return "" + } + return *s.Value[0].String +} +func (s *SingleQuotedString) ScalarString() string { return s.Value } +func (s *BlockString) ScalarString() string { return s.Value } + +func (s *UnquotedString) SetString(s2 string) { s.Value = []InterpolationBox{{String: &s2}} } +func (s *DoubleQuotedString) SetString(s2 string) { s.Value = []InterpolationBox{{String: &s2}} } +func (s *SingleQuotedString) SetString(s2 string) { s.Raw = ""; s.Value = s2 } +func (s *BlockString) SetString(s2 string) { s.Value = s2 } + +func (s *UnquotedString) Copy() String { tmp := *s; return &tmp } +func (s *DoubleQuotedString) Copy() String { tmp := *s; return &tmp } +func (s *SingleQuotedString) Copy() String { tmp := *s; return &tmp } +func (s *BlockString) Copy() String { tmp := *s; return &tmp } + +func (s *UnquotedString) _string() {} +func (s *DoubleQuotedString) _string() {} +func (s *SingleQuotedString) _string() {} +func (s *BlockString) _string() {} + +type Comment struct { + Range Range `json:"range"` + Value string `json:"value"` +} + +type BlockComment struct { + Range Range `json:"range"` + Value string `json:"value"` +} + +type Null struct { + Range Range `json:"range"` +} + +type Boolean struct { + Range Range `json:"range"` + Value bool `json:"value"` +} + +type Number struct { + Range Range `json:"range"` + Raw string `json:"raw"` + Value *big.Rat `json:"value"` +} + +type UnquotedString struct { + Range Range `json:"range"` + Value []InterpolationBox `json:"value"` +} + +func FlatUnquotedString(s string) *UnquotedString { + return &UnquotedString{ + Value: []InterpolationBox{{String: &s}}, + } +} + +type DoubleQuotedString struct { + Range Range `json:"range"` + Value []InterpolationBox `json:"value"` +} + +func FlatDoubleQuotedString(s string) *DoubleQuotedString { + return &DoubleQuotedString{ + Value: []InterpolationBox{{String: &s}}, + } +} + +type SingleQuotedString struct { + Range Range `json:"range"` + Raw string `json:"raw"` + Value string `json:"value"` +} + +type BlockString struct { + Range Range `json:"range"` + + // Quote contains the pipe delimiter for the block string. + // e.g. if 5 pipes were used to begin a block string, then Quote == "||||". + // The tag is not included. + Quote string `json:"quote"` + Tag string `json:"tag"` + Value string `json:"value"` +} + +type Array struct { + Range Range `json:"range"` + Nodes []ArrayNodeBox `json:"nodes"` +} + +type Map struct { + Range Range `json:"range"` + Nodes []MapNodeBox `json:"nodes"` +} + +func (m *Map) InsertAfter(cursor, n MapNode) { + afterIndex := len(m.Nodes) - 1 + + for i, n := range m.Nodes { + if n.Unbox() == cursor { + afterIndex = i + } + } + + a := make([]MapNodeBox, 0, len(m.Nodes)) + a = append(a, m.Nodes[:afterIndex+1]...) + a = append(a, MakeMapNodeBox(n)) + a = append(a, m.Nodes[afterIndex+1:]...) + m.Nodes = a +} + +func (m *Map) InsertBefore(cursor, n MapNode) { + beforeIndex := len(m.Nodes) + + for i, n := range m.Nodes { + if n.Unbox() == cursor { + beforeIndex = i + } + } + + a := make([]MapNodeBox, 0, len(m.Nodes)) + a = append(a, m.Nodes[:beforeIndex]...) + a = append(a, MakeMapNodeBox(n)) + a = append(a, m.Nodes[beforeIndex:]...) + m.Nodes = a +} + +func (m *Map) IsFileMap() bool { + return m.Range.Start.Line == 0 && m.Range.Start.Column == 0 +} + +// TODO: require @ on import values for readability +type Key struct { + Range Range `json:"range"` + + // Indicates this MapKey is an override selector. + Ampersand bool `json:"ampersand,omitempty"` + + // At least one of Key and Edges will be set but all four can also be set. + // The following are all valid MapKeys: + // Key: + // x + // Edges: + // x -> y + // Edges and EdgeIndex: + // (x -> y)[*] + // Edges and EdgeKey: + // (x -> y).label + // Key and Edges: + // container.(x -> y) + // Key, Edges and EdgeKey: + // container.(x -> y -> z).label + // Key, Edges, EdgeIndex EdgeKey: + // container.(x -> y -> z)[4].label + Key *KeyPath `json:"key,omitempty"` + Edges []*Edge `json:"edges,omitempty"` + EdgeIndex *EdgeIndex `json:"edge_index,omitempty"` + EdgeKey *KeyPath `json:"edge_key,omitempty"` + + Primary ScalarBox `json:"primary,omitempty"` + Value ValueBox `json:"value"` +} + +// TODO there's more stuff to compare +func (mk1 *Key) Equals(mk2 *Key) bool { + if (mk1.Key == nil) != (mk2.Key == nil) { + return false + } + if (mk1.EdgeIndex == nil) != (mk2.EdgeIndex == nil) { + return false + } + if (mk1.EdgeKey == nil) != (mk2.EdgeKey == nil) { + return false + } + if len(mk1.Edges) != len(mk2.Edges) { + return false + } + if (mk1.Value.Map == nil) != (mk2.Value.Map == nil) { + return false + } + if (mk1.Value.Unbox() == nil) != (mk2.Value.Unbox() == nil) { + return false + } + + if mk1.Key != nil { + if len(mk1.Key.Path) != len(mk2.Key.Path) { + return false + } + for i, id := range mk1.Key.Path { + if id.Unbox().ScalarString() != mk2.Key.Path[i].Unbox().ScalarString() { + return false + } + } + } + + if mk1.Value.Map != nil { + if len(mk1.Value.Map.Nodes) != len(mk2.Value.Map.Nodes) { + return false + } + for i := range mk1.Value.Map.Nodes { + if !mk1.Value.Map.Nodes[i].MapKey.Equals(mk2.Value.Map.Nodes[i].MapKey) { + return false + } + } + } + + if mk1.Value.Unbox() != nil { + if mk1.Value.ScalarBox().Unbox().ScalarString() != mk2.Value.ScalarBox().Unbox().ScalarString() { + return false + } + } + + return true +} + +func (mk *Key) SetScalar(scalar ScalarBox) { + if mk.Value.Unbox() != nil && mk.Value.ScalarBox().Unbox() == nil { + mk.Primary = scalar + } else { + mk.Value = MakeValueBox(scalar.Unbox()) + } +} + +type KeyPath struct { + Range Range `json:"range"` + Path []*StringBox `json:"path"` +} + +type Edge struct { + Range Range `json:"range"` + + Src *KeyPath `json:"src"` + // empty, < or * + SrcArrow string `json:"src_arrow"` + + Dst *KeyPath `json:"dst"` + // empty, > or * + DstArrow string `json:"dst_arrow"` +} + +type EdgeIndex struct { + Range Range `json:"range"` + + // [n] or [*] + Int *int `json:"int"` + Glob bool `json:"glob"` +} + +type Substitution struct { + Range Range `json:"range"` + + Spread bool `json:"spread"` + Path []*StringBox `json:"path"` +} + +// MapNodeBox is used to box MapNode for JSON persistence. +type MapNodeBox struct { + Comment *Comment `json:"comment,omitempty"` + BlockComment *BlockComment `json:"block_comment,omitempty"` + Substitution *Substitution `json:"substitution,omitempty"` + MapKey *Key `json:"map_key,omitempty"` +} + +func MakeMapNodeBox(n MapNode) MapNodeBox { + var box MapNodeBox + switch n := n.(type) { + case *Comment: + box.Comment = n + case *BlockComment: + box.BlockComment = n + case *Substitution: + box.Substitution = n + case *Key: + box.MapKey = n + } + return box +} + +func (mb MapNodeBox) Unbox() MapNode { + switch { + case mb.Comment != nil: + return mb.Comment + case mb.BlockComment != nil: + return mb.BlockComment + case mb.Substitution != nil: + return mb.Substitution + case mb.MapKey != nil: + return mb.MapKey + default: + return nil + } +} + +// ArrayNodeBox is used to box ArrayNode for JSON persistence. +type ArrayNodeBox struct { + Comment *Comment `json:"comment,omitempty"` + BlockComment *BlockComment `json:"block_comment,omitempty"` + Substitution *Substitution `json:"substitution,omitempty"` + Null *Null `json:"null,omitempty"` + Boolean *Boolean `json:"boolean,omitempty"` + Number *Number `json:"number,omitempty"` + UnquotedString *UnquotedString `json:"unquoted_string,omitempty"` + DoubleQuotedString *DoubleQuotedString `json:"double_quoted_string,omitempty"` + SingleQuotedString *SingleQuotedString `json:"single_quoted_string,omitempty"` + BlockString *BlockString `json:"block_string,omitempty"` + Array *Array `json:"array,omitempty"` + Map *Map `json:"map,omitempty"` +} + +func (ab ArrayNodeBox) Unbox() ArrayNode { + switch { + case ab.Comment != nil: + return ab.Comment + case ab.BlockComment != nil: + return ab.BlockComment + case ab.Substitution != nil: + return ab.Substitution + case ab.Null != nil: + return ab.Null + case ab.Boolean != nil: + return ab.Boolean + case ab.Number != nil: + return ab.Number + case ab.UnquotedString != nil: + return ab.UnquotedString + case ab.DoubleQuotedString != nil: + return ab.DoubleQuotedString + case ab.SingleQuotedString != nil: + return ab.SingleQuotedString + case ab.BlockString != nil: + return ab.BlockString + case ab.Array != nil: + return ab.Array + case ab.Map != nil: + return ab.Map + default: + return nil + } +} + +// ValueBox is used to box Value for JSON persistence. +type ValueBox struct { + Null *Null `json:"null,omitempty"` + Boolean *Boolean `json:"boolean,omitempty"` + Number *Number `json:"number,omitempty"` + UnquotedString *UnquotedString `json:"unquoted_string,omitempty"` + DoubleQuotedString *DoubleQuotedString `json:"double_quoted_string,omitempty"` + SingleQuotedString *SingleQuotedString `json:"single_quoted_string,omitempty"` + BlockString *BlockString `json:"block_string,omitempty"` + Array *Array `json:"array,omitempty"` + Map *Map `json:"map,omitempty"` +} + +func (vb ValueBox) Unbox() Value { + switch { + case vb.Null != nil: + return vb.Null + case vb.Boolean != nil: + return vb.Boolean + case vb.Number != nil: + return vb.Number + case vb.UnquotedString != nil: + return vb.UnquotedString + case vb.DoubleQuotedString != nil: + return vb.DoubleQuotedString + case vb.SingleQuotedString != nil: + return vb.SingleQuotedString + case vb.BlockString != nil: + return vb.BlockString + case vb.Array != nil: + return vb.Array + case vb.Map != nil: + return vb.Map + default: + return nil + } +} + +func MakeValueBox(v Value) ValueBox { + var vb ValueBox + switch v := v.(type) { + case *Null: + vb.Null = v + case *Boolean: + vb.Boolean = v + case *Number: + vb.Number = v + case *UnquotedString: + vb.UnquotedString = v + case *DoubleQuotedString: + vb.DoubleQuotedString = v + case *SingleQuotedString: + vb.SingleQuotedString = v + case *BlockString: + vb.BlockString = v + case *Array: + vb.Array = v + case *Map: + vb.Map = v + } + return vb +} + +func (vb ValueBox) ScalarBox() ScalarBox { + var sb ScalarBox + sb.Null = vb.Null + sb.Boolean = vb.Boolean + sb.Number = vb.Number + sb.UnquotedString = vb.UnquotedString + sb.DoubleQuotedString = vb.DoubleQuotedString + sb.SingleQuotedString = vb.SingleQuotedString + sb.BlockString = vb.BlockString + return sb +} + +func (vb ValueBox) StringBox() *StringBox { + var sb StringBox + sb.UnquotedString = vb.UnquotedString + sb.DoubleQuotedString = vb.DoubleQuotedString + sb.SingleQuotedString = vb.SingleQuotedString + sb.BlockString = vb.BlockString + return &sb +} + +// ScalarBox is used to box Scalar for JSON persistence. +// TODO: implement ScalarString() +type ScalarBox struct { + Null *Null `json:"null,omitempty"` + Boolean *Boolean `json:"boolean,omitempty"` + Number *Number `json:"number,omitempty"` + UnquotedString *UnquotedString `json:"unquoted_string,omitempty"` + DoubleQuotedString *DoubleQuotedString `json:"double_quoted_string,omitempty"` + SingleQuotedString *SingleQuotedString `json:"single_quoted_string,omitempty"` + BlockString *BlockString `json:"block_string,omitempty"` +} + +func (sb ScalarBox) Unbox() Scalar { + switch { + case sb.Null != nil: + return sb.Null + case sb.Boolean != nil: + return sb.Boolean + case sb.Number != nil: + return sb.Number + case sb.UnquotedString != nil: + return sb.UnquotedString + case sb.DoubleQuotedString != nil: + return sb.DoubleQuotedString + case sb.SingleQuotedString != nil: + return sb.SingleQuotedString + case sb.BlockString != nil: + return sb.BlockString + default: + return nil + } +} + +// StringBox is used to box String for JSON persistence. +type StringBox struct { + UnquotedString *UnquotedString `json:"unquoted_string,omitempty"` + DoubleQuotedString *DoubleQuotedString `json:"double_quoted_string,omitempty"` + SingleQuotedString *SingleQuotedString `json:"single_quoted_string,omitempty"` + BlockString *BlockString `json:"block_string,omitempty"` +} + +func (sb *StringBox) Unbox() String { + switch { + case sb.UnquotedString != nil: + return sb.UnquotedString + case sb.DoubleQuotedString != nil: + return sb.DoubleQuotedString + case sb.SingleQuotedString != nil: + return sb.SingleQuotedString + case sb.BlockString != nil: + return sb.BlockString + default: + return nil + } +} + +// InterpolationBox is used to select between strings and substitutions in unquoted and +// double quoted strings. There is no corresponding interface to avoid unnecessary +// abstraction. +type InterpolationBox struct { + String *string `json:"string,omitempty"` + StringRaw *string `json:"raw_string,omitempty"` + Substitution *Substitution `json:"substitution,omitempty"` +} + +// & is only special if it begins a key. +// - is only special if followed by another - in a key. +// ' " and | are only special if they begin an unquoted key or value. +var UnquotedKeySpecials = string([]rune{'#', ';', '\n', '\\', '{', '}', '[', ']', '\'', '"', '|', ':', '.', '-', '<', '>', '*', '&', '(', ')'}) +var UnquotedValueSpecials = string([]rune{'#', ';', '\n', '\\', '{', '}', '[', ']', '\'', '"', '|', '$'}) + +// RawString returns s in a AST String node that can format s in the most aesthetically +// pleasing way. +// TODO: Return StringBox +func RawString(s string, inKey bool) String { + if s == "" { + return FlatDoubleQuotedString(s) + } + + if inKey { + for i, r := range s { + switch r { + case '-': + if i+1 < len(s) && s[i+1] != '-' { + continue + } + case '&': + if i > 0 { + continue + } + } + if strings.ContainsRune(UnquotedKeySpecials, r) { + if !strings.ContainsRune(s, '"') { + return FlatDoubleQuotedString(s) + } + if strings.ContainsRune(s, '\n') { + return FlatDoubleQuotedString(s) + } + return &SingleQuotedString{Value: s} + } + } + } else if s == "null" || strings.ContainsAny(s, UnquotedValueSpecials) { + if !strings.ContainsRune(s, '"') && !strings.ContainsRune(s, '$') { + return FlatDoubleQuotedString(s) + } + if strings.ContainsRune(s, '\n') { + return FlatDoubleQuotedString(s) + } + return &SingleQuotedString{Value: s} + } + + if hasSurroundingWhitespace(s) { + return FlatDoubleQuotedString(s) + } + + return FlatUnquotedString(s) +} + +func hasSurroundingWhitespace(s string) bool { + r, _ := utf8.DecodeRuneInString(s) + r2, _ := utf8.DecodeLastRuneInString(s) + return unicode.IsSpace(r) || unicode.IsSpace(r2) +} diff --git a/d2ast/d2ast_test.go b/d2ast/d2ast_test.go new file mode 100644 index 000000000..883a68018 --- /dev/null +++ b/d2ast/d2ast_test.go @@ -0,0 +1,813 @@ +package d2ast_test + +import ( + "encoding/json" + "math/big" + math_rand "math/rand" + "reflect" + "strconv" + "strings" + "testing" + + "oss.terrastruct.com/xrand" + + "oss.terrastruct.com/diff" + + "oss.terrastruct.com/d2/d2ast" + "oss.terrastruct.com/d2/d2format" + "oss.terrastruct.com/d2/d2parser" + "oss.terrastruct.com/d2/lib/go2" +) + +func TestRange(t *testing.T) { + t.Parallel() + + t.Run("String", func(t *testing.T) { + t.Parallel() + + testCases := []struct { + name string + r d2ast.Range + exp string + }{ + { + name: "one_byte", + r: d2ast.Range{ + Path: "/src/example.go", + Start: d2ast.Position{ + Line: 10, + Column: 5, + Byte: 100, + }, + End: d2ast.Position{ + Line: 10, + Column: 6, + Byte: 100, + }, + }, + exp: "/src/example.go:11:6", + }, + { + name: "more_than_one_byte", + r: d2ast.Range{ + Path: "/src/example.go", + Start: d2ast.Position{ + Line: 10, + Column: 5, + Byte: 100, + }, + End: d2ast.Position{ + Line: 10, + Column: 7, + Byte: 101, + }, + }, + exp: "/src/example.go:11:6", + }, + { + name: "empty_path", + r: d2ast.Range{ + Start: d2ast.Position{ + Line: 10, + Column: 5, + Byte: 100, + }, + End: d2ast.Position{ + Line: 10, + Column: 7, + Byte: 101, + }, + }, + exp: "11:6", + }, + { + name: "start_equal_end", + r: d2ast.Range{ + Start: d2ast.Position{ + Line: 10, + Column: 5, + Byte: 100, + }, + End: d2ast.Position{ + Line: 10, + Column: 5, + Byte: 100, + }, + }, + exp: "11:6", + }, + } + + for _, tc := range testCases { + tc := tc + t.Run(tc.name, func(t *testing.T) { + t.Parallel() + + if tc.exp != tc.r.String() { + t.Fatalf("expected %q but got %q", tc.exp, tc.r.String()) + } + }) + } + }) + + t.Run("UnmarshalText", func(t *testing.T) { + t.Parallel() + + testCases := []struct { + name string + in string + + exp d2ast.Range + + errmsg string + }{ + { + name: "success", + in: `"json_test.d2,1:1:0-5:1:50"`, + exp: d2ast.Range{Path: "json_test.d2", Start: d2ast.Position{Line: 1, Column: 1, Byte: 0}, End: d2ast.Position{Line: 5, Column: 1, Byte: 50}}, + }, + { + name: "err1", + in: `"json_test.d2-5:1:50"`, + errmsg: "missing Start field", + }, + { + name: "err2", + in: `"json_test.d2"`, + errmsg: "missing End field", + }, + { + name: "err3", + in: `"json_test.d2,1:1:0-5:150"`, + errmsg: "expected three fields", + }, + { + name: "err4", + in: `"json_test.d2,1:10-5:1:50"`, + errmsg: "expected three fields", + }, + { + name: "err5", + in: `"json_test.d2,a:1:0-5:1:50"`, + errmsg: `strconv.Atoi: parsing "a": invalid syntax`, + }, + { + name: "err6", + in: `"json_test.d2,1:c:0-5:1:50"`, + errmsg: `strconv.Atoi: parsing "c": invalid syntax`, + }, + } + + for _, tc := range testCases { + tc := tc + t.Run(tc.name, func(t *testing.T) { + t.Parallel() + + var r d2ast.Range + err := json.Unmarshal([]byte(tc.in), &r) + + if tc.errmsg != "" { + if err == nil { + t.Fatalf("expected error: %#v", err) + } + if !strings.Contains(err.Error(), tc.errmsg) { + t.Fatalf("error message does not contain %q: %q", tc.errmsg, err.Error()) + } + } else { + if err != nil { + t.Fatal(err) + } + if !reflect.DeepEqual(tc.exp, r) { + t.Fatalf("expected %#v but got %#v", tc.exp, r) + } + } + }) + } + }) + + t.Run("Advance", func(t *testing.T) { + t.Parallel() + + t.Run("UTF-8", func(t *testing.T) { + t.Parallel() + + var p d2ast.Position + p = p.Advance('a', false) + diff.AssertJSONEq(t, `"0:1:1"`, p) + p = p.Advance('\n', false) + diff.AssertJSONEq(t, `"1:0:2"`, p) + p = p.Advance('è', false) + diff.AssertJSONEq(t, `"1:2:4"`, p) + p = p.Advance('𐀀', false) + diff.AssertJSONEq(t, `"1:6:8"`, p) + + p = p.Subtract('𐀀', false) + diff.AssertJSONEq(t, `"1:2:4"`, p) + p = p.Subtract('è', false) + diff.AssertJSONEq(t, `"1:0:2"`, p) + }) + + t.Run("UTF-16", func(t *testing.T) { + t.Parallel() + + var p d2ast.Position + p = p.Advance('a', true) + diff.AssertJSONEq(t, `"0:1:1"`, p) + p = p.Advance('\n', true) + diff.AssertJSONEq(t, `"1:0:2"`, p) + p = p.Advance('è', true) + diff.AssertJSONEq(t, `"1:1:3"`, p) + p = p.Advance('𐀀', true) + diff.AssertJSONEq(t, `"1:3:5"`, p) + + p = p.Subtract('𐀀', true) + diff.AssertJSONEq(t, `"1:1:3"`, p) + p = p.Subtract('è', true) + diff.AssertJSONEq(t, `"1:0:2"`, p) + }) + }) +} + +func TestJSON(t *testing.T) { + t.Parallel() + + m := &d2ast.Map{ + Range: d2ast.Range{Path: "json_test.d2", Start: d2ast.Position{Line: 0, Column: 0, Byte: 0}, End: d2ast.Position{Line: 5, Column: 1, Byte: 50}}, + + Nodes: []d2ast.MapNodeBox{ + { + Comment: &d2ast.Comment{ + Value: `America was discovered by Amerigo Vespucci and was named after him, until +people got tired of living in a place called "Vespuccia" and changed its +name to "America". + -- Mike Harding, "The Armchair Anarchist's Almanac"`, + }, + }, + { + BlockComment: &d2ast.BlockComment{ + Value: `America was discovered by Amerigo Vespucci and was named after him, until +people got tired of living in a place called "Vespuccia" and changed its +name to "America". + -- Mike Harding, "The Armchair Anarchist's Almanac"`, + }, + }, + { + Substitution: &d2ast.Substitution{ + Spread: true, + Path: []*d2ast.StringBox{ + { + BlockString: &d2ast.BlockString{ + Quote: "|", + Tag: "text", + Value: `America was discovered by Amerigo Vespucci and was named after him, until + people got tired of living in a place called "Vespuccia" and changed its + name to "America". + -- Mike Harding, "The Armchair Anarchist's Almanac"`, + }, + }, + }, + }, + }, + { + MapKey: &d2ast.Key{ + Ampersand: true, + + Key: &d2ast.KeyPath{ + Path: []*d2ast.StringBox{ + { + SingleQuotedString: &d2ast.SingleQuotedString{ + Value: "before edges", + }, + }, + }, + }, + + Edges: []*d2ast.Edge{ + { + Src: &d2ast.KeyPath{ + Path: []*d2ast.StringBox{ + { + SingleQuotedString: &d2ast.SingleQuotedString{ + Value: "src", + }, + }, + }, + }, + SrcArrow: "*", + + Dst: &d2ast.KeyPath{ + Path: []*d2ast.StringBox{ + { + SingleQuotedString: &d2ast.SingleQuotedString{ + Value: "dst", + }, + }, + }, + }, + DstArrow: ">", + }, + { + Src: &d2ast.KeyPath{ + Path: []*d2ast.StringBox{ + { + SingleQuotedString: &d2ast.SingleQuotedString{ + Value: "dst", + }, + }, + }, + }, + + Dst: &d2ast.KeyPath{ + Path: []*d2ast.StringBox{ + { + SingleQuotedString: &d2ast.SingleQuotedString{ + Value: "dst2", + }, + }, + }, + }, + }, + }, + + EdgeIndex: &d2ast.EdgeIndex{ + Glob: true, + }, + + EdgeKey: &d2ast.KeyPath{ + Path: []*d2ast.StringBox{ + { + SingleQuotedString: &d2ast.SingleQuotedString{ + Value: "after edges", + }, + }, + }, + }, + + Primary: d2ast.ScalarBox{ + Null: &d2ast.Null{}, + }, + + Value: d2ast.ValueBox{ + Array: &d2ast.Array{ + Nodes: []d2ast.ArrayNodeBox{ + { + Boolean: &d2ast.Boolean{ + Value: true, + }, + }, + { + Number: &d2ast.Number{ + Raw: "0xFF", + Value: big.NewRat(15, 1), + }, + }, + { + UnquotedString: &d2ast.UnquotedString{ + Value: []d2ast.InterpolationBox{ + { + String: go2.Pointer("no quotes needed"), + }, + }, + }, + }, + { + UnquotedString: &d2ast.UnquotedString{ + Value: []d2ast.InterpolationBox{ + { + Substitution: &d2ast.Substitution{}, + }, + }, + }, + }, + { + DoubleQuotedString: &d2ast.DoubleQuotedString{ + Value: []d2ast.InterpolationBox{ + { + String: go2.Pointer("no quotes needed"), + }, + }, + }, + }, + { + SingleQuotedString: &d2ast.SingleQuotedString{ + Value: "rawr", + }, + }, + { + BlockString: &d2ast.BlockString{ + Quote: "|", + Tag: "text", + Value: `America was discovered by Amerigo Vespucci and was named after him, until + people got tired of living in a place called "Vespuccia" and changed its + name to "America". + -- Mike Harding, "The Armchair Anarchist's Almanac"`, + }, + }, + }, + }, + }, + }, + }, + }, + } + + diff.AssertJSONEq(t, `{ + "range": "json_test.d2,0:0:0-5:1:50", + "nodes": [ + { + "comment": { + "range": ",0:0:0-0:0:0", + "value": "America was discovered by Amerigo Vespucci and was named after him, until\npeople got tired of living in a place called \"Vespuccia\" and changed its\nname to \"America\".\n\t\t-- Mike Harding, \"The Armchair Anarchist's Almanac\"" + } + }, + { + "block_comment": { + "range": ",0:0:0-0:0:0", + "value": "America was discovered by Amerigo Vespucci and was named after him, until\npeople got tired of living in a place called \"Vespuccia\" and changed its\nname to \"America\".\n\t\t-- Mike Harding, \"The Armchair Anarchist's Almanac\"" + } + }, + { + "substitution": { + "range": ",0:0:0-0:0:0", + "spread": true, + "path": [ + { + "block_string": { + "range": ",0:0:0-0:0:0", + "quote": "|", + "tag": "text", + "value": "America was discovered by Amerigo Vespucci and was named after him, until\n\tpeople got tired of living in a place called \"Vespuccia\" and changed its\n\tname to \"America\".\n\t-- Mike Harding, \"The Armchair Anarchist's Almanac\"" + } + } + ] + } + }, + { + "map_key": { + "range": ",0:0:0-0:0:0", + "ampersand": true, + "key": { + "range": ",0:0:0-0:0:0", + "path": [ + { + "single_quoted_string": { + "range": ",0:0:0-0:0:0", + "raw": "", + "value": "before edges" + } + } + ] + }, + "edges": [ + { + "range": ",0:0:0-0:0:0", + "src": { + "range": ",0:0:0-0:0:0", + "path": [ + { + "single_quoted_string": { + "range": ",0:0:0-0:0:0", + "raw": "", + "value": "src" + } + } + ] + }, + "src_arrow": "*", + "dst": { + "range": ",0:0:0-0:0:0", + "path": [ + { + "single_quoted_string": { + "range": ",0:0:0-0:0:0", + "raw": "", + "value": "dst" + } + } + ] + }, + "dst_arrow": ">" + }, + { + "range": ",0:0:0-0:0:0", + "src": { + "range": ",0:0:0-0:0:0", + "path": [ + { + "single_quoted_string": { + "range": ",0:0:0-0:0:0", + "raw": "", + "value": "dst" + } + } + ] + }, + "src_arrow": "", + "dst": { + "range": ",0:0:0-0:0:0", + "path": [ + { + "single_quoted_string": { + "range": ",0:0:0-0:0:0", + "raw": "", + "value": "dst2" + } + } + ] + }, + "dst_arrow": "" + } + ], + "edge_index": { + "range": ",0:0:0-0:0:0", + "int": null, + "glob": true + }, + "edge_key": { + "range": ",0:0:0-0:0:0", + "path": [ + { + "single_quoted_string": { + "range": ",0:0:0-0:0:0", + "raw": "", + "value": "after edges" + } + } + ] + }, + "primary": { + "null": { + "range": ",0:0:0-0:0:0" + } + }, + "value": { + "array": { + "range": ",0:0:0-0:0:0", + "nodes": [ + { + "boolean": { + "range": ",0:0:0-0:0:0", + "value": true + } + }, + { + "number": { + "range": ",0:0:0-0:0:0", + "raw": "0xFF", + "value": "15" + } + }, + { + "unquoted_string": { + "range": ",0:0:0-0:0:0", + "value": [ + { + "string": "no quotes needed" + } + ] + } + }, + { + "unquoted_string": { + "range": ",0:0:0-0:0:0", + "value": [ + { + "substitution": { + "range": ",0:0:0-0:0:0", + "spread": false, + "path": null + } + } + ] + } + }, + { + "double_quoted_string": { + "range": ",0:0:0-0:0:0", + "value": [ + { + "string": "no quotes needed" + } + ] + } + }, + { + "single_quoted_string": { + "range": ",0:0:0-0:0:0", + "raw": "", + "value": "rawr" + } + }, + { + "block_string": { + "range": ",0:0:0-0:0:0", + "quote": "|", + "tag": "text", + "value": "America was discovered by Amerigo Vespucci and was named after him, until\n\t\t\tpeople got tired of living in a place called \"Vespuccia\" and changed its\n\t\t\tname to \"America\".\n\t\t\t-- Mike Harding, \"The Armchair Anarchist's Almanac\"" + } + } + ] + } + } + } + } + ] +}`, m) +} + +func testRawStringKey(t *testing.T, key string) { + ast := d2ast.RawString(key, true) + enc := d2format.Format(ast) + k, err := d2parser.ParseKey(enc) + if err != nil { + t.Fatal(err) + } + if len(k.Path) != 1 { + t.Fatalf("unexpected key length: %#v", k.Path) + } + err = diff.Runes(key, k.Path[0].Unbox().ScalarString()) + if err != nil { + t.Fatal(err) + } +} + +func testRawStringValue(t *testing.T, value string) { + ast := d2ast.RawString(value, false) + enc := d2format.Format(ast) + v, err := d2parser.ParseValue(enc) + if err != nil { + t.Fatal(err) + } + ps, ok := v.(d2ast.Scalar) + if !ok { + t.Fatalf("unexpected value type: %#v", v) + } + err = diff.Runes(value, ps.ScalarString()) + if err != nil { + t.Fatal(err) + } +} + +func TestRawString(t *testing.T) { + t.Parallel() + + t.Run("chaos", func(t *testing.T) { + t.Parallel() + + t.Run("pinned", func(t *testing.T) { + t.Parallel() + + pinnedTestCases := []struct { + name string + str string + }{ + { + name: "1", + str: "\U000b64cd\U0008b732\U0009632c\U000983f8\U000f42d4\U000c4749\U00041723\uf584蝉\U00100cd5\U0003325d\U0003e4d2\U0007ff0e\U000e03d8\U000b0431\U00042053\U0001b3ea𠒹\U0006d9cf\U000c5b1c\U00019a3c\U000f3c3d\U0004acedଶ\U0009da18\U0001a0bb\U000b6bfd\U00015ebd\U00088c5a녈\U00078277\U000eaa58\U0009266b\U000d85ae\U000d6ce8譊𣱡\U0008ac84\U000a722f\U000d3d35\U00072581\U000c3423\U000a1753\U00082014\U0001bde6\U0010bf47炏\U000423fa\U0007df70\U00088aaf\U00074e5e\U000ee80b\U000e3d53\U0003f542\U0001ad9f\U00031408\U000cce7e\U00082172\u202f", + }, + { + name: "2", + str: "'\"Tc\U000d148d\U000dd61a\U0007cf68OO\U000b87a9\U000c073a\U000e7828n\U00068a9fc\U0004fbf5\x041\\'''", + }, + { + name: "3", + str: "\r\U00057d53\x01'\U00042e5a\U0007be73T\U000fb916\x01\U000e0e4afL]\U000474d1\x15\U00083bc0\fbT\ue09bs{vP\U000b3d33\x0f\U0007ad13\x10\U00098b38\x1d\U000cf9da\n ", + }, + } + for _, tc := range pinnedTestCases { + tc := tc + t.Run(tc.name, func(t *testing.T) { + t.Parallel() + + t.Run("key", func(t *testing.T) { + t.Parallel() + testRawStringKey(t, tc.str) + }) + + t.Run("value", func(t *testing.T) { + t.Parallel() + testRawStringValue(t, tc.str) + }) + }) + } + }) + + for i := 0; i < 1000; i++ { + i := i + t.Run(strconv.Itoa(i), func(t *testing.T) { + t.Parallel() + + s := xrand.String(math_rand.Intn(99), nil) + t.Logf("testing: %q", s) + + t.Run("key", func(t *testing.T) { + t.Parallel() + testRawStringKey(t, s) + }) + + t.Run("value", func(t *testing.T) { + t.Parallel() + testRawStringValue(t, s) + }) + }) + } + }) + + testCases := []struct { + name string + str string + exp string + inKey bool + }{ + { + name: "empty", + str: ``, + exp: `""`, + }, + { + name: "null", + str: `null`, + exp: `"null"`, + }, + { + name: "simple", + str: `wearisome_condition_of_humanity`, + exp: `wearisome_condition_of_humanity`, + }, + { + name: "specials_double", + str: `'#;#;#'`, + exp: `"'#;#;#'"`, + }, + { + name: "specials_single_quote", + str: `"cambridge"`, + exp: `'"cambridge"'`, + }, + { + name: "specials_single_dollar", + str: `$bingo`, + exp: `'$bingo'`, + }, + { + name: "not_key_specials", + str: `------`, + exp: `------`, + }, + { + name: "key_specials_double", + str: `-----`, + exp: `"-----"`, + inKey: true, + }, + { + name: "key_specials_single", + str: `"cambridge"`, + exp: `'"cambridge"'`, + inKey: true, + }, + { + name: "key_specials_unquoted", + str: `square-2`, + exp: `square-2`, + inKey: true, + }, + { + name: "multiline", + str: `||||yes +yes +yes +yes +||||`, + exp: `"||||yes\nyes\nyes\nyes\n||||"`, + inKey: true, + }, + { + name: "leading_whitespace", + str: ` yoho_park `, + exp: `" yoho_park "`, + }, + { + name: "leading_whitespace_newlines", + str: ` yoho +_park `, + exp: `" yoho\n_park "`, + }, + { + name: "leading_space_double_quotes_and_newlines", + str: ` "yoho" +_park `, + exp: `" \"yoho\"\n_park "`, + }, + } + + for _, tc := range testCases { + tc := tc + t.Run(tc.name, func(t *testing.T) { + t.Parallel() + + ast := d2ast.RawString(tc.str, tc.inKey) + diff.AssertStringEq(t, tc.exp, d2format.Format(ast)) + }) + } +} diff --git a/d2ast/error.go b/d2ast/error.go new file mode 100644 index 000000000..86da800a9 --- /dev/null +++ b/d2ast/error.go @@ -0,0 +1,15 @@ +package d2ast + +// TODO: Right now this is here to be available in both the Parser and Compiler but +// eventually we should make this a real part of the AST so that autofmt works on +// files with parse errors and semantically it makes more sense. +// Compile would continue to maintain a separate set of errors and then we'd do a +// merge & sort to get the final list of errors for user display. +type Error struct { + Range Range `json:"range"` + Message string `json:"errmsg"` +} + +func (e Error) Error() string { + return e.Message +} diff --git a/d2chaos/d2chaos.go b/d2chaos/d2chaos.go new file mode 100644 index 000000000..56b8c40b4 --- /dev/null +++ b/d2chaos/d2chaos.go @@ -0,0 +1,259 @@ +package d2chaos + +import ( + "fmt" + mathrand "math/rand" + "strings" + "time" + + "oss.terrastruct.com/d2/d2ast" + "oss.terrastruct.com/d2/d2format" + "oss.terrastruct.com/d2/d2graph" + "oss.terrastruct.com/d2/d2oracle" + "oss.terrastruct.com/d2/d2target" + "oss.terrastruct.com/d2/lib/go2" +) + +func GenDSL(maxi int) (_ string, err error) { + gs := &dslGenState{ + rand: mathrand.New(mathrand.NewSource(time.Now().UnixNano())), + g: d2graph.NewGraph(&d2ast.Map{}), + nodeShapes: make(map[string]string), + } + err = gs.gen(maxi) + if err != nil { + return "", err + } + return d2format.Format(gs.g.AST), nil +} + +type dslGenState struct { + rand *mathrand.Rand + g *d2graph.Graph + + nodesArr []string + nodeShapes map[string]string +} + +func (gs *dslGenState) gen(maxi int) error { + maxi = gs.rand.Intn(maxi) + 1 + + for i := 0; i < maxi; i++ { + switch gs.roll(25, 75) { + case 0: + // 25% chance of creating a new node. + err := gs.node() + if err != nil { + return err + } + case 1: + // 75% chance of connecting two random nodes with a random label. + err := gs.edge() + if err != nil { + return err + } + } + } + return nil +} + +func (gs *dslGenState) genNode(containerID string) (string, error) { + nodeID := gs.randStr(32, true) + if containerID != "" { + nodeID = containerID + "." + nodeID + } + var err error + gs.g, nodeID, err = d2oracle.Create(gs.g, nodeID) + if err != nil { + return "", err + } + gs.nodesArr = append(gs.nodesArr, nodeID) + gs.nodeShapes[nodeID] = "square" + return nodeID, nil +} + +func (gs *dslGenState) node() error { + containerID := "" + var err error + if gs.roll(25, 75) == 1 { + // 75% chance of creating this as a child under a container. + containerID, err = gs.randContainer() + if err != nil { + return err + } + } + + nodeID, err := gs.genNode(containerID) + if err != nil { + return err + } + + if gs.roll(25, 75) == 0 { + // 25% chance of adding a label. + gs.g, err = d2oracle.Set(gs.g, nodeID, nil, go2.Pointer(gs.randStr(256, false))) + if err != nil { + return err + } + } + + if gs.roll(25, 75) == 1 { + // 75% chance of adding a shape. + randShape := gs.randShape() + gs.g, err = d2oracle.Set(gs.g, nodeID+".shape", nil, go2.Pointer(randShape)) + if err != nil { + return err + } + gs.nodeShapes[nodeID] = randShape + } + + return nil +} + +func (gs *dslGenState) edge() error { + var src string + var dst string + var err error + for { + src, err = gs.randNode() + if err != nil { + return err + } + dst, err = gs.randNode() + if err != nil { + return err + } + if src != dst { + break + } + err = gs.node() + if err != nil { + return err + } + } + + srcArrow := "-" + if gs.randBool() { + srcArrow = "<" + } + dstArrow := "-" + if gs.randBool() { + dstArrow = ">" + if srcArrow == "<" { + dstArrow = "->" + } + } + + key := fmt.Sprintf("%s %s%s %s", src, srcArrow, dstArrow, dst) + gs.g, key, err = d2oracle.Create(gs.g, key) + if err != nil { + return err + } + if gs.randBool() { + gs.g, err = d2oracle.Set(gs.g, key, nil, go2.Pointer(gs.randStr(128, false))) + if err != nil { + return err + } + } + return nil +} + +func (gs *dslGenState) randContainer() (string, error) { + containers := go2.Filter(gs.nodesArr, func(x string) bool { + shape := gs.nodeShapes[x] + return shape != "image" && + shape != "code" && + shape != "sql_table" && + shape != "text" && + shape != "class" + }) + if len(containers) == 0 { + return "", nil + } + return containers[gs.rand.Intn(len(containers))], nil +} + +func (gs *dslGenState) randNode() (string, error) { + if len(gs.nodesArr) == 0 { + return gs.genNode("") + } + return gs.nodesArr[gs.rand.Intn(len(gs.nodesArr))], nil +} + +func (gs *dslGenState) randBool() bool { + return gs.rand.Intn(2) == 0 +} + +// TODO go back to using xrand.String, currently some incompatibility with +// stuffing these strings into a script for dagre +func randRune() rune { + if mathrand.Int31n(100) == 0 { + // Generate newline 1% of the time. + return '\n' + } + return mathrand.Int31n(128) + 1 +} + +func String(n int, exclude []rune) string { + var b strings.Builder + for i := 0; i < n; i++ { + r := randRune() + excluded := false + for _, xr := range exclude { + if r == xr { + excluded = true + break + } + } + if excluded { + i-- + continue + } + b.WriteRune(r) + } + return b.String() +} + +func (gs *dslGenState) randStr(n int, inKey bool) string { + // Underscores have semantic meaning (parent) + // Backticks are for opening and closing these strings + // Curly braces can trigger templating + // \\ triggers octal sequences + s := String(gs.rand.Intn(n), []rune{ + rune('_'), + rune('`'), + rune('}'), + rune('{'), + rune('\\'), + }) + as := d2ast.RawString(s, inKey) + return d2format.Format(as) +} + +func (gs *dslGenState) randShape() string { + for { + s := shapes[gs.rand.Intn(len(shapes))] + if s != "image" { + return s + } + } +} + +func (gs *dslGenState) roll(probs ...int) int { + max := 0 + for _, p := range probs { + max += p + } + + n := gs.rand.Intn(max) + var acc int + for i, p := range probs { + if n >= acc && n < acc+p { + return i + } + acc += p + } + + panic("d2chaos: unreachable") +} + +var shapes = d2target.Shapes diff --git a/d2chaos/d2chaos_test.go b/d2chaos/d2chaos_test.go new file mode 100644 index 000000000..a73af4d8d --- /dev/null +++ b/d2chaos/d2chaos_test.go @@ -0,0 +1,183 @@ +package d2chaos_test + +import ( + "context" + "fmt" + "io/ioutil" + "os" + "path/filepath" + "runtime/debug" + "strconv" + "strings" + "testing" + + "github.com/stretchr/testify/assert" + + "oss.terrastruct.com/d2/d2chaos" + "oss.terrastruct.com/d2/d2compiler" + "oss.terrastruct.com/d2/d2exporter" + "oss.terrastruct.com/d2/d2layouts/d2dagrelayout" + "oss.terrastruct.com/d2/d2renderers/textmeasure" + "oss.terrastruct.com/d2/lib/log" +) + +// usage: D2_CHAOS_MAXI=100 D2_CHAOS_N=100 ./ci/test.sh ./d2chaos +// +// D2_CHAOS_MAXI controls the number of iterations that the dsl generator +// should go through to generate each input D2. It's roughly equivalent to +// the complexity level of each input D2. +// +// D2_CHAOS_N controls the number of D2 texts to generate and run the full +// D2 flow on. +// +// All generated texts are stored in ./out/.d2 and also ./out/.d2.goenc +// The goenc version is the text encoded as a Go string. It lets you replay +// a test by adding it to testPinned below as you can just copy paste the go +// string in. +// +// If D2Chaos fails on CI and you need to investigate the input text that caused the +// failure, all generated texts will be available in the d2chaos-test and d2chaos-race +// github actions artifacts. +func TestD2Chaos(t *testing.T) { + t.Parallel() + + const outDir = "out" + err := os.MkdirAll(outDir, 0755) + if err != nil { + t.Fatal(err) + } + t.Logf("writing generated files to %s", outDir) + + t.Run("pinned", func(t *testing.T) { + testPinned(t, outDir) + }) + + n := 1 + if os.Getenv("D2_CHAOS_N") != "" { + envn, err := strconv.Atoi(os.Getenv("D2_CHAOS_N")) + if err != nil { + t.Errorf("failed to atoi $D2_CHAOS_N: %v", err) + } else { + n = envn + } + } + + maxi := 10 + if os.Getenv("D2_CHAOS_MAXI") != "" { + envMaxi, err := strconv.Atoi(os.Getenv("D2_CHAOS_MAXI")) + if err != nil { + t.Errorf("failed to atoi $D2_CHAOS_MAXI: %v", err) + } else { + maxi = envMaxi + } + } + + for i := 0; i < n; i++ { + i := i + t.Run("", func(t *testing.T) { + t.Parallel() + + text, err := d2chaos.GenDSL(maxi) + if err != nil { + t.Fatal(err) + } + + textPath := filepath.Join(outDir, fmt.Sprintf("%d.d2", i)) + test(t, textPath, text) + }) + } +} + +func test(t *testing.T, textPath, text string) { + t.Logf("writing d2 to %v (%d bytes)", textPath, len(text)) + err := ioutil.WriteFile(textPath, []byte(text), 0644) + if err != nil { + t.Fatal(err) + } + + goencText := fmt.Sprintf("%#v", text) + t.Logf("writing d2.goenc to %v (%d bytes)", textPath+".goenc", len(goencText)) + err = ioutil.WriteFile(textPath+".goenc", []byte(goencText), 0644) + if err != nil { + t.Fatal(err) + } + + g, err := d2compiler.Compile("", strings.NewReader(text), nil) + if err != nil { + t.Fatal(err) + } + + t.Run("layout", func(t *testing.T) { + defer func() { + r := recover() + if r != nil { + t.Errorf("recovered layout engine panic: %#v\n%s", r, debug.Stack()) + } + }() + + ctx := log.WithTB(context.Background(), t, nil) + + ruler, err := textmeasure.NewRuler() + assert.Nil(t, err) + + err = g.SetDimensions(nil, ruler) + assert.Nil(t, err) + + err = d2dagrelayout.Layout(ctx, g) + if err != nil { + t.Fatal(err) + } + + _, err = d2exporter.Export(ctx, g, 0) + if err != nil { + t.Fatal(err) + } + }) +} + +func testPinned(t *testing.T, outDir string) { + t.Parallel() + + outDir = filepath.Join(outDir, t.Name()) + err := os.MkdirAll(outDir, 0755) + if err != nil { + t.Fatal(err) + } + t.Logf("writing generated files to %v", outDir) + + testCases := []struct { + name string + text string + }{ + { + name: "internal class edge", + text: "a: {\n shape: class\n b -> c\n }", + }, + { + name: "table edge order", + text: "B: {shape: sql_table}\n B.C -- D\n B.C -- D\n D -- B.C\n B -- D\n A -- D", + }, + { + name: "child to container edge", + text: "a.b -> a", + }, + { + name: "sequence", + text: "a: {shape: step}\nb: {shape: step}\na -> b\n", + }, + { + name: "orientation", + text: "a: {\n b\n c\n }\n a <- a.c\n a.b -> a\n", + }, + } + + for _, tc := range testCases { + tc := tc + t.Run(tc.name, func(t *testing.T) { + t.Parallel() + + textPath := filepath.Join(outDir, fmt.Sprintf("%s.d2", tc.name)) + test(t, textPath, tc.text) + }) + } +} diff --git a/d2compiler/compile.go b/d2compiler/compile.go new file mode 100644 index 000000000..895b86d75 --- /dev/null +++ b/d2compiler/compile.go @@ -0,0 +1,850 @@ +package d2compiler + +import ( + "errors" + "fmt" + "io" + "net/url" + "strconv" + "strings" + + "oss.terrastruct.com/d2/d2ast" + "oss.terrastruct.com/d2/d2format" + "oss.terrastruct.com/d2/d2graph" + "oss.terrastruct.com/d2/d2parser" + "oss.terrastruct.com/d2/d2target" +) + +// TODO: should Parse even be exported? guess not. IR should contain list of files and +// their AST. +type CompileOptions struct { + UTF16 bool +} + +func Compile(path string, r io.RuneReader, opts *CompileOptions) (*d2graph.Graph, error) { + if opts == nil { + opts = &CompileOptions{} + } + + var pe d2parser.ParseError + + ast, err := d2parser.Parse(path, r, &d2parser.ParseOptions{ + UTF16: opts.UTF16, + }) + if err != nil { + if !errors.As(err, &pe) { + return nil, err + } + } + + return compileAST(path, pe, ast) +} + +func compileAST(path string, pe d2parser.ParseError, ast *d2ast.Map) (*d2graph.Graph, error) { + g := d2graph.NewGraph(ast) + + c := &compiler{ + path: path, + err: pe, + } + + c.compileKeys(g.Root, ast) + if len(c.err.Errors) == 0 { + c.validateKeys(g.Root, ast) + } + c.compileEdges(g.Root, ast) + // TODO: simplify removeContainer by running before compileEdges + c.compileShapes(g.Root) + c.validateNear(g) + + if len(c.err.Errors) > 0 { + return nil, c.err + } + return g, nil +} + +type compiler struct { + path string + err d2parser.ParseError +} + +func (c *compiler) errorf(start d2ast.Position, end d2ast.Position, f string, v ...interface{}) { + r := d2ast.Range{ + Path: c.path, + Start: start, + End: end, + } + f = "%v: " + f + v = append([]interface{}{r}, v...) + c.err.Errors = append(c.err.Errors, d2ast.Error{ + Range: r, + Message: fmt.Sprintf(f, v...), + }) +} + +func (c *compiler) compileKeys(obj *d2graph.Object, m *d2ast.Map) { + for _, n := range m.Nodes { + if n.MapKey != nil && n.MapKey.Key != nil && len(n.MapKey.Edges) == 0 { + c.compileKey(obj, m, n.MapKey) + } + } +} + +func (c *compiler) compileEdges(obj *d2graph.Object, m *d2ast.Map) { + for _, n := range m.Nodes { + if n.MapKey != nil { + if len(n.MapKey.Edges) > 0 { + obj := obj + if n.MapKey.Key != nil { + ida := d2graph.Key(n.MapKey.Key) + parent, resolvedIDA, err := d2graph.ResolveUnderscoreKey(ida, obj) + if err != nil { + c.errorf(n.MapKey.Range.Start, n.MapKey.Range.End, err.Error()) + return + } + unresolvedObj := obj + obj = parent.EnsureChild(resolvedIDA) + + parent.AppendReferences(ida, d2graph.Reference{ + Key: n.MapKey.Key, + + MapKey: n.MapKey, + Scope: m, + }, unresolvedObj) + } + c.compileEdgeMapKey(obj, m, n.MapKey) + } + if n.MapKey.Key != nil && n.MapKey.Value.Map != nil { + c.compileEdges(obj.EnsureChild(d2graph.Key(n.MapKey.Key)), n.MapKey.Value.Map) + } + } + } +} + +// compileArrowheads compiles keywords for edge arrowhead attributes by +// 1. creating a fake, detached parent +// 2. compiling the arrowhead field as a fake object onto that fake parent +// 3. transferring the relevant attributes onto the edge +func (c *compiler) compileArrowheads(edge *d2graph.Edge, m *d2ast.Map, mk *d2ast.Key) bool { + arrowheadKey := mk.Key + if mk.EdgeKey != nil { + arrowheadKey = mk.EdgeKey + } + if arrowheadKey == nil || len(arrowheadKey.Path) == 0 { + return false + } + key := arrowheadKey.Path[0].Unbox().ScalarString() + var field *d2graph.Attributes + if key == "source-arrowhead" { + if edge.SrcArrowhead == nil { + edge.SrcArrowhead = &d2graph.Attributes{} + } + field = edge.SrcArrowhead + } else if key == "target-arrowhead" { + if edge.DstArrowhead == nil { + edge.DstArrowhead = &d2graph.Attributes{} + } + field = edge.DstArrowhead + } else { + return false + } + fakeParent := &d2graph.Object{ + Children: make(map[string]*d2graph.Object), + } + detachedMK := &d2ast.Key{ + Key: arrowheadKey, + Primary: mk.Primary, + Value: mk.Value, + } + c.compileKey(fakeParent, m, detachedMK) + fakeObj := fakeParent.ChildrenArray[0] + c.compileShapes(fakeObj) + + if fakeObj.Attributes.Shape.Value != "" { + field.Shape = fakeObj.Attributes.Shape + } + if fakeObj.Attributes.Label.Value != "" && fakeObj.Attributes.Label.Value != "source-arrowhead" && fakeObj.Attributes.Label.Value != "target-arrowhead" { + field.Label = fakeObj.Attributes.Label + } + if fakeObj.Attributes.Style.Filled != nil { + field.Style.Filled = fakeObj.Attributes.Style.Filled + } + + return true +} + +func (c *compiler) compileAttributes(attrs *d2graph.Attributes, mk *d2ast.Key) { + var reserved string + var ok bool + + if mk.EdgeKey != nil { + _, reserved, ok = c.compileFlatKey(mk.EdgeKey) + } else if mk.Key != nil { + _, reserved, ok = c.compileFlatKey(mk.Key) + } + if !ok { + return + } + + if reserved == "" || reserved == "label" { + attrs.Label.MapKey = mk + } else if reserved == "shape" { + attrs.Shape.MapKey = mk + } else if reserved == "opacity" { + attrs.Style.Opacity = &d2graph.Scalar{MapKey: mk} + } else if reserved == "stroke" { + attrs.Style.Stroke = &d2graph.Scalar{MapKey: mk} + } else if reserved == "fill" { + attrs.Style.Fill = &d2graph.Scalar{MapKey: mk} + } else if reserved == "stroke-width" { + attrs.Style.StrokeWidth = &d2graph.Scalar{MapKey: mk} + } else if reserved == "stroke-dash" { + attrs.Style.StrokeDash = &d2graph.Scalar{MapKey: mk} + } else if reserved == "border-radius" { + attrs.Style.BorderRadius = &d2graph.Scalar{MapKey: mk} + } else if reserved == "shadow" { + attrs.Style.Shadow = &d2graph.Scalar{MapKey: mk} + } else if reserved == "3d" { + // TODO this should be movd to validateKeys, as shape may not be set yet + if attrs.Shape.Value != "" && !strings.EqualFold(attrs.Shape.Value, d2target.ShapeSquare) && !strings.EqualFold(attrs.Shape.Value, d2target.ShapeRectangle) { + c.errorf(mk.Range.Start, mk.Range.End, `key "3d" can only be applied to squares and rectangles`) + return + } + attrs.Style.ThreeDee = &d2graph.Scalar{MapKey: mk} + } else if reserved == "multiple" { + attrs.Style.Multiple = &d2graph.Scalar{MapKey: mk} + } else if reserved == "font" { + attrs.Style.Font = &d2graph.Scalar{MapKey: mk} + } else if reserved == "font-size" { + attrs.Style.FontSize = &d2graph.Scalar{MapKey: mk} + } else if reserved == "font-color" { + attrs.Style.FontColor = &d2graph.Scalar{MapKey: mk} + } else if reserved == "animated" { + attrs.Style.Animated = &d2graph.Scalar{MapKey: mk} + } else if reserved == "bold" { + attrs.Style.Bold = &d2graph.Scalar{MapKey: mk} + } else if reserved == "italic" { + attrs.Style.Italic = &d2graph.Scalar{MapKey: mk} + } else if reserved == "underline" { + attrs.Style.Underline = &d2graph.Scalar{MapKey: mk} + } else if reserved == "filled" { + attrs.Style.Filled = &d2graph.Scalar{MapKey: mk} + } else if reserved == "width" { + attrs.Width = &d2graph.Scalar{MapKey: mk} + } else if reserved == "height" { + attrs.Height = &d2graph.Scalar{MapKey: mk} + } +} + +func (c *compiler) compileKey(obj *d2graph.Object, m *d2ast.Map, mk *d2ast.Key) { + ida, reserved, ok := c.compileFlatKey(mk.Key) + if !ok { + return + } + if reserved == "desc" { + return + } + + resolvedObj, resolvedIDA, err := d2graph.ResolveUnderscoreKey(ida, obj) + if err != nil { + c.errorf(mk.Range.Start, mk.Range.End, err.Error()) + return + } + if resolvedObj != obj { + obj = resolvedObj + } + + parent := obj + if len(resolvedIDA) > 0 { + unresolvedObj := obj + obj = parent.EnsureChild(resolvedIDA) + parent.AppendReferences(ida, d2graph.Reference{ + Key: mk.Key, + + MapKey: mk, + Scope: m, + }, unresolvedObj) + } else if obj.Parent == nil { + // Top level reserved key set on root. + return + } + + if len(mk.Edges) > 0 { + return + } + + c.compileAttributes(&obj.Attributes, mk) + if obj.Attributes.Style.Animated != nil { + c.errorf(mk.Range.Start, mk.Range.End, `key "animated" can only be applied to edges`) + return + } + + c.applyScalar(&obj.Attributes, reserved, mk.Value.ScalarBox()) + if mk.Value.Map != nil { + if reserved != "" { + c.errorf(mk.Range.Start, mk.Range.End, "cannot set reserved key %q to a map", reserved) + return + } + obj.Map = mk.Value.Map + c.compileKeys(obj, mk.Value.Map) + } + + c.applyScalar(&obj.Attributes, reserved, mk.Primary) +} + +func (c *compiler) applyScalar(attrs *d2graph.Attributes, reserved string, box d2ast.ScalarBox) { + scalar := box.Unbox() + if scalar == nil { + return + } + + switch reserved { + case "shape": + in := d2target.IsShape(scalar.ScalarString()) + _, isArrowhead := d2target.Arrowheads[scalar.ScalarString()] + if !in && !isArrowhead { + c.errorf(scalar.GetRange().Start, scalar.GetRange().End, "unknown shape %q", scalar.ScalarString()) + return + } + if box.Null != nil { + attrs.Shape.Value = "" + } else { + attrs.Shape.Value = scalar.ScalarString() + } + if attrs.Shape.Value == d2target.ShapeCode { + // Explicit code shape is plaintext. + attrs.Language = d2target.ShapeText + } + return + case "icon": + iconURL, err := url.Parse(scalar.ScalarString()) + if err != nil { + c.errorf(scalar.GetRange().Start, scalar.GetRange().End, "bad icon url %#v: %s", scalar.ScalarString(), err) + return + } + attrs.Icon = iconURL + return + case "near": + nearKey, err := d2parser.ParseKey(scalar.ScalarString()) + if err != nil { + c.errorf(scalar.GetRange().Start, scalar.GetRange().End, "bad near key %#v: %s", scalar.ScalarString(), err) + return + } + attrs.NearKey = nearKey + return + case "tooltip": + attrs.Tooltip = scalar.ScalarString() + return + case "width": + _, err := strconv.Atoi(scalar.ScalarString()) + if err != nil { + c.errorf(scalar.GetRange().Start, scalar.GetRange().End, "non-integer width %#v: %s", scalar.ScalarString(), err) + return + } + attrs.Width.Value = scalar.ScalarString() + return + case "height": + _, err := strconv.Atoi(scalar.ScalarString()) + if err != nil { + c.errorf(scalar.GetRange().Start, scalar.GetRange().End, "non-integer height %#v: %s", scalar.ScalarString(), err) + return + } + attrs.Height.Value = scalar.ScalarString() + return + case "link": + attrs.Link = scalar.ScalarString() + return + } + + if _, ok := d2graph.StyleKeywords[reserved]; ok { + if err := attrs.Style.Apply(reserved, scalar.ScalarString()); err != nil { + c.errorf(scalar.GetRange().Start, scalar.GetRange().End, err.Error()) + } + return + } + + if box.Null != nil { + // TODO: delete obj + attrs.Label.Value = "" + } else { + attrs.Label.Value = scalar.ScalarString() + } + + bs := box.BlockString + if bs != nil && reserved == "" { + attrs.Language = bs.Tag + fullTag, ok := ShortToFullLanguageAliases[bs.Tag] + if ok { + attrs.Language = fullTag + } + if attrs.Language == "markdown" { + attrs.Shape.Value = d2target.ShapeText + } else { + attrs.Shape.Value = d2target.ShapeCode + } + } +} + +func (c *compiler) compileEdgeMapKey(obj *d2graph.Object, m *d2ast.Map, mk *d2ast.Key) { + if mk.EdgeIndex != nil { + edge, ok := obj.HasEdge(mk) + if ok { + c.appendEdgeReferences(obj, m, mk) + edge.References = append(edge.References, d2graph.EdgeReference{ + Edge: mk.Edges[0], + + MapKey: mk, + MapKeyEdgeIndex: 0, + Scope: m, + ScopeObj: obj, + }) + c.compileEdge(edge, m, mk) + } + return + } + for i, e := range mk.Edges { + if e.Src == nil || e.Dst == nil { + continue + } + edge, err := obj.Connect(d2graph.Key(e.Src), d2graph.Key(e.Dst), e.SrcArrow == "<", e.DstArrow == ">", "") + if err != nil { + c.errorf(e.Range.Start, e.Range.End, err.Error()) + continue + } + edge.References = append(edge.References, d2graph.EdgeReference{ + Edge: e, + + MapKey: mk, + MapKeyEdgeIndex: i, + Scope: m, + ScopeObj: obj, + }) + c.compileEdge(edge, m, mk) + } + c.appendEdgeReferences(obj, m, mk) +} + +func (c *compiler) compileEdge(edge *d2graph.Edge, m *d2ast.Map, mk *d2ast.Key) { + if mk.Key == nil && mk.EdgeKey == nil { + if len(mk.Edges) == 1 { + edge.Attributes.Label.MapKey = mk + } + c.applyScalar(&edge.Attributes, "", mk.Value.ScalarBox()) + c.applyScalar(&edge.Attributes, "", mk.Primary) + } else { + c.compileEdgeKey(edge, m, mk) + } + if mk.Value.Map != nil && mk.EdgeKey == nil { + for _, n := range mk.Value.Map.Nodes { + if n.MapKey == nil { + continue + } + if len(n.MapKey.Edges) > 0 { + c.errorf(mk.Range.Start, mk.Range.End, `edges cannot be nested within another edge`) + continue + } + if n.MapKey.Key == nil { + continue + } + for _, p := range n.MapKey.Key.Path { + _, ok := d2graph.ReservedKeywords[strings.ToLower(p.Unbox().ScalarString())] + if !ok { + c.errorf(mk.Range.Start, mk.Range.End, `edge map keys must be reserved keywords`) + return + } + } + c.compileEdgeKey(edge, m, n.MapKey) + } + } +} + +func (c *compiler) compileEdgeKey(edge *d2graph.Edge, m *d2ast.Map, mk *d2ast.Key) { + var r string + var ok bool + + // Give precedence to EdgeKeys + // x.(a -> b)[0].style.opacity: 0.4 + // We want to compile the style.opacity, not the x + if mk.EdgeKey != nil { + _, r, ok = c.compileFlatKey(mk.EdgeKey) + } else if mk.Key != nil { + _, r, ok = c.compileFlatKey(mk.Key) + } + if !ok { + return + } + + ok = c.compileArrowheads(edge, m, mk) + if ok { + return + } + c.compileAttributes(&edge.Attributes, mk) + c.applyScalar(&edge.Attributes, r, mk.Value.ScalarBox()) + if mk.Value.Map != nil { + for _, n := range mk.Value.Map.Nodes { + if n.MapKey != nil { + c.compileEdgeKey(edge, m, n.MapKey) + } + } + } +} + +func (c *compiler) appendEdgeReferences(obj *d2graph.Object, m *d2ast.Map, mk *d2ast.Key) { + for i, e := range mk.Edges { + if e.Src != nil { + ida := d2graph.Key(e.Src) + + parent, _, err := d2graph.ResolveUnderscoreKey(ida, obj) + if err != nil { + c.errorf(mk.Range.Start, mk.Range.End, err.Error()) + return + } + parent.AppendReferences(ida, d2graph.Reference{ + Key: e.Src, + + MapKey: mk, + MapKeyEdgeIndex: i, + Scope: m, + }, obj) + } + if e.Dst != nil { + ida := d2graph.Key(e.Dst) + + parent, _, err := d2graph.ResolveUnderscoreKey(ida, obj) + if err != nil { + c.errorf(mk.Range.Start, mk.Range.End, err.Error()) + return + } + parent.AppendReferences(ida, d2graph.Reference{ + Key: e.Dst, + + MapKey: mk, + MapKeyEdgeIndex: i, + Scope: m, + }, obj) + } + } +} + +func (c *compiler) compileFlatKey(k *d2ast.KeyPath) ([]string, string, bool) { + k2 := *k + var reserved string + for i, s := range k.Path { + keyword := strings.ToLower(s.Unbox().ScalarString()) + _, isReserved := d2graph.ReservedKeywords[keyword] + _, isReservedHolder := d2graph.ReservedKeywordHolders[keyword] + if isReserved && !isReservedHolder { + reserved = keyword + k2.Path = k2.Path[:i] + break + } + } + if len(k2.Path) < len(k.Path)-1 { + c.errorf(k.Range.Start, k.Range.End, "reserved key %q cannot have children", reserved) + return nil, "", false + } + return d2graph.Key(&k2), reserved, true +} + +// TODO add more, e.g. C, bash +var ShortToFullLanguageAliases = map[string]string{ + "md": "markdown", + "js": "javascript", + "go": "golang", + "py": "python", + "rb": "ruby", + "ts": "typescript", +} +var FullToShortLanguageAliases map[string]string + +func (c *compiler) compileShapes(obj *d2graph.Object) { + for _, obj := range obj.ChildrenArray { + switch obj.Attributes.Shape.Value { + case d2target.ShapeClass: + c.compileClass(obj) + case d2target.ShapeSQLTable: + c.compileSQLTable(obj) + case d2target.ShapeImage: + c.compileImage(obj) + } + c.compileShapes(obj) + } + + for _, obj := range obj.ChildrenArray { + switch obj.Attributes.Shape.Value { + case d2target.ShapeClass, d2target.ShapeSQLTable: + flattenContainer(obj.Graph, obj) + } + if obj.IDVal == "style" { + obj.Parent.Attributes.Style = obj.Attributes.Style + if obj.Graph != nil { + flattenContainer(obj.Graph, obj) + removeObject(obj.Graph, obj) + } + } + } +} + +func (c *compiler) compileImage(obj *d2graph.Object) { + if obj.Attributes.Icon == nil { + c.errorf(obj.Attributes.Shape.MapKey.Range.Start, obj.Attributes.Shape.MapKey.Range.End, `image shape must include an "icon" field`) + } +} + +func (c *compiler) compileClass(obj *d2graph.Object) { + obj.Class = &d2target.Class{} + + for _, f := range obj.ChildrenArray { + if f.IDVal == "style" { + continue + } + visiblity := "public" + name := f.IDVal + // See https://www.uml-diagrams.org/visibility.html + if name != "" { + switch name[0] { + case '+': + name = name[1:] + case '-': + visiblity = "private" + name = name[1:] + case '#': + visiblity = "protected" + name = name[1:] + } + } + + if !strings.Contains(f.IDVal, "(") { + typ := f.Attributes.Label.Value + if typ == f.IDVal { + typ = "" + } + obj.Class.Fields = append(obj.Class.Fields, d2target.ClassField{ + Name: name, + Type: typ, + Visibility: visiblity, + }) + } else { + // TODO: Not great, AST should easily allow specifying alternate primary field + // as an explicit label should change the name. + returnType := f.Attributes.Label.Value + if returnType == f.IDVal { + returnType = "void" + } + obj.Class.Methods = append(obj.Class.Methods, d2target.ClassMethod{ + Name: name, + Return: returnType, + Visibility: visiblity, + }) + } + } +} + +func (c *compiler) compileSQLTable(obj *d2graph.Object) { + obj.SQLTable = &d2target.SQLTable{} + + parentID := obj.Parent.AbsID() + tableID := obj.AbsID() + for _, col := range obj.ChildrenArray { + if col.IDVal == "style" { + continue + } + typ := col.Attributes.Label.Value + if typ == col.IDVal { + // Not great, AST should easily allow specifying alternate primary field + // as an explicit label should change the name. + typ = "" + } + d2Col := d2target.SQLColumn{ + Name: col.IDVal, + Type: typ, + } + // The only map a sql table field could have is to specify constraint + if col.Map != nil { + for _, n := range col.Map.Nodes { + if n.MapKey.Key == nil || len(n.MapKey.Key.Path) == 0 { + continue + } + if n.MapKey.Key.Path[0].Unbox().ScalarString() == "constraint" { + d2Col.Constraint = n.MapKey.Value.StringBox().Unbox().ScalarString() + } + } + } + + absID := col.AbsID() + for _, e := range obj.Graph.Edges { + srcID := e.Src.AbsID() + dstID := e.Dst.AbsID() + // skip edges between columns of the same table + if strings.HasPrefix(srcID, tableID) && strings.HasPrefix(dstID, tableID) { + continue + } + if srcID == absID { + // Frontend isn't aware of container IDs. + d2Col.Reference = strings.TrimPrefix(dstID, parentID+".") + relSrc := strings.TrimPrefix(absID, parentID+".") + e.Attributes.Label.Value = fmt.Sprintf("%s %s %s", relSrc, e.ArrowString(), d2Col.Reference) + // removeContainer() will adjust the edge to point to the table and not inside. + break + } + } + + obj.SQLTable.Columns = append(obj.SQLTable.Columns, d2Col) + } +} + +// TODO too similar to flattenContainer, should reconcile in a refactor +func removeObject(g *d2graph.Graph, obj *d2graph.Object) { + for i := 0; i < len(obj.Graph.Objects); i++ { + if obj.Graph.Objects[i] == obj { + obj.Graph.Objects = append(obj.Graph.Objects[:i], obj.Graph.Objects[i+1:]...) + break + } + } + delete(obj.Parent.Children, obj.ID) + for i, child := range obj.Parent.ChildrenArray { + if obj == child { + obj.Parent.ChildrenArray = append(obj.Parent.ChildrenArray[:i], obj.Parent.ChildrenArray[i+1:]...) + break + } + } +} + +func flattenContainer(g *d2graph.Graph, obj *d2graph.Object) { + absID := obj.AbsID() + + toRemove := map[*d2graph.Edge]struct{}{} + toAdd := []*d2graph.Edge{} + for i := 0; i < len(g.Edges); i++ { + e := g.Edges[i] + srcID := e.Src.AbsID() + dstID := e.Dst.AbsID() + + srcIsChild := strings.HasPrefix(srcID, absID+".") + dstIsChild := strings.HasPrefix(dstID, absID+".") + if srcIsChild && dstIsChild { + toRemove[e] = struct{}{} + } else if srcIsChild { + toRemove[e] = struct{}{} + if dstID == absID { + continue + } + toAdd = append(toAdd, e) + } else if dstIsChild { + toRemove[e] = struct{}{} + if srcID == absID { + continue + } + toAdd = append(toAdd, e) + } + } + for _, e := range toAdd { + var newEdge *d2graph.Edge + if strings.HasPrefix(e.Src.AbsID(), absID+".") { + newEdge, _ = g.Root.Connect(obj.AbsIDArray(), e.Dst.AbsIDArray(), e.SrcArrow, e.DstArrow, e.Attributes.Label.Value) + } else { + newEdge, _ = g.Root.Connect(e.Src.AbsIDArray(), obj.AbsIDArray(), e.SrcArrow, e.DstArrow, e.Attributes.Label.Value) + } + // TODO more attributes + newEdge.Attributes.Label = e.Attributes.Label + newEdge.References = e.References + } + updatedEdges := []*d2graph.Edge{} + for _, e := range g.Edges { + if _, is := toRemove[e]; is { + continue + } + updatedEdges = append(updatedEdges, e) + } + g.Edges = updatedEdges + + for i := 0; i < len(g.Objects); i++ { + child := g.Objects[i] + if strings.HasPrefix(child.AbsID(), absID+".") { + g.Objects = append(g.Objects[:i], g.Objects[i+1:]...) + i-- + delete(obj.Children, child.ID) + for i, child2 := range obj.ChildrenArray { + if child == child2 { + obj.ChildrenArray = append(obj.ChildrenArray[:i], obj.ChildrenArray[i+1:]...) + break + } + } + } + } +} + +func (c *compiler) validateKey(obj *d2graph.Object, m *d2ast.Map, mk *d2ast.Key) { + ida, reserved, ok := c.compileFlatKey(mk.Key) + if !ok { + return + } + + if reserved == "" && obj.Attributes.Shape.Value == d2target.ShapeImage { + c.errorf(mk.Range.Start, mk.Range.End, "image shapes cannot have children.") + } + + if reserved == "width" && obj.Attributes.Shape.Value != d2target.ShapeImage { + c.errorf(mk.Range.Start, mk.Range.End, "width is only applicable to image shapes.") + } + if reserved == "height" && obj.Attributes.Shape.Value != d2target.ShapeImage { + c.errorf(mk.Range.Start, mk.Range.End, "height is only applicable to image shapes.") + } + + in := d2target.IsShape(obj.Attributes.Shape.Value) + _, arrowheadIn := d2target.Arrowheads[obj.Attributes.Shape.Value] + if !in && arrowheadIn { + c.errorf(mk.Range.Start, mk.Range.End, fmt.Sprintf(`invalid shape, can only set "%s" for arrowheads`, obj.Attributes.Shape.Value)) + } + + resolvedObj, resolvedIDA, err := d2graph.ResolveUnderscoreKey(ida, obj) + if err != nil { + c.errorf(mk.Range.Start, mk.Range.End, err.Error()) + return + } + if resolvedObj != obj { + obj = resolvedObj + } + + parent := obj + if len(resolvedIDA) > 0 { + obj, _ = parent.HasChild(resolvedIDA) + } else if obj.Parent == nil { + return + } + + if len(mk.Edges) > 0 { + return + } + + if mk.Value.Map != nil { + c.validateKeys(obj, mk.Value.Map) + } +} + +func (c *compiler) validateKeys(obj *d2graph.Object, m *d2ast.Map) { + for _, n := range m.Nodes { + if n.MapKey != nil && n.MapKey.Key != nil && len(n.MapKey.Edges) == 0 { + c.validateKey(obj, m, n.MapKey) + } + } +} + +func (c *compiler) validateNear(g *d2graph.Graph) { + for _, obj := range g.Objects { + if obj.Attributes.NearKey != nil { + _, ok := g.Root.HasChild(d2graph.Key(obj.Attributes.NearKey)) + if !ok { + c.errorf(obj.Attributes.NearKey.GetRange().Start, obj.Attributes.NearKey.GetRange().End, "near key %#v does not exist. It must be the absolute path to a shape.", d2format.Format(obj.Attributes.NearKey)) + continue + } + } + } +} + +func init() { + FullToShortLanguageAliases = make(map[string]string, len(ShortToFullLanguageAliases)) + for k, v := range ShortToFullLanguageAliases { + FullToShortLanguageAliases[v] = k + } +} diff --git a/d2compiler/compile_test.go b/d2compiler/compile_test.go new file mode 100644 index 000000000..54f59d64c --- /dev/null +++ b/d2compiler/compile_test.go @@ -0,0 +1,1522 @@ +package d2compiler_test + +import ( + "fmt" + "path/filepath" + "strings" + "testing" + + "oss.terrastruct.com/diff" + + "github.com/stretchr/testify/assert" + + "oss.terrastruct.com/d2/d2compiler" + "oss.terrastruct.com/d2/d2format" + "oss.terrastruct.com/d2/d2graph" + "oss.terrastruct.com/d2/d2target" +) + +func TestCompile(t *testing.T) { + t.Parallel() + + testCases := []struct { + name string + text string + + expErr string + assertions func(t *testing.T, g *d2graph.Graph) + }{ + { + name: "basic_shape", + + text: ` +x: { + shape: circle +} +`, + assertions: func(t *testing.T, g *d2graph.Graph) { + if len(g.Objects) != 1 { + t.Fatalf("expected 1 objects: %#v", g.Objects) + } + if g.Objects[0].ID != "x" { + t.Fatalf("expected g.Objects[0].ID to be x: %#v", g.Objects[0]) + } + + if g.Objects[0].Attributes.Shape.Value != d2target.ShapeCircle { + t.Fatalf("expected g.Objects[0].Attributes.Shape.Value to be circle: %#v", g.Objects[0].Attributes.Shape.Value) + } + + }, + }, + { + name: "basic_style", + + text: ` +x: { + style.opacity: 0.4 +} +`, + assertions: func(t *testing.T, g *d2graph.Graph) { + if len(g.Objects) != 1 { + t.Fatalf("expected 1 objects: %#v", g.Objects) + } + if g.Objects[0].ID != "x" { + t.Fatalf("expected g.Objects[0].ID to be x: %#v", g.Objects[0]) + } + + if g.Objects[0].Attributes.Style.Opacity.Value != "0.4" { + t.Fatalf("expected g.Objects[0].Attributes.Style.Opacity.Value to be 0.4: %#v", g.Objects[0].Attributes.Style.Opacity.Value) + } + + }, + }, + { + name: "image_style", + + text: `hey: "" { + icon: https://icons.terrastruct.com/essentials/004-picture.svg + shape: image + style.stroke: "#0D32B2" +} +`, + assertions: func(t *testing.T, g *d2graph.Graph) { + if len(g.Objects) != 1 { + t.Fatalf("expected 1 objects: %#v", g.Objects) + } + }, + }, + + { + name: "dimensions_on_nonimage", + + text: `hey: "" { + shape: hexagon + width: 200 + height: 230 +} +`, + expErr: `d2/testdata/d2compiler/TestCompile/dimensions_on_nonimage.d2:3:2: width is only applicable to image shapes. +d2/testdata/d2compiler/TestCompile/dimensions_on_nonimage.d2:4:2: height is only applicable to image shapes. +`, + }, + { + name: "basic_icon", + + text: `hey: "" { + icon: https://icons.terrastruct.com/essentials/004-picture.svg +} +`, + assertions: func(t *testing.T, g *d2graph.Graph) { + if g.Objects[0].Attributes.Icon == nil { + t.Fatal("Attribute icon is nil") + } + }, + }, + { + name: "shape_unquoted_hex", + + text: `x: { + style: { + fill: #ffffff + } +} +`, + expErr: `d2/testdata/d2compiler/TestCompile/shape_unquoted_hex.d2:3:10: missing value after colon +`, + }, + { + name: "edge_unquoted_hex", + + text: `x -> y: { + style: { + fill: #ffffff + } +} +`, + expErr: `d2/testdata/d2compiler/TestCompile/edge_unquoted_hex.d2:3:10: missing value after colon +`, + }, + { + name: "blank_underscore", + + text: `x: { + y + _ +} +`, + expErr: `d2/testdata/d2compiler/TestCompile/blank_underscore.d2:3:3: invalid use of parent "_" +`, + }, + { + name: "image_non_style", + + text: `x: { + shape: image + icon: https://icons.terrastruct.com/aws/_Group%20Icons/EC2-instance-container_light-bg.svg + name: y +} +`, + expErr: `d2/testdata/d2compiler/TestCompile/image_non_style.d2:4:3: image shapes cannot have children. +`, + }, + { + name: "stroke-width", + + text: `hey { + style.stroke-width: 0 +} +`, + assertions: func(t *testing.T, g *d2graph.Graph) { + if len(g.Objects) != 1 { + t.Fatalf("expected 1 objects: %#v", g.Objects) + } + if g.Objects[0].Attributes.Style.StrokeWidth.Value != "0" { + t.Fatalf("unexpected") + } + }, + }, + { + name: "illegal-stroke-width", + + text: `hey { + style.stroke-width: -1 +} +`, + expErr: `d2/testdata/d2compiler/TestCompile/illegal-stroke-width.d2:2:23: expected "stroke-width" to be a number between 0 and 15 +`, + }, + { + name: "underscore_parent_create", + + text: ` +x: { + _.y +} +`, + assertions: func(t *testing.T, g *d2graph.Graph) { + if len(g.Objects) != 2 { + t.Fatalf("expected 2 objects: %#v", g.Objects) + } + if g.Objects[0].ID != "x" { + t.Fatalf("expected g.Objects[0].ID to be x: %#v", g.Objects[0]) + } + if g.Objects[1].ID != "y" { + t.Fatalf("expected g.Objects[1].ID to be y: %#v", g.Objects[1]) + } + + if len(g.Root.ChildrenArray) != 2 { + t.Fatalf("expected 2 objects at the root: %#v", len(g.Root.ChildrenArray)) + } + + }, + }, + { + name: "underscore_parent_not_root", + + text: ` +x: { + y: { + _.z + } +} +`, + assertions: func(t *testing.T, g *d2graph.Graph) { + if len(g.Objects) != 3 { + t.Fatalf("expected 3 objects: %#v", g.Objects) + } + if g.Objects[0].ID != "x" { + t.Fatalf("expected g.Objects[0].ID to be x: %#v", g.Objects[0]) + } + if g.Objects[1].ID != "y" { + t.Fatalf("expected g.Objects[1].ID to be y: %#v", g.Objects[1]) + } + + if len(g.Root.ChildrenArray) != 1 { + t.Fatalf("expected 1 object at the root: %#v", len(g.Root.ChildrenArray)) + } + if len(g.Objects[0].ChildrenArray) != 2 { + t.Fatalf("expected 2 objects within x: %v", len(g.Objects[0].ChildrenArray)) + } + + }, + }, + { + name: "underscore_parent_preference_1", + + text: ` +x: { + _.y: "All we are given is possibilities -- to make ourselves one thing or another." +} +y: "But it's real. And if it's real it can be affected ... we may not be able" +`, + assertions: func(t *testing.T, g *d2graph.Graph) { + if len(g.Objects) != 2 { + t.Fatalf("expected 2 objects: %#v", g.Objects) + } + if g.Objects[0].ID != "x" { + t.Fatalf("expected g.Objects[0].ID to be x: %#v", g.Objects[0]) + } + if g.Objects[1].ID != "y" { + t.Fatalf("expected g.Objects[1].ID to be y: %#v", g.Objects[1]) + } + + if len(g.Root.ChildrenArray) != 2 { + t.Fatalf("expected 2 objects at the root: %#v", len(g.Root.ChildrenArray)) + } + if g.Objects[1].Attributes.Label.Value != "But it's real. And if it's real it can be affected ... we may not be able" { + t.Fatalf("expected g.Objects[1].Label.Value to be last value: %#v", g.Objects[1].Attributes.Label.Value) + } + }, + }, + { + name: "underscore_parent_preference_2", + + text: ` +y: "But it's real. And if it's real it can be affected ... we may not be able" +x: { + _.y: "All we are given is possibilities -- to make ourselves one thing or another." +} +`, + assertions: func(t *testing.T, g *d2graph.Graph) { + if len(g.Objects) != 2 { + t.Fatalf("expected 2 objects: %#v", g.Objects) + } + if g.Objects[0].ID != "y" { + t.Fatalf("expected g.Objects[0].ID to be y: %#v", g.Objects[0]) + } + if g.Objects[1].ID != "x" { + t.Fatalf("expected g.Objects[1].ID to be x: %#v", g.Objects[1]) + } + + if len(g.Root.ChildrenArray) != 2 { + t.Fatalf("expected 2 objects at the root: %#v", len(g.Root.ChildrenArray)) + } + if g.Objects[0].Attributes.Label.Value != "All we are given is possibilities -- to make ourselves one thing or another." { + t.Fatalf("expected g.Objects[0].Label.Value to be last value: %#v", g.Objects[0].Attributes.Label.Value) + } + }, + }, + { + name: "underscore_parent_squared", + + text: ` +x: { + y: { + _._.z + } +} +`, + assertions: func(t *testing.T, g *d2graph.Graph) { + if len(g.Objects) != 3 { + t.Fatalf("expected 3 objects: %#v", len(g.Objects)) + } + + if len(g.Root.ChildrenArray) != 2 { + t.Fatalf("expected 2 objects at the root: %#v", len(g.Root.ChildrenArray)) + } + }, + }, + { + name: "underscore_parent_root", + + text: ` +_.x +`, + expErr: `d2/testdata/d2compiler/TestCompile/underscore_parent_root.d2:2:1: parent "_" cannot be used in the root scope +`, + }, + { + name: "underscore_parent_middle_path", + + text: ` +x: { + y._.z +} +`, + expErr: `d2/testdata/d2compiler/TestCompile/underscore_parent_middle_path.d2:3:3: parent "_" can only be used in the beginning of paths, e.g. "_.x" +`, + }, + { + name: "underscore_parent_sandwich_path", + + text: ` +x: { + _.z._ +} +`, + expErr: `d2/testdata/d2compiler/TestCompile/underscore_parent_sandwich_path.d2:3:3: parent "_" can only be used in the beginning of paths, e.g. "_.x" +`, + }, + { + name: "underscore_edge", + + text: ` +x: { + _.y -> _.x +} +`, + assertions: func(t *testing.T, g *d2graph.Graph) { + if len(g.Objects) != 2 { + t.Fatalf("expected 2 objects: %#v", g.Objects) + } + if g.Objects[0].ID != "x" { + t.Fatalf("expected g.Objects[0].ID to be x: %#v", g.Objects[0]) + } + if g.Objects[1].ID != "y" { + t.Fatalf("expected g.Objects[1].ID to be y: %#v", g.Objects[1]) + } + + if len(g.Edges) != 1 { + t.Fatalf("expected 1 edge: %#v", g.Edges) + } + if g.Edges[0].Src.ID != "y" { + t.Fatalf("expected g.Edges[0].Src.ID to be y: %#v", g.Edges[0]) + } + if g.Edges[0].Dst.ID != "x" { + t.Fatalf("expected g.Edges[0].Dst.ID to be x: %#v", g.Edges[0]) + } + if g.Edges[0].SrcArrow { + t.Fatalf("expected g.Edges[0].SrcArrow to be false: %#v", g.Edges[0]) + } + if !g.Edges[0].DstArrow { + t.Fatalf("expected g.Edges[0].DstArrow to be true: %#v", g.Edges[0]) + } + }, + }, + { + name: "underscore_edge_chain", + + text: ` +x: { + _.y -> _.x -> _.z +} +`, + assertions: func(t *testing.T, g *d2graph.Graph) { + if len(g.Objects) != 3 { + t.Fatalf("expected 3 objects: %#v", g.Objects) + } + if g.Objects[0].ID != "x" { + t.Fatalf("expected g.Objects[0].ID to be x: %#v", g.Objects[0]) + } + if g.Objects[1].ID != "y" { + t.Fatalf("expected g.Objects[1].ID to be y: %#v", g.Objects[1]) + } + if g.Objects[2].ID != "z" { + t.Fatalf("expected g.Objects[2].ID to be z: %#v", g.Objects[2]) + } + + if len(g.Edges) != 2 { + t.Fatalf("expected 2 edge: %#v", g.Edges) + } + if g.Edges[0].Src.ID != "y" { + t.Fatalf("expected g.Edges[0].Src.ID to be y: %#v", g.Edges[0]) + } + if g.Edges[0].Dst.ID != "x" { + t.Fatalf("expected g.Edges[0].Dst.ID to be x: %#v", g.Edges[0]) + } + if g.Edges[1].Src.ID != "x" { + t.Fatalf("expected g.Edges[1].Src.ID to be x: %#v", g.Edges[1]) + } + if g.Edges[1].Dst.ID != "z" { + t.Fatalf("expected g.Edges[1].Dst.ID to be z: %#v", g.Edges[1]) + } + }, + }, + { + name: "underscore_edge_existing", + + text: ` +a -> b: "Can you imagine how life could be improved if we could do away with" +x: { + _.a -> _.b: "Well, it's garish, ugly, and derelicts have used it for a toilet." +} +`, + assertions: func(t *testing.T, g *d2graph.Graph) { + if len(g.Objects) != 3 { + t.Fatalf("expected 3 objects: %#v", g.Objects) + } + if len(g.Edges) != 2 { + t.Fatalf("expected 2 edge: %#v", g.Edges) + } + if g.Edges[0].Src.ID != "a" { + t.Fatalf("expected g.Edges[0].Src.ID to be a: %#v", g.Edges[0]) + } + if g.Edges[0].Dst.ID != "b" { + t.Fatalf("expected g.Edges[0].Dst.ID to be b: %#v", g.Edges[0]) + } + if g.Edges[1].Src.ID != "a" { + t.Fatalf("expected g.Edges[1].Src.ID to be a: %#v", g.Edges[1]) + } + if g.Edges[1].Dst.ID != "b" { + t.Fatalf("expected g.Edges[1].Dst.ID to be b: %#v", g.Edges[1]) + } + if g.Edges[0].Attributes.Label.Value != "Can you imagine how life could be improved if we could do away with" { + t.Fatalf("unexpected g.Edges[0].Label: %#v", g.Edges[0].Attributes.Label) + } + if g.Edges[1].Attributes.Label.Value != "Well, it's garish, ugly, and derelicts have used it for a toilet." { + t.Fatalf("unexpected g.Edges[1].Label: %#v", g.Edges[1].Attributes.Label) + } + }, + }, + { + name: "underscore_edge_index", + + text: ` +a -> b: "Can you imagine how life could be improved if we could do away with" +x: { + (_.a -> _.b)[0]: "Well, it's garish, ugly, and derelicts have used it for a toilet." +} +`, + assertions: func(t *testing.T, g *d2graph.Graph) { + if len(g.Objects) != 3 { + t.Fatalf("expected 3 objects: %#v", g.Objects) + } + if len(g.Edges) != 1 { + t.Fatalf("expected 1 edge: %#v", g.Edges) + } + if g.Edges[0].Src.ID != "a" { + t.Fatalf("expected g.Edges[0].Src.ID to be a: %#v", g.Edges[0]) + } + if g.Edges[0].Dst.ID != "b" { + t.Fatalf("expected g.Edges[0].Dst.ID to be b: %#v", g.Edges[0]) + } + if g.Edges[0].Attributes.Label.Value != "Well, it's garish, ugly, and derelicts have used it for a toilet." { + t.Fatalf("unexpected g.Edges[0].Label: %#v", g.Edges[0].Attributes.Label) + } + }, + }, + { + name: "underscore_edge_nested", + + text: ` +x: { + y: { + _._.z -> _.y + } +} +`, + assertions: func(t *testing.T, g *d2graph.Graph) { + if len(g.Objects) != 3 { + t.Fatalf("expected 3 objects: %#v", g.Objects) + } + if len(g.Edges) != 1 { + t.Fatalf("expected 1 edge: %#v", g.Edges) + } + if g.Edges[0].Src.AbsID() != "z" { + t.Fatalf("expected g.Edges[0].Src.AbsID() to be z: %#v", g.Edges[0].Src.AbsID()) + } + if g.Edges[0].Dst.AbsID() != "x.y" { + t.Fatalf("expected g.Edges[0].Dst.AbsID() to be x.y: %#v", g.Edges[0].Dst.AbsID()) + } + }, + }, + { + name: "edge", + + text: ` +x -> y +`, + assertions: func(t *testing.T, g *d2graph.Graph) { + if len(g.Objects) != 2 { + t.Fatalf("expected 2 objects: %#v", g.Objects) + } + if g.Objects[0].ID != "x" { + t.Fatalf("expected g.Objects[0].ID to be x: %#v", g.Objects[0]) + } + if g.Objects[1].ID != "y" { + t.Fatalf("expected g.Objects[1].ID to be y: %#v", g.Objects[1]) + } + + if len(g.Edges) != 1 { + t.Fatalf("expected 1 edge: %#v", g.Edges) + } + if g.Edges[0].Src.ID != "x" { + t.Fatalf("expected g.Edges[0].Src.ID to be x: %#v", g.Edges[0]) + } + if g.Edges[0].Dst.ID != "y" { + t.Fatalf("expected g.Edges[0].Dst.ID to be y: %#v", g.Edges[0]) + } + if g.Edges[0].SrcArrow { + t.Fatalf("expected g.Edges[0].SrcArrow to be false: %#v", g.Edges[0]) + } + if !g.Edges[0].DstArrow { + t.Fatalf("expected g.Edges[0].DstArrow to be true: %#v", g.Edges[0]) + } + }, + }, + { + name: "edge_chain", + + text: ` +x -> y -> z: "The kids will love our inflatable slides" +`, + assertions: func(t *testing.T, g *d2graph.Graph) { + if len(g.Objects) != 3 { + t.Fatalf("expected 2 objects: %#v", g.Objects) + } + if g.Objects[0].ID != "x" { + t.Fatalf("expected g.Objects[0].ID to be x: %#v", g.Objects[0]) + } + if g.Objects[1].ID != "y" { + t.Fatalf("expected g.Objects[1].ID to be y: %#v", g.Objects[1]) + } + if g.Objects[2].ID != "z" { + t.Fatalf("expected g.Objects[2].ID to be z: %#v", g.Objects[2]) + } + + if len(g.Edges) != 2 { + t.Fatalf("expected 2 edge: %#v", g.Edges) + } + if g.Edges[0].Src.ID != "x" { + t.Fatalf("expected g.Edges[0].Src.ID to be x: %#v", g.Edges[0]) + } + if g.Edges[0].Dst.ID != "y" { + t.Fatalf("expected g.Edges[0].Dst.ID to be y: %#v", g.Edges[0]) + } + if g.Edges[1].Src.ID != "y" { + t.Fatalf("expected g.Edges[1].Src.ID to be x: %#v", g.Edges[1]) + } + if g.Edges[1].Dst.ID != "z" { + t.Fatalf("expected g.Edges[1].Dst.ID to be y: %#v", g.Edges[1]) + } + + if g.Edges[0].Attributes.Label.Value != "The kids will love our inflatable slides" { + t.Fatalf("unexpected g.Edges[0].Attributes.Label: %#v", g.Edges[0].Attributes.Label.Value) + } + if g.Edges[1].Attributes.Label.Value != "The kids will love our inflatable slides" { + t.Fatalf("unexpected g.Edges[1].Attributes.Label: %#v", g.Edges[1].Attributes.Label.Value) + } + }, + }, + { + name: "edge_index", + + text: ` +x -> y: one +(x -> y)[0]: two +`, + assertions: func(t *testing.T, g *d2graph.Graph) { + if len(g.Objects) != 2 { + t.Fatalf("expected 2 objects: %#v", g.Objects) + } + if g.Objects[0].ID != "x" { + t.Fatalf("expected g.Objects[0].ID to be x: %#v", g.Objects[0]) + } + if g.Objects[1].ID != "y" { + t.Fatalf("expected g.Objects[1].ID to be y: %#v", g.Objects[1]) + } + + if len(g.Edges) != 1 { + t.Fatalf("expected 1 edge: %#v", g.Edges) + } + if g.Edges[0].Src.ID != "x" { + t.Fatalf("expected g.Edges[0].Src.ID to be x: %#v", g.Edges[0].Src) + } + if g.Edges[0].Dst.ID != "y" { + t.Fatalf("expected g.Edges[0].Dst.ID to be y: %#v", g.Edges[0].Dst) + } + if g.Edges[0].SrcArrow { + t.Fatalf("expected g.Edges[0].SrcArrow to be false: %#v", g.Edges[0].SrcArrow) + } + if !g.Edges[0].DstArrow { + t.Fatalf("expected g.Edges[0].DstArrow to be true: %#v", g.Edges[0].DstArrow) + } + if g.Edges[0].Attributes.Label.Value != "two" { + t.Fatalf("expected g.Edges[0].Attributes.Label to be two: %#v", g.Edges[0].Attributes.Label) + } + }, + }, + { + name: "edge_index_nested", + + text: ` +b: { + x -> y: one + (x -> y)[0]: two +} +`, + assertions: func(t *testing.T, g *d2graph.Graph) { + if len(g.Objects) != 3 { + t.Fatalf("expected 3 objects: %#v", g.Objects) + } + if g.Objects[0].ID != "b" { + t.Fatalf("expected g.Objects[0].ID to be b: %#v", g.Objects[0]) + } + if g.Objects[1].ID != "x" { + t.Fatalf("expected g.Objects[1].ID to be x: %#v", g.Objects[0]) + } + if g.Objects[2].ID != "y" { + t.Fatalf("expected g.Objects[2].ID to be y: %#v", g.Objects[1]) + } + + if len(g.Edges) != 1 { + t.Fatalf("expected 1 edge: %#v", g.Edges) + } + if g.Edges[0].Src.AbsID() != "b.x" { + t.Fatalf("expected g.Edges[0].Src.AbsoluteID() to be x: %#v", g.Edges[0].Src) + } + if g.Edges[0].Dst.AbsID() != "b.y" { + t.Fatalf("expected g.Edges[0].Dst.AbsoluteID() to be y: %#v", g.Edges[0].Dst) + } + if g.Edges[0].SrcArrow { + t.Fatalf("expected g.Edges[0].SrcArrow to be false: %#v", g.Edges[0].SrcArrow) + } + if !g.Edges[0].DstArrow { + t.Fatalf("expected g.Edges[0].DstArrow to be true: %#v", g.Edges[0].DstArrow) + } + if g.Edges[0].Attributes.Label.Value != "two" { + t.Fatalf("expected g.Edges[0].Attributes.Label to be two: %#v", g.Edges[0].Attributes.Label) + } + }, + }, + { + name: "edge_index_nested_cross_scope", + + text: ` +b: { + x -> y: one +} +b.(x -> y)[0]: two +`, + assertions: func(t *testing.T, g *d2graph.Graph) { + if len(g.Objects) != 3 { + t.Fatalf("expected 3 objects: %#v", g.Objects) + } + if g.Objects[0].ID != "b" { + t.Fatalf("expected g.Objects[0].ID to be b: %#v", g.Objects[0]) + } + if g.Objects[1].ID != "x" { + t.Fatalf("expected g.Objects[1].ID to be x: %#v", g.Objects[0]) + } + if g.Objects[2].ID != "y" { + t.Fatalf("expected g.Objects[2].ID to be y: %#v", g.Objects[1]) + } + + if len(g.Edges) != 1 { + t.Fatalf("expected 1 edge: %#v", g.Edges) + } + if g.Edges[0].Src.AbsID() != "b.x" { + t.Fatalf("expected g.Edges[0].Src.AbsoluteID() to be x: %#v", g.Edges[0].Src) + } + if g.Edges[0].Dst.AbsID() != "b.y" { + t.Fatalf("expected g.Edges[0].Dst.AbsoluteID() to be y: %#v", g.Edges[0].Dst) + } + if g.Edges[0].SrcArrow { + t.Fatalf("expected g.Edges[0].SrcArrow to be false: %#v", g.Edges[0].SrcArrow) + } + if !g.Edges[0].DstArrow { + t.Fatalf("expected g.Edges[0].DstArrow to be true: %#v", g.Edges[0].DstArrow) + } + if g.Edges[0].Attributes.Label.Value != "two" { + t.Fatalf("expected g.Edges[0].Attributes.Label to be two: %#v", g.Edges[0].Attributes.Label) + } + }, + }, + { + name: "edge_map", + + text: ` +x -> y: { + label: "Space: the final frontier. These are the voyages of the starship Enterprise." +} +`, + assertions: func(t *testing.T, g *d2graph.Graph) { + if len(g.Objects) != 2 { + t.Fatalf("expected 2 objects: %#v", g.Objects) + } + if g.Objects[0].ID != "x" { + t.Fatalf("expected g.Objects[0].ID to be x: %#v", g.Objects[0]) + } + if g.Objects[1].ID != "y" { + t.Fatalf("expected g.Objects[1].ID to be y: %#v", g.Objects[1]) + } + + if len(g.Edges) != 1 { + t.Fatalf("expected 1 edge: %#v", g.Edges) + } + if g.Edges[0].Src.ID != "x" { + t.Fatalf("expected g.Edges[0].Src.ID to be x: %#v", g.Edges[0]) + } + if g.Edges[0].Dst.ID != "y" { + t.Fatalf("expected g.Edges[0].Dst.ID to be y: %#v", g.Edges[0]) + } + if g.Edges[0].Attributes.Label.Value != "Space: the final frontier. These are the voyages of the starship Enterprise." { + t.Fatalf("unexpected g.Edges[0].Attributes.Label.Value : %#v", g.Edges[0].Attributes.Label.Value) + } + }, + }, + { + name: "edge_label_map", + + text: `hey y9 -> qwer: asdf {style.opacity: 0.5} +`, + assertions: func(t *testing.T, g *d2graph.Graph) { + if len(g.Edges) != 1 { + t.Fatalf("expected 1 edge: %#v", g.Edges) + } + if g.Edges[0].Attributes.Label.Value != "asdf" { + t.Fatalf("unexpected g.Edges[0].Attributes.Label.Value : %#v", g.Edges[0].Attributes.Label.Value) + } + }, + }, + { + name: "edge_map_arrowhead", + + text: `x -> y: { + source-arrowhead: { + shape: diamond + } +} +`, + assertions: func(t *testing.T, g *d2graph.Graph) { + if len(g.Edges) != 1 { + t.Fatalf("expected 1 edge: %#v", g.Edges) + } + if len(g.Objects) != 2 { + t.Fatalf("expected 2 objects: %#v", g.Objects) + } + diff.AssertStringEq(t, "diamond", g.Edges[0].SrcArrowhead.Shape.Value) + assert.Empty(t, g.Edges[0].Attributes.Shape.Value) + // Make sure the DSL didn't change. this is a regression test where it did + exp := `x -> y: { + source-arrowhead: { + shape: diamond + } +} +` + newText := d2format.Format(g.AST) + ds, err := diff.Strings(exp, newText) + if err != nil { + t.Fatal(err) + } + if ds != "" { + t.Fatalf("exp != newText:\n%s", ds) + } + }, + }, + { + name: "edge_arrowhead_fields", + + text: `x -> y: { + source-arrowhead: Reisner's Rule of Conceptual Inertia { + shape: diamond + } + target-arrowhead: QOTD + target-arrowhead: { + style.filled: true + } +} +`, + assertions: func(t *testing.T, g *d2graph.Graph) { + if len(g.Edges) != 1 { + t.Fatalf("expected 1 edge: %#v", g.Edges) + } + if len(g.Objects) != 2 { + t.Fatalf("expected 2 objects: %#v", g.Objects) + } + diff.AssertStringEq(t, "diamond", g.Edges[0].SrcArrowhead.Shape.Value) + diff.AssertStringEq(t, "Reisner's Rule of Conceptual Inertia", g.Edges[0].SrcArrowhead.Label.Value) + diff.AssertStringEq(t, "QOTD", g.Edges[0].DstArrowhead.Label.Value) + diff.AssertStringEq(t, "true", g.Edges[0].DstArrowhead.Style.Filled.Value) + assert.Empty(t, g.Edges[0].Attributes.Shape.Value) + assert.Empty(t, g.Edges[0].Attributes.Label.Value) + assert.Nil(t, g.Edges[0].Attributes.Style.Filled) + }, + }, + { + name: "edge_flat_arrowhead", + + text: `x -> y +(x -> y)[0].source-arrowhead.shape: diamond +`, + assertions: func(t *testing.T, g *d2graph.Graph) { + if len(g.Edges) != 1 { + t.Fatalf("expected 1 edge: %#v", g.Edges) + } + if len(g.Objects) != 2 { + t.Fatalf("expected 2 objects: %#v", g.Objects) + } + diff.AssertStringEq(t, "diamond", g.Edges[0].SrcArrowhead.Shape.Value) + assert.Empty(t, g.Edges[0].Attributes.Shape.Value) + }, + }, + { + // tests setting to an arrowhead-only shape + name: "edge_non_shape_arrowhead", + + text: `x -> y: { source-arrowhead.shape: triangle } +`, + assertions: func(t *testing.T, g *d2graph.Graph) { + if len(g.Edges) != 1 { + t.Fatalf("expected 1 edge: %#v", g.Edges) + } + if len(g.Objects) != 2 { + t.Fatalf("expected 2 objects: %#v", g.Objects) + } + diff.AssertStringEq(t, "triangle", g.Edges[0].SrcArrowhead.Shape.Value) + assert.Empty(t, g.Edges[0].Attributes.Shape.Value) + }, + }, + { + name: "object_arrowhead_shape", + + text: `x: {shape: triangle} +`, + expErr: `d2/testdata/d2compiler/TestCompile/object_arrowhead_shape.d2:1:5: invalid shape, can only set "triangle" for arrowheads +`, + }, + { + name: "edge_flat_label_arrowhead", + + text: `x -> y: { + # comment + source-arrowhead.label: yo +} +`, + assertions: func(t *testing.T, g *d2graph.Graph) { + if len(g.Edges) != 1 { + t.Fatalf("expected 1 edge: %#v", g.Edges) + } + if len(g.Objects) != 2 { + t.Fatalf("expected 2 objects: %#v", g.Objects) + } + diff.AssertStringEq(t, "yo", g.Edges[0].SrcArrowhead.Label.Value) + assert.Empty(t, g.Edges[0].Attributes.Label.Value) + }, + }, + { + name: "edge_semiflat_arrowhead", + + text: `x -> y +(x -> y)[0].source-arrowhead: { + shape: diamond +} +`, + assertions: func(t *testing.T, g *d2graph.Graph) { + if len(g.Edges) != 1 { + t.Fatalf("expected 1 edge: %#v", g.Edges) + } + if len(g.Objects) != 2 { + t.Fatalf("expected 2 objects: %#v", g.Objects) + } + diff.AssertStringEq(t, "diamond", g.Edges[0].SrcArrowhead.Shape.Value) + assert.Empty(t, g.Edges[0].Attributes.Shape.Value) + }, + }, + { + name: "edge_mixed_arrowhead", + + text: `x -> y: { + target-arrowhead.shape: diamond +} +(x -> y)[0].source-arrowhead: { + shape: diamond +} +`, + assertions: func(t *testing.T, g *d2graph.Graph) { + if len(g.Edges) != 1 { + t.Fatalf("expected 1 edge: %#v", g.Edges) + } + if len(g.Objects) != 2 { + t.Fatalf("expected 2 objects: %#v", g.Objects) + } + diff.AssertStringEq(t, "diamond", g.Edges[0].SrcArrowhead.Shape.Value) + diff.AssertStringEq(t, "diamond", g.Edges[0].DstArrowhead.Shape.Value) + assert.Empty(t, g.Edges[0].Attributes.Shape.Value) + }, + }, + { + name: "edge_exclusive_style", + + text: ` +x -> y: { + style.animated: true +} +`, + assertions: func(t *testing.T, g *d2graph.Graph) { + if len(g.Edges) != 1 { + t.Fatalf("expected 1 edge: %#v", g.Edges) + } + if g.Edges[0].Attributes.Style.Animated.Value != "true" { + t.Fatalf("Edges[0].Attributes.Style.Animated.Value: %#v", g.Edges[0].Attributes.Style.Animated.Value) + } + }, + }, + { + name: "nested_edge", + + text: `sequence -> quest: { + space -> stars +} +`, + expErr: `d2/testdata/d2compiler/TestCompile/nested_edge.d2:1:1: edges cannot be nested within another edge +`, + }, + { + name: "shape_edge_style", + + text: ` +x: { + style.animated: true +} +`, + expErr: `d2/testdata/d2compiler/TestCompile/shape_edge_style.d2:3:2: key "animated" can only be applied to edges +`, + }, + { + name: "edge_chain_map", + + text: ` +x -> y -> z: { + label: "Space: the final frontier. These are the voyages of the starship Enterprise." +} +`, + assertions: func(t *testing.T, g *d2graph.Graph) { + if len(g.Objects) != 3 { + t.Fatalf("expected 3 objects: %#v", g.Objects) + } + + if len(g.Edges) != 2 { + t.Fatalf("expected 2 edge: %#v", g.Edges) + } + if g.Edges[0].Attributes.Label.Value != "Space: the final frontier. These are the voyages of the starship Enterprise." { + t.Fatalf("unexpected g.Edges[0].Attributes.Label.Value : %#v", g.Edges[0].Attributes.Label.Value) + } + if g.Edges[1].Attributes.Label.Value != "Space: the final frontier. These are the voyages of the starship Enterprise." { + t.Fatalf("unexpected g.Edges[0].Attributes.Label.Value : %#v", g.Edges[1].Attributes.Label.Value) + } + }, + }, + { + name: "edge_index_map", + + text: ` +x -> y +(x -> y)[0]: { + label: "Space: the final frontier. These are the voyages of the starship Enterprise." +} +`, + assertions: func(t *testing.T, g *d2graph.Graph) { + if len(g.Objects) != 2 { + t.Fatalf("expected 2 objects: %#v", g.Objects) + } + + if len(g.Edges) != 1 { + t.Fatalf("expected 1 edge: %#v", g.Edges) + } + if g.Edges[0].Attributes.Label.Value != "Space: the final frontier. These are the voyages of the starship Enterprise." { + t.Fatalf("unexpected g.Edges[0].Attributes.Label.Value : %#v", g.Edges[0].Attributes.Label.Value) + } + }, + }, + { + name: "edge_map_nested", + + text: ` +x -> y: { + style: { + opacity: 0.4 + } +} +`, + assertions: func(t *testing.T, g *d2graph.Graph) { + if len(g.Objects) != 2 { + t.Fatalf("expected 2 objects: %#v", g.Objects) + } + + if len(g.Edges) != 1 { + t.Fatalf("expected 1 edge: %#v", g.Edges) + } + if g.Edges[0].Attributes.Style.Opacity.Value != "0.4" { + t.Fatalf("unexpected g.Edges[0].Attributes.Style.Opacity.Value: %#v", g.Edges[0].Attributes.Style.Opacity.Value) + } + }, + }, + { + name: "edge_map_nested_flat", + + text: ` +x -> y: { + style.opacity: 0.4 +} +`, + assertions: func(t *testing.T, g *d2graph.Graph) { + if len(g.Objects) != 2 { + t.Fatalf("expected 2 objects: %#v", g.Objects) + } + + if len(g.Edges) != 1 { + t.Fatalf("expected 1 edge: %#v", g.Edges) + } + if g.Edges[0].Attributes.Style.Opacity.Value != "0.4" { + t.Fatalf("unexpected g.Edges[0].Attributes.Style.Opacity.Value: %#v", g.Edges[0].Attributes.Style.Opacity.Value) + } + if g.Edges[0].Attributes.Label.Value != "" { + t.Fatalf("unexpected g.Edges[0].Attributes.Label.Value : %#v", g.Edges[0].Attributes.Label.Value) + } + }, + }, + { + name: "edge_map_group_flat", + + text: ` +x -> y +(x -> y)[0].style.opacity: 0.4 +`, + assertions: func(t *testing.T, g *d2graph.Graph) { + if len(g.Objects) != 2 { + t.Fatalf("expected 2 objects: %#v", g.Objects) + } + + if len(g.Edges) != 1 { + t.Fatalf("expected 1 edge: %#v", g.Edges) + } + if g.Edges[0].Attributes.Style.Opacity.Value != "0.4" { + t.Fatalf("unexpected g.Edges[0].Attributes.Style.Opacity.Value: %#v", g.Edges[0].Attributes.Style.Opacity.Value) + } + if g.Edges[0].Attributes.Label.Value != "" { + t.Fatalf("unexpected g.Edges[0].Attributes.Label.Value : %#v", g.Edges[0].Attributes.Label.Value) + } + }, + }, + { + name: "edge_map_group_semiflat", + + text: `x -> y +(x -> y)[0].style: { + opacity: 0.4 +} +`, + assertions: func(t *testing.T, g *d2graph.Graph) { + if len(g.Objects) != 2 { + t.Fatalf("expected 2 objects: %#v", g.Objects) + } + + if len(g.Edges) != 1 { + t.Fatalf("expected 1 edge: %#v", g.Edges) + } + if g.Edges[0].Attributes.Style.Opacity.Value != "0.4" { + t.Fatalf("unexpected g.Edges[0].Attributes.Style.Opacity.Value: %#v", g.Edges[0].Attributes.Style.Opacity.Value) + } + if g.Edges[0].Attributes.Label.Value != "" { + t.Fatalf("unexpected g.Edges[0].Attributes.Label.Value : %#v", g.Edges[0].Attributes.Label.Value) + } + }, + }, + { + name: "edge_key_group_flat_nested", + + text: ` +x: { + a -> b +} +x.(a -> b)[0].style.opacity: 0.4 +`, + assertions: func(t *testing.T, g *d2graph.Graph) { + if len(g.Objects) != 3 { + t.Fatalf("expected 3 objects: %#v", g.Objects) + } + + if len(g.Edges) != 1 { + t.Fatalf("expected 1 edge: %#v", g.Edges) + } + if g.Edges[0].Attributes.Style.Opacity.Value != "0.4" { + t.Fatalf("unexpected g.Edges[0].Attributes.Style.Opacity.Value: %#v", g.Edges[0].Attributes.Style.Opacity.Value) + } + if g.Edges[0].Attributes.Label.Value != "" { + t.Fatalf("unexpected g.Edges[0].Attributes.Label.Value : %#v", g.Edges[0].Attributes.Label.Value) + } + }, + }, + { + name: "edge_key_group_flat_nested_underscore", + + text: ` +a -> b +x: { + (_.a -> _.b)[0].style.opacity: 0.4 +} +`, + assertions: func(t *testing.T, g *d2graph.Graph) { + if len(g.Objects) != 3 { + t.Fatalf("expected 3 objects: %#v", g.Objects) + } + + if len(g.Edges) != 1 { + t.Fatalf("expected 1 edge: %#v", g.Edges) + } + if g.Edges[0].Attributes.Style.Opacity.Value != "0.4" { + t.Fatalf("unexpected g.Edges[0].Attributes.Style.Opacity.Value: %#v", g.Edges[0].Attributes.Style.Opacity.Value) + } + if g.Edges[0].Attributes.Label.Value != "" { + t.Fatalf("unexpected g.Edges[0].Attributes.Label.Value : %#v", g.Edges[0].Attributes.Label.Value) + } + }, + }, + { + name: "edge_key_group_map_nested_underscore", + + text: ` +a -> b +x: { + (_.a -> _.b)[0]: { + style: { + opacity: 0.4 + } + } +} +`, + assertions: func(t *testing.T, g *d2graph.Graph) { + if len(g.Objects) != 3 { + t.Fatalf("expected 3 objects: %#v", g.Objects) + } + + if len(g.Edges) != 1 { + t.Fatalf("expected 1 edge: %#v", g.Edges) + } + if g.Edges[0].Attributes.Style.Opacity.Value != "0.4" { + t.Fatalf("unexpected g.Edges[0].Attributes.Style.Opacity.Value: %#v", g.Edges[0].Attributes.Style.Opacity.Value) + } + if g.Edges[0].Attributes.Label.Value != "" { + t.Fatalf("unexpected g.Edges[0].Attributes.Label.Value : %#v", g.Edges[0].Attributes.Label.Value) + } + }, + }, + { + name: "edge_key_group_map_flat_nested_underscore", + + text: ` +a -> b +x: { + (_.a -> _.b)[0]: { + style.opacity: 0.4 + } +} +`, + assertions: func(t *testing.T, g *d2graph.Graph) { + if len(g.Objects) != 3 { + t.Fatalf("expected 3 objects: %#v", g.Objects) + } + + if len(g.Edges) != 1 { + t.Fatalf("expected 1 edge: %#v", g.Edges) + } + if g.Edges[0].Attributes.Style.Opacity.Value != "0.4" { + t.Fatalf("unexpected g.Edges[0].Attributes.Style.Opacity.Value: %#v", g.Edges[0].Attributes.Style.Opacity.Value) + } + if g.Edges[0].Attributes.Label.Value != "" { + t.Fatalf("unexpected g.Edges[0].Attributes.Label.Value : %#v", g.Edges[0].Attributes.Label.Value) + } + }, + }, + { + name: "edge_map_non_reserved", + + text: ` +x -> y: { + z +} +`, + expErr: `d2/testdata/d2compiler/TestCompile/edge_map_non_reserved.d2:2:1: edge map keys must be reserved keywords +`, + }, + { + name: "url_link", + + text: `x: { + link: https://google.com +} +`, + assertions: func(t *testing.T, g *d2graph.Graph) { + if len(g.Objects) != 1 { + t.Fatal(g.Objects) + } + if g.Objects[0].Attributes.Link != "https://google.com" { + t.Fatal(g.Objects[0].Attributes.Link) + } + }, + }, + { + name: "path_link", + + text: `x: { + link: Overview.Untitled board 7.zzzzz +} +`, + assertions: func(t *testing.T, g *d2graph.Graph) { + if len(g.Objects) != 1 { + t.Fatal(g.Objects) + } + if g.Objects[0].Attributes.Link != "Overview.Untitled board 7.zzzzz" { + t.Fatal(g.Objects[0].Attributes.Link) + } + }, + }, + { + name: "reserved_icon_near_style", + + text: `x: { + icon: orange + style.opacity: 0.5 + style.stroke: red + style.fill: green +} +x.near: y +y +`, + assertions: func(t *testing.T, g *d2graph.Graph) { + if len(g.Objects) != 2 { + t.Fatal(g.Objects) + } + if g.Objects[0].Attributes.NearKey == nil { + t.Fatal("missing near key") + } + if g.Objects[0].Attributes.Icon.Path != "orange" { + t.Fatal(g.Objects[0].Attributes.Icon) + } + if g.Objects[0].Attributes.Style.Opacity.Value != "0.5" { + t.Fatal(g.Objects[0].Attributes.Style.Opacity) + } + if g.Objects[0].Attributes.Style.Stroke.Value != "red" { + t.Fatal(g.Objects[0].Attributes.Style.Stroke) + } + if g.Objects[0].Attributes.Style.Fill.Value != "green" { + t.Fatal(g.Objects[0].Attributes.Style.Fill) + } + }, + }, + { + name: "errors/reserved_icon_style", + + text: `x: { + near: y + icon: "::????:::%%orange" + style.opacity: -1 + style.opacity: 232 +} +`, + expErr: `d2/testdata/d2compiler/TestCompile/errors/reserved_icon_style.d2:3:9: bad icon url "::????:::%%orange": parse "::????:::%%orange": missing protocol scheme +d2/testdata/d2compiler/TestCompile/errors/reserved_icon_style.d2:4:18: expected "opacity" to be a number between 0.0 and 1.0 +d2/testdata/d2compiler/TestCompile/errors/reserved_icon_style.d2:5:18: expected "opacity" to be a number between 0.0 and 1.0 +d2/testdata/d2compiler/TestCompile/errors/reserved_icon_style.d2:1:1: near key "y" does not exist. It must be the absolute path to a shape. +`, + }, + { + name: "errors/missing_shape_icon", + + text: `x.shape: image`, + expErr: `d2/testdata/d2compiler/TestCompile/errors/missing_shape_icon.d2:1:1: image shape must include an "icon" field +`, + }, + { + name: "edge_in_column", + + text: `x: { + shape: sql_table + x: {p -> q} +}`, + }, + { + name: "edge_to_style", + + text: `x: {style.opacity: 0.4} +y -> x.style +`, + expErr: `d2/testdata/d2compiler/TestCompile/edge_to_style.d2:2:1: cannot connect to reserved keyword +`, + }, + { + name: "escaped_id", + + text: `b\nb`, + assertions: func(t *testing.T, g *d2graph.Graph) { + if len(g.Objects) != 1 { + t.Fatal(g.Objects) + } + diff.AssertStringEq(t, `b +b`, g.Objects[0].Attributes.Label.Value) + }, + }, + { + name: "class_style", + + text: `IUserProperties: { + shape: "class" + firstName?: "string" + style.opacity: 0.4 +} +`, + assertions: func(t *testing.T, g *d2graph.Graph) { + if len(g.Objects) != 1 { + t.Fatal(g.Objects) + } + if len(g.Objects[0].Class.Fields) != 1 { + t.Fatal(len(g.Objects[0].Class.Fields)) + } + if len(g.Objects[0].Class.Methods) != 0 { + t.Fatal(len(g.Objects[0].Class.Methods)) + } + if g.Objects[0].Attributes.Style.Opacity.Value != "0.4" { + t.Fatal(g.Objects[0].Attributes.Style.Opacity.Value) + } + }, + }, + { + name: "table_style", + + text: `IUserProperties: { + shape: sql_table + GetType(): string + style.opacity: 0.4 +} +`, + assertions: func(t *testing.T, g *d2graph.Graph) { + if len(g.Objects) != 1 { + t.Fatal(g.Objects) + } + if len(g.Objects[0].SQLTable.Columns) != 1 { + t.Fatal(len(g.Objects[0].SQLTable.Columns)) + } + if g.Objects[0].Attributes.Style.Opacity.Value != "0.4" { + t.Fatal(g.Objects[0].Attributes.Style.Opacity.Value) + } + }, + }, + { + name: "table_style_map", + + text: `IUserProperties: { + shape: sql_table + GetType(): string + style: { + opacity: 0.4 + color: blue + } +} +`, + assertions: func(t *testing.T, g *d2graph.Graph) { + if len(g.Objects) != 1 { + t.Fatal(g.Objects) + } + if len(g.Objects[0].SQLTable.Columns) != 1 { + t.Fatal(len(g.Objects[0].SQLTable.Columns)) + } + if g.Objects[0].Attributes.Style.Opacity.Value != "0.4" { + t.Fatal(g.Objects[0].Attributes.Style.Opacity.Value) + } + }, + }, + { + name: "class_paren", + + text: `_shape_: "shape" { + shape: class + + field here + GetType(): string + Is(): bool +}`, + assertions: func(t *testing.T, g *d2graph.Graph) { + if len(g.Objects) != 1 { + t.Fatal(g.Objects) + } + diff.AssertStringEq(t, `field here`, g.Objects[0].Class.Fields[0].Name) + diff.AssertStringEq(t, `GetType()`, g.Objects[0].Class.Methods[0].Name) + diff.AssertStringEq(t, `Is()`, g.Objects[0].Class.Methods[1].Name) + }, + }, + { + name: "sql_paren", + + text: `_shape_: "shape" { + shape: sql_table + + GetType(): string + Is(): bool +}`, + assertions: func(t *testing.T, g *d2graph.Graph) { + if len(g.Objects) != 1 { + t.Fatal(g.Objects) + } + diff.AssertStringEq(t, `GetType()`, g.Objects[0].SQLTable.Columns[0].Name) + diff.AssertStringEq(t, `Is()`, g.Objects[0].SQLTable.Columns[1].Name) + }, + }, + { + name: "nested_sql", + + text: `outer: { + table: { + shape: sql_table + + GetType(): string + Is(): bool + } +}`, + assertions: func(t *testing.T, g *d2graph.Graph) { + if len(g.Objects) != 2 { + t.Fatal(g.Objects) + } + if _, has := g.Objects[0].HasChild([]string{"table"}); !has { + t.Fatal(g.Objects) + } + if len(g.Objects[0].ChildrenArray) != 1 { + t.Fatal(g.Objects) + } + diff.AssertStringEq(t, `GetType()`, g.Objects[1].SQLTable.Columns[0].Name) + diff.AssertStringEq(t, `Is()`, g.Objects[1].SQLTable.Columns[1].Name) + }, + }, + { + name: "3d_oval", + + text: `SVP1.style.shape: oval +SVP1.style.3d: true`, + expErr: `d2/testdata/d2compiler/TestCompile/3d_oval.d2:2:1: key "3d" can only be applied to squares and rectangles +`, + }, + } + + for _, tc := range testCases { + tc := tc + t.Run(tc.name, func(t *testing.T) { + t.Parallel() + + d2Path := fmt.Sprintf("d2/testdata/d2compiler/%v.d2", t.Name()) + g, err := d2compiler.Compile(d2Path, strings.NewReader(tc.text), nil) + if tc.expErr != "" { + if err == nil { + t.Fatalf("expected error with: %q", tc.expErr) + } + ds, err := diff.Strings(tc.expErr, err.Error()) + if err != nil { + t.Fatal(err) + } + if ds != "" { + t.Fatalf("unexpected error: %s", ds) + } + } else if err != nil { + t.Fatal(err) + } + + if tc.expErr == "" && tc.assertions != nil { + t.Run("assertions", func(t *testing.T) { + tc.assertions(t, g) + }) + } + + got := struct { + Graph *d2graph.Graph `json:"graph"` + Err error `json:"err"` + }{ + Graph: g, + Err: err, + } + + err = diff.Testdata(filepath.Join("..", "testdata", "d2compiler", t.Name()), got) + if err != nil { + t.Fatal(err) + } + }) + } +} diff --git a/d2compiler/doc.go b/d2compiler/doc.go new file mode 100644 index 000000000..03799880e --- /dev/null +++ b/d2compiler/doc.go @@ -0,0 +1,6 @@ +// Package d2compiler implements a parser, compiler and autoformatter for the Terrastruct d2 +// diagramming language. +// +// https://github.com/terrastruct/d2-vscode +// https://terrastruct.com/docs/d2/tour/intro/ +package d2compiler diff --git a/d2exporter/export.go b/d2exporter/export.go new file mode 100644 index 000000000..987ede37d --- /dev/null +++ b/d2exporter/export.go @@ -0,0 +1,233 @@ +package d2exporter + +import ( + "context" + "strconv" + + "oss.terrastruct.com/d2/d2graph" + "oss.terrastruct.com/d2/d2target" + "oss.terrastruct.com/d2/d2themes" + "oss.terrastruct.com/d2/d2themes/d2themescatalog" +) + +func Export(ctx context.Context, g *d2graph.Graph, themeID int64) (*d2target.Diagram, error) { + theme := d2themescatalog.Find(themeID) + + diagram := d2target.NewDiagram() + + diagram.Shapes = make([]d2target.Shape, len(g.Objects)) + for i := range g.Objects { + diagram.Shapes[i] = toShape(g.Objects[i], &theme) + } + + diagram.Connections = make([]d2target.Connection, len(g.Edges)) + for i := range g.Edges { + diagram.Connections[i] = toConnection(g.Edges[i], &theme) + } + + return diagram, nil +} + +func applyTheme(shape *d2target.Shape, obj *d2graph.Object, theme *d2themes.Theme) { + shape.Stroke = obj.GetStroke(theme, shape.StrokeDash) + shape.Fill = obj.GetFill(theme) + if obj.Attributes.Shape.Value == d2target.ShapeText { + shape.Color = theme.Colors.Neutrals.N1 + } +} + +func applyStyles(shape *d2target.Shape, obj *d2graph.Object) { + if obj.Attributes.Style.Opacity != nil { + shape.Opacity, _ = strconv.ParseFloat(obj.Attributes.Style.Opacity.Value, 64) + } + if obj.Attributes.Style.StrokeDash != nil { + shape.StrokeDash, _ = strconv.ParseFloat(obj.Attributes.Style.StrokeDash.Value, 64) + } + if obj.Attributes.Style.Fill != nil { + shape.Fill = obj.Attributes.Style.Fill.Value + } + if obj.Attributes.Style.Stroke != nil { + shape.Stroke = obj.Attributes.Style.Stroke.Value + } + if obj.Attributes.Style.StrokeWidth != nil { + shape.StrokeWidth, _ = strconv.Atoi(obj.Attributes.Style.StrokeWidth.Value) + } + if obj.Attributes.Style.Shadow != nil { + shape.Shadow, _ = strconv.ParseBool(obj.Attributes.Style.Shadow.Value) + } + if obj.Attributes.Style.ThreeDee != nil { + shape.ThreeDee, _ = strconv.ParseBool(obj.Attributes.Style.ThreeDee.Value) + } + if obj.Attributes.Style.Multiple != nil { + shape.Multiple, _ = strconv.ParseBool(obj.Attributes.Style.Multiple.Value) + } + if obj.Attributes.Style.BorderRadius != nil { + shape.BorderRadius, _ = strconv.Atoi(obj.Attributes.Style.BorderRadius.Value) + } + + if obj.Attributes.Style.FontColor != nil { + shape.Color = obj.Attributes.Style.FontColor.Value + } + if obj.Attributes.Shape.Value != d2target.ShapeText { + if obj.Attributes.Style.Italic != nil { + shape.Italic, _ = strconv.ParseBool(obj.Attributes.Style.Italic.Value) + } + if obj.Attributes.Style.Bold != nil { + shape.Bold, _ = strconv.ParseBool(obj.Attributes.Style.Bold.Value) + } + if obj.Attributes.Style.Underline != nil { + shape.Underline, _ = strconv.ParseBool(obj.Attributes.Style.Underline.Value) + } + if obj.Attributes.Style.Font != nil { + shape.FontFamily = obj.Attributes.Style.Font.Value + } + } +} + +func toShape(obj *d2graph.Object, theme *d2themes.Theme) d2target.Shape { + shape := d2target.BaseShape() + shape.SetType(obj.Attributes.Shape.Value) + shape.ID = obj.AbsID() + shape.Pos = d2target.NewPoint(int(obj.TopLeft.X), int(obj.TopLeft.Y)) + shape.Width = int(obj.Width) + shape.Height = int(obj.Height) + + text := obj.Text() + shape.FontSize = text.FontSize + shape.Level = int(obj.Level()) + + applyStyles(shape, obj) + applyTheme(shape, obj, theme) + shape.Color = text.GetColor(theme, shape.Italic) + applyStyles(shape, obj) + + switch obj.Attributes.Shape.Value { + case d2target.ShapeCode, d2target.ShapeText: + shape.Language = obj.Attributes.Language + shape.Label = obj.Attributes.Label.Value + case d2target.ShapeClass: + shape.Class = *obj.Class + // The label is the header for classes and tables, which is set in client to be 4 px larger than the object's set font size + shape.FontSize -= 4 + case d2target.ShapeSQLTable: + shape.SQLTable = *obj.SQLTable + shape.FontSize -= 4 + } + shape.Label = text.Text + shape.LabelWidth = text.Dimensions.Width + shape.LabelHeight = text.Dimensions.Height + if obj.LabelPosition != nil { + shape.LabelPosition = *obj.LabelPosition + } + + shape.Tooltip = obj.Attributes.Tooltip + shape.Link = obj.Attributes.Link + shape.Icon = obj.Attributes.Icon + if obj.IconPosition != nil { + shape.IconPosition = *obj.IconPosition + } + + return *shape +} + +func toConnection(edge *d2graph.Edge, theme *d2themes.Theme) d2target.Connection { + connection := d2target.BaseConnection() + connection.ID = edge.AbsID() + // edge.Edge.ID = go2.StringToIntHash(connection.ID) + text := edge.Text() + + if edge.SrcArrow { + connection.SrcArrow = d2target.TriangleArrowhead + if edge.SrcArrowhead != nil { + if edge.SrcArrowhead.Shape.Value != "" { + filled := false + if edge.SrcArrowhead.Style.Filled != nil { + filled, _ = strconv.ParseBool(edge.SrcArrowhead.Style.Filled.Value) + } + connection.SrcArrow = d2target.ToArrowhead(edge.SrcArrowhead.Shape.Value, filled) + } + } + } + if edge.SrcArrowhead != nil { + if edge.SrcArrowhead.Label.Value != "" { + connection.SrcLabel = edge.SrcArrowhead.Label.Value + } + } + if edge.DstArrow { + connection.DstArrow = d2target.TriangleArrowhead + if edge.DstArrowhead != nil { + if edge.DstArrowhead.Shape.Value != "" { + filled := false + if edge.DstArrowhead.Style.Filled != nil { + filled, _ = strconv.ParseBool(edge.DstArrowhead.Style.Filled.Value) + } + connection.DstArrow = d2target.ToArrowhead(edge.DstArrowhead.Shape.Value, filled) + } + } + } + if edge.DstArrowhead != nil { + if edge.DstArrowhead.Label.Value != "" { + connection.DstLabel = edge.DstArrowhead.Label.Value + } + } + + if edge.Attributes.Style.Opacity != nil { + connection.Opacity, _ = strconv.ParseFloat(edge.Attributes.Style.Opacity.Value, 64) + } + + if edge.Attributes.Style.StrokeDash != nil { + connection.StrokeDash, _ = strconv.ParseFloat(edge.Attributes.Style.StrokeDash.Value, 64) + } + connection.Stroke = edge.GetStroke(theme, connection.StrokeDash) + if edge.Attributes.Style.Stroke != nil { + connection.Stroke = edge.Attributes.Style.Stroke.Value + } + + if edge.Attributes.Style.StrokeWidth != nil { + connection.StrokeWidth, _ = strconv.Atoi(edge.Attributes.Style.StrokeWidth.Value) + } + + connection.FontSize = text.FontSize + if edge.Attributes.Style.FontSize != nil { + connection.FontSize, _ = strconv.Atoi(edge.Attributes.Style.FontSize.Value) + } + + if edge.Attributes.Style.Animated != nil { + connection.Animated, _ = strconv.ParseBool(edge.Attributes.Style.Animated.Value) + } + + connection.Tooltip = edge.Attributes.Tooltip + connection.Icon = edge.Attributes.Icon + + if edge.Attributes.Style.Italic != nil { + connection.Italic, _ = strconv.ParseBool(edge.Attributes.Style.Italic.Value) + } + + connection.Color = text.GetColor(theme, connection.Italic) + if edge.Attributes.Style.FontColor != nil { + connection.Color = edge.Attributes.Style.FontColor.Value + } + if edge.Attributes.Style.Bold != nil { + connection.Bold, _ = strconv.ParseBool(edge.Attributes.Style.Bold.Value) + } + if edge.Attributes.Style.Font != nil { + connection.FontFamily = edge.Attributes.Style.Font.Value + } + connection.Label = text.Text + connection.LabelWidth = text.Dimensions.Width + connection.LabelHeight = text.Dimensions.Height + + if edge.LabelPosition != nil { + connection.LabelPosition = *edge.LabelPosition + } + if edge.LabelPercentage != nil { + connection.LabelPercentage = *edge.LabelPercentage + } + connection.Route = edge.Route + connection.IsCurve = edge.IsCurve + + connection.Src = edge.Src.AbsID() + connection.Dst = edge.Dst.AbsID() + + return *connection +} diff --git a/d2exporter/export_test.go b/d2exporter/export_test.go new file mode 100644 index 000000000..1d63d0604 --- /dev/null +++ b/d2exporter/export_test.go @@ -0,0 +1,259 @@ +package d2exporter_test + +import ( + "context" + "path/filepath" + "strings" + "testing" + + "cdr.dev/slog" + + "oss.terrastruct.com/diff" + + "github.com/stretchr/testify/assert" + + "oss.terrastruct.com/d2/d2compiler" + "oss.terrastruct.com/d2/d2exporter" + "oss.terrastruct.com/d2/d2layouts/d2dagrelayout" + "oss.terrastruct.com/d2/d2renderers/textmeasure" + "oss.terrastruct.com/d2/d2target" + "oss.terrastruct.com/d2/d2themes/d2themescatalog" + "oss.terrastruct.com/d2/lib/geo" + "oss.terrastruct.com/d2/lib/log" +) + +type testCase struct { + name string + dsl string + themeID int64 + + assertions func(t *testing.T, d *d2target.Diagram) +} + +func TestExport(t *testing.T) { + t.Parallel() + + t.Run("shape", testShape) + t.Run("connection", testConnection) + t.Run("label", testLabel) + t.Run("theme", testTheme) +} + +func testShape(t *testing.T) { + tcs := []testCase{ + { + name: "basic", + dsl: `x +`, + }, + { + name: "synonyms", + dsl: `x: {shape: circle} +y: {shape: square} +`, + }, + { + name: "text_color", + dsl: `x: |md yo | { style.font-color: red } +`, + }, + { + name: "border-radius", + dsl: `Square: "" { style.border-radius: 5 } +`, + }, + { + name: "image_dimensions", + + dsl: `hey: "" { + icon: https://icons.terrastruct.com/essentials/004-picture.svg + shape: image + width: 200 + height: 230 +} +`, + assertions: func(t *testing.T, d *d2target.Diagram) { + if d.Shapes[0].Width != 200 { + t.Fatalf("expected width 200, got %v", d.Shapes[0].Width) + } + if d.Shapes[0].Height != 230 { + t.Fatalf("expected height 230, got %v", d.Shapes[0].Height) + } + }, + }, + } + + runa(t, tcs) +} + +func testConnection(t *testing.T) { + tcs := []testCase{ + { + name: "basic", + dsl: `x -> y +`, + }, + { + name: "stroke-dash", + dsl: `x -> y: { style.stroke-dash: 4 } +`, + }, + { + name: "arrowhead", + dsl: `x -> y: { + source-arrowhead: If you've done six impossible things before breakfast, why not round it + target-arrowhead: { + label: A man with one watch knows what time it is. + shape: diamond + style.filled: true + } +} +`, + }, + { + // This is a regression test where a connection with stroke-dash of 0 on terrastruct flagship theme would have a diff color + // than a connection without stroke dash + themeID: d2themescatalog.FlagshipTerrastruct.ID, + name: "theme_stroke-dash", + dsl: `x -> y: { style.stroke-dash: 0 } +x -> y +`, + }, + } + + runa(t, tcs) +} + +func testLabel(t *testing.T) { + tcs := []testCase{ + { + name: "basic_shape", + dsl: `x: yo +`, + }, + { + name: "shape_font_color", + dsl: `x: yo { style.font-color: red } +`, + }, + { + name: "connection_font_color", + dsl: `x -> y: yo { style.font-color: red } +`, + }, + } + + runa(t, tcs) +} + +func testTheme(t *testing.T) { + tcs := []testCase{ + { + name: "shape_without_bold", + themeID: d2themescatalog.FlagshipTerrastruct.ID, + dsl: `x: { + style.bold: false +} +`, + }, + { + name: "shape_with_italic", + themeID: d2themescatalog.FlagshipTerrastruct.ID, + dsl: `x: { + style.italic: true +} +`, + }, + { + name: "connection_without_italic", + dsl: `x -> y: asdf { style.italic: false } +`, + themeID: d2themescatalog.FlagshipTerrastruct.ID, + }, + { + name: "connection_with_italic", + dsl: `x -> y: asdf { + style.italic: true +} +`, + themeID: d2themescatalog.FlagshipTerrastruct.ID, + }, + { + name: "connection_with_bold", + dsl: `x -> y: asdf { + style.bold: true +} +`, + themeID: d2themescatalog.FlagshipTerrastruct.ID, + }, + } + + runa(t, tcs) +} + +func runa(t *testing.T, tcs []testCase) { + for _, tc := range tcs { + tc := tc + t.Run(tc.name, func(t *testing.T) { + t.Parallel() + + run(t, tc) + }) + } +} + +func run(t *testing.T, tc testCase) { + ctx := context.Background() + ctx = log.WithTB(ctx, t, nil) + ctx = log.Leveled(ctx, slog.LevelDebug) + + g, err := d2compiler.Compile("", strings.NewReader(tc.dsl), &d2compiler.CompileOptions{ + UTF16: true, + }) + if err != nil { + t.Fatal(err) + } + + ruler, err := textmeasure.NewRuler() + assert.Nil(t, err) + + err = g.SetDimensions(nil, ruler) + assert.Nil(t, err) + + err = d2dagrelayout.Layout(ctx, g) + if err != nil { + t.Fatal(err) + } + + got, err := d2exporter.Export(ctx, g, tc.themeID) + if err != nil { + t.Fatal(err) + } + + if tc.assertions != nil { + t.Run("assertions", func(t *testing.T) { + tc.assertions(t, got) + }) + } + + // This test is agnostic of layout changes + for i := range got.Shapes { + got.Shapes[i].Pos = d2target.Point{} + got.Shapes[i].Width = 0 + got.Shapes[i].Height = 0 + got.Shapes[i].LabelWidth = 0 + got.Shapes[i].LabelHeight = 0 + got.Shapes[i].LabelPosition = "" + } + for i := range got.Connections { + got.Connections[i].Route = []*geo.Point{} + got.Connections[i].LabelWidth = 0 + got.Connections[i].LabelHeight = 0 + got.Connections[i].LabelPosition = "" + } + + err = diff.Testdata(filepath.Join("..", "testdata", "d2exporter", t.Name()), got) + if err != nil { + t.Fatal(err) + } +} diff --git a/d2format/escape.go b/d2format/escape.go new file mode 100644 index 000000000..b6267ea80 --- /dev/null +++ b/d2format/escape.go @@ -0,0 +1,88 @@ +package d2format + +import ( + "strings" + + "oss.terrastruct.com/d2/d2ast" +) + +func escapeSingleQuotedValue(s string) string { + var b strings.Builder + for _, r := range s { + switch r { + case '\'': + b.WriteByte('\'') + case '\n': + // TODO: Unified string syntax. + b.WriteByte('\\') + b.WriteByte('n') + continue + } + b.WriteRune(r) + } + return b.String() +} + +func escapeDoubledQuotedValue(s string, inKey bool) string { + var b strings.Builder + for _, r := range s { + switch r { + case '"', '\\': + b.WriteByte('\\') + case '\n': + b.WriteByte('\\') + b.WriteByte('n') + continue + } + if !inKey && r == '$' { + b.WriteByte('\\') + } + b.WriteRune(r) + } + return b.String() +} + +func escapeUnquotedValue(s string, inKey bool) string { + if len(s) == 0 { + return `""` + } + + if strings.EqualFold(s, "null") { + return "\\null" + } + + var b strings.Builder + for i, r := range s { + switch r { + case '\'', '"', '|': + if i == 0 { + b.WriteByte('\\') + } + case '\n': + b.WriteByte('\\') + b.WriteByte('n') + continue + default: + if inKey { + switch r { + case '-': + if i+1 < len(s) && s[i+1] == '-' { + b.WriteByte('\\') + } + case '&': + if i == 0 { + b.WriteByte('\\') + } + default: + if strings.ContainsRune(d2ast.UnquotedKeySpecials, r) { + b.WriteByte('\\') + } + } + } else if strings.ContainsRune(d2ast.UnquotedValueSpecials, r) { + b.WriteByte('\\') + } + } + b.WriteRune(r) + } + return b.String() +} diff --git a/d2format/escape_test.go b/d2format/escape_test.go new file mode 100644 index 000000000..2d50d6e4a --- /dev/null +++ b/d2format/escape_test.go @@ -0,0 +1,294 @@ +package d2format_test + +import ( + "testing" + + "oss.terrastruct.com/diff" + + "oss.terrastruct.com/d2/d2ast" + "oss.terrastruct.com/d2/d2format" +) + +func TestEscapeSingleQuoted(t *testing.T) { + t.Parallel() + + testCases := []struct { + name string + str string + exp string + }{ + { + name: "simple", + str: `Things will be bright in P.M. Love is a snowmobile racing across the tundra, which suddenly flips.`, + exp: `'Things will be bright in P.M. Love is a snowmobile racing across the tundra, which suddenly flips.'`, + }, + { + name: "single_quotes", + str: `'rawr'`, + exp: `'''rawr'''`, + }, + { + name: "newlines", + str: ` + + +`, + exp: `'\n\n\n'`, + }, + } + + for _, tc := range testCases { + tc := tc + t.Run(tc.name, func(t *testing.T) { + t.Parallel() + + diff.AssertStringEq(t, tc.exp, d2format.Format(&d2ast.SingleQuotedString{ + Value: tc.str, + })) + }) + } +} + +func TestEscapeDoubleQuoted(t *testing.T) { + t.Parallel() + + testCases := []struct { + name string + str string + exp string + inKey bool + }{ + { + name: "simple", + str: `Things will be bright in P.M. Love is a snowmobile racing across the tundra, which suddenly flips.`, + exp: `"Things will be bright in P.M. Love is a snowmobile racing across the tundra, which suddenly flips."`, + }, + { + name: "specials_1", + str: `"\x`, + exp: `"\"\\x"`, + }, + { + name: "specials_2", + str: `$$3es`, + exp: `"\$\$3es"`, + }, + { + name: "newlines", + str: ` + + +`, + exp: `"\n\n\n"`, + }, + { + name: "specials_key", + str: `$$3es`, + exp: `"$$3es"`, + inKey: true, + }, + } + + for _, tc := range testCases { + tc := tc + t.Run(tc.name, func(t *testing.T) { + t.Parallel() + + var n d2ast.Node + if tc.inKey { + n = &d2ast.KeyPath{ + Path: []*d2ast.StringBox{ + d2ast.MakeValueBox(d2ast.FlatDoubleQuotedString(tc.str)).StringBox(), + }, + } + } else { + n = d2ast.FlatDoubleQuotedString(tc.str) + } + diff.AssertStringEq(t, tc.exp, d2format.Format(n)) + }) + } +} + +func TestEscapeUnquoted(t *testing.T) { + t.Parallel() + + testCases := []struct { + name string + str string + exp string + inKey bool + }{ + { + name: "simple", + str: `Change your thoughts and you change your world.`, + exp: `Change your thoughts and you change your world.`, + }, + { + name: "specials_1", + str: `meow;{};meow`, + exp: `meow\;\{\}\;meow`, + }, + { + name: "specials_2", + str: `'meow-#'`, + exp: `\'meow-\#'`, + }, + { + name: "specials_3", + str: `#meow|`, + exp: `\#meow|`, + }, + { + name: "specials_key_1", + str: `<---->`, + exp: `\<\-\-\--\>`, + inKey: true, + }, + { + name: "specials_key_2", + str: `:::::`, + exp: `\:\:\:\:\:`, + inKey: true, + }, + { + name: "specials_key_3", + str: `&&OKAY!! Turn on the sound ONLY for TRYNEL CARPETING, FULLY-EQUIPPED`, + exp: `\&&OKAY!! Turn on the sound ONLY for TRYNEL CARPETING, FULLY-EQUIPPED`, + inKey: true, + }, + { + name: "specials_key_4", + str: `*-->`, + exp: `\*\--\>`, + inKey: true, + }, + { + name: "specials_key_4_notkey", + str: `*-->`, + exp: `*-->`, + }, + { + name: "null", + str: `null`, + exp: `\null`, + }, + { + name: "empty", + str: ``, + exp: `""`, + }, + { + name: "newlines", + str: ` + + +`, + exp: `\n\n\n`, + }, + } + + for _, tc := range testCases { + tc := tc + t.Run(tc.name, func(t *testing.T) { + t.Parallel() + + var n d2ast.Node + if tc.inKey { + n = &d2ast.KeyPath{ + Path: []*d2ast.StringBox{ + d2ast.MakeValueBox(d2ast.FlatUnquotedString(tc.str)).StringBox(), + }, + } + } else { + n = d2ast.FlatUnquotedString(tc.str) + } + + diff.AssertStringEq(t, tc.exp, d2format.Format(n)) + }) + } +} + +func TestEscapeBlockString(t *testing.T) { + t.Parallel() + + testCases := []struct { + name string + + tag string + quote string + value string + + exp string + }{ + { + name: "oneline", + value: `Change your thoughts and you change your world.`, + exp: `| Change your thoughts and you change your world. |`, + }, + { + name: "multiline", + value: `Change your thoughts and you change your world. +`, + exp: `| + Change your thoughts and you change your world. +|`, + }, + { + name: "empty", + value: ``, + exp: `| |`, + }, + { + name: "quote_1", + value: `|%%% %%%|`, + quote: "%%%", + + exp: `|%%%% |%%% %%%| %%%%|`, + }, + { + name: "quote_2", + value: `|%%% %%%%|`, + quote: "%%%", + + exp: `|%%%%% |%%% %%%%| %%%%%|`, + }, + { + name: "quote_3", + value: `||`, + quote: "", + + exp: `||| || |||`, + }, + { + name: "tag", + value: `This must be morning. I never could get the hang of mornings.`, + tag: "html", + + exp: `|html This must be morning. I never could get the hang of mornings. |`, + }, + { + name: "bad_tag", + value: `This must be morning. I never could get the hang of mornings.`, + tag: "ok ok", + + exp: `|ok ok This must be morning. I never could get the hang of mornings. |`, + }, + } + + for _, tc := range testCases { + tc := tc + t.Run(tc.name, func(t *testing.T) { + t.Parallel() + + n := &d2ast.BlockString{ + Quote: tc.quote, + Tag: tc.tag, + Value: tc.value, + } + + diff.AssertStringEq(t, tc.exp, d2format.Format(n)) + }) + } +} + +// TODO: chaos test each diff --git a/d2format/format.go b/d2format/format.go new file mode 100644 index 000000000..754e3302a --- /dev/null +++ b/d2format/format.go @@ -0,0 +1,399 @@ +package d2format + +import ( + "strconv" + "strings" + + "oss.terrastruct.com/d2/d2ast" +) + +// TODO: edges with shared path should be fmted as .(x -> y) +func Format(n d2ast.Node) string { + var p printer + p.node(n) + return p.sb.String() +} + +type printer struct { + sb strings.Builder + indentStr string + inKey bool +} + +func (p *printer) indent() { + p.indentStr += " " + " " +} + +func (p *printer) deindent() { + p.indentStr = p.indentStr[:len(p.indentStr)-2] +} + +func (p *printer) newline() { + p.sb.WriteByte('\n') + p.sb.WriteString(p.indentStr) +} + +func (p *printer) node(n d2ast.Node) { + switch n := n.(type) { + case *d2ast.Comment: + p.comment(n) + case *d2ast.BlockComment: + p.blockComment(n) + case *d2ast.Null: + p.sb.WriteString("null") + case *d2ast.Boolean: + p.sb.WriteString(strconv.FormatBool(n.Value)) + case *d2ast.Number: + p.sb.WriteString(n.Raw) + case *d2ast.UnquotedString: + p.interpolationBoxes(n.Value, false) + case *d2ast.DoubleQuotedString: + p.sb.WriteByte('"') + p.interpolationBoxes(n.Value, true) + p.sb.WriteByte('"') + case *d2ast.SingleQuotedString: + p.sb.WriteByte('\'') + if n.Raw == "" { + n.Raw = escapeSingleQuotedValue(n.Value) + } + p.sb.WriteString(escapeSingleQuotedValue(n.Value)) + p.sb.WriteByte('\'') + case *d2ast.BlockString: + p.blockString(n) + case *d2ast.Substitution: + p.substitution(n) + case *d2ast.Array: + p.array(n) + case *d2ast.Map: + p._map(n) + case *d2ast.Key: + p.mapKey(n) + case *d2ast.KeyPath: + p.key(n) + case *d2ast.Edge: + p.edge(n) + case *d2ast.EdgeIndex: + p.edgeIndex(n) + } +} + +func (p *printer) comment(c *d2ast.Comment) { + lines := strings.Split(c.Value, "\n") + for i, line := range lines { + p.sb.WriteString("#") + if line != "" && !strings.HasPrefix(line, " ") { + p.sb.WriteByte(' ') + } + p.sb.WriteString(line) + if i < len(lines)-1 { + p.newline() + } + } +} + +func (p *printer) blockComment(bc *d2ast.BlockComment) { + p.sb.WriteString(`"""`) + if bc.Range.OneLine() { + p.sb.WriteByte(' ') + } + + lines := strings.Split(bc.Value, "\n") + for _, l := range lines { + if !bc.Range.OneLine() { + if l == "" { + p.sb.WriteByte('\n') + } else { + p.newline() + } + } + p.sb.WriteString(l) + } + + if !bc.Range.OneLine() { + p.newline() + } else { + p.sb.WriteByte(' ') + } + p.sb.WriteString(`"""`) +} + +func (p *printer) interpolationBoxes(boxes []d2ast.InterpolationBox, isDoubleString bool) { + for _, b := range boxes { + if b.Substitution != nil { + p.substitution(b.Substitution) + continue + } + if b.StringRaw == nil { + var s string + if isDoubleString { + s = escapeDoubledQuotedValue(*b.String, p.inKey) + } else { + s = escapeUnquotedValue(*b.String, p.inKey) + } + b.StringRaw = &s + } + p.sb.WriteString(*b.StringRaw) + } +} + +func (p *printer) blockString(bs *d2ast.BlockString) { + quote := bs.Quote + for strings.Contains(bs.Value, "|"+quote) { + if quote == "" { + quote += "|" + } else { + quote += string(quote[len(quote)-1]) + } + } + for strings.Contains(bs.Value, quote+"|") { + quote += string(quote[len(quote)-1]) + } + + if bs.Range == (d2ast.Range{}) { + if strings.IndexByte(bs.Value, '\n') > -1 { + bs.Range = d2ast.MakeRange(",1:0:0-2:0:0") + } + bs.Value = strings.TrimSpace(bs.Value) + } + + p.sb.WriteString("|" + quote) + p.sb.WriteString(bs.Tag) + if !bs.Range.OneLine() { + p.indent() + } else { + p.sb.WriteByte(' ') + } + + lines := strings.Split(bs.Value, "\n") + for _, l := range lines { + if !bs.Range.OneLine() { + if l == "" { + p.sb.WriteByte('\n') + } else { + p.newline() + } + } + p.sb.WriteString(l) + } + + if !bs.Range.OneLine() { + p.deindent() + p.newline() + } else if bs.Value != "" { + p.sb.WriteByte(' ') + } + p.sb.WriteString(quote + "|") +} + +func (p *printer) path(els []*d2ast.StringBox) { + for i, s := range els { + p.node(s.Unbox()) + if i < len(els)-1 { + p.sb.WriteByte('.') + } + } +} + +func (p *printer) substitution(s *d2ast.Substitution) { + if s.Spread { + p.sb.WriteString("...") + } + p.sb.WriteString("${") + p.path(s.Path) + p.sb.WriteByte('}') +} + +func (p *printer) array(a *d2ast.Array) { + p.sb.WriteByte('[') + if !a.Range.OneLine() { + p.indent() + } + + prev := d2ast.Node(a) + for i := 0; i < len(a.Nodes); i++ { + nb := a.Nodes[i] + n := nb.Unbox() + + // Handle inline comments. + if i > 0 && (nb.Comment != nil || nb.BlockComment != nil) { + if n.GetRange().Start.Line == prev.GetRange().End.Line && n.GetRange().OneLine() { + p.sb.WriteByte(' ') + p.node(n) + continue + } + } + + if !a.Range.OneLine() { + if prev != a { + if n.GetRange().Start.Line-prev.GetRange().End.Line > 1 { + p.sb.WriteByte('\n') + } + } + p.newline() + } else if i > 0 { + p.sb.WriteString("; ") + } + + p.node(n) + prev = n + } + + if !a.Range.OneLine() { + p.deindent() + p.newline() + } + p.sb.WriteByte(']') +} + +func (p *printer) _map(m *d2ast.Map) { + if !m.IsFileMap() { + p.sb.WriteByte('{') + if !m.Range.OneLine() { + p.indent() + } + } + + prev := d2ast.Node(m) + for i := 0; i < len(m.Nodes); i++ { + nb := m.Nodes[i] + n := nb.Unbox() + + // Handle inline comments. + if i > 0 && (nb.Comment != nil || nb.BlockComment != nil) { + if n.GetRange().Start.Line == prev.GetRange().End.Line && n.GetRange().OneLine() { + p.sb.WriteByte(' ') + p.node(n) + continue + } + } + + if !m.Range.OneLine() { + if prev != m { + if n.GetRange().Start.Line-prev.GetRange().End.Line > 1 { + p.sb.WriteByte('\n') + } + } + if !m.IsFileMap() || i > 0 { + p.newline() + } + } else if i > 0 { + p.sb.WriteString("; ") + } + + p.node(n) + prev = n + } + + if !m.IsFileMap() { + if !m.Range.OneLine() { + p.deindent() + p.newline() + } + p.sb.WriteByte('}') + } else if len(m.Nodes) > 0 { + // Always write a trailing newline for nonempty file maps. + p.sb.WriteByte('\n') + } +} + +func (p *printer) mapKey(mk *d2ast.Key) { + if mk.Ampersand { + p.sb.WriteByte('&') + } + if mk.Key != nil { + p.key(mk.Key) + } + + if len(mk.Edges) > 0 { + if mk.Key != nil { + p.sb.WriteByte('.') + } + + if mk.Key != nil || mk.EdgeIndex != nil || mk.EdgeKey != nil { + p.sb.WriteByte('(') + } + if mk.Edges[0].Src != nil { + p.key(mk.Edges[0].Src) + p.sb.WriteByte(' ') + } + for i, e := range mk.Edges { + p.edgeArrowAndDst(e) + if i < len(mk.Edges)-1 { + p.sb.WriteByte(' ') + } + } + if mk.Key != nil || mk.EdgeIndex != nil || mk.EdgeKey != nil { + p.sb.WriteByte(')') + } + + if mk.EdgeIndex != nil { + p.edgeIndex(mk.EdgeIndex) + } + if mk.EdgeKey != nil { + p.sb.WriteByte('.') + p.key(mk.EdgeKey) + } + } + + if mk.Primary.Unbox() != nil { + p.sb.WriteString(": ") + p.node(mk.Primary.Unbox()) + } + if mk.Value.Map != nil && len(mk.Value.Map.Nodes) == 0 { + return + } + if mk.Value.Unbox() != nil { + if mk.Primary.Unbox() == nil { + p.sb.WriteString(": ") + } else { + p.sb.WriteByte(' ') + } + p.node(mk.Value.Unbox()) + } +} + +func (p *printer) key(k *d2ast.KeyPath) { + p.inKey = true + if k != nil { + p.path(k.Path) + } + p.inKey = false +} + +func (p *printer) edge(e *d2ast.Edge) { + if e.Src != nil { + p.key(e.Src) + p.sb.WriteByte(' ') + } + p.edgeArrowAndDst(e) +} + +func (p *printer) edgeArrowAndDst(e *d2ast.Edge) { + if e.SrcArrow == "" { + p.sb.WriteByte('-') + } else { + p.sb.WriteString(e.SrcArrow) + } + if e.DstArrow == "" { + p.sb.WriteByte('-') + } else { + if e.SrcArrow != "" { + p.sb.WriteByte('-') + } + p.sb.WriteString(e.DstArrow) + } + if e.Dst != nil { + p.sb.WriteByte(' ') + p.key(e.Dst) + } +} + +func (p *printer) edgeIndex(ei *d2ast.EdgeIndex) { + p.sb.WriteByte('[') + if ei.Glob { + p.sb.WriteByte('*') + } else { + p.sb.WriteString(strconv.Itoa(*ei.Int)) + } + p.sb.WriteByte(']') +} diff --git a/d2format/format_test.go b/d2format/format_test.go new file mode 100644 index 000000000..224154ca3 --- /dev/null +++ b/d2format/format_test.go @@ -0,0 +1,626 @@ +package d2format_test + +import ( + "fmt" + "strings" + "testing" + + "oss.terrastruct.com/diff" + + "oss.terrastruct.com/d2/d2format" + "oss.terrastruct.com/d2/d2parser" +) + +func TestPrint(t *testing.T) { + t.Parallel() + + testCases := []struct { + name string + in string + exp string + }{ + { + name: "basic", + in: ` +x -> y +`, + exp: `x -> y +`, + }, + + { + name: "complex", + in: ` +sql_example : sql_example { +board : { +shape: sql_table +id: int {constraint: primary_key} +frame: int {constraint: foreign_key} +diagram: int {constraint: foreign_key} +board_objects: jsonb +last_updated: timestamp with time zone +last_thumbgen: timestamp with time zone +dsl : text + } + + # Normal. + board.diagram -> diagrams.id + + # Self referential. + diagrams.id -> diagrams.representation + + # SrcArrow test. + diagrams.id <- views . diagram + diagrams.id <-> steps . diagram + + diagrams: { + shape: sql_table + id: {type: int ; constraint: primary_key} + representation: {type: jsonb} + } + + views: { + shape: sql_table + id: {type: int; constraint: primary_key} + representation: {type: jsonb} + diagram: int {constraint: foreign_key} +} + + steps: { + shape: sql_table +id: { type: int; constraint: primary_key } +representation: { type: jsonb } +diagram: int {constraint: foreign_key} + } + meow <- diagrams.id +} + +D2 AST Parser { + shape: class + + +prevRune : rune + prevColumn : int + + +eatSpace(eatNewlines bool): (rune, error) + unreadRune() + + \#scanKey(r rune): (k Key, _ error) +} + +"""dmaskkldsamkld """ + + +""" + +dmaskdmasl +mdlkasdaskml +daklsmdakms + +""" + +bs: | +dmasmdkals +dkmsamdklsa +| +bs2: | mdsalldkams| + +y-->q: meow +x->y->z + +meow: { +x: |` + "`" + ` +meow +meow +` + "`" + `| { +} +} + + +"meow\t": ok +`, + exp: `sql_example: sql_example { + board: { + shape: sql_table + id: int {constraint: primary_key} + frame: int {constraint: foreign_key} + diagram: int {constraint: foreign_key} + board_objects: jsonb + last_updated: timestamp with time zone + last_thumbgen: timestamp with time zone + dsl: text + } + + # Normal. + board.diagram -> diagrams.id + + # Self referential. + diagrams.id -> diagrams.representation + + # SrcArrow test. + diagrams.id <- views.diagram + diagrams.id <-> steps.diagram + + diagrams: { + shape: sql_table + id: {type: int; constraint: primary_key} + representation: {type: jsonb} + } + + views: { + shape: sql_table + id: {type: int; constraint: primary_key} + representation: {type: jsonb} + diagram: int {constraint: foreign_key} + } + + steps: { + shape: sql_table + id: {type: int; constraint: primary_key} + representation: {type: jsonb} + diagram: int {constraint: foreign_key} + } + meow <- diagrams.id +} + +D2 AST Parser: { + shape: class + + +prevRune: rune + prevColumn: int + + +eatSpace(eatNewlines bool): (rune, error) + unreadRune() + + \#scanKey(r rune): (k Key, _ error) +} + +""" dmaskkldsamkld """ + +""" + +dmaskdmasl +mdlkasdaskml +daklsmdakms + +""" + +bs: |md + dmasmdkals + dkmsamdklsa +| +bs2: |md mdsalldkams | + +y -> q: meow +x -> y -> z + +meow: { + x: |` + "`" + `md + meow + meow + ` + "`" + `| +} + +"meow\t": ok +`, + }, + + { + name: "block_comment", + in: ` +""" +D2 AST Parser2: { + shape: class + + reader: io.RuneReader + readerPos: d2ast.Position + + lookahead: "[]rune" + lookaheadPos: d2ast.Position + + peek() (r rune, eof bool) + -rewind(): () + +commit() + \#peekn(n int) (s string, eof bool) +} +""" +`, + exp: `""" +D2 AST Parser2: { + shape: class + + reader: io.RuneReader + readerPos: d2ast.Position + + lookahead: "[]rune" + lookaheadPos: d2ast.Position + + peek() (r rune, eof bool) + -rewind(): () + +commit() + \#peekn(n int) (s string, eof bool) +} +""" +`, + }, + + { + name: "block_string_indent", + in: ` +parent: { +example_code: |` + "`" + `go +package fs + +type FS interface { + Open(name string) (File, error) +} + +type File interface { + Stat() (FileInfo, error) + Read([]byte) (int, error) + Close() error +} + +var ( + ErrInvalid = errInvalid() // "invalid argument" + ErrPermission = errPermission() // "permission denied" + ErrExist = errExist() // "file already exists" + ErrNotExist = errNotExist() // "file does not exist" + ErrClosed = errClosed() // "file already closed" +) +` + "`" + `|}`, + exp: `parent: { + example_code: |` + "`" + `go + package fs + + type FS interface { + Open(name string) (File, error) + } + + type File interface { + Stat() (FileInfo, error) + Read([]byte) (int, error) + Close() error + } + + var ( + ErrInvalid = errInvalid() // "invalid argument" + ErrPermission = errPermission() // "permission denied" + ErrExist = errExist() // "file already exists" + ErrNotExist = errNotExist() // "file does not exist" + ErrClosed = errClosed() // "file already closed" + ) + ` + "`" + `| +} +`, + }, + + { + // This one we test that the common indent is stripped before the correct indent is + // applied. + name: "block_string_indent_2", + in: ` +parent: { +example_code: |` + "`" + `go + package fs + + type FS interface { + Open(name string) (File, error) + } + + type File interface { + Stat() (FileInfo, error) + Read([]byte) (int, error) + Close() error + } + + var ( + ErrInvalid = errInvalid() // "invalid argument" + ErrPermission = errPermission() // "permission denied" + ErrExist = errExist() // "file already exists" + ErrNotExist = errNotExist() // "file does not exist" + ErrClosed = errClosed() // "file already closed" + ) +` + "`" + `|}`, + exp: `parent: { + example_code: |` + "`" + `go + package fs + + type FS interface { + Open(name string) (File, error) + } + + type File interface { + Stat() (FileInfo, error) + Read([]byte) (int, error) + Close() error + } + + var ( + ErrInvalid = errInvalid() // "invalid argument" + ErrPermission = errPermission() // "permission denied" + ErrExist = errExist() // "file already exists" + ErrNotExist = errNotExist() // "file does not exist" + ErrClosed = errClosed() // "file already closed" + ) + ` + "`" + `| +} +`, + }, + + { + // This one we test that the common indent is stripped before the correct indent is + // applied even when there's too much indent. + name: "block_string_indent_3", + in: ` + parent: { + example_code: |` + "`" + `go + package fs + + type FS interface { + Open(name string) (File, error) + } + + type File interface { + Stat() (FileInfo, error) + Read([]byte) (int, error) + Close() error + } + + var ( + ErrInvalid = errInvalid() // "invalid argument" + ErrPermission = errPermission() // "permission denied" + ErrExist = errExist() // "file already exists" + ErrNotExist = errNotExist() // "file does not exist" + ErrClosed = errClosed() // "file already closed" + ) +` + "`" + `|}`, + exp: `parent: { + example_code: |` + "`" + `go + package fs + + type FS interface { + Open(name string) (File, error) + } + + type File interface { + Stat() (FileInfo, error) + Read([]byte) (int, error) + Close() error + } + + var ( + ErrInvalid = errInvalid() // "invalid argument" + ErrPermission = errPermission() // "permission denied" + ErrExist = errExist() // "file already exists" + ErrNotExist = errNotExist() // "file does not exist" + ErrClosed = errClosed() // "file already closed" + ) + ` + "`" + `| +} +`, + }, + + { + // This one has 3 space indent and whitespace only lines. + name: "block_string_uneven_indent", + in: ` +parent: { + example_code: |` + "`" + `go + package fs + + type FS interface { + Open(name string) (File, error) + } + + type File interface { + Stat() (FileInfo, error) + Read([]byte) (int, error) + Close() error + } + + var ( + ErrInvalid = errInvalid() // "invalid argument" + ErrPermission = errPermission() // "permission denied" + ErrExist = errExist() // "file already exists" + ErrNotExist = errNotExist() // "file does not exist" + ErrClosed = errClosed() // "file already closed" + ) +` + "`" + `|}`, + exp: `parent: { + example_code: |` + "`" + `go + package fs + + type FS interface { + Open(name string) (File, error) + } + + type File interface { + Stat() (FileInfo, error) + Read([]byte) (int, error) + Close() error + } + + var ( + ErrInvalid = errInvalid() // "invalid argument" + ErrPermission = errPermission() // "permission denied" + ErrExist = errExist() // "file already exists" + ErrNotExist = errNotExist() // "file does not exist" + ErrClosed = errClosed() // "file already closed" + ) + ` + "`" + `| +} +`, + }, + + { + // This one has 3 space indent and large whitespace only lines. + name: "block_string_uneven_indent_2", + in: ` +parent: { + example_code: |` + "`" + `go + package fs + + type FS interface { + Open(name string) (File, error) + } + +` + "`" + `|}`, + exp: `parent: { + example_code: |` + "`" + `go + package fs + + type FS interface { + Open(name string) (File, error) + } + + ` + "`" + `| +} +`, + }, + + { + name: "block_comment_indent", + in: ` +parent: { +""" +hello +""" }`, + exp: `parent: { + """ + hello + """ +} +`, + }, + + { + name: "scalars", + in: `x: null +y: true +z: 343`, + exp: `x: null +y: true +z: 343 +`, + }, + + { + name: "substitution", + in: `x: ${ok}; y: [...${yes}]`, + exp: `x: ${ok}; y: [...${yes}] +`, + }, + + { + name: "line_comment_block", + in: `# wsup +# hello +# The Least Successful Collector`, + exp: `# wsup +# hello +# The Least Successful Collector +`, + }, + + { + name: "inline_comment", + in: `hello: x # soldier +more`, + exp: `hello: x # soldier +more +`, + }, + + { + name: "array_one_line", + in: `a: [1;2;3;4]`, + exp: `a: [1; 2; 3; 4] +`, + }, + { + name: "array", + in: `a: [ +hi # Fraud is the homage that force pays to reason. +1 +2 + +3 +4 +5; 6; 7 + ]`, + exp: `a: [ + hi # Fraud is the homage that force pays to reason. + 1 + 2 + + 3 + 4 + 5 + 6 + 7 +] +`, + }, + + { + name: "ampersand", + in: `&scenario: red`, + exp: `&scenario: red +`, + }, + + { + name: "complex_edge", + in: `pre.(src -> dst -> more)[3].post`, + exp: `pre.(src -> dst -> more)[3].post +`, + }, + { + name: "edge_index_glob", + in: `(x -> y)[*]`, + exp: `(x -> y)[*] +`, + }, + { + name: "bidirectional", + in: `x<>y`, + exp: `x <-> y +`, + }, + { + name: "empty_map", + in: `x: {} +`, + exp: `x +`, + }, + } + + for _, tc := range testCases { + tc := tc + t.Run(tc.name, func(t *testing.T) { + t.Parallel() + + ast, err := d2parser.Parse(fmt.Sprintf("%s.d2", t.Name()), strings.NewReader(tc.in), nil) + if err != nil { + t.Fatal(err) + } + diff.AssertStringEq(t, tc.exp, d2format.Format(ast)) + }) + } +} + +func TestEdge(t *testing.T) { + t.Parallel() + + mk, err := d2parser.ParseMapKey(`(x -> y)[0]`) + if err != nil { + t.Fatal(err) + } + if len(mk.Edges) != 1 { + t.Fatalf("expected one edge: %#v", mk.Edges) + } + + diff.AssertStringEq(t, `x -> y`, d2format.Format(mk.Edges[0])) + diff.AssertStringEq(t, `[0]`, d2format.Format(mk.EdgeIndex)) +} diff --git a/d2graph/color_helper.go b/d2graph/color_helper.go new file mode 100644 index 000000000..b72dec543 --- /dev/null +++ b/d2graph/color_helper.go @@ -0,0 +1,158 @@ +package d2graph + +import "regexp" + +// namedColors is a list of valid CSS colors +var namedColors = []string{ + "transparent", + "aliceblue", + "antiquewhite", + "aqua", + "aquamarine", + "azure", + "beige", + "bisque", + "black", + "blanchedalmond", + "blue", + "blueviolet", + "brown", + "burlywood", + "cadetblue", + "chartreuse", + "chocolate", + "coral", + "cornflowerblue", + "cornsilk", + "crimson", + "cyan", + "darkblue", + "darkcyan", + "darkgoldenrod", + "darkgray", + "darkgrey", + "darkgreen", + "darkkhaki", + "darkmagenta", + "darkolivegreen", + "darkorange", + "darkorchid", + "darkred", + "darksalmon", + "darkseagreen", + "darkslateblue", + "darkslategray", + "darkslategrey", + "darkturquoise", + "darkviolet", + "deeppink", + "deepskyblue", + "dimgray", + "dimgrey", + "dodgerblue", + "firebrick", + "floralwhite", + "forestgreen", + "fuchsia", + "gainsboro", + "ghostwhite", + "gold", + "goldenrod", + "gray", + "grey", + "green", + "greenyellow", + "honeydew", + "hotpink", + "indianred", + "indigo", + "ivory", + "khaki", + "lavender", + "lavenderblush", + "lawngreen", + "lemonchiffon", + "lightblue", + "lightcoral", + "lightcyan", + "lightgoldenrodyellow", + "lightgray", + "lightgrey", + "lightgreen", + "lightpink", + "lightsalmon", + "lightseagreen", + "lightskyblue", + "lightslategray", + "lightslategrey", + "lightsteelblue", + "lightyellow", + "lime", + "limegreen", + "linen", + "magenta", + "maroon", + "mediumaquamarine", + "mediumblue", + "mediumorchid", + "mediumpurple", + "mediumseagreen", + "mediumslateblue", + "mediumspringgreen", + "mediumturquoise", + "mediumvioletred", + "midnightblue", + "mintcream", + "mistyrose", + "moccasin", + "navajowhite", + "navy", + "oldlace", + "olive", + "olivedrab", + "orange", + "orangered", + "orchid", + "palegoldenrod", + "palegreen", + "paleturquoise", + "palevioletred", + "papayawhip", + "peachpuff", + "peru", + "pink", + "plum", + "powderblue", + "purple", + "rebeccapurple", + "red", + "rosybrown", + "royalblue", + "saddlebrown", + "salmon", + "sandybrown", + "seagreen", + "seashell", + "sienna", + "silver", + "skyblue", + "slateblue", + "slategray", + "slategrey", + "snow", + "springgreen", + "steelblue", + "tan", + "teal", + "thistle", + "tomato", + "turquoise", + "violet", + "wheat", + "white", + "whitesmoke", + "yellow", + "yellowgreen", +} + +var colorHexRegex = regexp.MustCompile(`^#(([0-9a-fA-F]{2}){3}|([0-9a-fA-F]){3})$`) diff --git a/d2graph/d2graph.go b/d2graph/d2graph.go new file mode 100644 index 000000000..c43456677 --- /dev/null +++ b/d2graph/d2graph.go @@ -0,0 +1,1092 @@ +package d2graph + +import ( + "errors" + "fmt" + "net/url" + "strconv" + "strings" + + "oss.terrastruct.com/d2/d2ast" + "oss.terrastruct.com/d2/d2format" + "oss.terrastruct.com/d2/d2parser" + "oss.terrastruct.com/d2/d2renderers/d2fonts" + "oss.terrastruct.com/d2/d2renderers/textmeasure" + "oss.terrastruct.com/d2/d2target" + "oss.terrastruct.com/d2/d2themes" + "oss.terrastruct.com/d2/lib/geo" + "oss.terrastruct.com/d2/lib/go2" +) + +// TODO: Refactor with a light abstract layer on top of AST implementing scenarios, +// variables, imports, substitutions and then a final set of structures representing +// a final graph. +type Graph struct { + AST *d2ast.Map `json:"ast"` + + Root *Object `json:"root"` + Edges []*Edge `json:"edges"` + Objects []*Object `json:"objects"` +} + +func NewGraph(ast *d2ast.Map) *Graph { + d := &Graph{ + AST: ast, + } + d.Root = &Object{ + Graph: d, + Parent: nil, + Children: make(map[string]*Object), + } + return d +} + +// TODO consider having different Scalar types +// Right now we'll hold any types in Value and just convert, e.g. floats +type Scalar struct { + Value string `json:"value"` + MapKey *d2ast.Key `json:"-"` +} + +// TODO maybe rename to Shape +type Object struct { + Graph *Graph `json:"-"` + Parent *Object `json:"-"` + + // IDVal is the actual value of the ID whereas ID is the value in d2 syntax. + // e.g. ID: "yes'\"" + // IDVal: yes'" + // + // ID allows joining on . naively and construct a valid D2 key path + ID string `json:"id"` + IDVal string `json:"id_val"` + Map *d2ast.Map `json:"-"` + LabelDimensions d2target.TextDimensions `json:"label_dimensions"` + References []Reference `json:"references,omitempty"` + + *geo.Box `json:"box,omitempty"` + LabelPosition *string `json:"labelPosition,omitempty"` + LabelWidth *int `json:"labelWidth,omitempty"` + LabelHeight *int `json:"labelHeight,omitempty"` + IconPosition *string `json:"iconPosition,omitempty"` + + Class *d2target.Class `json:"class,omitempty"` + SQLTable *d2target.SQLTable `json:"sql_table,omitempty"` + + Children map[string]*Object `json:"-"` + ChildrenArray []*Object `json:"-"` + + Attributes Attributes `json:"attributes"` +} + +type Attributes struct { + Label Scalar `json:"label"` + Style Style `json:"style"` + Icon *url.URL `json:"icon,omitempty"` + Tooltip string `json:"tooltip,omitempty"` + Link string `json:"link,omitempty"` + + // Only applicable for images right now + Width *Scalar `json:"width,omitempty"` + Height *Scalar `json:"height,omitempty"` + + // TODO consider separate Attributes struct for shape-specific and edge-specific + // Shapes only + NearKey *d2ast.KeyPath `json:"near_key"` + Language string `json:"language,omitempty"` + // TODO: default to ShapeRectangle instead of empty string + Shape Scalar `json:"shape"` +} + +// TODO references at the root scope should have their Scope set to root graph AST +type Reference struct { + Key *d2ast.KeyPath `json:"key"` + KeyPathIndex int `json:"key_path_index"` + + MapKey *d2ast.Key `json:"-"` + MapKeyEdgeIndex int `json:"map_key_edge_index"` + Scope *d2ast.Map `json:"-"` + // The ScopeObj and UnresolvedScopeObj are the same except when the key contains underscores + ScopeObj *Object `json:"-"` + UnresolvedScopeObj *Object `json:"-"` +} + +func (r Reference) MapKeyEdgeDest() bool { + return r.Key == r.MapKey.Edges[r.MapKeyEdgeIndex].Dst +} + +func (r Reference) InEdge() bool { + return r.Key != r.MapKey.Key +} + +type Style struct { + Opacity *Scalar `json:"opacity,omitempty"` + Stroke *Scalar `json:"stroke,omitempty"` + Fill *Scalar `json:"fill,omitempty"` + StrokeWidth *Scalar `json:"strokeWidth,omitempty"` + StrokeDash *Scalar `json:"strokeDash,omitempty"` + BorderRadius *Scalar `json:"borderRadius,omitempty"` + Shadow *Scalar `json:"shadow,omitempty"` + ThreeDee *Scalar `json:"3d,omitempty"` + Multiple *Scalar `json:"multiple,omitempty"` + Font *Scalar `json:"font,omitempty"` + FontSize *Scalar `json:"fontSize,omitempty"` + FontColor *Scalar `json:"fontColor,omitempty"` + Animated *Scalar `json:"animated,omitempty"` + Bold *Scalar `json:"bold,omitempty"` + Italic *Scalar `json:"italic,omitempty"` + Underline *Scalar `json:"underline,omitempty"` + Filled *Scalar `json:"filled,omitempty"` +} + +func (s *Style) Apply(key, value string) error { + switch key { + case "opacity": + if s.Opacity == nil { + break + } + f, err := strconv.ParseFloat(value, 64) + if err != nil || (f < 0 || f > 1) { + return errors.New(`expected "opacity" to be a number between 0.0 and 1.0`) + } + s.Opacity.Value = value + case "stroke": + if s.Stroke == nil { + break + } + if !go2.Contains(namedColors, strings.ToLower(value)) && !colorHexRegex.MatchString(value) { + return errors.New(`expected "stroke" to be a valid named color ("orange") or a hex code ("#f0ff3a")`) + } + s.Stroke.Value = value + case "fill": + if s.Fill == nil { + break + } + if !go2.Contains(namedColors, strings.ToLower(value)) && !colorHexRegex.MatchString(value) { + return errors.New(`expected "fill" to be a valid named color ("orange") or a hex code ("#f0ff3a")`) + } + s.Fill.Value = value + case "stroke-width": + if s.StrokeWidth == nil { + break + } + f, err := strconv.Atoi(value) + if err != nil || (f < 0 || f > 15) { + return errors.New(`expected "stroke-width" to be a number between 0 and 15`) + } + s.StrokeWidth.Value = value + case "stroke-dash": + if s.StrokeDash == nil { + break + } + f, err := strconv.Atoi(value) + if err != nil || (f < 0 || f > 10) { + return errors.New(`expected "stroke-dash" to be a number between 0 and 10`) + } + s.StrokeDash.Value = value + case "border-radius": + if s.BorderRadius == nil { + break + } + f, err := strconv.Atoi(value) + if err != nil || (f < 0 || f > 20) { + return errors.New(`expected "border-radius" to be a number between 0 and 20`) + } + s.BorderRadius.Value = value + case "shadow": + if s.Shadow == nil { + break + } + _, err := strconv.ParseBool(value) + if err != nil { + return errors.New(`expected "shadow" to be true or false`) + } + s.Shadow.Value = value + case "3d": + if s.ThreeDee == nil { + break + } + _, err := strconv.ParseBool(value) + if err != nil { + return errors.New(`expected "3d" to be true or false`) + } + s.ThreeDee.Value = value + case "multiple": + if s.Multiple == nil { + break + } + _, err := strconv.ParseBool(value) + if err != nil { + return errors.New(`expected "multiple" to be true or false`) + } + s.Multiple.Value = value + case "font": + if s.Font == nil { + break + } + if !go2.Contains(systemFonts, strings.ToUpper(value)) { + return fmt.Errorf(`"%v" is not a valid font in our system`, value) + } + s.Font.Value = strings.ToUpper(value) + case "font-size": + if s.FontSize == nil { + break + } + f, err := strconv.Atoi(value) + if err != nil || (f < 8 || f > 100) { + return errors.New(`expected "font-size" to be a number between 8 and 100`) + } + s.FontSize.Value = value + case "font-color": + if s.FontColor == nil { + break + } + if !go2.Contains(namedColors, strings.ToLower(value)) && !colorHexRegex.MatchString(value) { + return errors.New(`expected "font-color" to be a valid named color ("orange") or a hex code ("#f0ff3a")`) + } + s.FontColor.Value = value + case "animated": + if s.Animated == nil { + break + } + _, err := strconv.ParseBool(value) + if err != nil { + return errors.New(`expected "animated" to be true or false`) + } + s.Animated.Value = value + case "bold": + if s.Bold == nil { + break + } + _, err := strconv.ParseBool(value) + if err != nil { + return errors.New(`expected "bold" to be true or false`) + } + s.Bold.Value = value + case "italic": + if s.Italic == nil { + break + } + _, err := strconv.ParseBool(value) + if err != nil { + return errors.New(`expected "italic" to be true or false`) + } + s.Italic.Value = value + case "underline": + if s.Underline == nil { + break + } + _, err := strconv.ParseBool(value) + if err != nil { + return errors.New(`expected "underline" to be true or false`) + } + s.Underline.Value = value + case "filled": + if s.Filled == nil { + break + } + _, err := strconv.ParseBool(value) + if err != nil { + return errors.New(`expected "filled" to be true or false`) + } + s.Filled.Value = value + default: + return fmt.Errorf("unknown style key: %s", key) + } + + return nil +} + +type ContainerLevel int + +func (l ContainerLevel) Fill() string { + // Darkest (least nested) to lightest (most nested) + if l == 1 { + return "#E3E9FD" + } else if l == 2 { + return "#EDF0FD" + } else if l == 3 { + return "#F7F8FE" + } + return "#FFFFFF" +} + +func (l ContainerLevel) LabelSize() int { + // Largest to smallest + if l == 1 { + return d2fonts.FONT_SIZE_XXL + } else if l == 2 { + return d2fonts.FONT_SIZE_XL + } else if l == 3 { + return d2fonts.FONT_SIZE_L + } + return d2fonts.FONT_SIZE_M +} + +func (obj *Object) GetFill(theme *d2themes.Theme) string { + level := int(obj.Level()) + shape := obj.Attributes.Shape.Value + + if shape == "" || strings.EqualFold(shape, d2target.ShapeSquare) || strings.EqualFold(shape, d2target.ShapeCircle) || strings.EqualFold(shape, d2target.ShapeOval) || strings.EqualFold(shape, d2target.ShapeRectangle) { + if level == 1 { + if !obj.IsContainer() { + return theme.Colors.B6 + } + return theme.Colors.B4 + } else if level == 2 { + return theme.Colors.B5 + } else if level == 3 { + return theme.Colors.B6 + } + return theme.Colors.Neutrals.N7 + } + + if strings.EqualFold(shape, d2target.ShapeCylinder) || strings.EqualFold(shape, d2target.ShapeStoredData) || strings.EqualFold(shape, d2target.ShapePackage) { + if level == 1 { + return theme.Colors.AA4 + } + return theme.Colors.AA5 + } + + if strings.EqualFold(shape, d2target.ShapeStep) || strings.EqualFold(shape, d2target.ShapePage) || strings.EqualFold(shape, d2target.ShapeDocument) { + if level == 1 { + return theme.Colors.AB4 + } + return theme.Colors.AB5 + } + + if strings.EqualFold(shape, d2target.ShapePerson) { + return theme.Colors.B3 + } + if strings.EqualFold(shape, d2target.ShapeDiamond) { + return theme.Colors.Neutrals.N4 + } + if strings.EqualFold(shape, d2target.ShapeCloud) || strings.EqualFold(shape, d2target.ShapeCallout) { + return theme.Colors.Neutrals.N7 + } + if strings.EqualFold(shape, d2target.ShapeQueue) || strings.EqualFold(shape, d2target.ShapeParallelogram) || strings.EqualFold(shape, d2target.ShapeHexagon) { + return theme.Colors.Neutrals.N5 + } + + return theme.Colors.Neutrals.N7 +} + +func (obj *Object) GetStroke(theme *d2themes.Theme, dashGapSize interface{}) string { + shape := obj.Attributes.Shape.Value + if strings.EqualFold(shape, d2target.ShapeCode) || strings.EqualFold(shape, d2target.ShapeClass) || strings.EqualFold(shape, d2target.ShapeSQLTable) { + return theme.Colors.Neutrals.N1 + } + if dashGapSize != 0.0 { + return theme.Colors.B2 + } + return theme.Colors.B1 +} + +func (obj *Object) Level() ContainerLevel { + if obj.Parent == nil { + return 0 + } + return 1 + obj.Parent.Level() +} + +func (obj *Object) IsContainer() bool { + return len(obj.Children) > 0 +} + +func (obj *Object) AbsID() string { + if obj.Parent != nil && obj.Parent.ID != "" { + return obj.Parent.AbsID() + "." + obj.ID + } + return obj.ID +} + +func (obj *Object) AbsIDArray() []string { + if obj.Parent == nil { + return nil + } + return append(obj.Parent.AbsIDArray(), obj.ID) +} + +func (obj *Object) Text() *d2target.MText { + fontSize := d2fonts.FONT_SIZE_M + if obj.IsContainer() { + fontSize = obj.Level().LabelSize() + } + // Class and Table objects have Label set to header + if obj.Class != nil || obj.SQLTable != nil { + fontSize = d2fonts.FONT_SIZE_XL + } + return &d2target.MText{ + Text: obj.Attributes.Label.Value, + FontSize: fontSize, + IsBold: !obj.IsContainer(), + IsItalic: false, + Language: obj.Attributes.Language, + Shape: obj.Attributes.Shape.Value, + + Dimensions: obj.LabelDimensions, + } +} + +func (obj *Object) newObject(id string) *Object { + idval := id + k, _ := d2parser.ParseKey(id) + if k != nil && len(k.Path) > 0 { + idval = k.Path[0].Unbox().ScalarString() + } + child := &Object{ + ID: id, + IDVal: idval, + Attributes: Attributes{ + Label: Scalar{ + Value: idval, + }, + }, + + Graph: obj.Graph, + Parent: obj, + + Children: make(map[string]*Object), + } + + obj.Children[strings.ToLower(id)] = child + obj.ChildrenArray = append(obj.ChildrenArray, child) + + if obj.Graph != nil { + obj.Graph.Objects = append(obj.Graph.Objects, child) + } + + return child +} + +func (obj *Object) HasChild(ids []string) (*Object, bool) { + if len(ids) == 1 && ids[0] != "style" { + _, ok := ReservedKeywords[ids[0]] + if ok { + return obj, true + } + } + + id := ids[0] + ids = ids[1:] + + child, ok := obj.Children[strings.ToLower(id)] + if !ok { + return nil, false + } + + if len(ids) >= 1 { + return child.HasChild(ids) + } + return child, true +} + +func (obj *Object) HasEdge(mk *d2ast.Key) (*Edge, bool) { + ea, ok := obj.FindEdges(mk) + if !ok { + return nil, false + } + for _, e := range ea { + if e.Index == *mk.EdgeIndex.Int { + return e, true + } + } + return nil, false +} + +func ResolveUnderscoreKey(ida []string, obj *Object) (resolvedObj *Object, resolvedIDA []string, _ error) { + resolvedObj = obj + resolvedIDA = ida + + for i, id := range ida { + if id != "_" { + continue + } + if i != 0 && ida[i-1] != "_" { + return nil, nil, errors.New(`parent "_" can only be used in the beginning of paths, e.g. "_.x"`) + } + if resolvedObj == obj.Graph.Root { + return nil, nil, errors.New(`parent "_" cannot be used in the root scope`) + } + if i == len(ida)-1 { + return nil, nil, errors.New(`invalid use of parent "_"`) + } + resolvedObj = resolvedObj.Parent + resolvedIDA = resolvedIDA[1:] + } + + return resolvedObj, resolvedIDA, nil +} + +// TODO: remove edges []edge and scope each edge inside Object. +func (obj *Object) FindEdges(mk *d2ast.Key) ([]*Edge, bool) { + if len(mk.Edges) != 1 { + return nil, false + } + if mk.EdgeIndex.Int == nil { + return nil, false + } + ae := mk.Edges[0] + + srcObj, srcID, err := ResolveUnderscoreKey(Key(ae.Src), obj) + if err != nil { + return nil, false + } + dstObj, dstID, err := ResolveUnderscoreKey(Key(ae.Dst), obj) + if err != nil { + return nil, false + } + + src := strings.Join(srcID, ".") + dst := strings.Join(dstID, ".") + if srcObj.Parent != nil { + src = srcObj.AbsID() + "." + src + } + if dstObj.Parent != nil { + dst = dstObj.AbsID() + "." + dst + } + + var ea []*Edge + for _, e := range obj.Graph.Edges { + if strings.EqualFold(src, e.Src.AbsID()) && + ((ae.SrcArrow == "<" && e.SrcArrow) || (ae.SrcArrow == "" && !e.SrcArrow)) && + strings.EqualFold(dst, e.Dst.AbsID()) && + ((ae.DstArrow == ">" && e.DstArrow) || (ae.DstArrow == "" && !e.DstArrow)) { + ea = append(ea, e) + } + } + return ea, true +} + +// EnsureChild grabs the child by ids or creates it if it does not exist including all +// intermediate nodes. +func (obj *Object) EnsureChild(ids []string) *Object { + _, is := ReservedKeywordHolders[ids[0]] + if len(ids) == 1 && !is { + _, ok := ReservedKeywords[ids[0]] + if ok { + return obj + } + } + + id := ids[0] + ids = ids[1:] + + child, ok := obj.Children[strings.ToLower(id)] + if !ok { + child = obj.newObject(id) + } + + if len(ids) >= 1 { + return child.EnsureChild(ids) + } + return child +} + +func (obj *Object) AppendReferences(ida []string, ref Reference, unresolvedObj *Object) { + ref.ScopeObj = obj + ref.UnresolvedScopeObj = unresolvedObj + numUnderscores := 0 + for i := range ida { + if ida[i] == "_" { + numUnderscores++ + continue + } + child, ok := obj.HasChild(ida[numUnderscores : i+1]) + if !ok { + return + } + ref.KeyPathIndex = i + child.References = append(child.References, ref) + } +} + +type Edge struct { + Index int `json:"index"` + + MinWidth int `json:"minWidth"` + MinHeight int `json:"minHeight"` + + LabelDimensions d2target.TextDimensions `json:"label_dimensions"` + LabelPosition *string `json:"labelPosition,omitempty"` + LabelPercentage *float64 `json:"labelPercentage,omitempty"` + + IsCurve bool `json:"isCurve"` + Route []*geo.Point `json:"route,omitempty"` + + Src *Object `json:"-"` + SrcArrow bool `json:"src_arrow"` + SrcArrowhead *Attributes `json:"srcArrowhead,omitempty"` + Dst *Object `json:"-"` + // TODO alixander (Mon Sep 12 2022): deprecate SrcArrow and DstArrow and just use SrcArrowhead and DstArrowhead + DstArrow bool `json:"dst_arrow"` + DstArrowhead *Attributes `json:"dstArrowhead,omitempty"` + + References []EdgeReference `json:"references,omitempty"` + Attributes Attributes `json:"attributes"` +} + +type EdgeReference struct { + Edge *d2ast.Edge `json:"-"` + + MapKey *d2ast.Key `json:"-"` + MapKeyEdgeIndex int `json:"map_key_edge_index"` + Scope *d2ast.Map `json:"-"` + ScopeObj *Object `json:"-"` +} + +func (e *Edge) GetStroke(theme *d2themes.Theme, dashGapSize interface{}) string { + if dashGapSize != 0.0 { + return theme.Colors.B2 + } + return theme.Colors.B1 +} + +func (e *Edge) ArrowString() string { + if e.SrcArrow && e.DstArrow { + return "<->" + } + if e.SrcArrow { + return "<-" + } + if e.DstArrow { + return "->" + } + return "--" +} + +func (e *Edge) Text() *d2target.MText { + return &d2target.MText{ + Text: e.Attributes.Label.Value, + FontSize: d2fonts.FONT_SIZE_M, + IsBold: false, + IsItalic: true, + + Dimensions: e.LabelDimensions, + } +} + +func (e *Edge) AbsID() string { + srcIDA := e.Src.AbsIDArray() + dstIDA := e.Dst.AbsIDArray() + + var commonIDA []string + for len(srcIDA) > 1 && len(dstIDA) > 1 { + if !strings.EqualFold(srcIDA[0], dstIDA[0]) { + break + } + commonIDA = append(commonIDA, srcIDA[0]) + srcIDA = srcIDA[1:] + dstIDA = dstIDA[1:] + } + + commonKey := "" + if len(commonIDA) > 0 { + commonKey = strings.Join(commonIDA, ".") + "." + } + + return fmt.Sprintf("%s(%s %s %s)[%d]", commonKey, strings.Join(srcIDA, "."), e.ArrowString(), strings.Join(dstIDA, "."), e.Index) +} + +func (obj *Object) Connect(srcID, dstID []string, srcArrow, dstArrow bool, label string) (*Edge, error) { + srcObj, srcID, err := ResolveUnderscoreKey(srcID, obj) + if err != nil { + return nil, err + } + dstObj, dstID, err := ResolveUnderscoreKey(dstID, obj) + if err != nil { + return nil, err + } + + for _, id := range [][]string{srcID, dstID} { + for _, p := range id { + if _, ok := ReservedKeywords[p]; ok { + return nil, errors.New("cannot connect to reserved keyword") + } + } + } + + src := srcObj.EnsureChild(srcID) + dst := dstObj.EnsureChild(dstID) + + if src == dst { + return nil, errors.New("self-referencing connection") + } + + edge := &Edge{ + Attributes: Attributes{ + Label: Scalar{ + Value: label, + }, + }, + Src: src, + SrcArrow: srcArrow, + Dst: dst, + DstArrow: dstArrow, + } + edge.initIndex() + + obj.Graph.Edges = append(obj.Graph.Edges, edge) + return edge, nil +} + +// TODO: Treat undirectional/bidirectional edge here and in HasEdge flipped. Same with +// SrcArrow. +func (e *Edge) initIndex() { + for _, e2 := range e.Src.Graph.Edges { + if e.Src == e2.Src && + e.SrcArrow == e2.SrcArrow && + e.Dst == e2.Dst && + e.DstArrow == e2.DstArrow { + e.Index++ + } + } +} + +func findMeasured(mtexts []*d2target.MText, t1 *d2target.MText) *d2target.TextDimensions { + for i, t2 := range mtexts { + if t1.Text != t2.Text { + continue + } + if t1.FontSize != t2.FontSize { + continue + } + if t1.IsBold != t2.IsBold { + continue + } + if t1.IsItalic != t2.IsItalic { + continue + } + if t1.Language != t2.Language { + continue + } + return &mtexts[i].Dimensions + } + return nil +} + +func getMarkdownDimensions(mtexts []*d2target.MText, ruler *textmeasure.Ruler, t *d2target.MText) (*d2target.TextDimensions, error) { + if dims := findMeasured(mtexts, t); dims != nil { + return dims, nil + } + + if ruler != nil { + width, height, err := textmeasure.MeasureMarkdown(t.Text, ruler) + if err != nil { + return nil, err + } + return d2target.NewTextDimensions(width, height), nil + } + + return nil, fmt.Errorf("text not pre-measured and no ruler provided") +} + +func getTextDimensions(mtexts []*d2target.MText, ruler *textmeasure.Ruler, t *d2target.MText) *d2target.TextDimensions { + if dims := findMeasured(mtexts, t); dims != nil { + return dims + } + + if ruler != nil { + var w int + var h int + if t.Language != "" { + w, h = ruler.Measure(d2fonts.SourceCodePro.Font(t.FontSize, d2fonts.FONT_STYLE_REGULAR), t.Text) + // padding + w += 12 + h += 12 + } else { + style := d2fonts.FONT_STYLE_REGULAR + if t.IsBold { + style = d2fonts.FONT_STYLE_BOLD + } else if t.IsItalic { + style = d2fonts.FONT_STYLE_ITALIC + } + w, h = ruler.Measure(d2fonts.SourceSansPro.Font(t.FontSize, style), t.Text) + } + return d2target.NewTextDimensions(w, h) + } + + return nil +} + +func appendTextDedup(texts []*d2target.MText, t *d2target.MText) []*d2target.MText { + if getTextDimensions(texts, nil, t) == nil { + return append(texts, t) + } + return texts +} + +func (g *Graph) SetDimensions(mtexts []*d2target.MText, ruler *textmeasure.Ruler) error { + for _, obj := range g.Objects { + obj.Box = &geo.Box{} + // TODO fix edge cases for unnamed class etc + // Image shapes can set their own widths/heights + if obj.Attributes.Label.Value == "" && obj.Attributes.Shape.Value != d2target.ShapeImage { + obj.Width = 100 + obj.Height = 100 + continue + } + + var dims *d2target.TextDimensions + if obj.Attributes.Shape.Value == d2target.ShapeText { + var err error + dims, err = getMarkdownDimensions(mtexts, ruler, obj.Text()) + if err != nil { + return err + } + } else { + dims = getTextDimensions(mtexts, ruler, obj.Text()) + } + if dims == nil { + if obj.Attributes.Shape.Value == d2target.ShapeImage { + dims = d2target.NewTextDimensions(0, 0) + } else { + return fmt.Errorf("dimensions for object label %#v not found", obj.Text()) + } + } + + switch obj.Attributes.Shape.Value { + case d2target.ShapeText, d2target.ShapeClass, d2target.ShapeSQLTable, d2target.ShapeCode: + // no labels + default: + if obj.Attributes.Label.Value != "" { + obj.LabelWidth = go2.Pointer(dims.Width) + obj.LabelHeight = go2.Pointer(dims.Height) + } + } + + const innerLabelPadding = 5 + dims.Width += innerLabelPadding + dims.Height += innerLabelPadding + obj.LabelDimensions = *dims + obj.Width = float64(dims.Width) + obj.Height = float64(dims.Height) + + switch strings.ToLower(obj.Attributes.Shape.Value) { + default: + obj.Width += 100 + obj.Height += 100 + + case d2target.ShapeImage: + if obj.Attributes.Width != nil { + w, _ := strconv.Atoi(obj.Attributes.Width.Value) + obj.Width = float64(w) + } else { + obj.Width = 128 + } + if obj.Attributes.Height != nil { + h, _ := strconv.Atoi(obj.Attributes.Height.Value) + obj.Height = float64(h) + } else { + obj.Height = 128 + } + + case d2target.ShapeSquare, d2target.ShapeCircle: + sideLength := go2.Max(obj.Width, obj.Height) + obj.Width = sideLength + 100 + obj.Height = sideLength + 100 + + case d2target.ShapeClass: + maxWidth := dims.Width + + for _, f := range obj.Class.Fields { + fdims := getTextDimensions(mtexts, ruler, f.Text()) + if fdims == nil { + return fmt.Errorf("dimensions for class field %#v not found", f.Text()) + } + lineWidth := fdims.Width + if maxWidth < lineWidth { + maxWidth = lineWidth + } + } + for _, m := range obj.Class.Methods { + mdims := getTextDimensions(mtexts, ruler, m.Text()) + if mdims == nil { + return fmt.Errorf("dimensions for class method %#v not found", m.Text()) + } + lineWidth := mdims.Width + if maxWidth < lineWidth { + maxWidth = lineWidth + } + } + + // All rows should be the same height + var anyRowText *d2target.MText + if len(obj.Class.Fields) > 0 { + anyRowText = obj.Class.Fields[0].Text() + } else if len(obj.Class.Methods) > 0 { + anyRowText = obj.Class.Methods[0].Text() + } + if anyRowText != nil { + // 10px of padding top and bottom so text doesn't look squished + rowHeight := getTextDimensions(mtexts, ruler, anyRowText).Height + 20 + obj.Height = float64(rowHeight * (len(obj.Class.Fields) + len(obj.Class.Methods) + 2)) + } + // Leave room for padding + obj.Width = float64(maxWidth + 100) + + case d2target.ShapeSQLTable: + maxWidth := dims.Width + + for _, c := range obj.SQLTable.Columns { + cdims := getTextDimensions(mtexts, ruler, c.Text()) + if cdims == nil { + return fmt.Errorf("dimensions for column %#v not found", c.Text()) + } + lineWidth := cdims.Width + if maxWidth < lineWidth { + maxWidth = lineWidth + } + } + + // The rows get padded a little due to header font being larger than row font + obj.Height = float64(dims.Height * (len(obj.SQLTable.Columns) + 1)) + // Leave room for padding + obj.Width = float64(maxWidth + 100) + + case d2target.ShapeText, d2target.ShapeCode: + } + } + for _, edge := range g.Edges { + endpointLabels := []string{} + if edge.SrcArrowhead != nil && edge.SrcArrowhead.Label.Value != "" { + endpointLabels = append(endpointLabels, edge.SrcArrowhead.Label.Value) + } + if edge.DstArrowhead != nil && edge.DstArrowhead.Label.Value != "" { + endpointLabels = append(endpointLabels, edge.DstArrowhead.Label.Value) + } + + for _, label := range endpointLabels { + t := edge.Text() + t.Text = label + dims := getTextDimensions(mtexts, ruler, t) + edge.MinWidth += dims.Width + // Some padding as it's not totally near the end + edge.MinHeight += dims.Height + 5 + } + + if edge.Attributes.Label.Value == "" { + continue + } + + dims := getTextDimensions(mtexts, ruler, edge.Text()) + if dims == nil { + return fmt.Errorf("dimensions for edge label %#v not found", edge.Text()) + } + + edge.LabelDimensions = *dims + edge.MinWidth += dims.Width + edge.MinHeight += dims.Height + } + return nil +} + +func (g *Graph) Texts() []*d2target.MText { + var texts []*d2target.MText + + for _, obj := range g.Objects { + if obj.Attributes.Label.Value != "" { + texts = appendTextDedup(texts, obj.Text()) + } + if obj.Class != nil { + for _, field := range obj.Class.Fields { + texts = appendTextDedup(texts, field.Text()) + } + for _, method := range obj.Class.Methods { + texts = appendTextDedup(texts, method.Text()) + } + } else if obj.SQLTable != nil { + for _, column := range obj.SQLTable.Columns { + texts = appendTextDedup(texts, column.Text()) + } + } + } + for _, edge := range g.Edges { + if edge.Attributes.Label.Value != "" { + texts = appendTextDedup(texts, edge.Text()) + } + if edge.SrcArrowhead != nil && edge.SrcArrowhead.Label.Value != "" { + t := edge.Text() + t.Text = edge.SrcArrowhead.Label.Value + texts = appendTextDedup(texts, t) + } + if edge.DstArrowhead != nil && edge.DstArrowhead.Label.Value != "" { + t := edge.Text() + t.Text = edge.DstArrowhead.Label.Value + texts = appendTextDedup(texts, t) + } + } + + return texts +} + +func Key(k *d2ast.KeyPath) []string { + var ids []string + for _, s := range k.Path { + // We format each string of the key to ensure the resulting strings can be parsed + // correctly. + n := &d2ast.KeyPath{ + Path: []*d2ast.StringBox{d2ast.MakeValueBox(d2ast.RawString(s.Unbox().ScalarString(), true)).StringBox()}, + } + ids = append(ids, d2format.Format(n)) + } + return ids +} + +var ReservedKeywords = map[string]struct{}{ + "label": {}, + "desc": {}, + "shape": {}, + "icon": {}, + "constraint": {}, + "tooltip": {}, + "link": {}, + "near": {}, + "width": {}, + "height": {}, +} + +// ReservedKeywordHolders are reserved keywords that are meaningless on its own and exist solely to hold a set of reserved keywords +var ReservedKeywordHolders = map[string]struct{}{ + "style": {}, + "source-arrowhead": {}, + "target-arrowhead": {}, +} + +// StyleKeywords are reserved keywords which cannot exist outside of the "style" keyword +var StyleKeywords = map[string]struct{}{ + "opacity": {}, + "stroke": {}, + "fill": {}, + "stroke-width": {}, + "stroke-dash": {}, + "border-radius": {}, + + // Only for text + "font": {}, + "font-size": {}, + "font-color": {}, + "bold": {}, + "italic": {}, + "underline": {}, + + // Only for shapes + "shadow": {}, + "multiple": {}, + + // Only for squares + "3d": {}, + + // Only for edges + "animated": {}, + "filled": {}, +} + +func init() { + for k, v := range StyleKeywords { + ReservedKeywords[k] = v + } + for k, v := range ReservedKeywordHolders { + ReservedKeywords[k] = v + } +} diff --git a/d2graph/d2graph_test.go b/d2graph/d2graph_test.go new file mode 100644 index 000000000..d207ee89c --- /dev/null +++ b/d2graph/d2graph_test.go @@ -0,0 +1,50 @@ +package d2graph_test + +import ( + "strings" + "testing" + + "oss.terrastruct.com/diff" + + "oss.terrastruct.com/d2/d2graph" + "oss.terrastruct.com/d2/d2parser" +) + +func TestKey(t *testing.T) { + t.Parallel() + + testCases := []struct { + name string + key string + exp string + }{ + { + name: "simple", + key: "meow.foo.bar", + exp: "meow.foo.bar", + }, + { + name: "specials_1", + key: `'null.$$$.---'''.",,,.{}{}-\\-><"`, + exp: `"null.$$$.---'".",,,.{}{}-\\-><"`, + }, + { + name: "specials_2", + key: `"&&####;;".| ;;::** |`, + exp: `"&&####;;".";;::**"`, + }, + } + + for _, tc := range testCases { + tc := tc + t.Run(tc.name, func(t *testing.T) { + t.Parallel() + + k, err := d2parser.ParseKey(tc.key) + if err != nil { + t.Fatal(err) + } + diff.AssertStringEq(t, tc.exp, strings.Join(d2graph.Key(k), ".")) + }) + } +} diff --git a/d2graph/font_helper.go b/d2graph/font_helper.go new file mode 100644 index 000000000..b8bf30523 --- /dev/null +++ b/d2graph/font_helper.go @@ -0,0 +1,10 @@ +package d2graph + +var systemFonts = []string{ + "DEFAULT", + "SERIOUS", + "DIGITAL", + "EDUCATIONAL", + "NEWSPAPER", + "MONO", +} diff --git a/d2graph/serde.go b/d2graph/serde.go new file mode 100644 index 000000000..bfaac7c80 --- /dev/null +++ b/d2graph/serde.go @@ -0,0 +1,159 @@ +package d2graph + +import ( + "encoding/json" + + "oss.terrastruct.com/d2/lib/go2" +) + +type SerializedGraph struct { + Root SerializedObject `json:"root"` + Edges []SerializedEdge `json:"edges"` + Objects []SerializedObject `json:"objects"` +} + +type SerializedObject map[string]interface{} + +type SerializedEdge map[string]interface{} + +func DeserializeGraph(bytes []byte, g *Graph) error { + var sg *SerializedGraph + err := json.Unmarshal(bytes, &sg) + if err != nil { + return err + } + + g.Root = &Object{ + Graph: g, + Children: make(map[string]*Object), + } + + idToObj := make(map[string]*Object) + idToObj[""] = g.Root + var objects []*Object + for _, so := range sg.Objects { + var o Object + if err := convert(so, &o); err != nil { + return err + } + objects = append(objects, &o) + idToObj[so["AbsID"].(string)] = &o + } + + for _, so := range append(sg.Objects, sg.Root) { + if so["ChildrenArray"] != nil { + children := make(map[string]*Object) + var childrenArray []*Object + + for _, id := range so["ChildrenArray"].([]interface{}) { + o := idToObj[id.(string)] + childrenArray = append(childrenArray, o) + children[id.(string)] = o + + o.Parent = idToObj[so["AbsID"].(string)] + } + + idToObj[so["AbsID"].(string)].Children = children + idToObj[so["AbsID"].(string)].ChildrenArray = childrenArray + } + } + + var edges []*Edge + for _, se := range sg.Edges { + var e Edge + if err := convert(se, &e); err != nil { + return err + } + + if se["Src"] != nil { + e.Src = idToObj[se["Src"].(string)] + } + if se["Dst"] != nil { + e.Dst = idToObj[se["Dst"].(string)] + } + edges = append(edges, &e) + } + + g.Objects = objects + g.Edges = edges + + return nil +} + +func SerializeGraph(g *Graph) ([]byte, error) { + sg := SerializedGraph{} + + root, err := toSerializedObject(g.Root) + if err != nil { + return nil, err + } + sg.Root = root + + var sobjects []SerializedObject + for _, o := range g.Objects { + so, err := toSerializedObject(o) + if err != nil { + return nil, err + } + sobjects = append(sobjects, so) + } + sg.Objects = sobjects + + var sedges []SerializedEdge + for _, e := range g.Edges { + se, err := toSerializedEdge(e) + if err != nil { + return nil, err + } + sedges = append(sedges, se) + } + sg.Edges = sedges + + return json.Marshal(sg) +} + +func toSerializedObject(o *Object) (SerializedObject, error) { + var so SerializedObject + if err := convert(o, &so); err != nil { + return nil, err + } + + so["AbsID"] = o.AbsID() + + if len(o.ChildrenArray) > 0 { + var children []string + for _, c := range o.ChildrenArray { + children = append(children, c.AbsID()) + } + so["ChildrenArray"] = children + } + + return so, nil +} + +func toSerializedEdge(e *Edge) (SerializedEdge, error) { + var se SerializedEdge + if err := convert(e, &se); err != nil { + return nil, err + } + + if e.Src != nil { + se["Src"] = go2.Pointer(e.Src.AbsID()) + } + if e.Dst != nil { + se["Dst"] = go2.Pointer(e.Dst.AbsID()) + } + + return se, nil +} + +func convert[T, Q any](from T, to *Q) error { + b, err := json.Marshal(from) + if err != nil { + return err + } + if err := json.Unmarshal(b, to); err != nil { + return err + } + return nil +} diff --git a/d2graph/serde_test.go b/d2graph/serde_test.go new file mode 100644 index 000000000..2afc65cbb --- /dev/null +++ b/d2graph/serde_test.go @@ -0,0 +1,55 @@ +package d2graph_test + +import ( + "strings" + "testing" + + "github.com/stretchr/testify/assert" + + "oss.terrastruct.com/d2/d2compiler" + "oss.terrastruct.com/d2/d2graph" +) + +func TestSerialization(t *testing.T) { + t.Parallel() + + g, err := d2compiler.Compile("", strings.NewReader("a.a.b -> a.a.c"), nil) + if err != nil { + t.Fatal(err) + } + + asserts := func(g *d2graph.Graph) { + assert.Equal(t, 4, len(g.Objects)) + assert.Equal(t, 1, len(g.Root.ChildrenArray)) + assert.Equal(t, 1, len(g.Root.ChildrenArray[0].ChildrenArray)) + assert.Equal(t, 2, len(g.Root.ChildrenArray[0].ChildrenArray[0].ChildrenArray)) + assert.Equal(t, + g.Root.ChildrenArray[0], + g.Root.ChildrenArray[0].ChildrenArray[0].Parent, + ) + + assert.Equal(t, + g.Root, + g.Root.ChildrenArray[0].Parent, + ) + + assert.Equal(t, 1, len(g.Edges)) + assert.Equal(t, "b", g.Edges[0].Src.ID) + assert.Equal(t, "c", g.Edges[0].Dst.ID) + } + + asserts(g) + + b, err := d2graph.SerializeGraph(g) + if err != nil { + t.Fatal(err) + } + + var newG d2graph.Graph + err = d2graph.DeserializeGraph(b, &newG) + if err != nil { + t.Fatal(err) + } + + asserts(&newG) +} diff --git a/d2layouts/d2dagrelayout/dagre.js b/d2layouts/d2dagrelayout/dagre.js new file mode 100644 index 000000000..58613b1ae --- /dev/null +++ b/d2layouts/d2dagrelayout/dagre.js @@ -0,0 +1,6754 @@ +!(function (e) { + "object" == typeof exports && "undefined" != typeof module + ? (module.exports = e()) + : "function" == typeof define && define.amd + ? define([], e) + : (("undefined" != typeof window + ? window + : "undefined" != typeof global + ? global + : "undefined" != typeof self + ? self + : this + ).dagre = e()); +})(function () { + return (function r(o, a, i) { + function s(t, e) { + if (!a[t]) { + if (!o[t]) { + var n = "function" == typeof require && require; + if (!e && n) return n(t, !0); + if (u) return u(t, !0); + throw ( + (((n = new Error("Cannot find module '" + t + "'")).code = + "MODULE_NOT_FOUND"), + n) + ); + } + (n = a[t] = { exports: {} }), + o[t][0].call( + n.exports, + function (e) { + return s(o[t][1][e] || e); + }, + n, + n.exports, + r, + o, + a, + i + ); + } + return a[t].exports; + } + for (var u = "function" == typeof require && require, e = 0; e < i.length; e++) + s(i[e]); + return s; + })( + { + 1: [ + function (e, t, n) { + t.exports = { + graphlib: e("./lib/graphlib"), + layout: e("./lib/layout"), + debug: e("./lib/debug"), + util: { + time: e("./lib/util").time, + notime: e("./lib/util").notime, + }, + version: e("./lib/version"), + }; + }, + { + "./lib/debug": 6, + "./lib/graphlib": 7, + "./lib/layout": 9, + "./lib/util": 29, + "./lib/version": 30, + }, + ], + 2: [ + function (e, t, n) { + "use strict"; + var i = e("./lodash"), + r = e("./greedy-fas"); + t.exports = { + run: function (n) { + var e = + "greedy" === n.graph().acyclicer + ? r( + n, + (function (t) { + return function (e) { + return t.edge(e).weight; + }; + })(n) + ) + : (function (n) { + var r = [], + o = {}, + a = {}; + return ( + i.forEach(n.nodes(), function t(e) { + if (i.has(a, e)) return; + a[e] = !0; + o[e] = !0; + i.forEach(n.outEdges(e), function (e) { + i.has(o, e.w) ? r.push(e) : t(e.w); + }); + delete o[e]; + }), + r + ); + })(n); + i.forEach(e, function (e) { + var t = n.edge(e); + n.removeEdge(e), + (t.forwardName = e.name), + (t.reversed = !0), + n.setEdge(e.w, e.v, t, i.uniqueId("rev")); + }); + }, + undo: function (r) { + i.forEach(r.edges(), function (e) { + var t, + n = r.edge(e); + n.reversed && + (r.removeEdge(e), + (t = n.forwardName), + delete n.reversed, + delete n.forwardName, + r.setEdge(e.w, e.v, n, t)); + }); + }, + }; + }, + { "./greedy-fas": 8, "./lodash": 10 }, + ], + 3: [ + function (e, t, n) { + var s = e("./lodash"), + u = e("./util"); + function c(e, t, n, r, o, a) { + var i = { width: 0, height: 0, rank: a, borderType: t }, + s = o[t][a - 1], + n = u.addDummyNode(e, "border", i, n); + (o[t][a] = n), e.setParent(n, r), s && e.setEdge(s, n, { weight: 1 }); + } + t.exports = function (i) { + s.forEach(i.children(), function e(t) { + var n = i.children(t), + r = i.node(t); + if ((n.length && s.forEach(n, e), s.has(r, "minRank"))) { + (r.borderLeft = []), (r.borderRight = []); + for (var o = r.minRank, a = r.maxRank + 1; o < a; ++o) + c(i, "borderLeft", "_bl", t, r, o), c(i, "borderRight", "_br", t, r, o); + } + }); + }; + }, + { "./lodash": 10, "./util": 29 }, + ], + 4: [ + function (e, t, n) { + "use strict"; + var r = e("./lodash"); + function o(t) { + r.forEach(t.nodes(), function (e) { + a(t.node(e)); + }), + r.forEach(t.edges(), function (e) { + a(t.edge(e)); + }); + } + function a(e) { + var t = e.width; + (e.width = e.height), (e.height = t); + } + function i(e) { + e.y = -e.y; + } + function s(e) { + var t = e.x; + (e.x = e.y), (e.y = t); + } + t.exports = { + adjust: function (e) { + var t = e.graph().rankdir.toLowerCase(); + ("lr" !== t && "rl" !== t) || o(e); + }, + undo: function (e) { + var t = e.graph().rankdir.toLowerCase(); + ("bt" !== t && "rl" !== t) || + (function (t) { + r.forEach(t.nodes(), function (e) { + i(t.node(e)); + }), + r.forEach(t.edges(), function (e) { + e = t.edge(e); + r.forEach(e.points, i), r.has(e, "y") && i(e); + }); + })(e); + ("lr" !== t && "rl" !== t) || + ((function (t) { + r.forEach(t.nodes(), function (e) { + s(t.node(e)); + }), + r.forEach(t.edges(), function (e) { + e = t.edge(e); + r.forEach(e.points, s), r.has(e, "x") && s(e); + }); + })(e), + o(e)); + }, + }; + }, + { "./lodash": 10 }, + ], + 5: [ + function (e, t, n) { + function r() { + var e = {}; + (e._next = e._prev = e), (this._sentinel = e); + } + function o(e) { + (e._prev._next = e._next), + (e._next._prev = e._prev), + delete e._next, + delete e._prev; + } + function a(e, t) { + if ("_next" !== e && "_prev" !== e) return t; + } + ((t.exports = r).prototype.dequeue = function () { + var e = this._sentinel, + t = e._prev; + if (t !== e) return o(t), t; + }), + (r.prototype.enqueue = function (e) { + var t = this._sentinel; + e._prev && e._next && o(e), + (e._next = t._next), + (t._next._prev = e), + ((t._next = e)._prev = t); + }), + (r.prototype.toString = function () { + for (var e = [], t = this._sentinel, n = t._prev; n !== t; ) + e.push(JSON.stringify(n, a)), (n = n._prev); + return "[" + e.join(", ") + "]"; + }); + }, + {}, + ], + 6: [ + function (e, t, n) { + var r = e("./lodash"), + o = e("./util"), + a = e("./graphlib").Graph; + t.exports = { + debugOrdering: function (t) { + var e = o.buildLayerMatrix(t), + n = new a({ compound: !0, multigraph: !0 }).setGraph({}); + return ( + r.forEach(t.nodes(), function (e) { + n.setNode(e, { label: e }), n.setParent(e, "layer" + t.node(e).rank); + }), + r.forEach(t.edges(), function (e) { + n.setEdge(e.v, e.w, {}, e.name); + }), + r.forEach(e, function (e, t) { + t = "layer" + t; + n.setNode(t, { rank: "same" }), + r.reduce(e, function (e, t) { + return n.setEdge(e, t, { style: "invis" }), t; + }); + }), + n + ); + }, + }; + }, + { "./graphlib": 7, "./lodash": 10, "./util": 29 }, + ], + 7: [ + function (e, t, n) { + var r; + if ("function" == typeof e) + try { + r = e("graphlib"); + } catch (e) {} + (r = r || window.graphlib), (t.exports = r); + }, + { graphlib: 31 }, + ], + 8: [ + function (e, t, n) { + var u = e("./lodash"), + s = e("./graphlib").Graph, + c = e("./data/list"); + t.exports = function (t, e) { + if (t.nodeCount() <= 1) return []; + (e = (function (e, r) { + var o = new s(), + a = 0, + i = 0; + u.forEach(e.nodes(), function (e) { + o.setNode(e, { v: e, in: 0, out: 0 }); + }), + u.forEach(e.edges(), function (e) { + var t = o.edge(e.v, e.w) || 0, + n = r(e), + t = t + n; + o.setEdge(e.v, e.w, t), + (i = Math.max(i, (o.node(e.v).out += n))), + (a = Math.max(a, (o.node(e.w).in += n))); + }); + var t = u.range(i + a + 3).map(function () { + return new c(); + }), + n = a + 1; + return ( + u.forEach(o.nodes(), function (e) { + d(t, n, o.node(e)); + }), + { graph: o, buckets: t, zeroIdx: n } + ); + })(t, e || r)), + (e = (function (e, t, n) { + var r, + o = [], + a = t[t.length - 1], + i = t[0]; + for (; e.nodeCount(); ) { + for (; (r = i.dequeue()); ) f(e, t, n, r); + for (; (r = a.dequeue()); ) f(e, t, n, r); + if (e.nodeCount()) + for (var s = t.length - 2; 0 < s; --s) + if ((r = t[s].dequeue())) { + o = o.concat(f(e, t, n, r, !0)); + break; + } + } + return o; + })(e.graph, e.buckets, e.zeroIdx)); + return u.flatten( + u.map(e, function (e) { + return t.outEdges(e.v, e.w); + }), + !0 + ); + }; + var r = u.constant(1); + function f(r, o, a, e, i) { + var s = i ? [] : void 0; + return ( + u.forEach(r.inEdges(e.v), function (e) { + var t = r.edge(e), + n = r.node(e.v); + i && s.push({ v: e.v, w: e.w }), (n.out -= t), d(o, a, n); + }), + u.forEach(r.outEdges(e.v), function (e) { + var t = r.edge(e), + e = e.w, + e = r.node(e); + (e.in -= t), d(o, a, e); + }), + r.removeNode(e.v), + s + ); + } + function d(e, t, n) { + (n.out ? (n.in ? e[n.out - n.in + t] : e[e.length - 1]) : e[0]).enqueue(n); + } + }, + { "./data/list": 5, "./graphlib": 7, "./lodash": 10 }, + ], + 9: [ + function (e, t, n) { + "use strict"; + var f = e("./lodash"), + r = e("./acyclic"), + o = e("./normalize"), + i = e("./rank"), + s = e("./util").normalizeRanks, + u = e("./parent-dummy-chains"), + d = e("./util").removeEmptyRanks, + h = e("./nesting-graph"), + l = e("./add-border-segments"), + p = e("./coordinate-system"), + _ = e("./order"), + v = e("./position"), + g = e("./util"), + c = e("./graphlib").Graph; + t.exports = function (a, e) { + var n = e && e.debugTiming ? g.time : g.notime; + n("layout", function () { + var t = n(" buildLayoutGraph", function () { + return ( + (n = a), + (r = new c({ multigraph: !0, compound: !0 })), + (e = O(n.graph())), + r.setGraph(f.merge({}, b, A(e, y), f.pick(e, m))), + f.forEach(n.nodes(), function (e) { + var t = O(n.node(e)); + r.setNode(e, f.defaults(A(t, x), w)), r.setParent(e, n.parent(e)); + }), + f.forEach(n.edges(), function (e) { + var t = O(n.edge(e)); + r.setEdge(e, f.merge({}, j, A(t, E), f.pick(t, k))); + }), + r + ); + var n, r, e; + }); + n(" runLayout", function () { + var c, e; + (c = t), + (e = n)(" makeSpaceForEdgeLabels", function () { + var t, n; + ((n = (t = c).graph()).ranksep /= 2), + f.forEach(t.edges(), function (e) { + e = t.edge(e); + (e.minlen *= 2), + "c" !== e.labelpos.toLowerCase() && + ("TB" === n.rankdir || "BT" === n.rankdir + ? (e.width += e.labeloffset) + : (e.height += e.labeloffset)); + }); + }), + e(" removeSelfEdges", function () { + var n; + (n = c), + f.forEach(n.edges(), function (e) { + var t; + e.v === e.w && + ((t = n.node(e.v)).selfEdges || (t.selfEdges = []), + t.selfEdges.push({ e: e, label: n.edge(e) }), + n.removeEdge(e)); + }); + }), + e(" acyclic", function () { + r.run(c); + }), + e(" nestingGraph.run", function () { + h.run(c); + }), + e(" rank", function () { + i(g.asNonCompoundGraph(c)); + }), + e(" injectEdgeLabelProxies", function () { + var n; + (n = c), + f.forEach(n.edges(), function (e) { + var t = n.edge(e); + t.width && + t.height && + ((t = n.node(e.v)), + (e = { + rank: (n.node(e.w).rank - t.rank) / 2 + t.rank, + e: e, + }), + g.addDummyNode(n, "edge-proxy", e, "_ep")); + }); + }), + e(" removeEmptyRanks", function () { + d(c); + }), + e(" nestingGraph.cleanup", function () { + h.cleanup(c); + }), + e(" normalizeRanks", function () { + s(c); + }), + e(" assignRankMinMax", function () { + var t, n; + (t = c), + (n = 0), + f.forEach(t.nodes(), function (e) { + e = t.node(e); + e.borderTop && + ((e.minRank = t.node(e.borderTop).rank), + (e.maxRank = t.node(e.borderBottom).rank), + (n = f.max(n, e.maxRank))); + }), + (t.graph().maxRank = n); + }), + e(" removeEdgeLabelProxies", function () { + var n; + (n = c), + f.forEach(n.nodes(), function (e) { + var t = n.node(e); + "edge-proxy" === t.dummy && + ((n.edge(t.e).labelRank = t.rank), n.removeNode(e)); + }); + }), + e(" normalize.run", function () { + o.run(c); + }), + e(" parentDummyChains", function () { + u(c); + }), + e(" addBorderSegments", function () { + l(c); + }), + e(" order", function () { + _(c); + }), + e(" insertSelfEdges", function () { + var o, e; + (o = c), + (e = g.buildLayerMatrix(o)), + f.forEach(e, function (e) { + var r = 0; + f.forEach(e, function (e, t) { + var n = o.node(e); + (n.order = t + r), + f.forEach(n.selfEdges, function (e) { + g.addDummyNode( + o, + "selfedge", + { + width: e.label.width, + height: e.label.height, + rank: n.rank, + order: t + ++r, + e: e.e, + label: e.label, + }, + "_se" + ); + }), + delete n.selfEdges; + }); + }); + }), + e(" adjustCoordinateSystem", function () { + p.adjust(c); + }), + e(" position", function () { + v(c); + }), + e(" positionSelfEdges", function () { + var i; + (i = c), + f.forEach(i.nodes(), function (e) { + var t, + n, + r, + o, + a = i.node(e); + "selfedge" === a.dummy && + ((t = (o = i.node(a.e.v)).x + o.width / 2), + (n = o.y), + (r = a.x - t), + (o = o.height / 2), + i.setEdge(a.e, a.label), + i.removeNode(e), + (a.label.points = [ + { x: t + (2 * r) / 3, y: n - o }, + { x: t + (5 * r) / 6, y: n - o }, + { x: t + r, y: n }, + { x: t + (5 * r) / 6, y: n + o }, + { x: t + (2 * r) / 3, y: n + o }, + ]), + (a.label.x = a.x), + (a.label.y = a.y)); + }); + }), + e(" removeBorderNodes", function () { + var a; + (a = c), + f.forEach(a.nodes(), function (e) { + var t, n, r, o; + a.children(e).length && + ((t = a.node(e)), + (n = a.node(t.borderTop)), + (r = a.node(t.borderBottom)), + (o = a.node(f.last(t.borderLeft))), + (e = a.node(f.last(t.borderRight))), + (t.width = Math.abs(e.x - o.x)), + (t.height = Math.abs(r.y - n.y)), + (t.x = o.x + t.width / 2), + (t.y = n.y + t.height / 2)); + }), + f.forEach(a.nodes(), function (e) { + "border" === a.node(e).dummy && a.removeNode(e); + }); + }), + e(" normalize.undo", function () { + o.undo(c); + }), + e(" fixupEdgeLabelCoords", function () { + var n; + (n = c), + f.forEach(n.edges(), function (e) { + var t = n.edge(e); + if (f.has(t, "x")) + switch ( + (("l" !== t.labelpos && "r" !== t.labelpos) || + (t.width -= t.labeloffset), + t.labelpos) + ) { + case "l": + t.x -= t.width / 2 + t.labeloffset; + break; + case "r": + t.x += t.width / 2 + t.labeloffset; + } + }); + }), + e(" undoCoordinateSystem", function () { + p.undo(c); + }), + e(" translateGraph", function () { + function t(e) { + var t = e.x, + n = e.y, + r = e.width, + e = e.height; + (o = Math.min(o, t - r / 2)), + (a = Math.max(a, t + r / 2)), + (i = Math.min(i, n - e / 2)), + (s = Math.max(s, n + e / 2)); + } + var n, o, a, i, s, e, r, u; + (n = c), + (o = Number.POSITIVE_INFINITY), + (a = 0), + (i = Number.POSITIVE_INFINITY), + (s = 0), + (e = n.graph()), + (r = e.marginx || 0), + (u = e.marginy || 0), + f.forEach(n.nodes(), function (e) { + t(n.node(e)); + }), + f.forEach(n.edges(), function (e) { + e = n.edge(e); + f.has(e, "x") && t(e); + }), + (o -= r), + (i -= u), + f.forEach(n.nodes(), function (e) { + e = n.node(e); + (e.x -= o), (e.y -= i); + }), + f.forEach(n.edges(), function (e) { + e = n.edge(e); + f.forEach(e.points, function (e) { + (e.x -= o), (e.y -= i); + }), + f.has(e, "x") && (e.x -= o), + f.has(e, "y") && (e.y -= i); + }), + (e.width = a - o + r), + (e.height = s - i + u); + }), + e(" assignNodeIntersects", function () { + var a; + (a = c), + f.forEach(a.edges(), function (e) { + var t, + n = a.edge(e), + r = a.node(e.v), + o = a.node(e.w), + e = n.points + ? ((t = n.points[0]), n.points[n.points.length - 1]) + : ((n.points = []), (t = o), r); + n.points.unshift(g.intersectRect(r, t)), + n.points.push(g.intersectRect(o, e)); + }); + }), + e(" reversePoints", function () { + var t; + (t = c), + f.forEach(t.edges(), function (e) { + e = t.edge(e); + e.reversed && e.points.reverse(); + }); + }), + e(" acyclic.undo", function () { + r.undo(c); + }); + }), + n(" updateInputGraph", function () { + var r, o; + (r = a), + (o = t), + f.forEach(r.nodes(), function (e) { + var t = r.node(e), + n = o.node(e); + t && + ((t.x = n.x), + (t.y = n.y), + o.children(e).length && + ((t.width = n.width), (t.height = n.height))); + }), + f.forEach(r.edges(), function (e) { + var t = r.edge(e), + e = o.edge(e); + (t.points = e.points), f.has(e, "x") && ((t.x = e.x), (t.y = e.y)); + }), + (r.graph().width = o.graph().width), + (r.graph().height = o.graph().height); + }); + }); + }; + var y = ["nodesep", "edgesep", "ranksep", "marginx", "marginy"], + b = { ranksep: 50, edgesep: 20, nodesep: 50, rankdir: "tb" }, + m = ["acyclicer", "ranker", "rankdir", "align"], + x = ["width", "height"], + w = { width: 0, height: 0 }, + E = ["minlen", "weight", "width", "height", "labeloffset"], + j = { + minlen: 1, + weight: 1, + width: 0, + height: 0, + labeloffset: 10, + labelpos: "r", + }, + k = ["labelpos"]; + function A(e, t) { + return f.mapValues(f.pick(e, t), Number); + } + function O(e) { + var n = {}; + return ( + f.forEach(e, function (e, t) { + n[t.toLowerCase()] = e; + }), + n + ); + } + }, + { + "./acyclic": 2, + "./add-border-segments": 3, + "./coordinate-system": 4, + "./graphlib": 7, + "./lodash": 10, + "./nesting-graph": 11, + "./normalize": 12, + "./order": 17, + "./parent-dummy-chains": 22, + "./position": 24, + "./rank": 26, + "./util": 29, + }, + ], + 10: [ + function (e, t, n) { + var r; + if ("function" == typeof e) + try { + r = { + cloneDeep: e("lodash/cloneDeep"), + constant: e("lodash/constant"), + defaults: e("lodash/defaults"), + each: e("lodash/each"), + filter: e("lodash/filter"), + find: e("lodash/find"), + flatten: e("lodash/flatten"), + forEach: e("lodash/forEach"), + forIn: e("lodash/forIn"), + has: e("lodash/has"), + isUndefined: e("lodash/isUndefined"), + last: e("lodash/last"), + map: e("lodash/map"), + mapValues: e("lodash/mapValues"), + max: e("lodash/max"), + merge: e("lodash/merge"), + min: e("lodash/min"), + minBy: e("lodash/minBy"), + now: e("lodash/now"), + pick: e("lodash/pick"), + range: e("lodash/range"), + reduce: e("lodash/reduce"), + sortBy: e("lodash/sortBy"), + uniqueId: e("lodash/uniqueId"), + values: e("lodash/values"), + zipObject: e("lodash/zipObject"), + }; + } catch (e) {} + (r = r || window._), (t.exports = r); + }, + { + "lodash/cloneDeep": 227, + "lodash/constant": 228, + "lodash/defaults": 229, + "lodash/each": 230, + "lodash/filter": 232, + "lodash/find": 233, + "lodash/flatten": 235, + "lodash/forEach": 236, + "lodash/forIn": 237, + "lodash/has": 239, + "lodash/isUndefined": 258, + "lodash/last": 261, + "lodash/map": 262, + "lodash/mapValues": 263, + "lodash/max": 264, + "lodash/merge": 266, + "lodash/min": 267, + "lodash/minBy": 268, + "lodash/now": 270, + "lodash/pick": 271, + "lodash/range": 273, + "lodash/reduce": 274, + "lodash/sortBy": 276, + "lodash/uniqueId": 286, + "lodash/values": 287, + "lodash/zipObject": 288, + }, + ], + 11: [ + function (e, t, n) { + var p = e("./lodash"), + _ = e("./util"); + t.exports = { + run: function (t) { + var n = _.addDummyNode(t, "root", {}, "_root"), + r = (function (o) { + var a = {}; + return ( + p.forEach(o.children(), function (e) { + !(function t(e, n) { + var r = o.children(e); + r && + r.length && + p.forEach(r, function (e) { + t(e, n + 1); + }); + a[e] = n; + })(e, 1); + }), + a + ); + })(t), + o = p.max(p.values(r)) - 1, + a = 2 * o + 1; + (t.graph().nestingRoot = n), + p.forEach(t.edges(), function (e) { + t.edge(e).minlen *= a; + }); + var i = + (function (n) { + return p.reduce( + n.edges(), + function (e, t) { + return e + n.edge(t).weight; + }, + 0 + ); + })(t) + 1; + p.forEach(t.children(), function (e) { + !(function o(a, i, s, u, c, f, d) { + var e = a.children(d); + if (!e.length) + return void (d !== i && a.setEdge(i, d, { weight: 0, minlen: s })); + var h = _.addBorderNode(a, "_bt"); + var l = _.addBorderNode(a, "_bb"); + var t = a.node(d); + a.setParent(h, d); + t.borderTop = h; + a.setParent(l, d); + t.borderBottom = l; + p.forEach(e, function (e) { + o(a, i, s, u, c, f, e); + var t = a.node(e), + n = t.borderTop || e, + r = t.borderBottom || e, + e = t.borderTop ? u : 2 * u, + t = n !== r ? 1 : c - f[d] + 1; + a.setEdge(h, n, { weight: e, minlen: t, nestingEdge: !0 }), + a.setEdge(r, l, { + weight: e, + minlen: t, + nestingEdge: !0, + }); + }); + a.parent(d) || a.setEdge(i, h, { weight: 0, minlen: c + f[d] }); + })(t, n, a, i, o, r, e); + }), + (t.graph().nodeRankFactor = a); + }, + cleanup: function (t) { + var e = t.graph(); + t.removeNode(e.nestingRoot), + delete e.nestingRoot, + p.forEach(t.edges(), function (e) { + t.edge(e).nestingEdge && t.removeEdge(e); + }); + }, + }; + }, + { "./lodash": 10, "./util": 29 }, + ], + 12: [ + function (e, t, n) { + "use strict"; + var r = e("./lodash"), + h = e("./util"); + t.exports = { + run: function (t) { + (t.graph().dummyChains = []), + r.forEach(t.edges(), function (e) { + !(function (e, t) { + var n, + r, + o, + a = t.v, + i = e.node(a).rank, + s = t.w, + u = e.node(s).rank, + c = t.name, + f = e.edge(t), + d = f.labelRank; + if (u !== i + 1) { + for (e.removeEdge(t), o = 0, ++i; i < u; ++o, ++i) + (f.points = []), + (r = { + width: 0, + height: 0, + edgeLabel: f, + edgeObj: t, + rank: i, + }), + (n = h.addDummyNode(e, "edge", r, "_d")), + i === d && + ((r.width = f.width), + (r.height = f.height), + (r.dummy = "edge-label"), + (r.labelpos = f.labelpos)), + e.setEdge(a, n, { weight: f.weight }, c), + 0 === o && e.graph().dummyChains.push(n), + (a = n); + e.setEdge(a, s, { weight: f.weight }, c); + } + })(t, e); + }); + }, + undo: function (o) { + r.forEach(o.graph().dummyChains, function (e) { + var t, + n = o.node(e), + r = n.edgeLabel; + for (o.setEdge(n.edgeObj, r); n.dummy; ) + (t = o.successors(e)[0]), + o.removeNode(e), + r.points.push({ x: n.x, y: n.y }), + "edge-label" === n.dummy && + ((r.x = n.x), + (r.y = n.y), + (r.width = n.width), + (r.height = n.height)), + (e = t), + (n = o.node(e)); + }); + }, + }; + }, + { "./lodash": 10, "./util": 29 }, + ], + 13: [ + function (e, t, n) { + var r = e("../lodash"); + t.exports = function (o, a, e) { + var i, + s = {}; + r.forEach(e, function (e) { + for (var t, n, r = o.parent(e); r; ) { + if ( + ((t = o.parent(r)) ? ((n = s[t]), (s[t] = r)) : ((n = i), (i = r)), + n && n !== r) + ) + return void a.setEdge(n, r); + r = t; + } + }); + }; + }, + { "../lodash": 10 }, + ], + 14: [ + function (e, t, n) { + var o = e("../lodash"); + t.exports = function (r, e) { + return o.map(e, function (e) { + var t = r.inEdges(e); + if (t.length) { + t = o.reduce( + t, + function (e, t) { + var n = r.edge(t), + t = r.node(t.v); + return { + sum: e.sum + n.weight * t.order, + weight: e.weight + n.weight, + }; + }, + { sum: 0, weight: 0 } + ); + return { v: e, barycenter: t.sum / t.weight, weight: t.weight }; + } + return { v: e }; + }); + }; + }, + { "../lodash": 10 }, + ], + 15: [ + function (e, t, n) { + var u = e("../lodash"), + r = e("../graphlib").Graph; + t.exports = function (o, n, a) { + var i = (function (e) { + var t; + for (; e.hasNode((t = u.uniqueId("_root"))); ); + return t; + })(o), + s = new r({ compound: !0 }) + .setGraph({ root: i }) + .setDefaultNodeLabel(function (e) { + return o.node(e); + }); + return ( + u.forEach(o.nodes(), function (r) { + var e = o.node(r), + t = o.parent(r); + (e.rank === n || (e.minRank <= n && n <= e.maxRank)) && + (s.setNode(r), + s.setParent(r, t || i), + u.forEach(o[a](r), function (e) { + var t = e.v === r ? e.w : e.v, + n = s.edge(t, r), + n = u.isUndefined(n) ? 0 : n.weight; + s.setEdge(t, r, { weight: o.edge(e).weight + n }); + }), + u.has(e, "minRank") && + s.setNode(r, { + borderLeft: e.borderLeft[n], + borderRight: e.borderRight[n], + })); + }), + s + ); + }; + }, + { "../graphlib": 7, "../lodash": 10 }, + ], + 16: [ + function (e, t, n) { + "use strict"; + var u = e("../lodash"); + t.exports = function (e, t) { + for (var n = 0, r = 1; r < t.length; ++r) + n += (function (t, e, n) { + var r = u.zipObject( + n, + u.map(n, function (e, t) { + return t; + }) + ), + o = u.flatten( + u.map(e, function (e) { + return u.sortBy( + u.map(t.outEdges(e), function (e) { + return { pos: r[e.w], weight: t.edge(e).weight }; + }), + "pos" + ); + }), + !0 + ), + a = 1; + for (; a < n.length; ) a <<= 1; + e = 2 * a - 1; + --a; + var i = u.map(new Array(e), function () { + return 0; + }), + s = 0; + return ( + u.forEach( + o.forEach(function (e) { + var t = e.pos + a; + i[t] += e.weight; + for (var n = 0; 0 < t; ) + t % 2 && (n += i[t + 1]), (i[(t = (t - 1) >> 1)] += e.weight); + s += e.weight * n; + }) + ), + s + ); + })(e, t[r - 1], t[r]); + return n; + }; + }, + { "../lodash": 10 }, + ], + 17: [ + function (e, t, n) { + "use strict"; + var f = e("../lodash"), + d = e("./init-order"), + h = e("./cross-count"), + l = e("./sort-subgraph"), + r = e("./build-layer-graph"), + p = e("./add-subgraph-constraints"), + _ = e("../graphlib").Graph, + v = e("../util"); + function g(t, e, n) { + return f.map(e, function (e) { + return r(t, e, n); + }); + } + function y(n, e) { + f.forEach(e, function (e) { + f.forEach(e, function (e, t) { + n.node(e).order = t; + }); + }); + } + t.exports = function (e) { + var t = v.maxRank(e), + n = g(e, f.range(1, t + 1), "inEdges"), + r = g(e, f.range(t - 1, -1, -1), "outEdges"), + o = d(e); + y(e, o); + for (var a, i = Number.POSITIVE_INFINITY, s = 0, u = 0; u < 4; ++s, ++u) { + !(function (e, t) { + var r = new _(); + f.forEach(e, function (n) { + var e = n.graph().root, + e = l(n, e, r, t); + f.forEach(e.vs, function (e, t) { + n.node(e).order = t; + }), + p(n, r, e.vs); + }); + })(s % 2 ? n : r, 2 <= s % 4), + (o = v.buildLayerMatrix(e)); + var c = h(e, o); + c < i && ((u = 0), (a = f.cloneDeep(o)), (i = c)); + } + y(e, a); + }; + }, + { + "../graphlib": 7, + "../lodash": 10, + "../util": 29, + "./add-subgraph-constraints": 13, + "./build-layer-graph": 15, + "./cross-count": 16, + "./init-order": 18, + "./sort-subgraph": 20, + }, + ], + 18: [ + function (e, t, n) { + "use strict"; + var i = e("../lodash"); + t.exports = function (r) { + var o = {}, + e = i.filter(r.nodes(), function (e) { + return !r.children(e).length; + }), + t = i.max( + i.map(e, function (e) { + return r.node(e).rank; + }) + ), + a = i.map(i.range(t + 1), function () { + return []; + }); + e = i.sortBy(e, function (e) { + return r.node(e).rank; + }); + return ( + i.forEach(e, function e(t) { + if (i.has(o, t)) return; + o[t] = !0; + var n = r.node(t); + a[n.rank].push(t); + i.forEach(r.successors(t), e); + }), + a + ); + }; + }, + { "../lodash": 10 }, + ], + 19: [ + function (e, t, n) { + "use strict"; + var a = e("../lodash"); + t.exports = function (e, t) { + var r = {}; + return ( + a.forEach(e, function (e, t) { + t = r[e.v] = { indegree: 0, in: [], out: [], vs: [e.v], i: t }; + a.isUndefined(e.barycenter) || + ((t.barycenter = e.barycenter), (t.weight = e.weight)); + }), + a.forEach(t.edges(), function (e) { + var t = r[e.v], + n = r[e.w]; + a.isUndefined(t) || + a.isUndefined(n) || + (n.indegree++, t.out.push(r[e.w])); + }), + (function (n) { + var e = []; + function t(o) { + return function (e) { + var t, n, r; + e.merged || + ((a.isUndefined(e.barycenter) || + a.isUndefined(o.barycenter) || + e.barycenter >= o.barycenter) && + ((t = e), + (r = n = 0), + (e = o).weight && + ((n += e.barycenter * e.weight), (r += e.weight)), + t.weight && ((n += t.barycenter * t.weight), (r += t.weight)), + (e.vs = t.vs.concat(e.vs)), + (e.barycenter = n / r), + (e.weight = r), + (e.i = Math.min(t.i, e.i)), + (t.merged = !0))); + }; + } + for (; n.length; ) { + var r = n.pop(); + e.push(r), + a.forEach(r.in.reverse(), t(r)), + a.forEach( + r.out, + (function (t) { + return function (e) { + e.in.push(t), 0 == --e.indegree && n.push(e); + }; + })(r) + ); + } + return a.map( + a.filter(e, function (e) { + return !e.merged; + }), + function (e) { + return a.pick(e, ["vs", "i", "barycenter", "weight"]); + } + ); + })( + a.filter(r, function (e) { + return !e.indegree; + }) + ) + ); + }; + }, + { "../lodash": 10 }, + ], + 20: [ + function (e, t, n) { + var f = e("../lodash"), + d = e("./barycenter"), + h = e("./resolve-conflicts"), + l = e("./sort"); + function p(e, t) { + f.forEach(e, function (e) { + e.vs = f.flatten( + e.vs.map(function (e) { + return t[e] ? t[e].vs : e; + }), + !0 + ); + }); + } + function _(e, t) { + f.isUndefined(e.barycenter) + ? ((e.barycenter = t.barycenter), (e.weight = t.weight)) + : ((e.barycenter = + (e.barycenter * e.weight + t.barycenter * t.weight) / + (e.weight + t.weight)), + (e.weight += t.weight)); + } + t.exports = function n(r, e, o, a) { + var t = r.children(e); + var i = r.node(e); + var s = i ? i.borderLeft : void 0; + var u = i ? i.borderRight : void 0; + var c = {}; + s && + (t = f.filter(t, function (e) { + return e !== s && e !== u; + })); + e = d(r, t); + f.forEach(e, function (e) { + var t; + r.children(e.v).length && + ((t = n(r, e.v, o, a)), (c[e.v] = t), f.has(t, "barycenter") && _(e, t)); + }); + i = h(e, o); + p(i, c); + var t = l(i, a); + s && + ((t.vs = f.flatten([s, t.vs, u], !0)), + r.predecessors(s).length && + ((e = r.node(r.predecessors(s)[0])), + (i = r.node(r.predecessors(u)[0])), + f.has(t, "barycenter") || ((t.barycenter = 0), (t.weight = 0)), + (t.barycenter = + (t.barycenter * t.weight + e.order + i.order) / (t.weight + 2)), + (t.weight += 2))); + return t; + }; + }, + { + "../lodash": 10, + "./barycenter": 14, + "./resolve-conflicts": 19, + "./sort": 21, + }, + ], + 21: [ + function (e, t, n) { + var u = e("../lodash"), + c = e("../util"); + function f(e, t, n) { + for (var r; t.length && (r = u.last(t)).i <= n; ) t.pop(), e.push(r.vs), n++; + return n; + } + t.exports = function (e, t) { + var n = c.partition(e, function (e) { + return u.has(e, "barycenter"); + }), + e = n.lhs, + r = u.sortBy(n.rhs, function (e) { + return -e.i; + }), + o = [], + a = 0, + i = 0, + s = 0; + e.sort( + (function (n) { + return function (e, t) { + return e.barycenter < t.barycenter + ? -1 + : e.barycenter > t.barycenter + ? 1 + : n + ? t.i - e.i + : e.i - t.i; + }; + })(!!t) + ), + (s = f(o, r, s)), + u.forEach(e, function (e) { + (s += e.vs.length), + o.push(e.vs), + (a += e.barycenter * e.weight), + (i += e.weight), + (s = f(o, r, s)); + }); + e = { vs: u.flatten(o, !0) }; + i && ((e.barycenter = a / i), (e.weight = i)); + return e; + }; + }, + { "../lodash": 10, "../util": 29 }, + ], + 22: [ + function (e, t, n) { + var i = e("./lodash"); + t.exports = function (c) { + var f = (function (r) { + var o = {}, + a = 0; + return ( + i.forEach(r.children(), function e(t) { + var n = a; + i.forEach(r.children(t), e); + o[t] = { low: n, lim: a++ }; + }), + o + ); + })(c); + i.forEach(c.graph().dummyChains, function (e) { + for ( + var t = c.node(e), + n = t.edgeObj, + r = (function (e, t, n, r) { + var o, + a, + i = [], + s = [], + u = Math.min(t[n].low, t[r].low), + c = Math.max(t[n].lim, t[r].lim); + o = n; + for ( + ; + (o = e.parent(o)), i.push(o), o && (t[o].low > u || c > t[o].lim); + + ); + (a = o), (o = r); + for (; (o = e.parent(o)) !== a; ) s.push(o); + return { path: i.concat(s.reverse()), lca: a }; + })(c, f, n.v, n.w), + o = r.path, + a = r.lca, + i = 0, + s = o[i], + u = !0; + e !== n.w; + + ) { + if (((t = c.node(e)), u)) { + for (; (s = o[i]) !== a && c.node(s).maxRank < t.rank; ) i++; + s === a && (u = !1); + } + if (!u) { + for (; i < o.length - 1 && c.node((s = o[i + 1])).minRank <= t.rank; ) + i++; + s = o[i]; + } + c.setParent(e, s), (e = c.successors(e)[0]); + } + }); + }; + }, + { "./lodash": 10 }, + ], + 23: [ + function (e, t, n) { + "use strict"; + var _ = e("../lodash"), + v = e("../graphlib").Graph, + s = e("../util"); + function u(c, e) { + var f = {}; + return ( + _.reduce(e, function (e, r) { + var a = 0, + i = 0, + s = e.length, + u = _.last(r); + return ( + _.forEach(r, function (e, t) { + var n = (function (t, e) { + if (t.node(e).dummy) + return _.find(t.predecessors(e), function (e) { + return t.node(e).dummy; + }); + })(c, e), + o = n ? c.node(n).order : s; + (!n && e !== u) || + (_.forEach(r.slice(i, t + 1), function (r) { + _.forEach(c.predecessors(r), function (e) { + var t = c.node(e), + n = t.order; + !(n < a || o < n) || (t.dummy && c.node(r).dummy) || d(f, e, r); + }); + }), + (i = t + 1), + (a = o)); + }), + r + ); + }), + f + ); + } + function c(s, e) { + var i = {}; + function u(t, e, n, r, o) { + var a; + _.forEach(_.range(e, n), function (e) { + (a = t[e]), + s.node(a).dummy && + _.forEach(s.predecessors(a), function (e) { + var t = s.node(e); + t.dummy && (t.order < r || t.order > o) && d(i, e, a); + }); + }); + } + return ( + _.reduce(e, function (n, r) { + var o, + a = -1, + i = 0; + return ( + _.forEach(r, function (e, t) { + "border" !== s.node(e).dummy || + ((e = s.predecessors(e)).length && + ((o = s.node(e[0]).order), u(r, i, t, a, o), (i = t), (a = o))), + u(r, i, r.length, o, n.length); + }), + r + ); + }), + i + ); + } + function d(e, t, n) { + n < t && ((r = t), (t = n), (n = r)); + var r = e[t]; + r || (e[t] = r = {}), (r[n] = !0); + } + function h(e, t, n) { + var r; + return n < t && ((r = t), (t = n), (n = r)), _.has(e[t], n); + } + function f(e, t, s, u) { + var c = {}, + f = {}, + d = {}; + return ( + _.forEach(t, function (e) { + _.forEach(e, function (e, t) { + (c[e] = e), (f[e] = e), (d[e] = t); + }); + }), + _.forEach(t, function (e) { + var i = -1; + _.forEach(e, function (e) { + var t = u(e); + if (t.length) + for ( + var n = + ((t = _.sortBy(t, function (e) { + return d[e]; + })).length - + 1) / + 2, + r = Math.floor(n), + o = Math.ceil(n); + r <= o; + ++r + ) { + var a = t[r]; + f[e] === e && + i < d[a] && + !h(s, e, a) && + ((f[a] = e), (f[e] = c[e] = c[a]), (i = d[a])); + } + }); + }), + { root: c, align: f } + ); + } + function l(r, e, t, n, o) { + var a, + i, + s, + u, + c, + f, + d = {}, + h = + ((a = r), + (i = e), + (s = t), + (u = o), + (c = new v()), + (e = a.graph()), + (f = (function (i, s, u) { + return function (e, t, n) { + var r, + o = e.node(t), + a = e.node(n), + n = 0; + if (((n += o.width / 2), _.has(o, "labelpos"))) + switch (o.labelpos.toLowerCase()) { + case "l": + r = -o.width / 2; + break; + case "r": + r = o.width / 2; + } + if ( + (r && (n += u ? r : -r), + (r = 0), + (n += (o.dummy ? s : i) / 2), + (n += (a.dummy ? s : i) / 2), + (n += a.width / 2), + _.has(a, "labelpos")) + ) + switch (a.labelpos.toLowerCase()) { + case "l": + r = a.width / 2; + break; + case "r": + r = -a.width / 2; + } + return r && (n += u ? r : -r), (r = 0), n; + }; + })(e.nodesep, e.edgesep, u)), + _.forEach(i, function (e) { + var o; + _.forEach(e, function (e) { + var t, + n, + r = s[e]; + c.setNode(r), + o && + ((t = s[o]), + (n = c.edge(t, r)), + c.setEdge(t, r, Math.max(f(a, e, o), n || 0))), + (o = e); + }); + }), + c), + l = o ? "borderLeft" : "borderRight"; + function p(e, t) { + for (var n = h.nodes(), r = n.pop(), o = {}; r; ) + o[r] ? e(r) : ((o[r] = !0), n.push(r), (n = n.concat(t(r)))), + (r = n.pop()); + } + return ( + p(function (e) { + d[e] = h.inEdges(e).reduce(function (e, t) { + return Math.max(e, d[t.v] + h.edge(t)); + }, 0); + }, h.predecessors.bind(h)), + p(function (e) { + var t = h.outEdges(e).reduce(function (e, t) { + return Math.min(e, d[t.w] - h.edge(t)); + }, Number.POSITIVE_INFINITY), + n = r.node(e); + t !== Number.POSITIVE_INFINITY && + n.borderType !== l && + (d[e] = Math.max(d[e], t)); + }, h.successors.bind(h)), + _.forEach(n, function (e) { + d[e] = d[t[e]]; + }), + d + ); + } + function p(o, e) { + return _.minBy(_.values(e), function (e) { + var n = Number.NEGATIVE_INFINITY, + r = Number.POSITIVE_INFINITY; + return ( + _.forIn(e, function (e, t) { + (t = t), (t = o.node(t).width / 2); + (n = Math.max(e + t, n)), (r = Math.min(e - t, r)); + }), + n - r + ); + }); + } + function g(i, s) { + var e = _.values(s), + u = _.min(e), + c = _.max(e); + _.forEach(["u", "d"], function (a) { + _.forEach(["l", "r"], function (e) { + var t, + n, + r = a + e, + o = i[r]; + o !== s && + ((t = _.values(o)), + (n = "l" === e ? u - _.min(t) : c - _.max(t)) && + (i[r] = _.mapValues(o, function (e) { + return e + n; + }))); + }); + }); + } + function y(n, r) { + return _.mapValues(n.ul, function (e, t) { + if (r) return n[r.toLowerCase()][t]; + t = _.sortBy(_.map(n, t)); + return (t[1] + t[2]) / 2; + }); + } + t.exports = { + positionX: function (r) { + var o, + e = s.buildLayerMatrix(r), + a = _.merge(u(r, e), c(r, e)), + i = {}; + _.forEach(["u", "d"], function (n) { + (o = "u" === n ? e : _.values(e).reverse()), + _.forEach(["l", "r"], function (e) { + "r" === e && + (o = _.map(o, function (e) { + return _.values(e).reverse(); + })); + var t = ("u" === n ? r.predecessors : r.successors).bind(r), + t = f(0, o, a, t), + t = l(r, o, t.root, t.align, "r" === e); + "r" === e && + (t = _.mapValues(t, function (e) { + return -e; + })), + (i[n + e] = t); + }); + }); + var t = p(r, i); + return g(i, t), y(i, r.graph().align); + }, + findType1Conflicts: u, + findType2Conflicts: c, + addConflict: d, + hasConflict: h, + verticalAlignment: f, + horizontalCompaction: l, + alignCoordinates: g, + findSmallestWidthAlignment: p, + balance: y, + }; + }, + { "../graphlib": 7, "../lodash": 10, "../util": 29 }, + ], + 24: [ + function (e, t, n) { + "use strict"; + var a = e("../lodash"), + i = e("../util"), + r = e("./bk").positionX; + t.exports = function (n) { + (function (n) { + var e = i.buildLayerMatrix(n), + r = n.graph().ranksep, + o = 0; + a.forEach(e, function (e) { + var t = a.max( + a.map(e, function (e) { + return n.node(e).height; + }) + ); + a.forEach(e, function (e) { + n.node(e).y = o + t / 2; + }), + (o += t + r); + }); + })((n = i.asNonCompoundGraph(n))), + a.forEach(r(n), function (e, t) { + n.node(t).x = e; + }); + }; + }, + { "../lodash": 10, "../util": 29, "./bk": 23 }, + ], + 25: [ + function (e, t, n) { + "use strict"; + var i = e("../lodash"), + a = e("../graphlib").Graph, + s = e("./util").slack; + t.exports = function (e) { + var t, + r = new a({ directed: !1 }), + n = e.nodes()[0], + o = e.nodeCount(); + r.setNode(n, {}); + for ( + ; + (function (o, a) { + return ( + i.forEach(o.nodes(), function n(r) { + i.forEach(a.nodeEdges(r), function (e) { + var t = e.v, + t = r === t ? e.w : t; + o.hasNode(t) || + s(a, e) || + (o.setNode(t, {}), o.setEdge(r, t, {}), n(t)); + }); + }), + o.nodeCount() + ); + })(r, e) < o; + + ) + (t = (function (t, n) { + return i.minBy(n.edges(), function (e) { + if (t.hasNode(e.v) !== t.hasNode(e.w)) return s(n, e); + }); + })(r, e)), + (t = r.hasNode(t.v) ? s(e, t) : -s(e, t)), + (function (t, n) { + i.forEach(r.nodes(), function (e) { + t.node(e).rank += n; + }); + })(e, t); + return r; + }; + }, + { "../graphlib": 7, "../lodash": 10, "./util": 28 }, + ], + 26: [ + function (e, t, n) { + "use strict"; + var r = e("./util").longestPath, + o = e("./feasible-tree"), + a = e("./network-simplex"); + t.exports = function (e) { + switch (e.graph().ranker) { + case "network-simplex": + s(e); + break; + case "tight-tree": + !(function (e) { + r(e), o(e); + })(e); + break; + case "longest-path": + i(e); + break; + default: + s(e); + } + }; + var i = r; + function s(e) { + a(e); + } + }, + { "./feasible-tree": 25, "./network-simplex": 27, "./util": 28 }, + ], + 27: [ + function (e, t, n) { + "use strict"; + var f = e("../lodash"), + r = e("./feasible-tree"), + s = e("./util").slack, + o = e("./util").longestPath, + u = e("../graphlib").alg.preorder, + i = e("../graphlib").alg.postorder, + a = e("../util").simplify; + function c(e) { + (e = a(e)), o(e); + var t, + n = r(e); + for (l(n), d(n, e); (t = p(n)); ) v(n, e, t, _(n, e, t)); + } + function d(o, a) { + var e = (e = i(o, o.nodes())).slice(0, e.length - 1); + f.forEach(e, function (e) { + var t, n, r; + (n = a), + (r = e), + (e = (t = o).node(r).parent), + (t.edge(r, e).cutvalue = h(t, n, r)); + }); + } + function h(o, a, i) { + var s = o.node(i).parent, + u = !0, + e = a.edge(i, s), + c = 0; + return ( + e || ((u = !1), (e = a.edge(s, i))), + (c = e.weight), + f.forEach(a.nodeEdges(i), function (e) { + var t, + n = e.v === i, + r = n ? e.w : e.v; + r !== s && + ((t = n === u), + (n = a.edge(e).weight), + (c += t ? n : -n), + (e = i), + (n = r), + o.hasEdge(e, n) && ((r = o.edge(i, r).cutvalue), (c += t ? -r : r))); + }), + c + ); + } + function l(e, t) { + arguments.length < 2 && (t = e.nodes()[0]), + (function t(n, r, o, a, e) { + var i = o; + var s = n.node(a); + r[a] = !0; + f.forEach(n.neighbors(a), function (e) { + f.has(r, e) || (o = t(n, r, o, e, a)); + }); + s.low = i; + s.lim = o++; + e ? (s.parent = e) : delete s.parent; + return o; + })(e, {}, 1, t); + } + function p(t) { + return f.find(t.edges(), function (e) { + return t.edge(e).cutvalue < 0; + }); + } + function _(t, n, e) { + var r = e.v, + o = e.w; + n.hasEdge(r, o) || ((r = e.w), (o = e.v)); + var r = t.node(r), + o = t.node(o), + a = r, + i = !1; + r.lim > o.lim && ((a = o), (i = !0)); + o = f.filter(n.edges(), function (e) { + return i === g(0, t.node(e.v), a) && i !== g(0, t.node(e.w), a); + }); + return f.minBy(o, function (e) { + return s(n, e); + }); + } + function v(e, t, n, r) { + var o, + a, + i = n.v, + n = n.w; + e.removeEdge(i, n), + e.setEdge(r.v, r.w, {}), + l(e), + d(e, t), + (o = e), + (a = t), + (t = f.find(o.nodes(), function (e) { + return !a.node(e).parent; + })), + (t = (t = u(o, t)).slice(1)), + f.forEach(t, function (e) { + var t = o.node(e).parent, + n = a.edge(e, t), + r = !1; + n || ((n = a.edge(t, e)), (r = !0)), + (a.node(e).rank = a.node(t).rank + (r ? n.minlen : -n.minlen)); + }); + } + function g(e, t, n) { + return n.low <= t.lim && t.lim <= n.lim; + } + ((t.exports = c).initLowLimValues = l), + (c.initCutValues = d), + (c.calcCutValue = h), + (c.leaveEdge = p), + (c.enterEdge = _), + (c.exchangeEdges = v); + }, + { + "../graphlib": 7, + "../lodash": 10, + "../util": 29, + "./feasible-tree": 25, + "./util": 28, + }, + ], + 28: [ + function (e, t, n) { + "use strict"; + var a = e("../lodash"); + t.exports = { + longestPath: function (r) { + var o = {}; + a.forEach(r.sources(), function t(e) { + var n = r.node(e); + if (a.has(o, e)) return n.rank; + o[e] = !0; + e = a.min( + a.map(r.outEdges(e), function (e) { + return t(e.w) - r.edge(e).minlen; + }) + ); + return ( + (e !== Number.POSITIVE_INFINITY && null != e) || (e = 0), (n.rank = e) + ); + }); + }, + slack: function (e, t) { + return e.node(t.w).rank - e.node(t.v).rank - e.edge(t).minlen; + }, + }; + }, + { "../lodash": 10 }, + ], + 29: [ + function (e, t, n) { + "use strict"; + var s = e("./lodash"), + a = e("./graphlib").Graph; + function i(e, t, n, r) { + for (var o; (o = s.uniqueId(r)), e.hasNode(o); ); + return (n.dummy = t), e.setNode(o, n), o; + } + function u(t) { + return s.max( + s.map(t.nodes(), function (e) { + e = t.node(e).rank; + if (!s.isUndefined(e)) return e; + }) + ); + } + t.exports = { + addDummyNode: i, + simplify: function (r) { + var o = new a().setGraph(r.graph()); + return ( + s.forEach(r.nodes(), function (e) { + o.setNode(e, r.node(e)); + }), + s.forEach(r.edges(), function (e) { + var t = o.edge(e.v, e.w) || { weight: 0, minlen: 1 }, + n = r.edge(e); + o.setEdge(e.v, e.w, { + weight: t.weight + n.weight, + minlen: Math.max(t.minlen, n.minlen), + }); + }), + o + ); + }, + asNonCompoundGraph: function (t) { + var n = new a({ multigraph: t.isMultigraph() }).setGraph(t.graph()); + return ( + s.forEach(t.nodes(), function (e) { + t.children(e).length || n.setNode(e, t.node(e)); + }), + s.forEach(t.edges(), function (e) { + n.setEdge(e, t.edge(e)); + }), + n + ); + }, + successorWeights: function (n) { + var e = s.map(n.nodes(), function (e) { + var t = {}; + return ( + s.forEach(n.outEdges(e), function (e) { + t[e.w] = (t[e.w] || 0) + n.edge(e).weight; + }), + t + ); + }); + return s.zipObject(n.nodes(), e); + }, + predecessorWeights: function (n) { + var e = s.map(n.nodes(), function (e) { + var t = {}; + return ( + s.forEach(n.inEdges(e), function (e) { + t[e.v] = (t[e.v] || 0) + n.edge(e).weight; + }), + t + ); + }); + return s.zipObject(n.nodes(), e); + }, + intersectRect: function (e, t) { + var n, + r = e.x, + o = e.y, + a = t.x - r, + i = t.y - o, + t = e.width / 2, + e = e.height / 2; + if (!a && !i) + throw new Error( + "Not possible to find intersection inside of the rectangle" + ); + a = + Math.abs(i) * t > Math.abs(a) * e + ? (i < 0 && (e = -e), (n = (e * a) / i), e) + : (a < 0 && (t = -t), ((n = t) * i) / a); + return { x: r + n, y: o + a }; + }, + buildLayerMatrix: function (r) { + var o = s.map(s.range(u(r) + 1), function () { + return []; + }); + return ( + s.forEach(r.nodes(), function (e) { + var t = r.node(e), + n = t.rank; + s.isUndefined(n) || (o[n][t.order] = e); + }), + o + ); + }, + normalizeRanks: function (t) { + var n = s.min( + s.map(t.nodes(), function (e) { + return t.node(e).rank; + }) + ); + s.forEach(t.nodes(), function (e) { + e = t.node(e); + s.has(e, "rank") && (e.rank -= n); + }); + }, + removeEmptyRanks: function (n) { + var r = s.min( + s.map(n.nodes(), function (e) { + return n.node(e).rank; + }) + ), + o = []; + s.forEach(n.nodes(), function (e) { + var t = n.node(e).rank - r; + o[t] || (o[t] = []), o[t].push(e); + }); + var a = 0, + i = n.graph().nodeRankFactor; + s.forEach(o, function (e, t) { + s.isUndefined(e) && t % i != 0 + ? --a + : a && + s.forEach(e, function (e) { + n.node(e).rank += a; + }); + }); + }, + addBorderNode: function (e, t, n, r) { + var o = { width: 0, height: 0 }; + 4 <= arguments.length && ((o.rank = n), (o.order = r)); + return i(e, "border", o, t); + }, + maxRank: u, + partition: function (e, t) { + var n = { lhs: [], rhs: [] }; + return ( + s.forEach(e, function (e) { + (t(e) ? n.lhs : n.rhs).push(e); + }), + n + ); + }, + time: function (e, t) { + var n = s.now(); + try { + return t(); + } finally { + console.log(e + " time: " + (s.now() - n) + "ms"); + } + }, + notime: function (e, t) { + return t(); + }, + }; + }, + { "./graphlib": 7, "./lodash": 10 }, + ], + 30: [ + function (e, t, n) { + t.exports = "0.8.5"; + }, + {}, + ], + 31: [ + function (e, t, n) { + var r = e("./lib"); + t.exports = { + Graph: r.Graph, + json: e("./lib/json"), + alg: e("./lib/alg"), + version: r.version, + }; + }, + { "./lib": 47, "./lib/alg": 38, "./lib/json": 48 }, + ], + 32: [ + function (e, t, n) { + var i = e("../lodash"); + t.exports = function (t) { + var n, + r = {}, + o = []; + function a(e) { + i.has(r, e) || + ((r[e] = !0), + n.push(e), + i.each(t.successors(e), a), + i.each(t.predecessors(e), a)); + } + return ( + i.each(t.nodes(), function (e) { + (n = []), a(e), n.length && o.push(n); + }), + o + ); + }; + }, + { "../lodash": 49 }, + ], + 33: [ + function (e, t, n) { + var s = e("../lodash"); + t.exports = function (t, e, n) { + s.isArray(e) || (e = [e]); + var r = (t.isDirected() ? t.successors : t.neighbors).bind(t), + o = [], + a = {}; + return ( + s.each(e, function (e) { + if (!t.hasNode(e)) throw new Error("Graph does not have node: " + e); + !(function t(n, e, r, o, a, i) { + s.has(o, e) || + ((o[e] = !0), + r || i.push(e), + s.each(a(e), function (e) { + t(n, e, r, o, a, i); + }), + r && i.push(e)); + })(t, e, "post" === n, a, r, o); + }), + o + ); + }; + }, + { "../lodash": 49 }, + ], + 34: [ + function (e, t, n) { + var a = e("./dijkstra"), + i = e("../lodash"); + t.exports = function (n, r, o) { + return i.transform( + n.nodes(), + function (e, t) { + e[t] = a(n, t, r, o); + }, + {} + ); + }; + }, + { "../lodash": 49, "./dijkstra": 35 }, + ], + 35: [ + function (e, t, n) { + var r = e("../lodash"), + o = e("../data/priority-queue"); + t.exports = function (t, e, n, r) { + return (function (e, n, a, t) { + function r(e) { + var t = e.v !== i ? e.v : e.w, + n = u[t], + r = a(e), + o = s.distance + r; + if (r < 0) + throw new Error( + "dijkstra does not allow negative edge weights. Bad edge: " + + e + + " Weight: " + + r + ); + o < n.distance && + ((n.distance = o), (n.predecessor = i), c.decrease(t, o)); + } + var i, + s, + u = {}, + c = new o(); + e.nodes().forEach(function (e) { + var t = e === n ? 0 : Number.POSITIVE_INFINITY; + (u[e] = { distance: t }), c.add(e, t); + }); + for ( + ; + 0 < c.size() && + ((i = c.removeMin()), (s = u[i]).distance !== Number.POSITIVE_INFINITY); + + ) + t(i).forEach(r); + return u; + })( + t, + String(e), + n || a, + r || + function (e) { + return t.outEdges(e); + } + ); + }; + var a = r.constant(1); + }, + { "../data/priority-queue": 45, "../lodash": 49 }, + ], + 36: [ + function (e, t, n) { + var r = e("../lodash"), + o = e("./tarjan"); + t.exports = function (t) { + return r.filter(o(t), function (e) { + return 1 < e.length || (1 === e.length && t.hasEdge(e[0], e[0])); + }); + }; + }, + { "../lodash": 49, "./tarjan": 43 }, + ], + 37: [ + function (e, t, n) { + e = e("../lodash"); + t.exports = function (t, e, n) { + return (function (e, r, t) { + var i = {}, + s = e.nodes(); + return ( + s.forEach(function (n) { + (i[n] = {}), + (i[n][n] = { distance: 0 }), + s.forEach(function (e) { + n !== e && (i[n][e] = { distance: Number.POSITIVE_INFINITY }); + }), + t(n).forEach(function (e) { + var t = e.v === n ? e.w : e.v, + e = r(e); + i[n][t] = { distance: e, predecessor: n }; + }); + }), + s.forEach(function (o) { + var a = i[o]; + s.forEach(function (e) { + var r = i[e]; + s.forEach(function (e) { + var t = r[o], + n = a[e], + e = r[e], + t = t.distance + n.distance; + t < e.distance && + ((e.distance = t), (e.predecessor = n.predecessor)); + }); + }); + }), + i + ); + })( + t, + e || r, + n || + function (e) { + return t.outEdges(e); + } + ); + }; + var r = e.constant(1); + }, + { "../lodash": 49 }, + ], + 38: [ + function (e, t, n) { + t.exports = { + components: e("./components"), + dijkstra: e("./dijkstra"), + dijkstraAll: e("./dijkstra-all"), + findCycles: e("./find-cycles"), + floydWarshall: e("./floyd-warshall"), + isAcyclic: e("./is-acyclic"), + postorder: e("./postorder"), + preorder: e("./preorder"), + prim: e("./prim"), + tarjan: e("./tarjan"), + topsort: e("./topsort"), + }; + }, + { + "./components": 32, + "./dijkstra": 35, + "./dijkstra-all": 34, + "./find-cycles": 36, + "./floyd-warshall": 37, + "./is-acyclic": 39, + "./postorder": 40, + "./preorder": 41, + "./prim": 42, + "./tarjan": 43, + "./topsort": 44, + }, + ], + 39: [ + function (e, t, n) { + var r = e("./topsort"); + t.exports = function (e) { + try { + r(e); + } catch (e) { + if (e instanceof r.CycleException) return !1; + throw e; + } + return !0; + }; + }, + { "./topsort": 44 }, + ], + 40: [ + function (e, t, n) { + var r = e("./dfs"); + t.exports = function (e, t) { + return r(e, t, "post"); + }; + }, + { "./dfs": 33 }, + ], + 41: [ + function (e, t, n) { + var r = e("./dfs"); + t.exports = function (e, t) { + return r(e, t, "pre"); + }; + }, + { "./dfs": 33 }, + ], + 42: [ + function (e, t, n) { + var u = e("../lodash"), + c = e("../graph"), + f = e("../data/priority-queue"); + t.exports = function (e, r) { + var o, + t = new c(), + a = {}, + i = new f(); + function n(e) { + var t = e.v === o ? e.w : e.v, + n = i.priority(t); + void 0 === n || ((e = r(e)) < n && ((a[t] = o), i.decrease(t, e))); + } + if (0 === e.nodeCount()) return t; + u.each(e.nodes(), function (e) { + i.add(e, Number.POSITIVE_INFINITY), t.setNode(e); + }), + i.decrease(e.nodes()[0], 0); + var s = !1; + for (; 0 < i.size(); ) { + if (((o = i.removeMin()), u.has(a, o))) t.setEdge(o, a[o]); + else { + if (s) throw new Error("Input graph is not connected: " + e); + s = !0; + } + e.nodeEdges(o).forEach(n); + } + return t; + }; + }, + { "../data/priority-queue": 45, "../graph": 46, "../lodash": 49 }, + ], + 43: [ + function (e, t, n) { + var f = e("../lodash"); + t.exports = function (a) { + var i = 0, + s = [], + u = {}, + c = []; + return ( + a.nodes().forEach(function (e) { + f.has(u, e) || + !(function t(e) { + var n = (u[e] = { onStack: !0, lowlink: i, index: i++ }); + s.push(e); + a.successors(e).forEach(function (e) { + f.has(u, e) + ? u[e].onStack && (n.lowlink = Math.min(n.lowlink, u[e].index)) + : (t(e), (n.lowlink = Math.min(n.lowlink, u[e].lowlink))); + }); + if (n.lowlink === n.index) { + for ( + var r, o = []; + (r = s.pop()), (u[r].onStack = !1), o.push(r), e !== r; + + ); + c.push(o); + } + })(e); + }), + c + ); + }; + }, + { "../lodash": 49 }, + ], + 44: [ + function (e, t, n) { + var i = e("../lodash"); + function r(n) { + var r = {}, + o = {}, + a = []; + if ( + (i.each(n.sinks(), function e(t) { + if (i.has(o, t)) throw new s(); + i.has(r, t) || + ((o[t] = !0), + (r[t] = !0), + i.each(n.predecessors(t), e), + delete o[t], + a.push(t)); + }), + i.size(r) !== n.nodeCount()) + ) + throw new s(); + return a; + } + function s() {} + ((t.exports = r).CycleException = s).prototype = new Error(); + }, + { "../lodash": 49 }, + ], + 45: [ + function (e, t, n) { + var a = e("../lodash"); + function r() { + (this._arr = []), (this._keyIndices = {}); + } + ((t.exports = r).prototype.size = function () { + return this._arr.length; + }), + (r.prototype.keys = function () { + return this._arr.map(function (e) { + return e.key; + }); + }), + (r.prototype.has = function (e) { + return a.has(this._keyIndices, e); + }), + (r.prototype.priority = function (e) { + e = this._keyIndices[e]; + if (void 0 !== e) return this._arr[e].priority; + }), + (r.prototype.min = function () { + if (0 === this.size()) throw new Error("Queue underflow"); + return this._arr[0].key; + }), + (r.prototype.add = function (e, t) { + var n = this._keyIndices; + if (((e = String(e)), a.has(n, e))) return !1; + var r = this._arr, + o = r.length; + return (n[e] = o), r.push({ key: e, priority: t }), this._decrease(o), !0; + }), + (r.prototype.removeMin = function () { + this._swap(0, this._arr.length - 1); + var e = this._arr.pop(); + return delete this._keyIndices[e.key], this._heapify(0), e.key; + }), + (r.prototype.decrease = function (e, t) { + var n = this._keyIndices[e]; + if (t > this._arr[n].priority) + throw new Error( + "New priority is greater than current priority. Key: " + + e + + " Old: " + + this._arr[n].priority + + " New: " + + t + ); + (this._arr[n].priority = t), this._decrease(n); + }), + (r.prototype._heapify = function (e) { + var t = this._arr, + n = 2 * e, + r = 1 + n, + o = e; + n < t.length && + ((o = t[n].priority < t[o].priority ? n : o), + r < t.length && (o = t[r].priority < t[o].priority ? r : o), + o !== e && (this._swap(e, o), this._heapify(o))); + }), + (r.prototype._decrease = function (e) { + for ( + var t, n = this._arr, r = n[e].priority; + 0 !== e && !(n[(t = e >> 1)].priority < r); + + ) + this._swap(e, t), (e = t); + }), + (r.prototype._swap = function (e, t) { + var n = this._arr, + r = this._keyIndices, + o = n[e], + a = n[t]; + (n[e] = a), (n[t] = o), (r[a.key] = e), (r[o.key] = t); + }); + }, + { "../lodash": 49 }, + ], + 46: [ + function (e, t, n) { + "use strict"; + var i = e("./lodash"); + t.exports = s; + var o = "\0", + r = "\0", + a = ""; + function s(e) { + (this._isDirected = !i.has(e, "directed") || e.directed), + (this._isMultigraph = !!i.has(e, "multigraph") && e.multigraph), + (this._isCompound = !!i.has(e, "compound") && e.compound), + (this._label = void 0), + (this._defaultNodeLabelFn = i.constant(void 0)), + (this._defaultEdgeLabelFn = i.constant(void 0)), + (this._nodes = {}), + this._isCompound && + ((this._parent = {}), (this._children = {}), (this._children[r] = {})), + (this._in = {}), + (this._preds = {}), + (this._out = {}), + (this._sucs = {}), + (this._edgeObjs = {}), + (this._edgeLabels = {}); + } + function u(e, t) { + e[t] ? e[t]++ : (e[t] = 1); + } + function c(e, t) { + --e[t] || delete e[t]; + } + function f(e, t, n, r) { + (t = "" + t), (n = "" + n); + return ( + !e && n < t && ((e = t), (t = n), (n = e)), + t + a + n + a + (i.isUndefined(r) ? o : r) + ); + } + function d(e, t) { + return f(e, t.v, t.w, t.name); + } + (s.prototype._nodeCount = 0), + (s.prototype._edgeCount = 0), + (s.prototype.isDirected = function () { + return this._isDirected; + }), + (s.prototype.isMultigraph = function () { + return this._isMultigraph; + }), + (s.prototype.isCompound = function () { + return this._isCompound; + }), + (s.prototype.setGraph = function (e) { + return (this._label = e), this; + }), + (s.prototype.graph = function () { + return this._label; + }), + (s.prototype.setDefaultNodeLabel = function (e) { + return ( + i.isFunction(e) || (e = i.constant(e)), + (this._defaultNodeLabelFn = e), + this + ); + }), + (s.prototype.nodeCount = function () { + return this._nodeCount; + }), + (s.prototype.nodes = function () { + return i.keys(this._nodes); + }), + (s.prototype.sources = function () { + var t = this; + return i.filter(this.nodes(), function (e) { + return i.isEmpty(t._in[e]); + }); + }), + (s.prototype.sinks = function () { + var t = this; + return i.filter(this.nodes(), function (e) { + return i.isEmpty(t._out[e]); + }); + }), + (s.prototype.setNodes = function (e, t) { + var n = arguments, + r = this; + return ( + i.each(e, function (e) { + 1 < n.length ? r.setNode(e, t) : r.setNode(e); + }), + this + ); + }), + (s.prototype.setNode = function (e, t) { + return ( + i.has(this._nodes, e) + ? 1 < arguments.length && (this._nodes[e] = t) + : ((this._nodes[e] = + 1 < arguments.length ? t : this._defaultNodeLabelFn(e)), + this._isCompound && + ((this._parent[e] = r), + (this._children[e] = {}), + (this._children[r][e] = !0)), + (this._in[e] = {}), + (this._preds[e] = {}), + (this._out[e] = {}), + (this._sucs[e] = {}), + ++this._nodeCount), + this + ); + }), + (s.prototype.node = function (e) { + return this._nodes[e]; + }), + (s.prototype.hasNode = function (e) { + return i.has(this._nodes, e); + }), + (s.prototype.removeNode = function (e) { + var t, + n = this; + return ( + i.has(this._nodes, e) && + ((t = function (e) { + n.removeEdge(n._edgeObjs[e]); + }), + delete this._nodes[e], + this._isCompound && + (this._removeFromParentsChildList(e), + delete this._parent[e], + i.each(this.children(e), function (e) { + n.setParent(e); + }), + delete this._children[e]), + i.each(i.keys(this._in[e]), t), + delete this._in[e], + delete this._preds[e], + i.each(i.keys(this._out[e]), t), + delete this._out[e], + delete this._sucs[e], + --this._nodeCount), + this + ); + }), + (s.prototype.setParent = function (e, t) { + if (!this._isCompound) + throw new Error("Cannot set parent in a non-compound graph"); + if (i.isUndefined(t)) t = r; + else { + for (var n = (t += ""); !i.isUndefined(n); n = this.parent(n)) + if (n === e) + throw new Error( + "Setting " + t + " as parent of " + e + " would create a cycle" + ); + this.setNode(t); + } + return ( + this.setNode(e), + this._removeFromParentsChildList(e), + (this._parent[e] = t), + (this._children[t][e] = !0), + this + ); + }), + (s.prototype._removeFromParentsChildList = function (e) { + delete this._children[this._parent[e]][e]; + }), + (s.prototype.parent = function (e) { + if (this._isCompound) { + e = this._parent[e]; + if (e !== r) return e; + } + }), + (s.prototype.children = function (e) { + if ((i.isUndefined(e) && (e = r), !this._isCompound)) + return e === r ? this.nodes() : this.hasNode(e) ? [] : void 0; + e = this._children[e]; + return e ? i.keys(e) : void 0; + }), + (s.prototype.predecessors = function (e) { + e = this._preds[e]; + if (e) return i.keys(e); + }), + (s.prototype.successors = function (e) { + e = this._sucs[e]; + if (e) return i.keys(e); + }), + (s.prototype.neighbors = function (e) { + var t = this.predecessors(e); + if (t) return i.union(t, this.successors(e)); + }), + (s.prototype.isLeaf = function (e) { + e = this.isDirected() ? this.successors(e) : this.neighbors(e); + return 0 === e.length; + }), + (s.prototype.filterNodes = function (n) { + var r = new this.constructor({ + directed: this._isDirected, + multigraph: this._isMultigraph, + compound: this._isCompound, + }); + r.setGraph(this.graph()); + var o = this; + i.each(this._nodes, function (e, t) { + n(t) && r.setNode(t, e); + }), + i.each(this._edgeObjs, function (e) { + r.hasNode(e.v) && r.hasNode(e.w) && r.setEdge(e, o.edge(e)); + }); + var a = {}; + return ( + this._isCompound && + i.each(r.nodes(), function (e) { + r.setParent( + e, + (function e(t) { + var n = o.parent(t); + return void 0 === n || r.hasNode(n) + ? (a[t] = n) + : n in a + ? a[n] + : e(n); + })(e) + ); + }), + r + ); + }), + (s.prototype.setDefaultEdgeLabel = function (e) { + return ( + i.isFunction(e) || (e = i.constant(e)), + (this._defaultEdgeLabelFn = e), + this + ); + }), + (s.prototype.edgeCount = function () { + return this._edgeCount; + }), + (s.prototype.edges = function () { + return i.values(this._edgeObjs); + }), + (s.prototype.setPath = function (e, n) { + var r = this, + o = arguments; + return ( + i.reduce(e, function (e, t) { + return 1 < o.length ? r.setEdge(e, t, n) : r.setEdge(e, t), t; + }), + this + ); + }), + (s.prototype.setEdge = function () { + var e, + t = !1, + n = arguments[0]; + "object" == typeof n && null !== n && "v" in n + ? ((o = n.v), + (a = n.w), + (r = n.name), + 2 === arguments.length && ((e = arguments[1]), (t = !0))) + : ((o = n), + (a = arguments[1]), + (r = arguments[3]), + 2 < arguments.length && ((e = arguments[2]), (t = !0))), + (o = "" + o), + (a = "" + a), + i.isUndefined(r) || (r = "" + r); + n = f(this._isDirected, o, a, r); + if (i.has(this._edgeLabels, n)) return t && (this._edgeLabels[n] = e), this; + if (!i.isUndefined(r) && !this._isMultigraph) + throw new Error("Cannot set a named edge when isMultigraph = false"); + this.setNode(o), + this.setNode(a), + (this._edgeLabels[n] = t ? e : this._defaultEdgeLabelFn(o, a, r)); + var r = (function (e, t, n, r) { + (t = "" + t), (n = "" + n); + !e && n < t && ((e = t), (t = n), (n = e)); + n = { v: t, w: n }; + r && (n.name = r); + return n; + })(this._isDirected, o, a, r), + o = r.v, + a = r.w; + return ( + Object.freeze(r), + (this._edgeObjs[n] = r), + u(this._preds[a], o), + u(this._sucs[o], a), + (this._in[a][n] = r), + (this._out[o][n] = r), + this._edgeCount++, + this + ); + }), + (s.prototype.edge = function (e, t, n) { + n = + 1 === arguments.length + ? d(this._isDirected, e) + : f(this._isDirected, e, t, n); + return this._edgeLabels[n]; + }), + (s.prototype.hasEdge = function (e, t, n) { + n = + 1 === arguments.length + ? d(this._isDirected, e) + : f(this._isDirected, e, t, n); + return i.has(this._edgeLabels, n); + }), + (s.prototype.removeEdge = function (e, t, n) { + var r = + 1 === arguments.length + ? d(this._isDirected, arguments[0]) + : f(this._isDirected, e, t, n), + n = this._edgeObjs[r]; + return ( + n && + ((e = n.v), + (t = n.w), + delete this._edgeLabels[r], + delete this._edgeObjs[r], + c(this._preds[t], e), + c(this._sucs[e], t), + delete this._in[t][r], + delete this._out[e][r], + this._edgeCount--), + this + ); + }), + (s.prototype.inEdges = function (e, t) { + e = this._in[e]; + if (e) { + e = i.values(e); + return t + ? i.filter(e, function (e) { + return e.v === t; + }) + : e; + } + }), + (s.prototype.outEdges = function (e, t) { + e = this._out[e]; + if (e) { + e = i.values(e); + return t + ? i.filter(e, function (e) { + return e.w === t; + }) + : e; + } + }), + (s.prototype.nodeEdges = function (e, t) { + var n = this.inEdges(e, t); + if (n) return n.concat(this.outEdges(e, t)); + }); + }, + { "./lodash": 49 }, + ], + 47: [ + function (e, t, n) { + t.exports = { Graph: e("./graph"), version: e("./version") }; + }, + { "./graph": 46, "./version": 50 }, + ], + 48: [ + function (e, t, n) { + var o = e("./lodash"), + r = e("./graph"); + t.exports = { + write: function (e) { + var t = { + options: { + directed: e.isDirected(), + multigraph: e.isMultigraph(), + compound: e.isCompound(), + }, + nodes: (function (r) { + return o.map(r.nodes(), function (e) { + var t = r.node(e), + n = r.parent(e), + e = { v: e }; + return ( + o.isUndefined(t) || (e.value = t), + o.isUndefined(n) || (e.parent = n), + e + ); + }); + })(e), + edges: (function (r) { + return o.map(r.edges(), function (e) { + var t = r.edge(e), + n = { v: e.v, w: e.w }; + return ( + o.isUndefined(e.name) || (n.name = e.name), + o.isUndefined(t) || (n.value = t), + n + ); + }); + })(e), + }; + o.isUndefined(e.graph()) || (t.value = o.clone(e.graph())); + return t; + }, + read: function (e) { + var t = new r(e.options).setGraph(e.value); + return ( + o.each(e.nodes, function (e) { + t.setNode(e.v, e.value), e.parent && t.setParent(e.v, e.parent); + }), + o.each(e.edges, function (e) { + t.setEdge({ v: e.v, w: e.w, name: e.name }, e.value); + }), + t + ); + }, + }; + }, + { "./graph": 46, "./lodash": 49 }, + ], + 49: [ + function (e, t, n) { + var r; + if ("function" == typeof e) + try { + r = { + clone: e("lodash/clone"), + constant: e("lodash/constant"), + each: e("lodash/each"), + filter: e("lodash/filter"), + has: e("lodash/has"), + isArray: e("lodash/isArray"), + isEmpty: e("lodash/isEmpty"), + isFunction: e("lodash/isFunction"), + isUndefined: e("lodash/isUndefined"), + keys: e("lodash/keys"), + map: e("lodash/map"), + reduce: e("lodash/reduce"), + size: e("lodash/size"), + transform: e("lodash/transform"), + union: e("lodash/union"), + values: e("lodash/values"), + }; + } catch (e) {} + (r = r || window._), (t.exports = r); + }, + { + "lodash/clone": 226, + "lodash/constant": 228, + "lodash/each": 230, + "lodash/filter": 232, + "lodash/has": 239, + "lodash/isArray": 243, + "lodash/isEmpty": 247, + "lodash/isFunction": 248, + "lodash/isUndefined": 258, + "lodash/keys": 259, + "lodash/map": 262, + "lodash/reduce": 274, + "lodash/size": 275, + "lodash/transform": 284, + "lodash/union": 285, + "lodash/values": 287, + }, + ], + 50: [ + function (e, t, n) { + t.exports = "2.1.8"; + }, + {}, + ], + 51: [ + function (e, t, n) { + e = e("./_getNative")(e("./_root"), "DataView"); + t.exports = e; + }, + { "./_getNative": 163, "./_root": 208 }, + ], + 52: [ + function (e, t, n) { + var r = e("./_hashClear"), + o = e("./_hashDelete"), + a = e("./_hashGet"), + i = e("./_hashHas"), + e = e("./_hashSet"); + function s(e) { + var t = -1, + n = null == e ? 0 : e.length; + for (this.clear(); ++t < n; ) { + var r = e[t]; + this.set(r[0], r[1]); + } + } + (s.prototype.clear = r), + (s.prototype.delete = o), + (s.prototype.get = a), + (s.prototype.has = i), + (s.prototype.set = e), + (t.exports = s); + }, + { + "./_hashClear": 172, + "./_hashDelete": 173, + "./_hashGet": 174, + "./_hashHas": 175, + "./_hashSet": 176, + }, + ], + 53: [ + function (e, t, n) { + var r = e("./_listCacheClear"), + o = e("./_listCacheDelete"), + a = e("./_listCacheGet"), + i = e("./_listCacheHas"), + e = e("./_listCacheSet"); + function s(e) { + var t = -1, + n = null == e ? 0 : e.length; + for (this.clear(); ++t < n; ) { + var r = e[t]; + this.set(r[0], r[1]); + } + } + (s.prototype.clear = r), + (s.prototype.delete = o), + (s.prototype.get = a), + (s.prototype.has = i), + (s.prototype.set = e), + (t.exports = s); + }, + { + "./_listCacheClear": 188, + "./_listCacheDelete": 189, + "./_listCacheGet": 190, + "./_listCacheHas": 191, + "./_listCacheSet": 192, + }, + ], + 54: [ + function (e, t, n) { + e = e("./_getNative")(e("./_root"), "Map"); + t.exports = e; + }, + { "./_getNative": 163, "./_root": 208 }, + ], + 55: [ + function (e, t, n) { + var r = e("./_mapCacheClear"), + o = e("./_mapCacheDelete"), + a = e("./_mapCacheGet"), + i = e("./_mapCacheHas"), + e = e("./_mapCacheSet"); + function s(e) { + var t = -1, + n = null == e ? 0 : e.length; + for (this.clear(); ++t < n; ) { + var r = e[t]; + this.set(r[0], r[1]); + } + } + (s.prototype.clear = r), + (s.prototype.delete = o), + (s.prototype.get = a), + (s.prototype.has = i), + (s.prototype.set = e), + (t.exports = s); + }, + { + "./_mapCacheClear": 193, + "./_mapCacheDelete": 194, + "./_mapCacheGet": 195, + "./_mapCacheHas": 196, + "./_mapCacheSet": 197, + }, + ], + 56: [ + function (e, t, n) { + e = e("./_getNative")(e("./_root"), "Promise"); + t.exports = e; + }, + { "./_getNative": 163, "./_root": 208 }, + ], + 57: [ + function (e, t, n) { + e = e("./_getNative")(e("./_root"), "Set"); + t.exports = e; + }, + { "./_getNative": 163, "./_root": 208 }, + ], + 58: [ + function (e, t, n) { + var r = e("./_MapCache"), + o = e("./_setCacheAdd"), + e = e("./_setCacheHas"); + function a(e) { + var t = -1, + n = null == e ? 0 : e.length; + for (this.__data__ = new r(); ++t < n; ) this.add(e[t]); + } + (a.prototype.add = a.prototype.push = o), + (a.prototype.has = e), + (t.exports = a); + }, + { "./_MapCache": 55, "./_setCacheAdd": 210, "./_setCacheHas": 211 }, + ], + 59: [ + function (e, t, n) { + var r = e("./_ListCache"), + o = e("./_stackClear"), + a = e("./_stackDelete"), + i = e("./_stackGet"), + s = e("./_stackHas"), + e = e("./_stackSet"); + function u(e) { + e = this.__data__ = new r(e); + this.size = e.size; + } + (u.prototype.clear = o), + (u.prototype.delete = a), + (u.prototype.get = i), + (u.prototype.has = s), + (u.prototype.set = e), + (t.exports = u); + }, + { + "./_ListCache": 53, + "./_stackClear": 215, + "./_stackDelete": 216, + "./_stackGet": 217, + "./_stackHas": 218, + "./_stackSet": 219, + }, + ], + 60: [ + function (e, t, n) { + e = e("./_root").Symbol; + t.exports = e; + }, + { "./_root": 208 }, + ], + 61: [ + function (e, t, n) { + e = e("./_root").Uint8Array; + t.exports = e; + }, + { "./_root": 208 }, + ], + 62: [ + function (e, t, n) { + e = e("./_getNative")(e("./_root"), "WeakMap"); + t.exports = e; + }, + { "./_getNative": 163, "./_root": 208 }, + ], + 63: [ + function (e, t, n) { + t.exports = function (e, t, n) { + switch (n.length) { + case 0: + return e.call(t); + case 1: + return e.call(t, n[0]); + case 2: + return e.call(t, n[0], n[1]); + case 3: + return e.call(t, n[0], n[1], n[2]); + } + return e.apply(t, n); + }; + }, + {}, + ], + 64: [ + function (e, t, n) { + t.exports = function (e, t) { + for ( + var n = -1, r = null == e ? 0 : e.length; + ++n < r && !1 !== t(e[n], n, e); + + ); + return e; + }; + }, + {}, + ], + 65: [ + function (e, t, n) { + t.exports = function (e, t) { + for (var n = -1, r = null == e ? 0 : e.length, o = 0, a = []; ++n < r; ) { + var i = e[n]; + t(i, n, e) && (a[o++] = i); + } + return a; + }; + }, + {}, + ], + 66: [ + function (e, t, n) { + var r = e("./_baseIndexOf"); + t.exports = function (e, t) { + return !!(null == e ? 0 : e.length) && -1 < r(e, t, 0); + }; + }, + { "./_baseIndexOf": 95 }, + ], + 67: [ + function (e, t, n) { + t.exports = function (e, t, n) { + for (var r = -1, o = null == e ? 0 : e.length; ++r < o; ) + if (n(t, e[r])) return !0; + return !1; + }; + }, + {}, + ], + 68: [ + function (e, t, n) { + var f = e("./_baseTimes"), + d = e("./isArguments"), + h = e("./isArray"), + l = e("./isBuffer"), + p = e("./_isIndex"), + _ = e("./isTypedArray"), + v = Object.prototype.hasOwnProperty; + t.exports = function (e, t) { + var n, + r = h(e), + o = !r && d(e), + a = !r && !o && l(e), + i = !r && !o && !a && _(e), + s = r || o || a || i, + u = s ? f(e.length, String) : [], + c = u.length; + for (n in e) + (!t && !v.call(e, n)) || + (s && + ("length" == n || + (a && ("offset" == n || "parent" == n)) || + (i && ("buffer" == n || "byteLength" == n || "byteOffset" == n)) || + p(n, c))) || + u.push(n); + return u; + }; + }, + { + "./_baseTimes": 125, + "./_isIndex": 181, + "./isArguments": 242, + "./isArray": 243, + "./isBuffer": 246, + "./isTypedArray": 257, + }, + ], + 69: [ + function (e, t, n) { + t.exports = function (e, t) { + for (var n = -1, r = null == e ? 0 : e.length, o = Array(r); ++n < r; ) + o[n] = t(e[n], n, e); + return o; + }; + }, + {}, + ], + 70: [ + function (e, t, n) { + t.exports = function (e, t) { + for (var n = -1, r = t.length, o = e.length; ++n < r; ) e[o + n] = t[n]; + return e; + }; + }, + {}, + ], + 71: [ + function (e, t, n) { + t.exports = function (e, t, n, r) { + var o = -1, + a = null == e ? 0 : e.length; + for (r && a && (n = e[++o]); ++o < a; ) n = t(n, e[o], o, e); + return n; + }; + }, + {}, + ], + 72: [ + function (e, t, n) { + t.exports = function (e, t) { + for (var n = -1, r = null == e ? 0 : e.length; ++n < r; ) + if (t(e[n], n, e)) return !0; + return !1; + }; + }, + {}, + ], + 73: [ + function (e, t, n) { + e = e("./_baseProperty")("length"); + t.exports = e; + }, + { "./_baseProperty": 117 }, + ], + 74: [ + function (e, t, n) { + var r = e("./_baseAssignValue"), + o = e("./eq"); + t.exports = function (e, t, n) { + ((void 0 === n || o(e[t], n)) && (void 0 !== n || t in e)) || r(e, t, n); + }; + }, + { "./_baseAssignValue": 79, "./eq": 231 }, + ], + 75: [ + function (e, t, n) { + var o = e("./_baseAssignValue"), + a = e("./eq"), + i = Object.prototype.hasOwnProperty; + t.exports = function (e, t, n) { + var r = e[t]; + (i.call(e, t) && a(r, n) && (void 0 !== n || t in e)) || o(e, t, n); + }; + }, + { "./_baseAssignValue": 79, "./eq": 231 }, + ], + 76: [ + function (e, t, n) { + var r = e("./eq"); + t.exports = function (e, t) { + for (var n = e.length; n--; ) if (r(e[n][0], t)) return n; + return -1; + }; + }, + { "./eq": 231 }, + ], + 77: [ + function (e, t, n) { + var r = e("./_copyObject"), + o = e("./keys"); + t.exports = function (e, t) { + return e && r(t, o(t), e); + }; + }, + { "./_copyObject": 143, "./keys": 259 }, + ], + 78: [ + function (e, t, n) { + var r = e("./_copyObject"), + o = e("./keysIn"); + t.exports = function (e, t) { + return e && r(t, o(t), e); + }; + }, + { "./_copyObject": 143, "./keysIn": 260 }, + ], + 79: [ + function (e, t, n) { + var r = e("./_defineProperty"); + t.exports = function (e, t, n) { + "__proto__" == t && r + ? r(e, t, { + configurable: !0, + enumerable: !0, + value: n, + writable: !0, + }) + : (e[t] = n); + }; + }, + { "./_defineProperty": 153 }, + ], + 80: [ + function (e, t, n) { + var p = e("./_Stack"), + _ = e("./_arrayEach"), + v = e("./_assignValue"), + g = e("./_baseAssign"), + y = e("./_baseAssignIn"), + b = e("./_cloneBuffer"), + m = e("./_copyArray"), + x = e("./_copySymbols"), + w = e("./_copySymbolsIn"), + E = e("./_getAllKeys"), + j = e("./_getAllKeysIn"), + k = e("./_getTag"), + A = e("./_initCloneArray"), + O = e("./_initCloneByTag"), + I = e("./_initCloneObject"), + S = e("./isArray"), + C = e("./isBuffer"), + N = e("./isMap"), + L = e("./isObject"), + M = e("./isSet"), + T = e("./keys"), + P = 1, + F = 2, + B = 4, + D = "[object Arguments]", + G = "[object Function]", + R = "[object GeneratorFunction]", + U = "[object Object]", + z = {}; + (z[D] = + z["[object Array]"] = + z["[object ArrayBuffer]"] = + z["[object DataView]"] = + z["[object Boolean]"] = + z["[object Date]"] = + z["[object Float32Array]"] = + z["[object Float64Array]"] = + z["[object Int8Array]"] = + z["[object Int16Array]"] = + z["[object Int32Array]"] = + z["[object Map]"] = + z["[object Number]"] = + z[U] = + z["[object RegExp]"] = + z["[object Set]"] = + z["[object String]"] = + z["[object Symbol]"] = + z["[object Uint8Array]"] = + z["[object Uint8ClampedArray]"] = + z["[object Uint16Array]"] = + z["[object Uint32Array]"] = + !0), + (z["[object Error]"] = z[G] = z["[object WeakMap]"] = !1), + (t.exports = function n(r, o, a, e, t, i) { + var s, + u = o & P, + c = o & F, + f = o & B; + if ((a && (s = t ? a(r, e, t, i) : a(r)), void 0 !== s)) return s; + if (!L(r)) return r; + var d = S(r); + if (d) { + if (((s = A(r)), !u)) return m(r, s); + } else { + var h = k(r), + e = h == G || h == R; + if (C(r)) return b(r, u); + if (h == U || h == D || (e && !t)) { + if (((s = c || e ? {} : I(r)), !u)) + return c ? w(r, y(s, r)) : x(r, g(s, r)); + } else { + if (!z[h]) return t ? r : {}; + s = O(r, h, u); + } + } + u = (i = i || new p()).get(r); + if (u) return u; + i.set(r, s), + M(r) + ? r.forEach(function (e) { + s.add(n(e, o, a, e, r, i)); + }) + : N(r) && + r.forEach(function (e, t) { + s.set(t, n(e, o, a, t, r, i)); + }); + var c = f ? (c ? j : E) : c ? keysIn : T, + l = d ? void 0 : c(r); + return ( + _(l || r, function (e, t) { + l && (e = r[(t = e)]), v(s, t, n(e, o, a, t, r, i)); + }), + s + ); + }); + }, + { + "./_Stack": 59, + "./_arrayEach": 64, + "./_assignValue": 75, + "./_baseAssign": 77, + "./_baseAssignIn": 78, + "./_cloneBuffer": 135, + "./_copyArray": 142, + "./_copySymbols": 144, + "./_copySymbolsIn": 145, + "./_getAllKeys": 159, + "./_getAllKeysIn": 160, + "./_getTag": 168, + "./_initCloneArray": 177, + "./_initCloneByTag": 178, + "./_initCloneObject": 179, + "./isArray": 243, + "./isBuffer": 246, + "./isMap": 250, + "./isObject": 251, + "./isSet": 254, + "./keys": 259, + }, + ], + 81: [ + function (e, t, n) { + var r = e("./isObject"), + o = Object.create, + e = function (e) { + if (!r(e)) return {}; + if (o) return o(e); + a.prototype = e; + e = new a(); + return (a.prototype = void 0), e; + }; + function a() {} + t.exports = e; + }, + { "./isObject": 251 }, + ], + 82: [ + function (e, t, n) { + var r = e("./_baseForOwn"), + r = e("./_createBaseEach")(r); + t.exports = r; + }, + { "./_baseForOwn": 88, "./_createBaseEach": 148 }, + ], + 83: [ + function (e, t, n) { + var c = e("./isSymbol"); + t.exports = function (e, t, n) { + for (var r = -1, o = e.length; ++r < o; ) { + var a, + i, + s = e[r], + u = t(s); + null != u && + (void 0 === a ? u == u && !c(u) : n(u, a)) && + ((a = u), (i = s)); + } + return i; + }; + }, + { "./isSymbol": 256 }, + ], + 84: [ + function (e, t, n) { + var a = e("./_baseEach"); + t.exports = function (e, r) { + var o = []; + return ( + a(e, function (e, t, n) { + r(e, t, n) && o.push(e); + }), + o + ); + }; + }, + { "./_baseEach": 82 }, + ], + 85: [ + function (e, t, n) { + t.exports = function (e, t, n, r) { + for (var o = e.length, a = n + (r ? 1 : -1); r ? a-- : ++a < o; ) + if (t(e[a], a, e)) return a; + return -1; + }; + }, + {}, + ], + 86: [ + function (e, t, n) { + var c = e("./_arrayPush"), + f = e("./_isFlattenable"); + t.exports = function e(t, n, r, o, a) { + var i = -1, + s = t.length; + for (r = r || f, a = a || []; ++i < s; ) { + var u = t[i]; + 0 < n && r(u) + ? 1 < n + ? e(u, n - 1, r, o, a) + : c(a, u) + : o || (a[a.length] = u); + } + return a; + }; + }, + { "./_arrayPush": 70, "./_isFlattenable": 180 }, + ], + 87: [ + function (e, t, n) { + e = e("./_createBaseFor")(); + t.exports = e; + }, + { "./_createBaseFor": 149 }, + ], + 88: [ + function (e, t, n) { + var r = e("./_baseFor"), + o = e("./keys"); + t.exports = function (e, t) { + return e && r(e, t, o); + }; + }, + { "./_baseFor": 87, "./keys": 259 }, + ], + 89: [ + function (e, t, n) { + var o = e("./_castPath"), + a = e("./_toKey"); + t.exports = function (e, t) { + for (var n = 0, r = (t = o(t, e)).length; null != e && n < r; ) + e = e[a(t[n++])]; + return n && n == r ? e : void 0; + }; + }, + { "./_castPath": 133, "./_toKey": 223 }, + ], + 90: [ + function (e, t, n) { + var r = e("./_arrayPush"), + o = e("./isArray"); + t.exports = function (e, t, n) { + return (t = t(e)), o(e) ? t : r(t, n(e)); + }; + }, + { "./_arrayPush": 70, "./isArray": 243 }, + ], + 91: [ + function (e, t, n) { + var r = e("./_Symbol"), + o = e("./_getRawTag"), + a = e("./_objectToString"), + i = r ? r.toStringTag : void 0; + t.exports = function (e) { + return null == e + ? void 0 === e + ? "[object Undefined]" + : "[object Null]" + : (i && i in Object(e) ? o : a)(e); + }; + }, + { "./_Symbol": 60, "./_getRawTag": 165, "./_objectToString": 205 }, + ], + 92: [ + function (e, t, n) { + t.exports = function (e, t) { + return t < e; + }; + }, + {}, + ], + 93: [ + function (e, t, n) { + var r = Object.prototype.hasOwnProperty; + t.exports = function (e, t) { + return null != e && r.call(e, t); + }; + }, + {}, + ], + 94: [ + function (e, t, n) { + t.exports = function (e, t) { + return null != e && t in Object(e); + }; + }, + {}, + ], + 95: [ + function (e, t, n) { + var r = e("./_baseFindIndex"), + o = e("./_baseIsNaN"), + a = e("./_strictIndexOf"); + t.exports = function (e, t, n) { + return t == t ? a(e, t, n) : r(e, o, n); + }; + }, + { + "./_baseFindIndex": 85, + "./_baseIsNaN": 101, + "./_strictIndexOf": 220, + }, + ], + 96: [ + function (e, t, n) { + var r = e("./_baseGetTag"), + o = e("./isObjectLike"); + t.exports = function (e) { + return o(e) && "[object Arguments]" == r(e); + }; + }, + { "./_baseGetTag": 91, "./isObjectLike": 252 }, + ], + 97: [ + function (e, t, n) { + var i = e("./_baseIsEqualDeep"), + s = e("./isObjectLike"); + t.exports = function e(t, n, r, o, a) { + return ( + t === n || + (null == t || null == n || (!s(t) && !s(n)) + ? t != t && n != n + : i(t, n, r, o, e, a)) + ); + }; + }, + { "./_baseIsEqualDeep": 98, "./isObjectLike": 252 }, + ], + 98: [ + function (e, t, n) { + var d = e("./_Stack"), + h = e("./_equalArrays"), + l = e("./_equalByTag"), + p = e("./_equalObjects"), + _ = e("./_getTag"), + v = e("./isArray"), + g = e("./isBuffer"), + y = e("./isTypedArray"), + b = "[object Arguments]", + m = "[object Array]", + x = "[object Object]", + w = Object.prototype.hasOwnProperty; + t.exports = function (e, t, n, r, o, a) { + var i = v(e), + s = v(t), + u = i ? m : _(e), + c = s ? m : _(t), + f = (u = u == b ? x : u) == x, + s = (c = c == b ? x : c) == x; + if ((c = u == c) && g(e)) { + if (!g(t)) return !1; + f = !(i = !0); + } + if (c && !f) + return ( + (a = a || new d()), + i || y(e) ? h(e, t, n, r, o, a) : l(e, t, u, n, r, o, a) + ); + if (!(1 & n)) { + (f = f && w.call(e, "__wrapped__")), (s = s && w.call(t, "__wrapped__")); + if (f || s) + return o(f ? e.value() : e, s ? t.value() : t, n, r, (a = a || new d())); + } + return !!c && ((a = a || new d()), p(e, t, n, r, o, a)); + }; + }, + { + "./_Stack": 59, + "./_equalArrays": 154, + "./_equalByTag": 155, + "./_equalObjects": 156, + "./_getTag": 168, + "./isArray": 243, + "./isBuffer": 246, + "./isTypedArray": 257, + }, + ], + 99: [ + function (e, t, n) { + var r = e("./_getTag"), + o = e("./isObjectLike"); + t.exports = function (e) { + return o(e) && "[object Map]" == r(e); + }; + }, + { "./_getTag": 168, "./isObjectLike": 252 }, + ], + 100: [ + function (e, t, n) { + var l = e("./_Stack"), + p = e("./_baseIsEqual"); + t.exports = function (e, t, n, r) { + var o = n.length, + a = o, + i = !r; + if (null == e) return !a; + for (e = Object(e); o--; ) { + var s = n[o]; + if (i && s[2] ? s[1] !== e[s[0]] : !(s[0] in e)) return !1; + } + for (; ++o < a; ) { + var u = (s = n[o])[0], + c = e[u], + f = s[1]; + if (i && s[2]) { + if (void 0 === c && !(u in e)) return !1; + } else { + var d, + h = new l(); + if ( + (r && (d = r(c, f, u, e, t, h)), !(void 0 === d ? p(f, c, 3, r, h) : d)) + ) + return !1; + } + } + return !0; + }; + }, + { "./_Stack": 59, "./_baseIsEqual": 97 }, + ], + 101: [ + function (e, t, n) { + t.exports = function (e) { + return e != e; + }; + }, + {}, + ], + 102: [ + function (e, t, n) { + var r = e("./isFunction"), + o = e("./_isMasked"), + a = e("./isObject"), + i = e("./_toSource"), + s = /^\[object .+?Constructor\]$/, + u = Function.prototype, + e = Object.prototype, + u = u.toString, + e = e.hasOwnProperty, + c = RegExp( + "^" + + u + .call(e) + .replace(/[\\^$.*+?()[\]{}|]/g, "\\$&") + .replace( + /hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g, + "$1.*?" + ) + + "$" + ); + t.exports = function (e) { + return !(!a(e) || o(e)) && (r(e) ? c : s).test(i(e)); + }; + }, + { + "./_isMasked": 185, + "./_toSource": 224, + "./isFunction": 248, + "./isObject": 251, + }, + ], + 103: [ + function (e, t, n) { + var r = e("./_getTag"), + o = e("./isObjectLike"); + t.exports = function (e) { + return o(e) && "[object Set]" == r(e); + }; + }, + { "./_getTag": 168, "./isObjectLike": 252 }, + ], + 104: [ + function (e, t, n) { + var r = e("./_baseGetTag"), + o = e("./isLength"), + a = e("./isObjectLike"), + i = {}; + (i["[object Float32Array]"] = + i["[object Float64Array]"] = + i["[object Int8Array]"] = + i["[object Int16Array]"] = + i["[object Int32Array]"] = + i["[object Uint8Array]"] = + i["[object Uint8ClampedArray]"] = + i["[object Uint16Array]"] = + i["[object Uint32Array]"] = + !0), + (i["[object Arguments]"] = + i["[object Array]"] = + i["[object ArrayBuffer]"] = + i["[object Boolean]"] = + i["[object DataView]"] = + i["[object Date]"] = + i["[object Error]"] = + i["[object Function]"] = + i["[object Map]"] = + i["[object Number]"] = + i["[object Object]"] = + i["[object RegExp]"] = + i["[object Set]"] = + i["[object String]"] = + i["[object WeakMap]"] = + !1), + (t.exports = function (e) { + return a(e) && o(e.length) && !!i[r(e)]; + }); + }, + { "./_baseGetTag": 91, "./isLength": 249, "./isObjectLike": 252 }, + ], + 105: [ + function (e, t, n) { + var r = e("./_baseMatches"), + o = e("./_baseMatchesProperty"), + a = e("./identity"), + i = e("./isArray"), + s = e("./property"); + t.exports = function (e) { + return "function" == typeof e + ? e + : null == e + ? a + : "object" == typeof e + ? i(e) + ? o(e[0], e[1]) + : r(e) + : s(e); + }; + }, + { + "./_baseMatches": 110, + "./_baseMatchesProperty": 111, + "./identity": 241, + "./isArray": 243, + "./property": 272, + }, + ], + 106: [ + function (e, t, n) { + var r = e("./_isPrototype"), + o = e("./_nativeKeys"), + a = Object.prototype.hasOwnProperty; + t.exports = function (e) { + if (!r(e)) return o(e); + var t, + n = []; + for (t in Object(e)) a.call(e, t) && "constructor" != t && n.push(t); + return n; + }; + }, + { "./_isPrototype": 186, "./_nativeKeys": 202 }, + ], + 107: [ + function (e, t, n) { + var o = e("./isObject"), + a = e("./_isPrototype"), + i = e("./_nativeKeysIn"), + s = Object.prototype.hasOwnProperty; + t.exports = function (e) { + if (!o(e)) return i(e); + var t, + n = a(e), + r = []; + for (t in e) ("constructor" != t || (!n && s.call(e, t))) && r.push(t); + return r; + }; + }, + { "./_isPrototype": 186, "./_nativeKeysIn": 203, "./isObject": 251 }, + ], + 108: [ + function (e, t, n) { + t.exports = function (e, t) { + return e < t; + }; + }, + {}, + ], + 109: [ + function (e, t, n) { + var i = e("./_baseEach"), + s = e("./isArrayLike"); + t.exports = function (e, r) { + var o = -1, + a = s(e) ? Array(e.length) : []; + return ( + i(e, function (e, t, n) { + a[++o] = r(e, t, n); + }), + a + ); + }; + }, + { "./_baseEach": 82, "./isArrayLike": 244 }, + ], + 110: [ + function (e, t, n) { + var r = e("./_baseIsMatch"), + o = e("./_getMatchData"), + a = e("./_matchesStrictComparable"); + t.exports = function (t) { + var n = o(t); + return 1 == n.length && n[0][2] + ? a(n[0][0], n[0][1]) + : function (e) { + return e === t || r(e, t, n); + }; + }; + }, + { + "./_baseIsMatch": 100, + "./_getMatchData": 162, + "./_matchesStrictComparable": 199, + }, + ], + 111: [ + function (e, t, n) { + var o = e("./_baseIsEqual"), + a = e("./get"), + i = e("./hasIn"), + s = e("./_isKey"), + u = e("./_isStrictComparable"), + c = e("./_matchesStrictComparable"), + f = e("./_toKey"); + t.exports = function (n, r) { + return s(n) && u(r) + ? c(f(n), r) + : function (e) { + var t = a(e, n); + return void 0 === t && t === r ? i(e, n) : o(r, t, 3); + }; + }; + }, + { + "./_baseIsEqual": 97, + "./_isKey": 183, + "./_isStrictComparable": 187, + "./_matchesStrictComparable": 199, + "./_toKey": 223, + "./get": 238, + "./hasIn": 240, + }, + ], + 112: [ + function (e, t, n) { + var c = e("./_Stack"), + f = e("./_assignMergeValue"), + d = e("./_baseFor"), + h = e("./_baseMergeDeep"), + l = e("./isObject"), + p = e("./keysIn"), + _ = e("./_safeGet"); + t.exports = function r(o, a, i, s, u) { + o !== a && + d( + a, + function (e, t) { + var n; + (u = u || new c()), + l(e) + ? h(o, a, t, i, r, s, u) + : (void 0 === (n = s ? s(_(o, t), e, t + "", o, a, u) : void 0) && + (n = e), + f(o, t, n)); + }, + p + ); + }; + }, + { + "./_Stack": 59, + "./_assignMergeValue": 74, + "./_baseFor": 87, + "./_baseMergeDeep": 113, + "./_safeGet": 209, + "./isObject": 251, + "./keysIn": 260, + }, + ], + 113: [ + function (e, t, n) { + var l = e("./_assignMergeValue"), + p = e("./_cloneBuffer"), + _ = e("./_cloneTypedArray"), + v = e("./_copyArray"), + g = e("./_initCloneObject"), + y = e("./isArguments"), + b = e("./isArray"), + m = e("./isArrayLikeObject"), + x = e("./isBuffer"), + w = e("./isFunction"), + E = e("./isObject"), + j = e("./isPlainObject"), + k = e("./isTypedArray"), + A = e("./_safeGet"), + O = e("./toPlainObject"); + t.exports = function (e, t, n, r, o, a, i) { + var s, + u, + c, + f = A(e, n), + d = A(t, n), + h = i.get(d); + h + ? l(e, n, h) + : ((s = void 0 === (c = a ? a(f, d, n + "", e, t, i) : void 0)) && + ((h = !(u = b(d)) && x(d)), + (t = !u && !h && k(d)), + (c = d), + u || h || t + ? (c = b(f) + ? f + : m(f) + ? v(f) + : h + ? p(d, !(s = !1)) + : t + ? _(d, !(s = !1)) + : []) + : j(d) || y(d) + ? y((c = f)) + ? (c = O(f)) + : (E(f) && !w(f)) || (c = g(d)) + : (s = !1)), + s && (i.set(d, c), o(c, d, r, a, i), i.delete(d)), + l(e, n, c)); + }; + }, + { + "./_assignMergeValue": 74, + "./_cloneBuffer": 135, + "./_cloneTypedArray": 139, + "./_copyArray": 142, + "./_initCloneObject": 179, + "./_safeGet": 209, + "./isArguments": 242, + "./isArray": 243, + "./isArrayLikeObject": 245, + "./isBuffer": 246, + "./isFunction": 248, + "./isObject": 251, + "./isPlainObject": 253, + "./isTypedArray": 257, + "./toPlainObject": 282, + }, + ], + 114: [ + function (e, t, n) { + var a = e("./_arrayMap"), + i = e("./_baseIteratee"), + s = e("./_baseMap"), + u = e("./_baseSortBy"), + c = e("./_baseUnary"), + f = e("./_compareMultiple"), + d = e("./identity"); + t.exports = function (e, r, n) { + var o = -1; + return ( + (r = a(r.length ? r : [d], c(i))), + (e = s(e, function (t, e, n) { + return { + criteria: a(r, function (e) { + return e(t); + }), + index: ++o, + value: t, + }; + })), + u(e, function (e, t) { + return f(e, t, n); + }) + ); + }; + }, + { + "./_arrayMap": 69, + "./_baseIteratee": 105, + "./_baseMap": 109, + "./_baseSortBy": 124, + "./_baseUnary": 127, + "./_compareMultiple": 141, + "./identity": 241, + }, + ], + 115: [ + function (e, t, n) { + var r = e("./_basePickBy"), + o = e("./hasIn"); + t.exports = function (n, e) { + return r(n, e, function (e, t) { + return o(n, t); + }); + }; + }, + { "./_basePickBy": 116, "./hasIn": 240 }, + ], + 116: [ + function (e, t, n) { + var u = e("./_baseGet"), + c = e("./_baseSet"), + f = e("./_castPath"); + t.exports = function (e, t, n) { + for (var r = -1, o = t.length, a = {}; ++r < o; ) { + var i = t[r], + s = u(e, i); + n(s, i) && c(a, f(i, e), s); + } + return a; + }; + }, + { "./_baseGet": 89, "./_baseSet": 122, "./_castPath": 133 }, + ], + 117: [ + function (e, t, n) { + t.exports = function (t) { + return function (e) { + return null == e ? void 0 : e[t]; + }; + }; + }, + {}, + ], + 118: [ + function (e, t, n) { + var r = e("./_baseGet"); + t.exports = function (t) { + return function (e) { + return r(e, t); + }; + }; + }, + { "./_baseGet": 89 }, + ], + 119: [ + function (e, t, n) { + var s = Math.ceil, + u = Math.max; + t.exports = function (e, t, n, r) { + for (var o = -1, a = u(s((t - e) / (n || 1)), 0), i = Array(a); a--; ) + (i[r ? a : ++o] = e), (e += n); + return i; + }; + }, + {}, + ], + 120: [ + function (e, t, n) { + t.exports = function (e, r, o, a, t) { + return ( + t(e, function (e, t, n) { + o = a ? ((a = !1), e) : r(o, e, t, n); + }), + o + ); + }; + }, + {}, + ], + 121: [ + function (e, t, n) { + var r = e("./identity"), + o = e("./_overRest"), + a = e("./_setToString"); + t.exports = function (e, t) { + return a(o(e, t, r), e + ""); + }; + }, + { "./_overRest": 207, "./_setToString": 213, "./identity": 241 }, + ], + 122: [ + function (e, t, n) { + var d = e("./_assignValue"), + h = e("./_castPath"), + l = e("./_isIndex"), + p = e("./isObject"), + _ = e("./_toKey"); + t.exports = function (e, t, n, r) { + if (!p(e)) return e; + for ( + var o = -1, a = (t = h(t, e)).length, i = a - 1, s = e; + null != s && ++o < a; + + ) { + var u, + c = _(t[o]), + f = n; + o != i && + ((u = s[c]), + void 0 === (f = r ? r(u, c, s) : void 0) && + (f = p(u) ? u : l(t[o + 1]) ? [] : {})), + d(s, c, f), + (s = s[c]); + } + return e; + }; + }, + { + "./_assignValue": 75, + "./_castPath": 133, + "./_isIndex": 181, + "./_toKey": 223, + "./isObject": 251, + }, + ], + 123: [ + function (e, t, n) { + var r = e("./constant"), + o = e("./_defineProperty"), + e = e("./identity"), + e = o + ? function (e, t) { + return o(e, "toString", { + configurable: !0, + enumerable: !1, + value: r(t), + writable: !0, + }); + } + : e; + t.exports = e; + }, + { "./_defineProperty": 153, "./constant": 228, "./identity": 241 }, + ], + 124: [ + function (e, t, n) { + t.exports = function (e, t) { + var n = e.length; + for (e.sort(t); n--; ) e[n] = e[n].value; + return e; + }; + }, + {}, + ], + 125: [ + function (e, t, n) { + t.exports = function (e, t) { + for (var n = -1, r = Array(e); ++n < e; ) r[n] = t(n); + return r; + }; + }, + {}, + ], + 126: [ + function (e, t, n) { + var r = e("./_Symbol"), + o = e("./_arrayMap"), + a = e("./isArray"), + i = e("./isSymbol"), + s = 1 / 0, + r = r ? r.prototype : void 0, + u = r ? r.toString : void 0; + t.exports = function e(t) { + if ("string" == typeof t) return t; + if (a(t)) return o(t, e) + ""; + if (i(t)) return u ? u.call(t) : ""; + var n = t + ""; + return "0" == n && 1 / t == -s ? "-0" : n; + }; + }, + { + "./_Symbol": 60, + "./_arrayMap": 69, + "./isArray": 243, + "./isSymbol": 256, + }, + ], + 127: [ + function (e, t, n) { + t.exports = function (t) { + return function (e) { + return t(e); + }; + }; + }, + {}, + ], + 128: [ + function (e, t, n) { + var l = e("./_SetCache"), + p = e("./_arrayIncludes"), + _ = e("./_arrayIncludesWith"), + v = e("./_cacheHas"), + g = e("./_createSet"), + y = e("./_setToArray"); + t.exports = function (e, t, n) { + var r = -1, + o = p, + a = e.length, + i = !0, + s = [], + u = s; + if (n) (i = !1), (o = _); + else if (200 <= a) { + var c = t ? null : g(e); + if (c) return y(c); + (i = !1), (o = v), (u = new l()); + } else u = t ? [] : s; + e: for (; ++r < a; ) { + var f = e[r], + d = t ? t(f) : f, + f = n || 0 !== f ? f : 0; + if (i && d == d) { + for (var h = u.length; h--; ) if (u[h] === d) continue e; + t && u.push(d), s.push(f); + } else o(u, d, n) || (u !== s && u.push(d), s.push(f)); + } + return s; + }; + }, + { + "./_SetCache": 58, + "./_arrayIncludes": 66, + "./_arrayIncludesWith": 67, + "./_cacheHas": 131, + "./_createSet": 152, + "./_setToArray": 212, + }, + ], + 129: [ + function (e, t, n) { + var r = e("./_arrayMap"); + t.exports = function (t, e) { + return r(e, function (e) { + return t[e]; + }); + }; + }, + { "./_arrayMap": 69 }, + ], + 130: [ + function (e, t, n) { + t.exports = function (e, t, n) { + for (var r = -1, o = e.length, a = t.length, i = {}; ++r < o; ) { + var s = r < a ? t[r] : void 0; + n(i, e[r], s); + } + return i; + }; + }, + {}, + ], + 131: [ + function (e, t, n) { + t.exports = function (e, t) { + return e.has(t); + }; + }, + {}, + ], + 132: [ + function (e, t, n) { + var r = e("./identity"); + t.exports = function (e) { + return "function" == typeof e ? e : r; + }; + }, + { "./identity": 241 }, + ], + 133: [ + function (e, t, n) { + var r = e("./isArray"), + o = e("./_isKey"), + a = e("./_stringToPath"), + i = e("./toString"); + t.exports = function (e, t) { + return r(e) ? e : o(e, t) ? [e] : a(i(e)); + }; + }, + { + "./_isKey": 183, + "./_stringToPath": 222, + "./isArray": 243, + "./toString": 283, + }, + ], + 134: [ + function (e, t, n) { + var r = e("./_Uint8Array"); + t.exports = function (e) { + var t = new e.constructor(e.byteLength); + return new r(t).set(new r(e)), t; + }; + }, + { "./_Uint8Array": 61 }, + ], + 135: [ + function (e, t, n) { + var r = e("./_root"), + e = "object" == typeof n && n && !n.nodeType && n, + n = e && "object" == typeof t && t && !t.nodeType && t, + r = n && n.exports === e ? r.Buffer : void 0, + o = r ? r.allocUnsafe : void 0; + t.exports = function (e, t) { + return t + ? e.slice() + : ((t = e.length), (t = o ? o(t) : new e.constructor(t)), e.copy(t), t); + }; + }, + { "./_root": 208 }, + ], + 136: [ + function (e, t, n) { + var r = e("./_cloneArrayBuffer"); + t.exports = function (e, t) { + return ( + (t = t ? r(e.buffer) : e.buffer), + new e.constructor(t, e.byteOffset, e.byteLength) + ); + }; + }, + { "./_cloneArrayBuffer": 134 }, + ], + 137: [ + function (e, t, n) { + var r = /\w*$/; + t.exports = function (e) { + var t = new e.constructor(e.source, r.exec(e)); + return (t.lastIndex = e.lastIndex), t; + }; + }, + {}, + ], + 138: [ + function (e, t, n) { + var e = e("./_Symbol"), + e = e ? e.prototype : void 0, + r = e ? e.valueOf : void 0; + t.exports = function (e) { + return r ? Object(r.call(e)) : {}; + }; + }, + { "./_Symbol": 60 }, + ], + 139: [ + function (e, t, n) { + var r = e("./_cloneArrayBuffer"); + t.exports = function (e, t) { + return ( + (t = t ? r(e.buffer) : e.buffer), + new e.constructor(t, e.byteOffset, e.length) + ); + }; + }, + { "./_cloneArrayBuffer": 134 }, + ], + 140: [ + function (e, t, n) { + var f = e("./isSymbol"); + t.exports = function (e, t) { + if (e !== t) { + var n = void 0 !== e, + r = null === e, + o = e == e, + a = f(e), + i = void 0 !== t, + s = null === t, + u = t == t, + c = f(t); + if ( + (!s && !c && !a && t < e) || + (a && i && u && !s && !c) || + (r && i && u) || + (!n && u) || + !o + ) + return 1; + if ( + (!r && !a && !c && e < t) || + (c && n && o && !r && !a) || + (s && n && o) || + (!i && o) || + !u + ) + return -1; + } + return 0; + }; + }, + { "./isSymbol": 256 }, + ], + 141: [ + function (e, t, n) { + var c = e("./_compareAscending"); + t.exports = function (e, t, n) { + for ( + var r = -1, o = e.criteria, a = t.criteria, i = o.length, s = n.length; + ++r < i; + + ) { + var u = c(o[r], a[r]); + if (u) return s <= r ? u : u * ("desc" == n[r] ? -1 : 1); + } + return e.index - t.index; + }; + }, + { "./_compareAscending": 140 }, + ], + 142: [ + function (e, t, n) { + t.exports = function (e, t) { + var n = -1, + r = e.length; + for (t = t || Array(r); ++n < r; ) t[n] = e[n]; + return t; + }; + }, + {}, + ], + 143: [ + function (e, t, n) { + var c = e("./_assignValue"), + f = e("./_baseAssignValue"); + t.exports = function (e, t, n, r) { + var o = !n; + n = n || {}; + for (var a = -1, i = t.length; ++a < i; ) { + var s = t[a], + u = r ? r(n[s], e[s], s, n, e) : void 0; + void 0 === u && (u = e[s]), (o ? f : c)(n, s, u); + } + return n; + }; + }, + { "./_assignValue": 75, "./_baseAssignValue": 79 }, + ], + 144: [ + function (e, t, n) { + var r = e("./_copyObject"), + o = e("./_getSymbols"); + t.exports = function (e, t) { + return r(e, o(e), t); + }; + }, + { "./_copyObject": 143, "./_getSymbols": 166 }, + ], + 145: [ + function (e, t, n) { + var r = e("./_copyObject"), + o = e("./_getSymbolsIn"); + t.exports = function (e, t) { + return r(e, o(e), t); + }; + }, + { "./_copyObject": 143, "./_getSymbolsIn": 167 }, + ], + 146: [ + function (e, t, n) { + e = e("./_root")["__core-js_shared__"]; + t.exports = e; + }, + { "./_root": 208 }, + ], + 147: [ + function (e, t, n) { + var r = e("./_baseRest"), + u = e("./_isIterateeCall"); + t.exports = function (s) { + return r(function (e, t) { + var n = -1, + r = t.length, + o = 1 < r ? t[r - 1] : void 0, + a = 2 < r ? t[2] : void 0, + o = 3 < s.length && "function" == typeof o ? (r--, o) : void 0; + for ( + a && u(t[0], t[1], a) && ((o = r < 3 ? void 0 : o), (r = 1)), + e = Object(e); + ++n < r; + + ) { + var i = t[n]; + i && s(e, i, n, o); + } + return e; + }); + }; + }, + { "./_baseRest": 121, "./_isIterateeCall": 182 }, + ], + 148: [ + function (e, t, n) { + var s = e("./isArrayLike"); + t.exports = function (a, i) { + return function (e, t) { + if (null == e) return e; + if (!s(e)) return a(e, t); + for ( + var n = e.length, r = i ? n : -1, o = Object(e); + (i ? r-- : ++r < n) && !1 !== t(o[r], r, o); + + ); + return e; + }; + }; + }, + { "./isArrayLike": 244 }, + ], + 149: [ + function (e, t, n) { + t.exports = function (u) { + return function (e, t, n) { + for (var r = -1, o = Object(e), a = n(e), i = a.length; i--; ) { + var s = a[u ? i : ++r]; + if (!1 === t(o[s], s, o)) break; + } + return e; + }; + }; + }, + {}, + ], + 150: [ + function (e, t, n) { + var i = e("./_baseIteratee"), + s = e("./isArrayLike"), + u = e("./keys"); + t.exports = function (a) { + return function (e, t, n) { + var r, + o = Object(e); + s(e) || + ((r = i(t, 3)), + (e = u(e)), + (t = function (e) { + return r(o[e], e, o); + })); + n = a(e, t, n); + return -1 < n ? o[r ? e[n] : n] : void 0; + }; + }; + }, + { "./_baseIteratee": 105, "./isArrayLike": 244, "./keys": 259 }, + ], + 151: [ + function (e, t, n) { + var o = e("./_baseRange"), + a = e("./_isIterateeCall"), + i = e("./toFinite"); + t.exports = function (r) { + return function (e, t, n) { + return ( + n && "number" != typeof n && a(e, t, n) && (t = n = void 0), + (e = i(e)), + void 0 === t ? ((t = e), (e = 0)) : (t = i(t)), + (n = void 0 === n ? (e < t ? 1 : -1) : i(n)), + o(e, t, n, r) + ); + }; + }; + }, + { "./_baseRange": 119, "./_isIterateeCall": 182, "./toFinite": 279 }, + ], + 152: [ + function (e, t, n) { + var r = e("./_Set"), + o = e("./noop"), + e = e("./_setToArray"), + o = + r && 1 / e(new r([, -0]))[1] == 1 / 0 + ? function (e) { + return new r(e); + } + : o; + t.exports = o; + }, + { "./_Set": 57, "./_setToArray": 212, "./noop": 269 }, + ], + 153: [ + function (e, t, n) { + var r = e("./_getNative"), + e = (function () { + try { + var e = r(Object, "defineProperty"); + return e({}, "", {}), e; + } catch (e) {} + })(); + t.exports = e; + }, + { "./_getNative": 163 }, + ], + 154: [ + function (e, t, n) { + var _ = e("./_SetCache"), + v = e("./_arraySome"), + g = e("./_cacheHas"); + t.exports = function (e, t, n, r, o, a) { + var i = 1 & n, + s = e.length, + u = t.length; + if (s != u && !(i && s < u)) return !1; + if ((u = a.get(e)) && a.get(t)) return u == t; + var c = -1, + f = !0, + d = 2 & n ? new _() : void 0; + for (a.set(e, t), a.set(t, e); ++c < s; ) { + var h, + l = e[c], + p = t[c]; + if ( + (r && (h = i ? r(p, l, c, t, e, a) : r(l, p, c, e, t, a)), void 0 !== h) + ) { + if (h) continue; + f = !1; + break; + } + if (d) { + if ( + !v(t, function (e, t) { + if (!g(d, t) && (l === e || o(l, e, n, r, a))) return d.push(t); + }) + ) { + f = !1; + break; + } + } else if (l !== p && !o(l, p, n, r, a)) { + f = !1; + break; + } + } + return a.delete(e), a.delete(t), f; + }; + }, + { "./_SetCache": 58, "./_arraySome": 72, "./_cacheHas": 131 }, + ], + 155: [ + function (e, t, n) { + var r = e("./_Symbol"), + c = e("./_Uint8Array"), + f = e("./eq"), + d = e("./_equalArrays"), + h = e("./_mapToArray"), + l = e("./_setToArray"), + r = r ? r.prototype : void 0, + p = r ? r.valueOf : void 0; + t.exports = function (e, t, n, r, o, a, i) { + switch (n) { + case "[object DataView]": + if (e.byteLength != t.byteLength || e.byteOffset != t.byteOffset) + return !1; + (e = e.buffer), (t = t.buffer); + case "[object ArrayBuffer]": + return e.byteLength == t.byteLength && a(new c(e), new c(t)) ? !0 : !1; + case "[object Boolean]": + case "[object Date]": + case "[object Number]": + return f(+e, +t); + case "[object Error]": + return e.name == t.name && e.message == t.message; + case "[object RegExp]": + case "[object String]": + return e == t + ""; + case "[object Map]": + var s = h; + case "[object Set]": + var u = 1 & r, + s = s || l; + if (e.size != t.size && !u) return !1; + u = i.get(e); + if (u) return u == t; + (r |= 2), i.set(e, t); + s = d(s(e), s(t), r, o, a, i); + return i.delete(e), s; + case "[object Symbol]": + if (p) return p.call(e) == p.call(t); + } + return !1; + }; + }, + { + "./_Symbol": 60, + "./_Uint8Array": 61, + "./_equalArrays": 154, + "./_mapToArray": 198, + "./_setToArray": 212, + "./eq": 231, + }, + ], + 156: [ + function (e, t, n) { + var y = e("./_getAllKeys"), + b = Object.prototype.hasOwnProperty; + t.exports = function (e, t, n, r, o, a) { + var i = 1 & n, + s = y(e), + u = s.length; + if (u != y(t).length && !i) return !1; + for (var c = u; c--; ) { + var f = s[c]; + if (!(i ? f in t : b.call(t, f))) return !1; + } + var d = a.get(e); + if (d && a.get(t)) return d == t; + var h = !0; + a.set(e, t), a.set(t, e); + for (var l, p = i; ++c < u; ) { + var _, + v = e[(f = s[c])], + g = t[f]; + if ( + (r && (_ = i ? r(g, v, f, t, e, a) : r(v, g, f, e, t, a)), + !(void 0 === _ ? v === g || o(v, g, n, r, a) : _)) + ) { + h = !1; + break; + } + p = p || "constructor" == f; + } + return ( + !h || + p || + ((l = e.constructor) != (d = t.constructor) && + "constructor" in e && + "constructor" in t && + !( + "function" == typeof l && + l instanceof l && + "function" == typeof d && + d instanceof d + ) && + (h = !1)), + a.delete(e), + a.delete(t), + h + ); + }; + }, + { "./_getAllKeys": 159 }, + ], + 157: [ + function (e, t, n) { + var r = e("./flatten"), + o = e("./_overRest"), + a = e("./_setToString"); + t.exports = function (e) { + return a(o(e, void 0, r), e + ""); + }; + }, + { "./_overRest": 207, "./_setToString": 213, "./flatten": 235 }, + ], + 158: [ + function (e, t, n) { + (function (e) { + e = "object" == typeof e && e && e.Object === Object && e; + t.exports = e; + }.call( + this, + "undefined" != typeof global + ? global + : "undefined" != typeof self + ? self + : "undefined" != typeof window + ? window + : {} + )); + }, + {}, + ], + 159: [ + function (e, t, n) { + var r = e("./_baseGetAllKeys"), + o = e("./_getSymbols"), + a = e("./keys"); + t.exports = function (e) { + return r(e, a, o); + }; + }, + { "./_baseGetAllKeys": 90, "./_getSymbols": 166, "./keys": 259 }, + ], + 160: [ + function (e, t, n) { + var r = e("./_baseGetAllKeys"), + o = e("./_getSymbolsIn"), + a = e("./keysIn"); + t.exports = function (e) { + return r(e, a, o); + }; + }, + { "./_baseGetAllKeys": 90, "./_getSymbolsIn": 167, "./keysIn": 260 }, + ], + 161: [ + function (e, t, n) { + var r = e("./_isKeyable"); + t.exports = function (e, t) { + return ( + (e = e.__data__), r(t) ? e["string" == typeof t ? "string" : "hash"] : e.map + ); + }; + }, + { "./_isKeyable": 184 }, + ], + 162: [ + function (e, t, n) { + var a = e("./_isStrictComparable"), + i = e("./keys"); + t.exports = function (e) { + for (var t = i(e), n = t.length; n--; ) { + var r = t[n], + o = e[r]; + t[n] = [r, o, a(o)]; + } + return t; + }; + }, + { "./_isStrictComparable": 187, "./keys": 259 }, + ], + 163: [ + function (e, t, n) { + var r = e("./_baseIsNative"), + o = e("./_getValue"); + t.exports = function (e, t) { + return (t = o(e, t)), r(t) ? t : void 0; + }; + }, + { "./_baseIsNative": 102, "./_getValue": 169 }, + ], + 164: [ + function (e, t, n) { + e = e("./_overArg")(Object.getPrototypeOf, Object); + t.exports = e; + }, + { "./_overArg": 206 }, + ], + 165: [ + function (e, t, n) { + var r = e("./_Symbol"), + e = Object.prototype, + a = e.hasOwnProperty, + i = e.toString, + s = r ? r.toStringTag : void 0; + t.exports = function (e) { + var t = a.call(e, s), + n = e[s]; + try { + var r = !(e[s] = void 0); + } catch (e) {} + var o = i.call(e); + return r && (t ? (e[s] = n) : delete e[s]), o; + }; + }, + { "./_Symbol": 60 }, + ], + 166: [ + function (e, t, n) { + var r = e("./_arrayFilter"), + e = e("./stubArray"), + o = Object.prototype.propertyIsEnumerable, + a = Object.getOwnPropertySymbols, + e = a + ? function (t) { + return null == t + ? [] + : ((t = Object(t)), + r(a(t), function (e) { + return o.call(t, e); + })); + } + : e; + t.exports = e; + }, + { "./_arrayFilter": 65, "./stubArray": 277 }, + ], + 167: [ + function (e, t, n) { + var r = e("./_arrayPush"), + o = e("./_getPrototype"), + a = e("./_getSymbols"), + e = e("./stubArray"), + e = Object.getOwnPropertySymbols + ? function (e) { + for (var t = []; e; ) r(t, a(e)), (e = o(e)); + return t; + } + : e; + t.exports = e; + }, + { + "./_arrayPush": 70, + "./_getPrototype": 164, + "./_getSymbols": 166, + "./stubArray": 277, + }, + ], + 168: [ + function (e, t, n) { + var r = e("./_DataView"), + o = e("./_Map"), + a = e("./_Promise"), + i = e("./_Set"), + s = e("./_WeakMap"), + u = e("./_baseGetTag"), + c = e("./_toSource"), + f = "[object Map]", + d = "[object Promise]", + h = "[object Set]", + l = "[object WeakMap]", + p = "[object DataView]", + _ = c(r), + v = c(o), + g = c(a), + y = c(i), + b = c(s), + e = u; + ((r && e(new r(new ArrayBuffer(1))) != p) || + (o && e(new o()) != f) || + (a && e(a.resolve()) != d) || + (i && e(new i()) != h) || + (s && e(new s()) != l)) && + (e = function (e) { + var t = u(e), + e = "[object Object]" == t ? e.constructor : void 0, + e = e ? c(e) : ""; + if (e) + switch (e) { + case _: + return p; + case v: + return f; + case g: + return d; + case y: + return h; + case b: + return l; + } + return t; + }), + (t.exports = e); + }, + { + "./_DataView": 51, + "./_Map": 54, + "./_Promise": 56, + "./_Set": 57, + "./_WeakMap": 62, + "./_baseGetTag": 91, + "./_toSource": 224, + }, + ], + 169: [ + function (e, t, n) { + t.exports = function (e, t) { + return null == e ? void 0 : e[t]; + }; + }, + {}, + ], + 170: [ + function (e, t, n) { + var s = e("./_castPath"), + u = e("./isArguments"), + c = e("./isArray"), + f = e("./_isIndex"), + d = e("./isLength"), + h = e("./_toKey"); + t.exports = function (e, t, n) { + for (var r = -1, o = (t = s(t, e)).length, a = !1; ++r < o; ) { + var i = h(t[r]); + if (!(a = null != e && n(e, i))) break; + e = e[i]; + } + return a || ++r != o + ? a + : !!(o = null == e ? 0 : e.length) && d(o) && f(i, o) && (c(e) || u(e)); + }; + }, + { + "./_castPath": 133, + "./_isIndex": 181, + "./_toKey": 223, + "./isArguments": 242, + "./isArray": 243, + "./isLength": 249, + }, + ], + 171: [ + function (e, t, n) { + var r = RegExp( + "[\\u200d\\ud800-\\udfff\\u0300-\\u036f\\ufe20-\\ufe2f\\u20d0-\\u20ff\\ufe0e\\ufe0f]" + ); + t.exports = function (e) { + return r.test(e); + }; + }, + {}, + ], + 172: [ + function (e, t, n) { + var r = e("./_nativeCreate"); + t.exports = function () { + (this.__data__ = r ? r(null) : {}), (this.size = 0); + }; + }, + { "./_nativeCreate": 201 }, + ], + 173: [ + function (e, t, n) { + t.exports = function (e) { + return ( + (e = this.has(e) && delete this.__data__[e]), (this.size -= e ? 1 : 0), e + ); + }; + }, + {}, + ], + 174: [ + function (e, t, n) { + var r = e("./_nativeCreate"), + o = Object.prototype.hasOwnProperty; + t.exports = function (e) { + var t = this.__data__; + if (r) { + var n = t[e]; + return "__lodash_hash_undefined__" === n ? void 0 : n; + } + return o.call(t, e) ? t[e] : void 0; + }; + }, + { "./_nativeCreate": 201 }, + ], + 175: [ + function (e, t, n) { + var r = e("./_nativeCreate"), + o = Object.prototype.hasOwnProperty; + t.exports = function (e) { + var t = this.__data__; + return r ? void 0 !== t[e] : o.call(t, e); + }; + }, + { "./_nativeCreate": 201 }, + ], + 176: [ + function (e, t, n) { + var r = e("./_nativeCreate"); + t.exports = function (e, t) { + var n = this.__data__; + return ( + (this.size += this.has(e) ? 0 : 1), + (n[e] = r && void 0 === t ? "__lodash_hash_undefined__" : t), + this + ); + }; + }, + { "./_nativeCreate": 201 }, + ], + 177: [ + function (e, t, n) { + var r = Object.prototype.hasOwnProperty; + t.exports = function (e) { + var t = e.length, + n = new e.constructor(t); + return ( + t && + "string" == typeof e[0] && + r.call(e, "index") && + ((n.index = e.index), (n.input = e.input)), + n + ); + }; + }, + {}, + ], + 178: [ + function (e, t, n) { + var o = e("./_cloneArrayBuffer"), + a = e("./_cloneDataView"), + i = e("./_cloneRegExp"), + s = e("./_cloneSymbol"), + u = e("./_cloneTypedArray"); + t.exports = function (e, t, n) { + var r = e.constructor; + switch (t) { + case "[object ArrayBuffer]": + return o(e); + case "[object Boolean]": + case "[object Date]": + return new r(+e); + case "[object DataView]": + return a(e, n); + case "[object Float32Array]": + case "[object Float64Array]": + case "[object Int8Array]": + case "[object Int16Array]": + case "[object Int32Array]": + case "[object Uint8Array]": + case "[object Uint8ClampedArray]": + case "[object Uint16Array]": + case "[object Uint32Array]": + return u(e, n); + case "[object Map]": + return new r(); + case "[object Number]": + case "[object String]": + return new r(e); + case "[object RegExp]": + return i(e); + case "[object Set]": + return new r(); + case "[object Symbol]": + return s(e); + } + }; + }, + { + "./_cloneArrayBuffer": 134, + "./_cloneDataView": 136, + "./_cloneRegExp": 137, + "./_cloneSymbol": 138, + "./_cloneTypedArray": 139, + }, + ], + 179: [ + function (e, t, n) { + var r = e("./_baseCreate"), + o = e("./_getPrototype"), + a = e("./_isPrototype"); + t.exports = function (e) { + return "function" != typeof e.constructor || a(e) ? {} : r(o(e)); + }; + }, + { "./_baseCreate": 81, "./_getPrototype": 164, "./_isPrototype": 186 }, + ], + 180: [ + function (e, t, n) { + var r = e("./_Symbol"), + o = e("./isArguments"), + a = e("./isArray"), + i = r ? r.isConcatSpreadable : void 0; + t.exports = function (e) { + return a(e) || o(e) || !!(i && e && e[i]); + }; + }, + { "./_Symbol": 60, "./isArguments": 242, "./isArray": 243 }, + ], + 181: [ + function (e, t, n) { + var r = /^(?:0|[1-9]\d*)$/; + t.exports = function (e, t) { + var n = typeof e; + return ( + !!(t = null == t ? 9007199254740991 : t) && + ("number" == n || ("symbol" != n && r.test(e))) && + -1 < e && + e % 1 == 0 && + e < t + ); + }; + }, + {}, + ], + 182: [ + function (e, t, n) { + var o = e("./eq"), + a = e("./isArrayLike"), + i = e("./_isIndex"), + s = e("./isObject"); + t.exports = function (e, t, n) { + if (!s(n)) return !1; + var r = typeof t; + return ( + !!("number" == r ? a(n) && i(t, n.length) : "string" == r && t in n) && + o(n[t], e) + ); + }; + }, + { + "./_isIndex": 181, + "./eq": 231, + "./isArrayLike": 244, + "./isObject": 251, + }, + ], + 183: [ + function (e, t, n) { + var r = e("./isArray"), + o = e("./isSymbol"), + a = /\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/, + i = /^\w*$/; + t.exports = function (e, t) { + if (r(e)) return !1; + var n = typeof e; + return ( + !("number" != n && "symbol" != n && "boolean" != n && null != e && !o(e)) || + i.test(e) || + !a.test(e) || + (null != t && e in Object(t)) + ); + }; + }, + { "./isArray": 243, "./isSymbol": 256 }, + ], + 184: [ + function (e, t, n) { + t.exports = function (e) { + var t = typeof e; + return "string" == t || "number" == t || "symbol" == t || "boolean" == t + ? "__proto__" !== e + : null === e; + }; + }, + {}, + ], + 185: [ + function (e, t, n) { + var e = e("./_coreJsData"), + r = (e = /[^.]+$/.exec((e && e.keys && e.keys.IE_PROTO) || "")) + ? "Symbol(src)_1." + e + : ""; + t.exports = function (e) { + return !!r && r in e; + }; + }, + { "./_coreJsData": 146 }, + ], + 186: [ + function (e, t, n) { + var r = Object.prototype; + t.exports = function (e) { + var t = e && e.constructor; + return e === (("function" == typeof t && t.prototype) || r); + }; + }, + {}, + ], + 187: [ + function (e, t, n) { + var r = e("./isObject"); + t.exports = function (e) { + return e == e && !r(e); + }; + }, + { "./isObject": 251 }, + ], + 188: [ + function (e, t, n) { + t.exports = function () { + (this.__data__ = []), (this.size = 0); + }; + }, + {}, + ], + 189: [ + function (e, t, n) { + var r = e("./_assocIndexOf"), + o = Array.prototype.splice; + t.exports = function (e) { + var t = this.__data__; + return ( + !((e = r(t, e)) < 0) && + (e == t.length - 1 ? t.pop() : o.call(t, e, 1), --this.size, !0) + ); + }; + }, + { "./_assocIndexOf": 76 }, + ], + 190: [ + function (e, t, n) { + var r = e("./_assocIndexOf"); + t.exports = function (e) { + var t = this.__data__; + return (e = r(t, e)) < 0 ? void 0 : t[e][1]; + }; + }, + { "./_assocIndexOf": 76 }, + ], + 191: [ + function (e, t, n) { + var r = e("./_assocIndexOf"); + t.exports = function (e) { + return -1 < r(this.__data__, e); + }; + }, + { "./_assocIndexOf": 76 }, + ], + 192: [ + function (e, t, n) { + var o = e("./_assocIndexOf"); + t.exports = function (e, t) { + var n = this.__data__, + r = o(n, e); + return r < 0 ? (++this.size, n.push([e, t])) : (n[r][1] = t), this; + }; + }, + { "./_assocIndexOf": 76 }, + ], + 193: [ + function (e, t, n) { + var r = e("./_Hash"), + o = e("./_ListCache"), + a = e("./_Map"); + t.exports = function () { + (this.size = 0), + (this.__data__ = { + hash: new r(), + map: new (a || o)(), + string: new r(), + }); + }; + }, + { "./_Hash": 52, "./_ListCache": 53, "./_Map": 54 }, + ], + 194: [ + function (e, t, n) { + var r = e("./_getMapData"); + t.exports = function (e) { + return (e = r(this, e).delete(e)), (this.size -= e ? 1 : 0), e; + }; + }, + { "./_getMapData": 161 }, + ], + 195: [ + function (e, t, n) { + var r = e("./_getMapData"); + t.exports = function (e) { + return r(this, e).get(e); + }; + }, + { "./_getMapData": 161 }, + ], + 196: [ + function (e, t, n) { + var r = e("./_getMapData"); + t.exports = function (e) { + return r(this, e).has(e); + }; + }, + { "./_getMapData": 161 }, + ], + 197: [ + function (e, t, n) { + var o = e("./_getMapData"); + t.exports = function (e, t) { + var n = o(this, e), + r = n.size; + return n.set(e, t), (this.size += n.size == r ? 0 : 1), this; + }; + }, + { "./_getMapData": 161 }, + ], + 198: [ + function (e, t, n) { + t.exports = function (e) { + var n = -1, + r = Array(e.size); + return ( + e.forEach(function (e, t) { + r[++n] = [t, e]; + }), + r + ); + }; + }, + {}, + ], + 199: [ + function (e, t, n) { + t.exports = function (t, n) { + return function (e) { + return null != e && e[t] === n && (void 0 !== n || t in Object(e)); + }; + }; + }, + {}, + ], + 200: [ + function (e, t, n) { + var r = e("./memoize"); + t.exports = function (e) { + var t = (e = r(e, function (e) { + return 500 === t.size && t.clear(), e; + })).cache; + return e; + }; + }, + { "./memoize": 265 }, + ], + 201: [ + function (e, t, n) { + e = e("./_getNative")(Object, "create"); + t.exports = e; + }, + { "./_getNative": 163 }, + ], + 202: [ + function (e, t, n) { + e = e("./_overArg")(Object.keys, Object); + t.exports = e; + }, + { "./_overArg": 206 }, + ], + 203: [ + function (e, t, n) { + t.exports = function (e) { + var t = []; + if (null != e) for (var n in Object(e)) t.push(n); + return t; + }; + }, + {}, + ], + 204: [ + function (e, t, n) { + var e = e("./_freeGlobal"), + n = "object" == typeof n && n && !n.nodeType && n, + r = n && "object" == typeof t && t && !t.nodeType && t, + o = r && r.exports === n && e.process, + e = (function () { + try { + var e = r && r.require && r.require("util").types; + return e ? e : o && o.binding && o.binding("util"); + } catch (e) {} + })(); + t.exports = e; + }, + { "./_freeGlobal": 158 }, + ], + 205: [ + function (e, t, n) { + var r = Object.prototype.toString; + t.exports = function (e) { + return r.call(e); + }; + }, + {}, + ], + 206: [ + function (e, t, n) { + t.exports = function (t, n) { + return function (e) { + return t(n(e)); + }; + }; + }, + {}, + ], + 207: [ + function (e, t, n) { + var u = e("./_apply"), + c = Math.max; + t.exports = function (a, i, s) { + return ( + (i = c(void 0 === i ? a.length - 1 : i, 0)), + function () { + for ( + var e = arguments, t = -1, n = c(e.length - i, 0), r = Array(n); + ++t < n; + + ) + r[t] = e[i + t]; + t = -1; + for (var o = Array(i + 1); ++t < i; ) o[t] = e[t]; + return (o[i] = s(r)), u(a, this, o); + } + ); + }; + }, + { "./_apply": 63 }, + ], + 208: [ + function (e, t, n) { + var r = e("./_freeGlobal"), + e = "object" == typeof self && self && self.Object === Object && self, + e = r || e || Function("return this")(); + t.exports = e; + }, + { "./_freeGlobal": 158 }, + ], + 209: [ + function (e, t, n) { + t.exports = function (e, t) { + if (("constructor" !== t || "function" != typeof e[t]) && "__proto__" != t) + return e[t]; + }; + }, + {}, + ], + 210: [ + function (e, t, n) { + t.exports = function (e) { + return this.__data__.set(e, "__lodash_hash_undefined__"), this; + }; + }, + {}, + ], + 211: [ + function (e, t, n) { + t.exports = function (e) { + return this.__data__.has(e); + }; + }, + {}, + ], + 212: [ + function (e, t, n) { + t.exports = function (e) { + var t = -1, + n = Array(e.size); + return ( + e.forEach(function (e) { + n[++t] = e; + }), + n + ); + }; + }, + {}, + ], + 213: [ + function (e, t, n) { + var r = e("./_baseSetToString"), + r = e("./_shortOut")(r); + t.exports = r; + }, + { "./_baseSetToString": 123, "./_shortOut": 214 }, + ], + 214: [ + function (e, t, n) { + var a = Date.now; + t.exports = function (n) { + var r = 0, + o = 0; + return function () { + var e = a(), + t = 16 - (e - o); + if (((o = e), 0 < t)) { + if (800 <= ++r) return arguments[0]; + } else r = 0; + return n.apply(void 0, arguments); + }; + }; + }, + {}, + ], + 215: [ + function (e, t, n) { + var r = e("./_ListCache"); + t.exports = function () { + (this.__data__ = new r()), (this.size = 0); + }; + }, + { "./_ListCache": 53 }, + ], + 216: [ + function (e, t, n) { + t.exports = function (e) { + var t = this.__data__, + e = t.delete(e); + return (this.size = t.size), e; + }; + }, + {}, + ], + 217: [ + function (e, t, n) { + t.exports = function (e) { + return this.__data__.get(e); + }; + }, + {}, + ], + 218: [ + function (e, t, n) { + t.exports = function (e) { + return this.__data__.has(e); + }; + }, + {}, + ], + 219: [ + function (e, t, n) { + var o = e("./_ListCache"), + a = e("./_Map"), + i = e("./_MapCache"); + t.exports = function (e, t) { + var n = this.__data__; + if (n instanceof o) { + var r = n.__data__; + if (!a || r.length < 199) + return r.push([e, t]), (this.size = ++n.size), this; + n = this.__data__ = new i(r); + } + return n.set(e, t), (this.size = n.size), this; + }; + }, + { "./_ListCache": 53, "./_Map": 54, "./_MapCache": 55 }, + ], + 220: [ + function (e, t, n) { + t.exports = function (e, t, n) { + for (var r = n - 1, o = e.length; ++r < o; ) if (e[r] === t) return r; + return -1; + }; + }, + {}, + ], + 221: [ + function (e, t, n) { + var r = e("./_asciiSize"), + o = e("./_hasUnicode"), + a = e("./_unicodeSize"); + t.exports = function (e) { + return (o(e) ? a : r)(e); + }; + }, + { "./_asciiSize": 73, "./_hasUnicode": 171, "./_unicodeSize": 225 }, + ], + 222: [ + function (e, t, n) { + var e = e("./_memoizeCapped"), + r = + /[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g, + a = /\\(\\)?/g, + e = e(function (e) { + var o = []; + return ( + 46 === e.charCodeAt(0) && o.push(""), + e.replace(r, function (e, t, n, r) { + o.push(n ? r.replace(a, "$1") : t || e); + }), + o + ); + }); + t.exports = e; + }, + { "./_memoizeCapped": 200 }, + ], + 223: [ + function (e, t, n) { + var r = e("./isSymbol"); + t.exports = function (e) { + if ("string" == typeof e || r(e)) return e; + var t = e + ""; + return "0" == t && 1 / e == -1 / 0 ? "-0" : t; + }; + }, + { "./isSymbol": 256 }, + ], + 224: [ + function (e, t, n) { + var r = Function.prototype.toString; + t.exports = function (e) { + if (null != e) { + try { + return r.call(e); + } catch (e) {} + try { + return e + ""; + } catch (e) {} + } + return ""; + }; + }, + {}, + ], + 225: [ + function (e, t, n) { + var r = "\\ud800-\\udfff", + o = "[" + r + "]", + a = "[\\u0300-\\u036f\\ufe20-\\ufe2f\\u20d0-\\u20ff]", + i = "\\ud83c[\\udffb-\\udfff]", + s = "[^" + r + "]", + u = "(?:\\ud83c[\\udde6-\\uddff]){2}", + c = "[\\ud800-\\udbff][\\udc00-\\udfff]", + f = "(?:" + a + "|" + i + ")" + "?", + r = "[\\ufe0e\\ufe0f]?", + f = r + f + ("(?:\\u200d(?:" + [s, u, c].join("|") + ")" + r + f + ")*"), + o = "(?:" + [s + a + "?", a, u, c, o].join("|") + ")", + d = RegExp(i + "(?=" + i + ")|" + o + f, "g"); + t.exports = function (e) { + for (var t = (d.lastIndex = 0); d.test(e); ) ++t; + return t; + }; + }, + {}, + ], + 226: [ + function (e, t, n) { + var r = e("./_baseClone"); + t.exports = function (e) { + return r(e, 4); + }; + }, + { "./_baseClone": 80 }, + ], + 227: [ + function (e, t, n) { + var r = e("./_baseClone"); + t.exports = function (e) { + return r(e, 5); + }; + }, + { "./_baseClone": 80 }, + ], + 228: [ + function (e, t, n) { + t.exports = function (e) { + return function () { + return e; + }; + }; + }, + {}, + ], + 229: [ + function (e, t, n) { + var r = e("./_baseRest"), + d = e("./eq"), + h = e("./_isIterateeCall"), + l = e("./keysIn"), + p = Object.prototype, + _ = p.hasOwnProperty, + r = r(function (e, t) { + e = Object(e); + var n = -1, + r = t.length, + o = 2 < r ? t[2] : void 0; + for (o && h(t[0], t[1], o) && (r = 1); ++n < r; ) + for (var a = t[n], i = l(a), s = -1, u = i.length; ++s < u; ) { + var c = i[s], + f = e[c]; + (void 0 === f || (d(f, p[c]) && !_.call(e, c))) && (e[c] = a[c]); + } + return e; + }); + t.exports = r; + }, + { + "./_baseRest": 121, + "./_isIterateeCall": 182, + "./eq": 231, + "./keysIn": 260, + }, + ], + 230: [ + function (e, t, n) { + t.exports = e("./forEach"); + }, + { "./forEach": 236 }, + ], + 231: [ + function (e, t, n) { + t.exports = function (e, t) { + return e === t || (e != e && t != t); + }; + }, + {}, + ], + 232: [ + function (e, t, n) { + var r = e("./_arrayFilter"), + o = e("./_baseFilter"), + a = e("./_baseIteratee"), + i = e("./isArray"); + t.exports = function (e, t) { + return (i(e) ? r : o)(e, a(t, 3)); + }; + }, + { + "./_arrayFilter": 65, + "./_baseFilter": 84, + "./_baseIteratee": 105, + "./isArray": 243, + }, + ], + 233: [ + function (e, t, n) { + e = e("./_createFind")(e("./findIndex")); + t.exports = e; + }, + { "./_createFind": 150, "./findIndex": 234 }, + ], + 234: [ + function (e, t, n) { + var o = e("./_baseFindIndex"), + a = e("./_baseIteratee"), + i = e("./toInteger"), + s = Math.max; + t.exports = function (e, t, n) { + var r = null == e ? 0 : e.length; + return r + ? ((n = null == n ? 0 : i(n)) < 0 && (n = s(r + n, 0)), o(e, a(t, 3), n)) + : -1; + }; + }, + { "./_baseFindIndex": 85, "./_baseIteratee": 105, "./toInteger": 280 }, + ], + 235: [ + function (e, t, n) { + var r = e("./_baseFlatten"); + t.exports = function (e) { + return (null == e ? 0 : e.length) ? r(e, 1) : []; + }; + }, + { "./_baseFlatten": 86 }, + ], + 236: [ + function (e, t, n) { + var r = e("./_arrayEach"), + o = e("./_baseEach"), + a = e("./_castFunction"), + i = e("./isArray"); + t.exports = function (e, t) { + return (i(e) ? r : o)(e, a(t)); + }; + }, + { + "./_arrayEach": 64, + "./_baseEach": 82, + "./_castFunction": 132, + "./isArray": 243, + }, + ], + 237: [ + function (e, t, n) { + var r = e("./_baseFor"), + o = e("./_castFunction"), + a = e("./keysIn"); + t.exports = function (e, t) { + return null == e ? e : r(e, o(t), a); + }; + }, + { "./_baseFor": 87, "./_castFunction": 132, "./keysIn": 260 }, + ], + 238: [ + function (e, t, n) { + var r = e("./_baseGet"); + t.exports = function (e, t, n) { + return void 0 === (t = null == e ? void 0 : r(e, t)) ? n : t; + }; + }, + { "./_baseGet": 89 }, + ], + 239: [ + function (e, t, n) { + var r = e("./_baseHas"), + o = e("./_hasPath"); + t.exports = function (e, t) { + return null != e && o(e, t, r); + }; + }, + { "./_baseHas": 93, "./_hasPath": 170 }, + ], + 240: [ + function (e, t, n) { + var r = e("./_baseHasIn"), + o = e("./_hasPath"); + t.exports = function (e, t) { + return null != e && o(e, t, r); + }; + }, + { "./_baseHasIn": 94, "./_hasPath": 170 }, + ], + 241: [ + function (e, t, n) { + t.exports = function (e) { + return e; + }; + }, + {}, + ], + 242: [ + function (e, t, n) { + var r = e("./_baseIsArguments"), + o = e("./isObjectLike"), + e = Object.prototype, + a = e.hasOwnProperty, + i = e.propertyIsEnumerable, + r = r( + (function () { + return arguments; + })() + ) + ? r + : function (e) { + return o(e) && a.call(e, "callee") && !i.call(e, "callee"); + }; + t.exports = r; + }, + { "./_baseIsArguments": 96, "./isObjectLike": 252 }, + ], + 243: [ + function (e, t, n) { + var r = Array.isArray; + t.exports = r; + }, + {}, + ], + 244: [ + function (e, t, n) { + var r = e("./isFunction"), + o = e("./isLength"); + t.exports = function (e) { + return null != e && o(e.length) && !r(e); + }; + }, + { "./isFunction": 248, "./isLength": 249 }, + ], + 245: [ + function (e, t, n) { + var r = e("./isArrayLike"), + o = e("./isObjectLike"); + t.exports = function (e) { + return o(e) && r(e); + }; + }, + { "./isArrayLike": 244, "./isObjectLike": 252 }, + ], + 246: [ + function (e, t, n) { + var r = e("./_root"), + o = e("./stubFalse"), + e = "object" == typeof n && n && !n.nodeType && n, + n = e && "object" == typeof t && t && !t.nodeType && t, + r = n && n.exports === e ? r.Buffer : void 0, + o = (r ? r.isBuffer : void 0) || o; + t.exports = o; + }, + { "./_root": 208, "./stubFalse": 278 }, + ], + 247: [ + function (e, t, n) { + var r = e("./_baseKeys"), + o = e("./_getTag"), + a = e("./isArguments"), + i = e("./isArray"), + s = e("./isArrayLike"), + u = e("./isBuffer"), + c = e("./_isPrototype"), + f = e("./isTypedArray"), + d = Object.prototype.hasOwnProperty; + t.exports = function (e) { + if (null == e) return !0; + if ( + s(e) && + (i(e) || + "string" == typeof e || + "function" == typeof e.splice || + u(e) || + f(e) || + a(e)) + ) + return !e.length; + var t, + n = o(e); + if ("[object Map]" == n || "[object Set]" == n) return !e.size; + if (c(e)) return !r(e).length; + for (t in e) if (d.call(e, t)) return !1; + return !0; + }; + }, + { + "./_baseKeys": 106, + "./_getTag": 168, + "./_isPrototype": 186, + "./isArguments": 242, + "./isArray": 243, + "./isArrayLike": 244, + "./isBuffer": 246, + "./isTypedArray": 257, + }, + ], + 248: [ + function (e, t, n) { + var r = e("./_baseGetTag"), + o = e("./isObject"); + t.exports = function (e) { + return ( + !!o(e) && + ("[object Function]" == (e = r(e)) || + "[object GeneratorFunction]" == e || + "[object AsyncFunction]" == e || + "[object Proxy]" == e) + ); + }; + }, + { "./_baseGetTag": 91, "./isObject": 251 }, + ], + 249: [ + function (e, t, n) { + t.exports = function (e) { + return "number" == typeof e && -1 < e && e % 1 == 0 && e <= 9007199254740991; + }; + }, + {}, + ], + 250: [ + function (e, t, n) { + var r = e("./_baseIsMap"), + o = e("./_baseUnary"), + e = e("./_nodeUtil"), + e = e && e.isMap, + r = e ? o(e) : r; + t.exports = r; + }, + { "./_baseIsMap": 99, "./_baseUnary": 127, "./_nodeUtil": 204 }, + ], + 251: [ + function (e, t, n) { + t.exports = function (e) { + var t = typeof e; + return null != e && ("object" == t || "function" == t); + }; + }, + {}, + ], + 252: [ + function (e, t, n) { + t.exports = function (e) { + return null != e && "object" == typeof e; + }; + }, + {}, + ], + 253: [ + function (e, t, n) { + var r = e("./_baseGetTag"), + o = e("./_getPrototype"), + a = e("./isObjectLike"), + i = Function.prototype, + e = Object.prototype, + s = i.toString, + u = e.hasOwnProperty, + c = s.call(Object); + t.exports = function (e) { + return ( + !(!a(e) || "[object Object]" != r(e)) && + (null === (e = o(e)) || + ("function" == typeof (e = u.call(e, "constructor") && e.constructor) && + e instanceof e && + s.call(e) == c)) + ); + }; + }, + { "./_baseGetTag": 91, "./_getPrototype": 164, "./isObjectLike": 252 }, + ], + 254: [ + function (e, t, n) { + var r = e("./_baseIsSet"), + o = e("./_baseUnary"), + e = e("./_nodeUtil"), + e = e && e.isSet, + r = e ? o(e) : r; + t.exports = r; + }, + { "./_baseIsSet": 103, "./_baseUnary": 127, "./_nodeUtil": 204 }, + ], + 255: [ + function (e, t, n) { + var r = e("./_baseGetTag"), + o = e("./isArray"), + a = e("./isObjectLike"); + t.exports = function (e) { + return "string" == typeof e || (!o(e) && a(e) && "[object String]" == r(e)); + }; + }, + { "./_baseGetTag": 91, "./isArray": 243, "./isObjectLike": 252 }, + ], + 256: [ + function (e, t, n) { + var r = e("./_baseGetTag"), + o = e("./isObjectLike"); + t.exports = function (e) { + return "symbol" == typeof e || (o(e) && "[object Symbol]" == r(e)); + }; + }, + { "./_baseGetTag": 91, "./isObjectLike": 252 }, + ], + 257: [ + function (e, t, n) { + var r = e("./_baseIsTypedArray"), + o = e("./_baseUnary"), + e = e("./_nodeUtil"), + e = e && e.isTypedArray, + r = e ? o(e) : r; + t.exports = r; + }, + { "./_baseIsTypedArray": 104, "./_baseUnary": 127, "./_nodeUtil": 204 }, + ], + 258: [ + function (e, t, n) { + t.exports = function (e) { + return void 0 === e; + }; + }, + {}, + ], + 259: [ + function (e, t, n) { + var r = e("./_arrayLikeKeys"), + o = e("./_baseKeys"), + a = e("./isArrayLike"); + t.exports = function (e) { + return (a(e) ? r : o)(e); + }; + }, + { "./_arrayLikeKeys": 68, "./_baseKeys": 106, "./isArrayLike": 244 }, + ], + 260: [ + function (e, t, n) { + var r = e("./_arrayLikeKeys"), + o = e("./_baseKeysIn"), + a = e("./isArrayLike"); + t.exports = function (e) { + return a(e) ? r(e, !0) : o(e); + }; + }, + { "./_arrayLikeKeys": 68, "./_baseKeysIn": 107, "./isArrayLike": 244 }, + ], + 261: [ + function (e, t, n) { + t.exports = function (e) { + var t = null == e ? 0 : e.length; + return t ? e[t - 1] : void 0; + }; + }, + {}, + ], + 262: [ + function (e, t, n) { + var r = e("./_arrayMap"), + o = e("./_baseIteratee"), + a = e("./_baseMap"), + i = e("./isArray"); + t.exports = function (e, t) { + return (i(e) ? r : a)(e, o(t, 3)); + }; + }, + { + "./_arrayMap": 69, + "./_baseIteratee": 105, + "./_baseMap": 109, + "./isArray": 243, + }, + ], + 263: [ + function (e, t, n) { + var a = e("./_baseAssignValue"), + i = e("./_baseForOwn"), + s = e("./_baseIteratee"); + t.exports = function (e, r) { + var o = {}; + return ( + (r = s(r, 3)), + i(e, function (e, t, n) { + a(o, t, r(e, t, n)); + }), + o + ); + }; + }, + { + "./_baseAssignValue": 79, + "./_baseForOwn": 88, + "./_baseIteratee": 105, + }, + ], + 264: [ + function (e, t, n) { + var r = e("./_baseExtremum"), + o = e("./_baseGt"), + a = e("./identity"); + t.exports = function (e) { + return e && e.length ? r(e, a, o) : void 0; + }; + }, + { "./_baseExtremum": 83, "./_baseGt": 92, "./identity": 241 }, + ], + 265: [ + function (e, t, n) { + var i = e("./_MapCache"), + s = "Expected a function"; + function u(r, o) { + if ("function" != typeof r || (null != o && "function" != typeof o)) + throw new TypeError(s); + var a = function () { + var e = arguments, + t = o ? o.apply(this, e) : e[0], + n = a.cache; + if (n.has(t)) return n.get(t); + e = r.apply(this, e); + return (a.cache = n.set(t, e) || n), e; + }; + return (a.cache = new (u.Cache || i)()), a; + } + (u.Cache = i), (t.exports = u); + }, + { "./_MapCache": 55 }, + ], + 266: [ + function (e, t, n) { + var r = e("./_baseMerge"), + e = e("./_createAssigner")(function (e, t, n) { + r(e, t, n); + }); + t.exports = e; + }, + { "./_baseMerge": 112, "./_createAssigner": 147 }, + ], + 267: [ + function (e, t, n) { + var r = e("./_baseExtremum"), + o = e("./_baseLt"), + a = e("./identity"); + t.exports = function (e) { + return e && e.length ? r(e, a, o) : void 0; + }; + }, + { "./_baseExtremum": 83, "./_baseLt": 108, "./identity": 241 }, + ], + 268: [ + function (e, t, n) { + var r = e("./_baseExtremum"), + o = e("./_baseIteratee"), + a = e("./_baseLt"); + t.exports = function (e, t) { + return e && e.length ? r(e, o(t, 2), a) : void 0; + }; + }, + { "./_baseExtremum": 83, "./_baseIteratee": 105, "./_baseLt": 108 }, + ], + 269: [ + function (e, t, n) { + t.exports = function () {}; + }, + {}, + ], + 270: [ + function (e, t, n) { + var r = e("./_root"); + t.exports = function () { + return r.Date.now(); + }; + }, + { "./_root": 208 }, + ], + 271: [ + function (e, t, n) { + var r = e("./_basePick"), + e = e("./_flatRest")(function (e, t) { + return null == e ? {} : r(e, t); + }); + t.exports = e; + }, + { "./_basePick": 115, "./_flatRest": 157 }, + ], + 272: [ + function (e, t, n) { + var r = e("./_baseProperty"), + o = e("./_basePropertyDeep"), + a = e("./_isKey"), + i = e("./_toKey"); + t.exports = function (e) { + return a(e) ? r(i(e)) : o(e); + }; + }, + { + "./_baseProperty": 117, + "./_basePropertyDeep": 118, + "./_isKey": 183, + "./_toKey": 223, + }, + ], + 273: [ + function (e, t, n) { + e = e("./_createRange")(); + t.exports = e; + }, + { "./_createRange": 151 }, + ], + 274: [ + function (e, t, n) { + var a = e("./_arrayReduce"), + i = e("./_baseEach"), + s = e("./_baseIteratee"), + u = e("./_baseReduce"), + c = e("./isArray"); + t.exports = function (e, t, n) { + var r = c(e) ? a : u, + o = arguments.length < 3; + return r(e, s(t, 4), n, o, i); + }; + }, + { + "./_arrayReduce": 71, + "./_baseEach": 82, + "./_baseIteratee": 105, + "./_baseReduce": 120, + "./isArray": 243, + }, + ], + 275: [ + function (e, t, n) { + var r = e("./_baseKeys"), + o = e("./_getTag"), + a = e("./isArrayLike"), + i = e("./isString"), + s = e("./_stringSize"); + t.exports = function (e) { + if (null == e) return 0; + if (a(e)) return i(e) ? s(e) : e.length; + var t = o(e); + return "[object Map]" == t || "[object Set]" == t ? e.size : r(e).length; + }; + }, + { + "./_baseKeys": 106, + "./_getTag": 168, + "./_stringSize": 221, + "./isArrayLike": 244, + "./isString": 255, + }, + ], + 276: [ + function (e, t, n) { + var r = e("./_baseFlatten"), + o = e("./_baseOrderBy"), + a = e("./_baseRest"), + i = e("./_isIterateeCall"), + a = a(function (e, t) { + if (null == e) return []; + var n = t.length; + return ( + 1 < n && i(e, t[0], t[1]) + ? (t = []) + : 2 < n && i(t[0], t[1], t[2]) && (t = [t[0]]), + o(e, r(t, 1), []) + ); + }); + t.exports = a; + }, + { + "./_baseFlatten": 86, + "./_baseOrderBy": 114, + "./_baseRest": 121, + "./_isIterateeCall": 182, + }, + ], + 277: [ + function (e, t, n) { + t.exports = function () { + return []; + }; + }, + {}, + ], + 278: [ + function (e, t, n) { + t.exports = function () { + return !1; + }; + }, + {}, + ], + 279: [ + function (e, t, n) { + var r = e("./toNumber"); + t.exports = function (e) { + return e + ? (e = r(e)) !== 1 / 0 && e !== -1 / 0 + ? e == e + ? e + : 0 + : 17976931348623157e292 * (e < 0 ? -1 : 1) + : 0 === e + ? e + : 0; + }; + }, + { "./toNumber": 281 }, + ], + 280: [ + function (e, t, n) { + var r = e("./toFinite"); + t.exports = function (e) { + var t = r(e), + e = t % 1; + return t == t ? (e ? t - e : t) : 0; + }; + }, + { "./toFinite": 279 }, + ], + 281: [ + function (e, t, n) { + var r = e("./isObject"), + o = e("./isSymbol"), + a = /^\s+|\s+$/g, + i = /^[-+]0x[0-9a-f]+$/i, + s = /^0b[01]+$/i, + u = /^0o[0-7]+$/i, + c = parseInt; + t.exports = function (e) { + if ("number" == typeof e) return e; + if (o(e)) return NaN; + if ( + (r(e) && + ((t = "function" == typeof e.valueOf ? e.valueOf() : e), + (e = r(t) ? t + "" : t)), + "string" != typeof e) + ) + return 0 === e ? e : +e; + e = e.replace(a, ""); + var t = s.test(e); + return t || u.test(e) ? c(e.slice(2), t ? 2 : 8) : i.test(e) ? NaN : +e; + }; + }, + { "./isObject": 251, "./isSymbol": 256 }, + ], + 282: [ + function (e, t, n) { + var r = e("./_copyObject"), + o = e("./keysIn"); + t.exports = function (e) { + return r(e, o(e)); + }; + }, + { "./_copyObject": 143, "./keysIn": 260 }, + ], + 283: [ + function (e, t, n) { + var r = e("./_baseToString"); + t.exports = function (e) { + return null == e ? "" : r(e); + }; + }, + { "./_baseToString": 126 }, + ], + 284: [ + function (e, t, n) { + var i = e("./_arrayEach"), + s = e("./_baseCreate"), + u = e("./_baseForOwn"), + c = e("./_baseIteratee"), + f = e("./_getPrototype"), + d = e("./isArray"), + h = e("./isBuffer"), + l = e("./isFunction"), + p = e("./isObject"), + _ = e("./isTypedArray"); + t.exports = function (e, r, o) { + var t, + n = d(e), + a = n || h(e) || _(e); + return ( + (r = c(r, 4)), + null == o && + ((t = e && e.constructor), + (o = a ? (n ? new t() : []) : p(e) && l(t) ? s(f(e)) : {})), + (a ? i : u)(e, function (e, t, n) { + return r(o, e, t, n); + }), + o + ); + }; + }, + { + "./_arrayEach": 64, + "./_baseCreate": 81, + "./_baseForOwn": 88, + "./_baseIteratee": 105, + "./_getPrototype": 164, + "./isArray": 243, + "./isBuffer": 246, + "./isFunction": 248, + "./isObject": 251, + "./isTypedArray": 257, + }, + ], + 285: [ + function (e, t, n) { + var r = e("./_baseFlatten"), + o = e("./_baseRest"), + a = e("./_baseUniq"), + i = e("./isArrayLikeObject"), + o = o(function (e) { + return a(r(e, 1, i, !0)); + }); + t.exports = o; + }, + { + "./_baseFlatten": 86, + "./_baseRest": 121, + "./_baseUniq": 128, + "./isArrayLikeObject": 245, + }, + ], + 286: [ + function (e, t, n) { + var r = e("./toString"), + o = 0; + t.exports = function (e) { + var t = ++o; + return r(e) + t; + }; + }, + { "./toString": 283 }, + ], + 287: [ + function (e, t, n) { + var r = e("./_baseValues"), + o = e("./keys"); + t.exports = function (e) { + return null == e ? [] : r(e, o(e)); + }; + }, + { "./_baseValues": 129, "./keys": 259 }, + ], + 288: [ + function (e, t, n) { + var r = e("./_assignValue"), + o = e("./_baseZipObject"); + t.exports = function (e, t) { + return o(e || [], t || [], r); + }; + }, + { "./_assignValue": 75, "./_baseZipObject": 130 }, + ], + }, + {}, + [1] + )(1); +}); diff --git a/d2layouts/d2dagrelayout/layout.go b/d2layouts/d2dagrelayout/layout.go new file mode 100644 index 000000000..fb37ececf --- /dev/null +++ b/d2layouts/d2dagrelayout/layout.go @@ -0,0 +1,248 @@ +package d2dagrelayout + +import ( + "context" + _ "embed" + "encoding/json" + "fmt" + "math" + "strings" + + "cdr.dev/slog" + v8 "rogchap.com/v8go" + + "oss.terrastruct.com/xdefer" + + "oss.terrastruct.com/d2/d2graph" + "oss.terrastruct.com/d2/d2target" + "oss.terrastruct.com/d2/lib/geo" + "oss.terrastruct.com/d2/lib/go2" + "oss.terrastruct.com/d2/lib/label" + "oss.terrastruct.com/d2/lib/log" + "oss.terrastruct.com/d2/lib/shape" +) + +//go:embed setup.js +var setupJS string + +//go:embed dagre.js +var dagreJS string + +type DagreNode struct { + X float64 `json:"x"` + Y float64 `json:"y"` + Width float64 `json:"width"` + Height float64 `json:"height"` +} + +type DagreEdge struct { + Points []*geo.Point `json:"points"` +} + +type dagreGraphAttrs struct { + // for a top to bottom graph: ranksep is y spacing, nodesep is x spacing, edgesep is x spacing + ranksep int + edgesep int + nodesep int + // graph direction: tb (top to bottom)| bt | lr | rl + rankdir string +} + +func Layout(ctx context.Context, d2graph *d2graph.Graph) (err error) { + defer xdefer.Errorf(&err, "failed to dagre layout") + + debugJS := false + v8ctx := v8.NewContext() + if _, err := v8ctx.RunScript(dagreJS, "dagre.js"); err != nil { + return err + } + if _, err := v8ctx.RunScript(setupJS, "setup.js"); err != nil { + return err + } + + configJS := setGraphAttrs(dagreGraphAttrs{ + ranksep: 100, + edgesep: 40, + nodesep: 60, + rankdir: "tb", + }) + if _, err := v8ctx.RunScript(configJS, "config.js"); err != nil { + return err + } + + loadScript := "" + for _, obj := range d2graph.Objects { + id := obj.AbsID() + loadScript += generateAddNodeLine(id, obj.Attributes.Label.Value, int(obj.Width), int(obj.Height)) + if obj.Parent != d2graph.Root { + loadScript += generateAddParentLine(id, obj.Parent.AbsID()) + } + } + for _, edge := range d2graph.Edges { + // dagre doesn't work with edges to containers so we connect container edges to their first child instead (going all the way down) + // we will chop the edge where it intersects the container border so it only shows the edge from the container + src := edge.Src + for len(src.Children) > 0 && src.Class == nil && src.SQLTable == nil { + src = src.ChildrenArray[0] + } + dst := edge.Dst + for len(dst.Children) > 0 && dst.Class == nil && dst.SQLTable == nil { + dst = dst.ChildrenArray[0] + } + if edge.SrcArrow && !edge.DstArrow { + // for `b <- a`, edge.Edge is `a -> b` and we expect this routing result + src, dst = dst, src + } + loadScript += generateAddEdgeLine(src.AbsID(), dst.AbsID(), edge.AbsID(), edge.Attributes.Label.Value) + } + + if debugJS { + log.Debug(ctx, "script", slog.F("all", setupJS+configJS+loadScript)) + } + + if _, err := v8ctx.RunScript(loadScript, "load.js"); err != nil { + return err + } + + if _, err := v8ctx.RunScript(`dagre.layout(g)`, "layout.js"); err != nil { + if debugJS { + log.Warn(ctx, "layout error", slog.F("err", err)) + } + return err + } + + // val, err := v8ctx.RunScript("JSON.stringify(dagre.graphlib.json.write(g))", "q.js") + // if err != nil { + // return err + // } + // log.Debug(ctx, "graph", slog.F("json", val.String())) + + for i, obj := range d2graph.Objects { + val, err := v8ctx.RunScript(fmt.Sprintf("JSON.stringify(g.node(g.nodes()[%d]))", i), "value.js") + if err != nil { + return err + } + var dn DagreNode + if err := json.Unmarshal([]byte(val.String()), &dn); err != nil { + return err + } + + // dagre gives center of node + obj.TopLeft = geo.NewPoint(math.Round(dn.X-dn.Width/2), math.Round(dn.Y-dn.Height/2)) + obj.Width = dn.Width + obj.Height = dn.Height + + if obj.LabelWidth != nil && obj.LabelHeight != nil { + if len(obj.ChildrenArray) > 0 { + obj.LabelPosition = go2.Pointer(string(label.InsideTopCenter)) + } else { + obj.LabelPosition = go2.Pointer(string(label.InsideMiddleCenter)) + } + } + if obj.Attributes.Icon != nil { + obj.IconPosition = go2.Pointer(string(label.InsideMiddleCenter)) + } + } + + for i, edge := range d2graph.Edges { + val, err := v8ctx.RunScript(fmt.Sprintf("JSON.stringify(g.edge(g.edges()[%d]))", i), "value.js") + if err != nil { + return err + } + var de DagreEdge + if err := json.Unmarshal([]byte(val.String()), &de); err != nil { + return err + } + + points := make([]*geo.Point, len(de.Points)) + for i := range de.Points { + if edge.SrcArrow && !edge.DstArrow { + points[len(de.Points)-i-1] = de.Points[i].Copy() + } else { + points[i] = de.Points[i].Copy() + } + } + + startIndex, endIndex := 0, len(points)-1 + start, end := points[startIndex], points[endIndex] + + // chop where edge crosses the source/target boxes since container edges were routed to a descendant + for i := 1; i < len(points); i++ { + segment := *geo.NewSegment(points[i-1], points[i]) + if intersections := edge.Src.Box.Intersections(segment); len(intersections) > 0 { + start = intersections[0] + startIndex = i - 1 + } + + if intersections := edge.Dst.Box.Intersections(segment); len(intersections) > 0 { + end = intersections[0] + endIndex = i + break + } + } + + srcShape := shape.NewShape(d2target.DSL_SHAPE_TO_SHAPE_TYPE[strings.ToLower(edge.Src.Attributes.Shape.Value)], edge.Src.Box) + dstShape := shape.NewShape(d2target.DSL_SHAPE_TO_SHAPE_TYPE[strings.ToLower(edge.Dst.Attributes.Shape.Value)], edge.Dst.Box) + + // trace the edge to the specific shape's border + points[startIndex] = shape.TraceToShapeBorder(srcShape, start, points[startIndex+1]) + points[endIndex] = shape.TraceToShapeBorder(dstShape, end, points[endIndex-1]) + points = points[startIndex : endIndex+1] + + // build a curved path from the dagre route + vectors := make([]geo.Vector, 0, len(points)-1) + for i := 1; i < len(points); i++ { + vectors = append(vectors, points[i-1].VectorTo(points[i])) + } + + path := make([]*geo.Point, 0) + path = append(path, points[0]) + path = append(path, points[0].AddVector(vectors[0].Multiply(.8))) + for i := 1; i < len(vectors)-2; i++ { + p := points[i] + v := vectors[i] + path = append(path, p.AddVector(v.Multiply(.2))) + path = append(path, p.AddVector(v.Multiply(.5))) + path = append(path, p.AddVector(v.Multiply(.8))) + } + path = append(path, points[len(points)-2].AddVector(vectors[len(vectors)-1].Multiply(.2))) + path = append(path, points[len(points)-1]) + + edge.IsCurve = true + edge.Route = path + // compile needs to assign edge label positions + if edge.Attributes.Label.Value != "" { + edge.LabelPosition = go2.Pointer(string(label.InsideMiddleCenter)) + } + } + + return nil +} + +func setGraphAttrs(attrs dagreGraphAttrs) string { + return fmt.Sprintf(`g.setGraph({ + ranksep: %d, + edgesep: %d, + nodesep: %d, + rankdir: "%s", +}); +`, + attrs.ranksep, + attrs.edgesep, + attrs.nodesep, + attrs.rankdir, + ) +} + +func generateAddNodeLine(id, label string, width, height int) string { + return fmt.Sprintf("g.setNode(`%s`, { label: `%s`, width: %d, height: %d });\n", id, label, width, height) +} + +func generateAddParentLine(childID, parentID string) string { + return fmt.Sprintf("g.setParent(`%s`, `%s`);\n", childID, parentID) +} + +func generateAddEdgeLine(fromID, toID, edgeID, label string) string { + // in dagre v is from, w is to, name is to uniquely identify + return fmt.Sprintf("g.setEdge({v:`%s`, w:`%s`, name:`%s`, label:`%s`});\n", fromID, toID, edgeID, label) +} diff --git a/d2layouts/d2dagrelayout/setup.js b/d2layouts/d2dagrelayout/setup.js new file mode 100644 index 000000000..300901e77 --- /dev/null +++ b/d2layouts/d2dagrelayout/setup.js @@ -0,0 +1,7 @@ +var g = new dagre.graphlib.Graph({ compound: true, multigraph: true }); +g.setDefaultNodeLabel(function () { + return {}; +}); +g.setDefaultEdgeLabel(function () { + return {}; +}); diff --git a/d2oracle/edit.go b/d2oracle/edit.go new file mode 100644 index 000000000..5e943056e --- /dev/null +++ b/d2oracle/edit.go @@ -0,0 +1,2102 @@ +package d2oracle + +import ( + "errors" + "fmt" + "strconv" + "strings" + "unicode" + + "oss.terrastruct.com/xdefer" + + "oss.terrastruct.com/xrand" + + "oss.terrastruct.com/d2/d2ast" + "oss.terrastruct.com/d2/d2compiler" + "oss.terrastruct.com/d2/d2format" + "oss.terrastruct.com/d2/d2graph" + "oss.terrastruct.com/d2/d2parser" + "oss.terrastruct.com/d2/d2target" + "oss.terrastruct.com/d2/lib/go2" +) + +func Create(g *d2graph.Graph, key string) (_ *d2graph.Graph, newKey string, err error) { + defer xdefer.Errorf(&err, "failed to create %#v", key) + + newKey, edge, err := generateUniqueKey(g, key) + if err != nil { + return nil, "", err + } + + if edge { + err = _set(g, key, nil, nil) + } else { + err = _set(g, newKey, nil, nil) + } + if err != nil { + return nil, "", err + } + g, err = recompile(g) + if err != nil { + return nil, "", err + } + return g, newKey, nil +} + +// TODO: update graph in place when compiler can accept single modifications +// TODO: go through all references to decide best spot to insert something +func Set(g *d2graph.Graph, key string, tag, value *string) (_ *d2graph.Graph, err error) { + var valueHelp string + if value == nil { + valueHelp = fmt.Sprintf("%#v", value) + } else { + valueHelp = fmt.Sprintf("%#v", *value) + } + if tag != nil { + defer xdefer.Errorf(&err, "failed to set %#v to %#v %#v", key, *tag, valueHelp) + } else { + defer xdefer.Errorf(&err, "failed to set %#v to %#v", key, valueHelp) + } + + err = _set(g, key, tag, value) + if err != nil { + return nil, err + } + + return recompile(g) +} + +func recompile(g *d2graph.Graph) (*d2graph.Graph, error) { + s := d2format.Format(g.AST) + g, err := d2compiler.Compile(g.AST.Range.Path, strings.NewReader(s), nil) + if err != nil { + return nil, fmt.Errorf("failed to recompile:\n%s\n%w", s, err) + } + return g, nil +} + +// TODO merge flat styles +func _set(g *d2graph.Graph, key string, tag, value *string) error { + if tag != nil { + if hasSpace(*tag) { + return fmt.Errorf("spaces are not allowed in blockstring tags") + } + } + + mk, err := d2parser.ParseMapKey(key) + if err != nil { + return err + } + + if len(mk.Edges) > 1 { + return errors.New("can only set one edge at a time") + } + + if value != nil { + mk.Value = d2ast.MakeValueBox(d2ast.RawString(*value, false)) + } else { + mk.Value = d2ast.ValueBox{} + } + if tag != nil && value != nil { + mk.Value = d2ast.MakeValueBox(&d2ast.BlockString{ + Tag: *tag, + Value: *value, + }) + } + + scope := g.AST + edgeTrimCommon(mk) + obj := g.Root + toSkip := 1 + + reserved := false + if mk.Key != nil { + found := true + for _, idel := range d2graph.Key(mk.Key) { + _, ok := d2graph.ReservedKeywords[idel] + if ok { + reserved = true + break + } + o, ok := obj.HasChild([]string{idel}) + if !ok { + found = false + break + } + obj = o + + if obj.Map == nil { + // If we find a deeper obj.Map we need to skip this key too. + toSkip++ + continue + } + + scope = obj.Map + mk.Key.Path = mk.Key.Path[toSkip:] + toSkip = 1 + if len(mk.Key.Path) == 0 { + mk.Key = nil + } + } + + if obj.Attributes.Label.MapKey != nil && obj.Map == nil && (!found || reserved || len(mk.Edges) > 0) { + obj.Map = &d2ast.Map{ + Range: d2ast.MakeRange(",1:0:0-1:0:0"), + } + obj.Attributes.Label.MapKey.Primary = obj.Attributes.Label.MapKey.Value.ScalarBox() + obj.Attributes.Label.MapKey.Value = d2ast.MakeValueBox(obj.Map) + scope = obj.Map + + mk.Key.Path = mk.Key.Path[toSkip-1:] + toSkip = 1 + if len(mk.Key.Path) == 0 { + mk.Key = nil + } + } + + if !found { + appendMapKey(scope, mk) + return nil + } + } + + attrs := obj.Attributes + if len(mk.Edges) == 1 { + if mk.EdgeIndex == nil { + appendMapKey(scope, mk) + return nil + } + edge, ok := obj.HasEdge(mk) + if !ok { + return errors.New("edge not found") + } + onlyInChain := true + for _, ref := range edge.References { + // TODO merge flat edgekeys + // E.g. this can group into a map + // (y -> z)[0].style.opacity: 0.4 + // (y -> z)[0].style.animated: true + if len(ref.MapKey.Edges) == 1 && ref.MapKey.EdgeIndex == nil { + onlyInChain = false + break + } + } + if onlyInChain { + appendMapKey(scope, mk) + return nil + } + attrs = edge.Attributes + + if mk.EdgeKey != nil { + if _, ok := d2graph.ReservedKeywords[mk.EdgeKey.Path[0].Unbox().ScalarString()]; !ok { + return errors.New("edge key must be reserved") + } + reserved = true + + toSkip = 1 + mk = &d2ast.Key{ + Key: cloneKey(mk.EdgeKey), + Value: mk.Value, + } + + foundMap := false + for _, ref := range edge.References { + // TODO get the most nested one + if ref.MapKey.Value.Map != nil { + foundMap = true + scope = ref.MapKey.Value.Map + // TODO when edges can have more fields, search for style + if len(scope.Nodes) == 1 && scope.Nodes[0].MapKey.Value.Map != nil { + scope = scope.Nodes[0].MapKey.Value.Map + mk.Key.Path = mk.Key.Path[1:] + } + break + } + } + if !foundMap && attrs.Label.MapKey != nil { + attrs.Label.MapKey.Primary = attrs.Label.MapKey.Value.ScalarBox() + edgeMap := &d2ast.Map{ + Range: d2ast.MakeRange(",1:0:0-1:0:0"), + } + attrs.Label.MapKey.Value = d2ast.MakeValueBox(edgeMap) + scope = edgeMap + } + } + } + + if reserved { + reservedIndex := toSkip - 1 + if mk.Key != nil && len(mk.Key.Path) > 0 { + switch mk.Key.Path[reservedIndex].Unbox().ScalarString() { + case "shape": + if attrs.Shape.MapKey != nil { + attrs.Shape.MapKey.SetScalar(mk.Value.ScalarBox()) + return nil + } + case "style": + if len(mk.Key.Path[reservedIndex:]) != 2 { + return errors.New("malformed style setting, expected 2 part path") + } + switch mk.Key.Path[reservedIndex+1].Unbox().ScalarString() { + case "opacity": + if attrs.Style.Opacity != nil { + attrs.Style.Opacity.MapKey.SetScalar(mk.Value.ScalarBox()) + return nil + } + case "stroke": + if attrs.Style.Stroke != nil { + attrs.Style.Stroke.MapKey.SetScalar(mk.Value.ScalarBox()) + return nil + } + case "fill": + if attrs.Style.Fill != nil { + attrs.Style.Fill.MapKey.SetScalar(mk.Value.ScalarBox()) + return nil + } + case "stroke-width": + if attrs.Style.StrokeWidth != nil { + attrs.Style.StrokeWidth.MapKey.SetScalar(mk.Value.ScalarBox()) + return nil + } + case "stroke-dash": + if attrs.Style.StrokeDash != nil { + attrs.Style.StrokeDash.MapKey.SetScalar(mk.Value.ScalarBox()) + return nil + } + case "border-radius": + if attrs.Style.BorderRadius != nil { + attrs.Style.BorderRadius.MapKey.SetScalar(mk.Value.ScalarBox()) + return nil + } + case "shadow": + if attrs.Style.Shadow != nil { + attrs.Style.Shadow.MapKey.SetScalar(mk.Value.ScalarBox()) + return nil + } + case "3d": + if attrs.Style.ThreeDee != nil { + attrs.Style.ThreeDee.MapKey.SetScalar(mk.Value.ScalarBox()) + return nil + } + case "multiple": + if attrs.Style.Multiple != nil { + attrs.Style.Multiple.MapKey.SetScalar(mk.Value.ScalarBox()) + return nil + } + case "font": + if attrs.Style.Font != nil { + attrs.Style.Font.MapKey.SetScalar(mk.Value.ScalarBox()) + return nil + } + case "font-size": + if attrs.Style.FontSize != nil { + attrs.Style.FontSize.MapKey.SetScalar(mk.Value.ScalarBox()) + return nil + } + case "font-color": + if attrs.Style.FontColor != nil { + attrs.Style.FontColor.MapKey.SetScalar(mk.Value.ScalarBox()) + return nil + } + case "animated": + if attrs.Style.Animated != nil { + attrs.Style.Animated.MapKey.SetScalar(mk.Value.ScalarBox()) + return nil + } + case "bold": + if attrs.Style.Bold != nil { + attrs.Style.Bold.MapKey.SetScalar(mk.Value.ScalarBox()) + return nil + } + case "italic": + if attrs.Style.Italic != nil { + attrs.Style.Italic.MapKey.SetScalar(mk.Value.ScalarBox()) + return nil + } + case "underline": + if attrs.Style.Underline != nil { + attrs.Style.Underline.MapKey.SetScalar(mk.Value.ScalarBox()) + return nil + } + } + case "label": + if attrs.Label.MapKey != nil { + attrs.Label.MapKey.SetScalar(mk.Value.ScalarBox()) + return nil + } + } + } + } else if attrs.Label.MapKey != nil { + attrs.Label.MapKey.SetScalar(mk.Value.ScalarBox()) + return nil + } + appendMapKey(scope, mk) + return nil +} + +func appendUniqueMapKey(m *d2ast.Map, mk *d2ast.Key) { + for _, n := range m.Nodes { + if n.MapKey != nil && n.MapKey.Equals(mk) { + return + } + } + appendMapKey(m, mk) +} + +func appendMapKey(m *d2ast.Map, mk *d2ast.Key) { + m.Nodes = append(m.Nodes, d2ast.MapNodeBox{ + MapKey: mk, + }) + if len(m.Nodes) == 1 && + mk.Key != nil && + len(mk.Key.Path) > 0 { + _, ok := d2graph.ReservedKeywords[mk.Key.Path[0].Unbox().ScalarString()] + if ok { + // Allow one line reserved key (like shape) maps. + // TODO: This needs to be smarter as certain keys are only reserved in context. + // e.g. all keys under style are reserved. And constraint is only reserved + // under sql_table shapes. + return + } + } + if !m.IsFileMap() && m.Range.OneLine() { + // This doesn't require any shenanigans to prevent consuming sibling spacing because + // d2format will use the mapkey's range to determine whether to insert extra newlines. + // See TestCreate/make_scope_multiline_spacing_2 + m.Range.End.Line++ + } +} + +func Delete(g *d2graph.Graph, key string) (_ *d2graph.Graph, err error) { + defer xdefer.Errorf(&err, "failed to delete %#v", key) + + mk, err := d2parser.ParseMapKey(key) + if err != nil { + return nil, err + } + + if len(mk.Edges) > 1 { + return nil, errors.New("can only delete one edge at a time") + } + + if len(mk.Edges) == 1 { + edgeTrimCommon(mk) + } + + g2, err := deleteReserved(g, mk) + if err != nil { + return nil, err + } + if g != g2 { + return g2, nil + } + g = g2 + + if len(mk.Edges) == 1 { + obj := g.Root + if mk.Key != nil { + var ok bool + obj, ok = g.Root.HasChild(d2graph.Key(mk.Key)) + if !ok { + return g, nil + } + } + e, ok := obj.HasEdge(mk) + if !ok { + return g, nil + } + + ref := e.References[0] + var refEdges []*d2ast.Edge + for _, ref := range e.References { + refEdges = append(refEdges, ref.Edge) + } + ensureNode(g, refEdges, ref.ScopeObj, ref.Scope, ref.MapKey, ref.MapKey.Edges[ref.MapKeyEdgeIndex].Src, true) + ensureNode(g, refEdges, ref.ScopeObj, ref.Scope, ref.MapKey, ref.MapKey.Edges[ref.MapKeyEdgeIndex].Dst, false) + + for i := len(e.References) - 1; i >= 0; i-- { + ref := e.References[i] + deleteEdge(g, ref.Scope, ref.MapKey, ref.MapKeyEdgeIndex) + } + + edges, ok := obj.FindEdges(mk) + if ok { + for _, e2 := range edges { + if e2.Index <= e.Index { + continue + } + for i := len(e2.References) - 1; i >= 0; i-- { + ref := e2.References[i] + if ref.MapKey.EdgeIndex != nil { + *ref.MapKey.EdgeIndex.Int-- + } + } + } + } + return recompile(g) + } + + prevG, _ := recompile(g) + + g, err = renameConflictsToParent(g, mk.Key) + if err != nil { + return nil, err + } + + obj, ok := g.Root.HasChild(d2graph.Key(mk.Key)) + if !ok { + return g, nil + } + + g, err = deleteObject(g, mk.Key, obj) + if err != nil { + return nil, err + } + + if err := updateNear(prevG, g, &key, nil); err != nil { + return nil, err + } + + return recompile(g) +} + +func bumpChildrenUnderscores(m *d2ast.Map) { + for _, n := range m.Nodes { + if n.MapKey == nil { + continue + } + if n.MapKey.Key != nil { + if n.MapKey.Key.Path[0].Unbox().ScalarString() == "_" { + n.MapKey.Key.Path = n.MapKey.Key.Path[1:] + } + } + for _, e := range n.MapKey.Edges { + if e.Src.Path[0].Unbox().ScalarString() == "_" { + e.Src.Path = e.Src.Path[1:] + } + if e.Dst.Path[0].Unbox().ScalarString() == "_" { + e.Dst.Path = e.Dst.Path[1:] + } + } + if n.MapKey.Value.Map != nil { + bumpChildrenUnderscores(n.MapKey.Value.Map) + } + } +} + +func hoistRefChildren(g *d2graph.Graph, key *d2ast.KeyPath, ref d2graph.Reference) { + if ref.MapKey.Value.Map == nil { + return + } + + bumpChildrenUnderscores(ref.MapKey.Value.Map) + scopeKey, scope := findNearestParentScope(g, key) + for i := 0; i < len(ref.MapKey.Value.Map.Nodes); i++ { + n := ref.MapKey.Value.Map.Nodes[i] + if n.MapKey == nil { + continue + } + if n.MapKey.Key != nil { + _, ok := d2graph.ReservedKeywords[n.MapKey.Key.Path[0].Unbox().ScalarString()] + if ok { + continue + } + } + scopeKey := cloneKey(scopeKey) + scopeKey.Path = scopeKey.Path[:len(scopeKey.Path)-1] + if n.MapKey.Key != nil { + scopeKey.Path = append(scopeKey.Path, n.MapKey.Key.Path...) + } + if len(scopeKey.Path) > 0 { + n.MapKey.Key = scopeKey + } + scope.InsertBefore(ref.MapKey, n.Unbox()) + } +} + +// renameConflictsToParent renames would-be ID conflicts. +func renameConflictsToParent(g *d2graph.Graph, key *d2ast.KeyPath) (*d2graph.Graph, error) { + obj, ok := g.Root.HasChild(d2graph.Key(key)) + if !ok { + return g, nil + } + if obj.Attributes.Shape.Value == d2target.ShapeSQLTable || obj.Attributes.Shape.Value == d2target.ShapeClass { + return g, nil + } + + dedupedRenames := map[string]struct{}{} + for _, ref := range obj.References { + var absKeys []*d2ast.KeyPath + + if len(ref.Key.Path)-1 == ref.KeyPathIndex { + if ref.MapKey.Value.Map == nil { + continue + } + var mapKeys []*d2ast.KeyPath + for _, n := range ref.MapKey.Value.Map.Nodes { + if n.MapKey == nil { + continue + } + if n.MapKey.Key != nil { + _, ok := d2graph.ReservedKeywords[n.MapKey.Key.Path[0].Unbox().ScalarString()] + if ok { + continue + } + mapKeys = append(mapKeys, n.MapKey.Key) + } + for _, e := range n.MapKey.Edges { + mapKeys = append(mapKeys, e.Src) + mapKeys = append(mapKeys, e.Dst) + } + } + for _, k := range mapKeys { + absKey, err := d2parser.ParseKey(ref.ScopeObj.AbsID()) + if err != nil { + absKey = &d2ast.KeyPath{} + } + absKey.Path = append(absKey.Path, ref.Key.Path...) + absKey.Path = append(absKey.Path, k.Path[0]) + absKeys = append(absKeys, absKey) + } + } else if _, ok := d2graph.ReservedKeywords[ref.Key.Path[len(ref.Key.Path)-1].Unbox().ScalarString()]; !ok { + absKey, err := d2parser.ParseKey(ref.ScopeObj.AbsID()) + if err != nil { + absKey = &d2ast.KeyPath{} + } + absKey.Path = append(absKey.Path, ref.Key.Path[:ref.KeyPathIndex+2]...) + absKeys = append(absKeys, absKey) + } + + for _, absKey := range absKeys { + ida := d2graph.Key(absKey) + absKeyStr := strings.Join(ida, ".") + if _, ok := dedupedRenames[absKeyStr]; ok { + continue + } + dedupedRenames[absKeyStr] = struct{}{} + // Do not consider the parent for conflicts, assume the parent will be deleted + if ida[len(ida)-1] == ida[len(ida)-2] { + continue + } + + hoistedAbsKey, err := d2parser.ParseKey(ref.ScopeObj.AbsID()) + if err != nil { + hoistedAbsKey = &d2ast.KeyPath{} + } + hoistedAbsKey.Path = append(hoistedAbsKey.Path, ref.Key.Path[:ref.KeyPathIndex]...) + hoistedAbsKey.Path = append(hoistedAbsKey.Path, absKey.Path[len(absKey.Path)-1]) + + uniqueKeyStr, _, err := generateUniqueKey(g, strings.Join(d2graph.Key(hoistedAbsKey), ".")) + if err != nil { + return nil, err + } + uniqueKey, err := d2parser.ParseKey(uniqueKeyStr) + if err != nil { + return nil, err + } + + renamedKey := cloneKey(absKey) + renamedKey.Path[len(renamedKey.Path)-1].Unbox().SetString(uniqueKey.Path[len(uniqueKey.Path)-1].Unbox().ScalarString()) + + renamedKeyStr := strings.Join(d2graph.Key(renamedKey), ".") + if absKeyStr != renamedKeyStr { + g, err = move(g, absKeyStr, renamedKeyStr) + if err != nil { + return nil, err + } + } + } + } + return g, nil +} + +func deleteReserved(g *d2graph.Graph, mk *d2ast.Key) (*d2graph.Graph, error) { + targetKey := mk.Key + if len(mk.Edges) == 1 { + if mk.EdgeKey == nil { + return g, nil + } + targetKey = mk.EdgeKey + } + _, ok := d2graph.ReservedKeywords[targetKey.Path[len(targetKey.Path)-1].Unbox().ScalarString()] + if !ok { + return g, nil + } + + var e *d2graph.Edge + obj := g.Root + if len(mk.Edges) == 1 { + if mk.Key != nil { + var ok bool + obj, ok = g.Root.HasChild(d2graph.Key(mk.Key)) + if !ok { + return g, nil + } + } + e, ok = obj.HasEdge(mk) + if !ok { + return g, nil + } + + if err := deleteEdgeField(g, e, targetKey.Path[len(targetKey.Path)-1].Unbox().ScalarString()); err != nil { + return nil, err + } + return recompile(g) + } + + isStyleKey := false + for _, id := range d2graph.Key(targetKey) { + _, ok := d2graph.ReservedKeywords[id] + if ok { + if id == "style" { + isStyleKey = true + continue + } + if isStyleKey { + err := deleteObjField(g, obj, id) + if err != nil { + return nil, err + } + } + + if id == "near" || + id == "tooltip" || + id == "icon" || + id == "link" { + err := deleteObjField(g, obj, id) + if err != nil { + return nil, err + } + } + break + } + obj, ok = obj.HasChild([]string{id}) + if !ok { + return nil, fmt.Errorf("object not found") + } + } + + return recompile(g) +} + +func deleteMapField(m *d2ast.Map, field string) { + for i := 0; i < len(m.Nodes); i++ { + n := m.Nodes[i] + if n.MapKey != nil && n.MapKey.Key != nil { + if n.MapKey.Key.Path[0].Unbox().ScalarString() == field { + deleteFromMap(m, n.MapKey) + } else if n.MapKey.Key.Path[0].Unbox().ScalarString() == "style" { + if n.MapKey.Value.Map != nil { + deleteMapField(n.MapKey.Value.Map, field) + if len(n.MapKey.Value.Map.Nodes) == 0 { + deleteFromMap(m, n.MapKey) + } + } else if len(n.MapKey.Key.Path) == 2 && n.MapKey.Key.Path[1].Unbox().ScalarString() == field { + deleteFromMap(m, n.MapKey) + } + } + } + } +} + +func deleteEdgeField(g *d2graph.Graph, e *d2graph.Edge, field string) error { + for _, ref := range e.References { + // Edge chains can't have fields + if len(ref.MapKey.Edges) > 1 { + continue + } + if ref.MapKey.Value.Map != nil { + deleteMapField(ref.MapKey.Value.Map, field) + } else if ref.MapKey.EdgeKey != nil && ref.MapKey.EdgeKey.Path[len(ref.MapKey.EdgeKey.Path)-1].Unbox().ScalarString() == field { + // It's always safe to delete, since edge references must coexist with edge definition elsewhere + deleteFromMap(ref.Scope, ref.MapKey) + } + } + return nil +} + +func deleteObjField(g *d2graph.Graph, obj *d2graph.Object, field string) error { + objK, err := d2parser.ParseKey(obj.AbsID()) + if err != nil { + return err + } + objGK := d2graph.Key(objK) + for _, ref := range obj.References { + if ref.InEdge() { + continue + } + if ref.MapKey.Value.Map != nil { + deleteMapField(ref.MapKey.Value.Map, field) + } else if (len(ref.Key.Path) >= 2 && + ref.Key.Path[len(ref.Key.Path)-1].Unbox().ScalarString() == field && + ref.Key.Path[len(ref.Key.Path)-2].Unbox().ScalarString() == obj.ID) || + (len(ref.Key.Path) >= 3 && + ref.Key.Path[len(ref.Key.Path)-1].Unbox().ScalarString() == field && + ref.Key.Path[len(ref.Key.Path)-2].Unbox().ScalarString() == "style" && + ref.Key.Path[len(ref.Key.Path)-3].Unbox().ScalarString() == obj.ID) { + tmpNodes := make([]d2ast.MapNodeBox, len(ref.Scope.Nodes)) + copy(tmpNodes, ref.Scope.Nodes) + // If I delete this, will the object still exist? + deleteFromMap(ref.Scope, ref.MapKey) + g2, err := recompile(g) + if err != nil { + return err + } + if _, ok := g2.Root.HasChild(objGK); !ok { + // Nope, so can't delete it, just remove the field then + ref.Scope.Nodes = tmpNodes + ref.MapKey.Value = d2ast.ValueBox{} + ref.Key.Path = ref.Key.Path[:ref.KeyPathIndex+1] + } + + } + } + return nil +} + +func deleteObject(g *d2graph.Graph, key *d2ast.KeyPath, obj *d2graph.Object) (*d2graph.Graph, error) { + var refEdges []*d2ast.Edge + for _, ref := range obj.References { + if ref.InEdge() { + refEdges = append(refEdges, ref.MapKey.Edges[ref.MapKeyEdgeIndex]) + } + } + + for i := len(obj.References) - 1; i >= 0; i-- { + ref := obj.References[i] + + if len(ref.MapKey.Edges) == 0 { + isSuffix := ref.KeyPathIndex == len(ref.Key.Path)-1 + ref.Key.Path = append(ref.Key.Path[:ref.KeyPathIndex], ref.Key.Path[ref.KeyPathIndex+1:]...) + withoutReserved := go2.Filter(ref.Key.Path, func(x *d2ast.StringBox) bool { + _, ok := d2graph.ReservedKeywords[x.Unbox().ScalarString()] + return !ok + }) + if obj.Attributes.Shape.Value == d2target.ShapeSQLTable || obj.Attributes.Shape.Value == d2target.ShapeClass { + ref.MapKey.Value.Map = nil + } else if len(withoutReserved) == 0 { + hoistRefChildren(g, key, ref) + deleteFromMap(ref.Scope, ref.MapKey) + } else if ref.MapKey.Value.Unbox() == nil && + obj.Parent != nil && + isSuffix && + len(obj.Parent.References) > 1 { + // Redundant key. + deleteFromMap(ref.Scope, ref.MapKey) + } else if ref.MapKey.Value.Map != nil { + for i := 0; i < len(ref.MapKey.Value.Map.Nodes); i++ { + n := ref.MapKey.Value.Map.Nodes[i] + if n.MapKey != nil && n.MapKey.Key != nil { + _, ok := d2graph.ReservedKeywords[n.MapKey.Key.Path[0].Unbox().ScalarString()] + if ok { + deleteFromMap(ref.MapKey.Value.Map, n.MapKey) + i-- + continue + } + } + } + } + } else if ref.InEdge() { + edge := ref.MapKey.Edges[ref.MapKeyEdgeIndex] + + if obj.Attributes.Shape.Value == d2target.ShapeSQLTable || obj.Attributes.Shape.Value == d2target.ShapeClass { + if ref.MapKeyEdgeDest() { + ensureNode(g, refEdges, ref.ScopeObj, ref.Scope, ref.MapKey, edge.Src, true) + } else { + ensureNode(g, refEdges, ref.ScopeObj, ref.Scope, ref.MapKey, edge.Dst, false) + } + deleteEdge(g, ref.Scope, ref.MapKey, ref.MapKeyEdgeIndex) + } else if ref.KeyPathIndex == len(ref.Key.Path)-1 { + if ref.MapKeyEdgeDest() { + ensureNode(g, refEdges, ref.ScopeObj, ref.Scope, ref.MapKey, edge.Src, true) + } else { + ensureNode(g, refEdges, ref.ScopeObj, ref.Scope, ref.MapKey, edge.Dst, false) + } + deleteEdge(g, ref.Scope, ref.MapKey, ref.MapKeyEdgeIndex) + } else { + ref.Key.Path = append(ref.Key.Path[:ref.KeyPathIndex], ref.Key.Path[ref.KeyPathIndex+1:]...) + + // Skip visiting the same middle key in an edge chain + if !ref.MapKeyEdgeDest() && i > 0 { + nextRef := obj.References[i-1] + if nextRef.InEdge() && nextRef.MapKey == ref.MapKey { + i-- + } + } + } + } else { + // MapKey.Key with edge. + ref.Key.Path = append(ref.Key.Path[:ref.KeyPathIndex], ref.Key.Path[ref.KeyPathIndex+1:]...) + if len(ref.Key.Path) == 0 { + ref.MapKey.Key = nil + } + } + } + + return g, nil +} + +func findNearestParentScope(g *d2graph.Graph, k *d2ast.KeyPath) (prefix *d2ast.KeyPath, _ *d2ast.Map) { + for i := 1; i < len(k.Path); i++ { + scopeKey := cloneKey(k) + scopeKey.Path = scopeKey.Path[:len(k.Path)-i] + obj, ok := g.Root.HasChild(d2graph.Key(scopeKey)) + if ok && obj.Map != nil { + prefix := cloneKey(k) + prefix.Path = prefix.Path[len(k.Path)-i:] + return prefix, obj.Map + } + } + return k, g.AST +} + +func deleteEdge(g *d2graph.Graph, scope *d2ast.Map, mk *d2ast.Key, i int) { + edgesAfter := mk.Edges[i+1:] + mk.Edges = mk.Edges[:i] + + for _, obj := range g.Objects { + for j := range obj.References { + ref := obj.References[j] + if ref.InEdge() { + if ref.MapKey == mk && ref.MapKeyEdgeIndex >= i { + obj.References[j].MapKeyEdgeIndex -= i + } + } + } + } + + if len(edgesAfter) > 0 { + tmp := *mk + mk2 := &tmp + mk2.Edges = edgesAfter + scope.InsertAfter(mk, mk2) + } + if len(mk.Edges) == 0 { + deleteFromMap(scope, mk) + } +} + +func ensureNode(g *d2graph.Graph, excludedEdges []*d2ast.Edge, scopeObj *d2graph.Object, scope *d2ast.Map, cursor *d2ast.Key, k *d2ast.KeyPath, before bool) { + if k == nil || len(k.Path) == 0 { + return + } + if cursor.Key != nil && len(cursor.Key.Path) > 0 { + k = cloneKey(k) + k.Path = append(cursor.Key.Path, k.Path...) + } + + obj, ok := scopeObj.HasChild(d2graph.Key(k)) + if ok { + // If this key only exists as part of excludedEdges (edges that'll be deleted), we need to make a new one + hasPersistingRef := false + for _, ref := range obj.References { + if !ref.InEdge() { + hasPersistingRef = true + break + } + if len(ref.MapKey.Edges) == 0 { + continue + } + if !go2.Contains(excludedEdges, ref.MapKey.Edges[ref.MapKeyEdgeIndex]) { + hasPersistingRef = true + break + } + } + if hasPersistingRef { + return + } + } + mk := &d2ast.Key{ + Key: k, + } + + for _, n := range scope.Nodes { + if n.MapKey != nil && n.MapKey.Equals(mk) { + return + } + } + + if before { + scope.InsertBefore(cursor, mk) + } else { + scope.InsertAfter(cursor, mk) + } +} + +func Rename(g *d2graph.Graph, key, newName string) (_ *d2graph.Graph, err error) { + defer xdefer.Errorf(&err, "failed to rename %#v to %#v", key, newName) + + mk, err := d2parser.ParseMapKey(key) + if err != nil { + return nil, err + } + + if len(mk.Edges) > 0 && mk.EdgeKey == nil { + // TODO: Not a fan of this dual interpretation depending on mk.Edges. + // Maybe we remove Rename and just have Move. + mk2, err := d2parser.ParseMapKey(newName) + if err != nil { + return nil, err + } + + mk2.Key = mk.Key + mk = mk2 + } else { + _, ok := d2graph.ReservedKeywords[newName] + if ok { + return nil, fmt.Errorf("cannot rename to reserved keyword: %#v", newName) + } + // TODO: Handle mk.EdgeKey + mk.Key.Path[len(mk.Key.Path)-1] = d2ast.MakeValueBox(d2ast.RawString(newName, true)).StringBox() + } + + return move(g, key, d2format.Format(mk)) +} + +func trimReservedSuffix(path []*d2ast.StringBox) []*d2ast.StringBox { + for i, p := range path { + if _, ok := d2graph.ReservedKeywords[p.Unbox().ScalarString()]; ok { + return path[:i] + } + } + return path +} + +// Does not handle edge keys, on account of edge keys can only be reserved, e.g. (a->b).style.color: red +func Move(g *d2graph.Graph, key, newKey string) (_ *d2graph.Graph, err error) { + defer xdefer.Errorf(&err, "failed to move: %#v to %#v", key, newKey) + return move(g, key, newKey) +} + +func move(g *d2graph.Graph, key, newKey string) (*d2graph.Graph, error) { + if key == newKey { + return g, nil + } + newKey, _, err := generateUniqueKey(g, newKey) + if err != nil { + return nil, err + } + + mk, err := d2parser.ParseMapKey(key) + if err != nil { + return nil, err + } + + mk2, err := d2parser.ParseMapKey(newKey) + if err != nil { + return nil, err + } + edgeTrimCommon(mk) + edgeTrimCommon(mk2) + if len(mk.Edges) > 0 && mk.EdgeKey == nil { + if d2format.Format(mk.Key) != d2format.Format(mk2.Key) { + // TODO just prevent moving edges at all + return nil, errors.New("moving across scopes isn't supported for edges") + } + obj := g.Root + if mk.Key != nil { + var ok bool + obj, ok = g.Root.HasChild(d2graph.Key(mk.Key)) + if !ok { + return nil, fmt.Errorf("edge referenced by from does not exist") + } + } + e, ok := obj.HasEdge(mk) + if !ok { + return nil, fmt.Errorf("edge referenced by to does not exist") + } + _, ok = obj.HasEdge(mk2) + if ok { + return nil, fmt.Errorf("to edge already exists") + } + + for i := len(e.References) - 1; i >= 0; i-- { + ref := e.References[i] + ref.MapKey.Edges[ref.MapKeyEdgeIndex].SrcArrow = mk2.Edges[0].SrcArrow + ref.MapKey.Edges[ref.MapKeyEdgeIndex].DstArrow = mk2.Edges[0].DstArrow + } + return recompile(g) + } + + prevG, _ := recompile(g) + + ak := d2graph.Key(mk.Key) + ak2 := d2graph.Key(mk2.Key) + + isCrossScope := strings.Join(ak[:len(ak)-1], ".") != strings.Join(ak2[:len(ak2)-1], ".") + + if isCrossScope { + g, err = renameConflictsToParent(g, mk.Key) + if err != nil { + return nil, err + } + } + + obj, ok := g.Root.HasChild(ak) + if !ok { + return nil, fmt.Errorf("key referenced by from does not exist") + } + + toParent := g.Root + if isCrossScope && len(ak2) > 1 { + toParent, ok = g.Root.HasChild(ak2[:len(ak2)-1]) + if !ok { + return nil, fmt.Errorf("key referenced by to parent does not exist") + } + } + + // Cross-scope move: + // 1. Ensure parent node exists as a Key + // 2. Ensure parent node Key has a map to accept moved node + // 3. Rename + // 4. Update all Key references + // 5. Update all Edge references + + // 1. Ensure parent node exists as a Key + // The toParent may only exist as an implicit, edge-created node + // + // For example, d.e here + // a.b.c -> d.e.f + // MOVE(a.b, d.e.q) + // We can't open d.e as a map, so we need to create a new key + + // If the key targeted exists only as implicit edge creation, e.g. the b in `a.b -> ...`, + // then we'll be able to move it anywhere by changing that key, e.g. `_._.c.x -> ...` + // Otherwise, we'll need to make sure the parent exists as a map to move into + needsLandingMap := false + if isCrossScope { + for _, ref := range obj.References { + if !ref.InEdge() { + needsLandingMap = true + break + } + if ref.KeyPathIndex != len(ref.Key.Path)-1 { + needsLandingMap = true + break + } + } + } + if isCrossScope && len(ak2) > 1 && needsLandingMap { + parentExistsAsKey := false + for _, ref := range toParent.References { + if len(ref.MapKey.Edges) == 0 { + parentExistsAsKey = true + break + } + } + if !parentExistsAsKey { + // Choose the most nested edge as cursor for this new node + var mostNestedRef d2graph.Reference + for _, ref := range toParent.References { + if mostNestedRef == (d2graph.Reference{}) || len(ref.ScopeObj.AbsIDArray()) > len(mostNestedRef.ScopeObj.AbsIDArray()) { + mostNestedRef = ref + } + } + detachedMK := &d2ast.Key{ + Key: cloneKey(mostNestedRef.MapKey.Key), + } + detachedMK.Key.Path = mostNestedRef.Key.Path[:mostNestedRef.KeyPathIndex+1] + detachedMK.Range = d2ast.MakeRange(",1:0:0-1:0:0") + mostNestedRef.Scope.InsertAfter(mostNestedRef.MapKey, detachedMK) + + mostNestedRef.ScopeObj.AppendReferences(d2graph.Key(detachedMK.Key), d2graph.Reference{ + Key: detachedMK.Key, + MapKey: detachedMK, + Scope: mostNestedRef.Scope, + }, mostNestedRef.UnresolvedScopeObj) + } + } + + // 2. Ensure parent node Key has a map to accept moved node. + // This map will be what MOVE will append the new key to + toScope := g.AST + if isCrossScope && len(ak2) > 1 && needsLandingMap { + mostNestedParentRefs := getMostNestedRefs(toParent) + mapExists := false + for _, ref := range mostNestedParentRefs { + if ref.KeyPathIndex == len(ref.Key.Path)-1 && ref.MapKey.Value.Map != nil { + toScope = ref.MapKey.Value.Map + mapExists = true + break + } + } + + if !mapExists { + toScope = &d2ast.Map{ + Range: d2ast.MakeRange(",1:0:0-1:0:0"), + } + + ref := mostNestedParentRefs[len(mostNestedParentRefs)-1] + // Parent node key exists as part of a flat key, need to split up + if ref.KeyPathIndex < len(ref.Key.Path)-1 { + detachedMK := &d2ast.Key{ + Key: cloneKey(ref.MapKey.Key), + } + detachedMK.Value = ref.MapKey.Value + detachedMK.Key.Path = ref.Key.Path[ref.KeyPathIndex+1:] + detachedMK.Range = d2ast.MakeRange(",1:0:0-1:0:0") + + ref.Key.Path = ref.Key.Path[:ref.KeyPathIndex+1] + appendUniqueMapKey(toScope, detachedMK) + } else { + ref.MapKey.Primary = ref.MapKey.Value.ScalarBox() + } + ref.MapKey.Value = d2ast.MakeValueBox(toScope) + } + } + mostNestedRefs := getMostNestedRefs(obj) + for _, ref := range obj.References { + isExplicit := ref.KeyPathIndex == len(trimReservedSuffix(ref.Key.Path))-1 && ref.MapKey.Value.Map == nil + + // 3. Rename + if ak[len(ak)-1] != ak2[len(ak2)-1] { + ref.Key.Path[ref.KeyPathIndex] = d2ast.MakeValueBox(d2ast.RawString( + mk2.Key.Path[len(mk2.Key.Path)-1].Unbox().ScalarString(), + true, + )).StringBox() + } + + // 4. Update all Key references + if len(ref.MapKey.Edges) != 0 { + continue + } + + ida := d2graph.Key(ref.Key) + resolvedObj, resolvedIDA, err := d2graph.ResolveUnderscoreKey(ida, obj) + if err != nil { + return nil, err + } + if resolvedObj != obj { + ida = resolvedIDA + } + ida = go2.Filter(ida, func(x string) bool { + _, ok := d2graph.ReservedKeywords[x] + return !ok + }) + + // There are 3 cases of what we want to do with Key references in cross scope + // 1. Transplant. Remove from its current scope, plop it into new scope + // -- The ref key is the key being moved + // 2. Split. One node remains, while another gets added to new scope + // -- The ref key is a flat map with more than just the key being moved + // 3. Extend. + // -- The key is moving from its current scope into a more nested scope + // 4. Slice. + // -- The key is moving from its current scope out to a less nested scope + if isCrossScope { + if len(ida) == 1 { + // 1. Transplant + absKey, err := d2parser.ParseKey(ref.ScopeObj.AbsID()) + if err != nil { + absKey = &d2ast.KeyPath{} + } + absKey.Path = append(absKey.Path, ref.Key.Path...) + hoistRefChildren(g, absKey, ref) + deleteFromMap(ref.Scope, ref.MapKey) + detachedMK := &d2ast.Key{Primary: ref.MapKey.Primary, Key: cloneKey(ref.MapKey.Key)} + detachedMK.Key.Path = go2.Filter(detachedMK.Key.Path, func(x *d2ast.StringBox) bool { + return x.Unbox().ScalarString() != "_" + }) + detachedMK.Value = ref.MapKey.Value + if ref.MapKey != nil && ref.MapKey.Value.Map != nil { + detachedMK.Value.Map = &d2ast.Map{ + Range: ref.MapKey.Value.Map.Range, + } + for _, n := range ref.MapKey.Value.Map.Nodes { + if n.MapKey == nil { + continue + } + if n.MapKey.Key != nil { + _, ok := d2graph.ReservedKeywords[n.MapKey.Key.Path[0].Unbox().ScalarString()] + if ok { + detachedMK.Value.Map.Nodes = append(detachedMK.Value.Map.Nodes, n) + } + } + } + if len(detachedMK.Value.Map.Nodes) == 0 { + detachedMK.Value.Map = nil + } + } + + appendUniqueMapKey(toScope, detachedMK) + } else if len(ida) > 1 && (!isExplicit || go2.Contains(mostNestedRefs, ref)) { + // 2. Split + detachedMK := &d2ast.Key{Key: cloneKey(ref.MapKey.Key)} + detachedMK.Key.Path = []*d2ast.StringBox{ref.Key.Path[ref.KeyPathIndex]} + if ref.KeyPathIndex == len(ref.Key.Path)-1 { + withReserved, withoutReserved := filterReserved(ref.MapKey.Value) + detachedMK.Value = withReserved + ref.MapKey.Value = withoutReserved + } + ref.Key.Path = append(ref.Key.Path[:ref.KeyPathIndex], ref.Key.Path[ref.KeyPathIndex+1:]...) + appendUniqueMapKey(toScope, detachedMK) + } else if len(getCommonPath(ak, ak2)) > 0 { + // 3. Extend + newKeyPath := ref.Key.Path[:ref.KeyPathIndex] + newKeyPath = append(newKeyPath, mk2.Key.Path[len(getCommonPath(ak, ak2)):]...) + ref.Key.Path = append(newKeyPath, ref.Key.Path[ref.KeyPathIndex+1:]...) + } else { + // 4. Slice + scopePath := ref.ScopeObj.AbsIDArray() + if len(getCommonPath(scopePath, ak2)) != len(scopePath) { + deleteFromMap(ref.Scope, ref.MapKey) + } else { + ref.Key.Path = ref.Key.Path[ref.KeyPathIndex:] + exists := false + for _, n := range toScope.Nodes { + if n.MapKey != nil && n.MapKey != ref.MapKey && n.MapKey.Equals(ref.MapKey) { + exists = true + } + } + if exists { + deleteFromMap(ref.Scope, ref.MapKey) + } + } + } + } + } + var refEdges []*d2ast.Edge + for _, ref := range obj.References { + if ref.InEdge() { + refEdges = append(refEdges, ref.MapKey.Edges[ref.MapKeyEdgeIndex]) + } + } + for i := 0; i < len(obj.References); i++ { + if !isCrossScope { + break + } + + ref := obj.References[i] + // 5. Update all Edge references + if len(ref.MapKey.Edges) == 0 { + continue + } + + if i > 0 && ref.Key == obj.References[i-1].Key { + continue + } + + // We don't want this to be underscore-resolved scope. We want to ignore underscores + var scopeak []string + if ref.UnresolvedScopeObj != g.Root { + scopek, err := d2parser.ParseKey(ref.UnresolvedScopeObj.AbsID()) + if err != nil { + return nil, err + } + scopeak = d2graph.Key(scopek) + } + commonPath := getCommonPath(scopeak, ak2) + + // When moving a node out of an edge, e.g. the `b` out of `a.b.c -> ...`, + // The edge needs to continue targeting the same thing (c) + if ref.KeyPathIndex != len(ref.Key.Path)-1 { + // Split + detachedMK := &d2ast.Key{ + Key: cloneKey(ref.Key), + } + detachedMK.Key.Path = []*d2ast.StringBox{ref.Key.Path[ref.KeyPathIndex]} + appendUniqueMapKey(toScope, detachedMK) + + ref.Key.Path = append(ref.Key.Path[:ref.KeyPathIndex], ref.Key.Path[ref.KeyPathIndex+1:]...) + } else { + // When moving a node connected to an edge, we have to ensure parents continue to exist + // e.g. the `c` out of `a.b.c -> ...` + // `a.b` needs to exist + if len(go2.Filter(ref.Key.Path, func(x *d2ast.StringBox) bool { return x.Unbox().ScalarString() != "_" })) > 1 { + detachedK := cloneKey(ref.Key) + detachedK.Path = detachedK.Path[:len(detachedK.Path)-1] + ensureNode(g, refEdges, ref.ScopeObj, ref.Scope, ref.MapKey, detachedK, false) + } + // Move out to most common scope + ref.Key.Path = nil + for i := len(commonPath); i < len(scopeak); i++ { + ref.Key.Path = append(ref.Key.Path, d2ast.MakeValueBox(d2ast.RawString("_", true)).StringBox()) + } + // From most common scope, target the toKey + ref.Key.Path = append(ref.Key.Path, mk2.Key.Path[len(commonPath):]...) + } + } + + if err := updateNear(prevG, g, &key, &newKey); err != nil { + return nil, err + } + + return recompile(g) +} + +// filterReserved takes a Value and splits it into 2 +// 1. Value with reserved keywords +// 2. Without reserved keywords +// Maintains structure, so if reserved keywords were part of map, the output will keep them in a map +func filterReserved(value d2ast.ValueBox) (with, without d2ast.ValueBox) { + with, without = d2ast.MakeValueBox(value.Unbox()), d2ast.ValueBox{} + + if value.Map != nil { + var forWith []d2ast.MapNodeBox + var forWithout []d2ast.MapNodeBox + + // assume comments are above what they describe + // going down the map line by line, we batch here as we encounter, and flush to either forWith or forWithout, whichever hits first + var commentBatch []d2ast.MapNodeBox + flushComments := func(to *[]d2ast.MapNodeBox) { + *to = append(*to, commentBatch...) + commentBatch = nil + } + + for _, n := range value.Map.Nodes { + if n.MapKey == nil { + if n.Comment != nil || n.BlockComment != nil { + commentBatch = append(commentBatch, n) + } + continue + } + if n.MapKey.Key == nil || (len(n.MapKey.Key.Path) > 1) { + flushComments(&forWithout) + forWithout = append(forWithout, n) + continue + } + _, ok := d2graph.ReservedKeywords[n.MapKey.Key.Path[0].Unbox().ScalarString()] + if !ok { + flushComments(&forWithout) + forWithout = append(forWithout, n) + continue + } + flushComments(&forWith) + forWith = append(forWith, n) + } + + if len(forWith) > 0 { + if with.Map == nil { + with.Map = &d2ast.Map{ + Range: d2ast.MakeRange(",1:0:0-1:0:0"), + } + } + with.Map.Nodes = forWith + } else { + with.Map = nil + } + if len(forWithout) > 0 { + if without.Map == nil { + without.Map = &d2ast.Map{ + Range: value.Map.Range, + } + } + without.Map.Nodes = forWithout + } else { + without.Map = nil + } + } + + return +} + +// updateNear updates all the Near fields +// prevG is the graph before the update (i.e. deletion, rename, move) +func updateNear(prevG, g *d2graph.Graph, from, to *string) error { + mk, _ := d2parser.ParseMapKey(*from) + if len(mk.Edges) > 0 { + return nil + } + if mk.Key == nil { + return nil + } + if len(mk.Key.Path) == 0 { + return nil + } + for _, obj := range g.Objects { + if obj.Map == nil { + continue + } + for _, n := range obj.Map.Nodes { + if n.MapKey == nil { + continue + } + if n.MapKey.Key == nil { + continue + } + if len(n.MapKey.Key.Path) == 0 { + continue + } + if n.MapKey.Key.Path[0].Unbox().ScalarString() == "near" { + k := n.MapKey.Value.ScalarBox().Unbox().ScalarString() + if strings.EqualFold(k, *from) && to == nil { + deleteFromMap(obj.Map, n.MapKey) + } else { + valueMK, err := d2parser.ParseMapKey(k) + if err != nil { + return err + } + tmpG, _ := recompile(prevG) + appendMapKey(tmpG.AST, valueMK) + if to == nil { + deltas, err := DeleteIDDeltas(tmpG, *from) + if err != nil { + return err + } + if v, ok := deltas[k]; ok { + n.MapKey.Value = d2ast.MakeValueBox(d2ast.RawString(v, false)) + } + } else { + deltas, err := MoveIDDeltas(tmpG, *from, *to) + if err != nil { + return err + } + if v, ok := deltas[k]; ok { + n.MapKey.Value = d2ast.MakeValueBox(d2ast.RawString(v, false)) + } + } + } + } + } + } + return nil +} + +func deleteFromMap(m *d2ast.Map, mk *d2ast.Key) bool { + for i, n := range m.Nodes { + if n.MapKey == mk { + m.Nodes = append(m.Nodes[:i], m.Nodes[i+1:]...) + return true + } + } + return false +} + +func ReparentIDDelta(g *d2graph.Graph, key, parentKey string) (string, error) { + mk, err := d2parser.ParseMapKey(key) + if err != nil { + return "", err + } + obj, ok := g.Root.HasChild(d2graph.Key(mk.Key)) + if !ok { + return "", errors.New("not found") + } + + parent := g.Root + if parentKey != "" { + mk2, err := d2parser.ParseMapKey(parentKey) + if err != nil { + return "", err + } + parent, ok = g.Root.HasChild(d2graph.Key(mk2.Key)) + if !ok { + return "", errors.New("not found") + } + } + + prevParent := obj.Parent + obj.Parent = parent + id := obj.AbsID() + obj.Parent = prevParent + return id, nil +} + +func ReconnectEdgeIDDelta(g *d2graph.Graph, edgeID, srcID, dstID string) (string, error) { + mk, err := d2parser.ParseMapKey(edgeID) + if err != nil { + return "", err + } + edgeTrimCommon(mk) + obj := g.Root + if mk.Key != nil { + var ok bool + obj, ok = g.Root.HasChild(d2graph.Key(mk.Key)) + if !ok { + return "", errors.New("edge key not found") + } + } + e, ok := obj.HasEdge(mk) + if !ok { + return "", fmt.Errorf("edge %v not found", edgeID) + } + if e.Src.AbsID() == srcID && e.Dst.AbsID() == dstID { + return edgeID, nil + } + oldSrc := e.Src + oldDst := e.Dst + if e.Src.AbsID() != srcID { + mk, err := d2parser.ParseMapKey(srcID) + if err != nil { + return "", err + } + src, ok := g.Root.HasChild(d2graph.Key(mk.Key)) + if !ok { + return "", fmt.Errorf("src %v not found", srcID) + } + e.Src = src + } + if e.Dst.AbsID() != dstID { + mk, err := d2parser.ParseMapKey(dstID) + if err != nil { + return "", err + } + dst, ok := g.Root.HasChild(d2graph.Key(mk.Key)) + if !ok { + return "", fmt.Errorf("dst %v not found", dstID) + } + e.Dst = dst + } + newID := fmt.Sprintf("%s %s %s", e.Src.AbsID(), e.ArrowString(), e.Dst.AbsID()) + e.Src = oldSrc + e.Dst = oldDst + return newID, nil +} + +func generateUniqueKey(g *d2graph.Graph, prefix string) (key string, edge bool, _ error) { + mk, err := d2parser.ParseMapKey(prefix) + if err != nil { + return "", false, err + } + + if len(mk.Edges) > 1 { + return "", false, errors.New("cannot generate unique key for edge chain") + } + + if len(mk.Edges) == 1 { + if mk.EdgeIndex == nil || mk.EdgeIndex.Int == nil { + mk.EdgeIndex = &d2ast.EdgeIndex{ + Int: go2.Pointer(0), + } + } + + edgeTrimCommon(mk) + obj := g.Root + if mk.Key != nil { + var ok bool + obj, ok = g.Root.HasChild(d2graph.Key(mk.Key)) + if !ok { + return d2format.Format(mk), true, nil + } + } + for { + _, ok := obj.HasEdge(mk) + if !ok { + return d2format.Format(mk), true, nil + } + mk.EdgeIndex.Int = go2.Pointer(*mk.EdgeIndex.Int + 1) + } + } + + // If a key is not provided, we generate one. + if mk.Key == nil { + mk.Key = &d2ast.KeyPath{ + Path: []*d2ast.StringBox{d2ast.MakeValueBox(d2ast.RawString(xrand.Base64(16), true)).StringBox()}, + } + } else if _, ok := g.Root.HasChild(d2graph.Key(mk.Key)); ok { + // The key may already have an index, e.g. "x 2" + spaced := strings.Split(prefix, " ") + if _, err := strconv.Atoi(spaced[len(spaced)-1]); err == nil { + withoutIndex := strings.Join(spaced[:len(spaced)-1], " ") + mk, err = d2parser.ParseMapKey(withoutIndex) + if err != nil { + return "", false, err + } + } + } + + k2 := cloneKey(mk.Key) + i := 0 + for { + _, ok := g.Root.HasChild(d2graph.Key(k2)) + if !ok { + return d2format.Format(k2), false, nil + } + + rr := fmt.Sprintf("%s %d", mk.Key.Path[len(mk.Key.Path)-1].Unbox().ScalarString(), i+2) + k2.Path[len(k2.Path)-1] = d2ast.MakeValueBox(d2ast.RawString(rr, true)).StringBox() + i++ + } +} + +func cloneKey(k *d2ast.KeyPath) *d2ast.KeyPath { + if k == nil { + return &d2ast.KeyPath{} + } + tmp := *k + k2 := &tmp + k2.Path = nil + for _, p := range k.Path { + k2.Path = append(k2.Path, d2ast.MakeValueBox(p.Unbox().Copy()).StringBox()) + } + return k2 +} + +func getCommonPath(a, b []string) []string { + var out []string + for i := 0; i < len(a) && i < len(b); i++ { + if a[i] == b[i] { + out = a[:i+1] + } + } + return out +} + +func edgeTrimCommon(mk *d2ast.Key) { + if len(mk.Edges) != 1 { + return + } + e := mk.Edges[0] + for len(e.Src.Path) > 1 && len(e.Dst.Path) > 1 { + if !strings.EqualFold(e.Src.Path[0].Unbox().ScalarString(), e.Dst.Path[0].Unbox().ScalarString()) { + return + } + if mk.Key == nil { + mk.Key = &d2ast.KeyPath{} + } + mk.Key.Path = append(mk.Key.Path, e.Src.Path[0]) + e.Src.Path = e.Src.Path[1:] + e.Dst.Path = e.Dst.Path[1:] + } +} + +func MoveIDDeltas(g *d2graph.Graph, key, newKey string) (deltas map[string]string, err error) { + defer xdefer.Errorf(&err, "failed to get deltas for move from %#v to %#v", key, newKey) + deltas = make(map[string]string) + + if key == newKey { + return deltas, nil + } + + mk, err := d2parser.ParseMapKey(key) + if err != nil { + return nil, err + } + + newKey, _, err = generateUniqueKey(g, newKey) + if err != nil { + return nil, err + } + + mk2, err := d2parser.ParseMapKey(newKey) + if err != nil { + return nil, err + } + + ak := d2graph.Key(mk.Key) + ak2 := d2graph.Key(mk2.Key) + isCrossScope := strings.Join(ak[:len(ak)-1], ".") != strings.Join(ak2[:len(ak2)-1], ".") + + edgeTrimCommon(mk) + obj := g.Root + + // Conflict IDs are when a container is moved and the children conflict with something in parent + conflictNewIDs := make(map[*d2graph.Object]string) + conflictOldIDs := make(map[*d2graph.Object]string) + if mk.Key != nil { + var ok bool + obj, ok = g.Root.HasChild(d2graph.Key(mk.Key)) + if !ok { + return nil, nil + } + + for _, ch := range obj.ChildrenArray { + chMK, err := d2parser.ParseMapKey(ch.AbsID()) + if err != nil { + return nil, err + } + ida := d2graph.Key(chMK.Key) + if ida[len(ida)-1] == ida[len(ida)-2] { + continue + } + + hoistedAbsID := ch.ID + if obj.Parent != g.Root { + hoistedAbsID = obj.Parent.AbsID() + "." + ch.ID + } + hoistedMK, err := d2parser.ParseMapKey(hoistedAbsID) + if err != nil { + return nil, err + } + if _, ok := g.Root.HasChild(d2graph.Key(hoistedMK.Key)); ok { + newKey, _, err := generateUniqueKey(g, hoistedAbsID) + if err != nil { + return nil, err + } + newMK, err := d2parser.ParseMapKey(newKey) + if err != nil { + return nil, err + } + newAK := d2graph.Key(newMK.Key) + conflictOldIDs[ch] = ch.ID + conflictNewIDs[ch] = newAK[len(newAK)-1] + } + } + } + + if len(mk.Edges) > 1 { + return nil, nil + } + if len(mk.Edges) == 1 { + if len(mk.Edges) == 0 { + return nil, errors.New("cannot rename edge to node") + } + if len(mk.Edges) > 1 { + return nil, errors.New("cannot rename edge to edge chain") + } + + e, ok := obj.HasEdge(mk) + if !ok { + return nil, nil + } + beforeID := e.AbsID() + tmp := *e + e2 := &tmp + e2.SrcArrow = mk2.Edges[0].SrcArrow == "<" + e2.DstArrow = mk2.Edges[0].DstArrow == ">" + deltas[beforeID] = e2.AbsID() + return deltas, nil + } + + beforeObjID := obj.ID + + toParent := g.Root + if len(ak2) > 1 { + var ok bool + toParent, ok = g.Root.HasChild(ak2[:len(ak2)-1]) + if !ok { + return nil, errors.New("to parent not found") + } + } + id := ak2[len(ak2)-1] + + tmpRenames := func() func() { + if isCrossScope { + for _, ch := range obj.ChildrenArray { + ch.Parent = obj.Parent + } + } + + prevParent := obj.Parent + obj.Parent = toParent + obj.ID = id + + for k, v := range conflictNewIDs { + k.ID = v + } + return func() { + for k, v := range conflictOldIDs { + k.ID = v + } + obj.ID = beforeObjID + obj.Parent = prevParent + + if isCrossScope { + for _, ch := range obj.ChildrenArray { + ch.Parent = obj + } + } + } + } + + appendNodeDelta := func(ch *d2graph.Object) { + beforeID := ch.AbsID() + revert := tmpRenames() + deltas[beforeID] = ch.AbsID() + revert() + } + + appendEdgeDelta := func(ch *d2graph.Object) { + for _, e := range obj.Graph.Edges { + if e.Src == ch || e.Dst == ch { + beforeID := e.AbsID() + revert := tmpRenames() + deltas[beforeID] = e.AbsID() + revert() + } + } + } + + var recurse func(ch *d2graph.Object) + recurse = func(ch *d2graph.Object) { + for _, ch := range ch.ChildrenArray { + appendNodeDelta(ch) + appendEdgeDelta(ch) + recurse(ch) + } + } + appendNodeDelta(obj) + appendEdgeDelta(obj) + recurse(obj) + return deltas, nil +} + +func DeleteIDDeltas(g *d2graph.Graph, key string) (deltas map[string]string, err error) { + defer xdefer.Errorf(&err, "failed to get deltas for deletion of %#v", key) + deltas = make(map[string]string) + + mk, err := d2parser.ParseMapKey(key) + if err != nil { + return nil, err + } + + edgeTrimCommon(mk) + obj := g.Root + conflictNewIDs := make(map[*d2graph.Object]string) + conflictOldIDs := make(map[*d2graph.Object]string) + if mk.Key != nil { + var ok bool + obj, ok = g.Root.HasChild(d2graph.Key(mk.Key)) + if !ok { + return nil, nil + } + for _, ch := range obj.ChildrenArray { + chMK, err := d2parser.ParseMapKey(ch.AbsID()) + if err != nil { + return nil, err + } + ida := d2graph.Key(chMK.Key) + if ida[len(ida)-1] == ida[len(ida)-2] { + continue + } + hoistedAbsID := ch.ID + if obj.Parent != g.Root { + hoistedAbsID = obj.Parent.AbsID() + "." + ch.ID + } + hoistedMK, err := d2parser.ParseMapKey(hoistedAbsID) + if err != nil { + return nil, err + } + if _, ok := g.Root.HasChild(d2graph.Key(hoistedMK.Key)); ok { + newKey, _, err := generateUniqueKey(g, hoistedAbsID) + if err != nil { + return nil, err + } + newMK, err := d2parser.ParseMapKey(newKey) + if err != nil { + return nil, err + } + newAK := d2graph.Key(newMK.Key) + conflictOldIDs[ch] = ch.ID + conflictNewIDs[ch] = newAK[len(newAK)-1] + } + } + } + if len(mk.Edges) > 1 { + return nil, nil + } + if len(mk.Edges) == 1 { + // Anything deleted in an edge key cannot affect deltas + if mk.EdgeKey != nil { + return nil, nil + } + e, ok := obj.HasEdge(mk) + if !ok { + return nil, nil + } + ea, ok := obj.FindEdges(mk) + if !ok { + return nil, nil + } + for _, e2 := range ea { + if e2.Index > e.Index { + beforeID := e2.AbsID() + e2.Index-- + deltas[beforeID] = e2.AbsID() + e2.Index++ + } + } + return deltas, nil + } + + for _, ch := range obj.ChildrenArray { + tmpRenames := func() func() { + prevIDs := make(map[*d2graph.Object]string) + for _, ch := range obj.ChildrenArray { + prevIDs[ch] = ch.ID + ch.Parent = obj.Parent + } + for k, v := range conflictNewIDs { + k.ID = v + } + + return func() { + for k, v := range conflictOldIDs { + k.ID = v + } + for _, ch := range obj.ChildrenArray { + ch.Parent = obj + ch.ID = prevIDs[ch] + } + } + } + + appendNodeDelta := func(ch2 *d2graph.Object) { + beforeAbsID := ch2.AbsID() + revert := tmpRenames() + deltas[beforeAbsID] = ch2.AbsID() + revert() + + } + appendEdgeDelta := func(ch2 *d2graph.Object) { + for _, e := range obj.Graph.Edges { + if e.Src == ch2 || e.Dst == ch2 { + beforeAbsID := e.AbsID() + revert := tmpRenames() + deltas[beforeAbsID] = e.AbsID() + revert() + + } + } + } + + var recurse func(ch2 *d2graph.Object) + recurse = func(ch2 *d2graph.Object) { + for _, ch2 := range ch2.ChildrenArray { + appendNodeDelta(ch2) + appendEdgeDelta(ch2) + recurse(ch2) + } + } + + appendNodeDelta(ch) + appendEdgeDelta(ch) + recurse(ch) + } + return deltas, nil +} + +func RenameIDDeltas(g *d2graph.Graph, key, newName string) (deltas map[string]string, err error) { + defer xdefer.Errorf(&err, "failed to get deltas for renaming of %#v to %#v", key, newName) + deltas = make(map[string]string) + + mk, err := d2parser.ParseMapKey(key) + if err != nil { + return nil, err + } + + edgeTrimCommon(mk) + obj := g.Root + if mk.Key != nil { + var ok bool + obj, ok = g.Root.HasChild(d2graph.Key(mk.Key)) + if !ok { + return nil, nil + } + } + if len(mk.Edges) > 1 { + return nil, nil + } + if len(mk.Edges) == 1 { + mk2, err := d2parser.ParseMapKey(newName) + if err != nil { + return nil, err + } + if len(mk.Edges) == 0 { + return nil, errors.New("cannot rename edge to node") + } + if len(mk.Edges) > 1 { + return nil, errors.New("cannot rename edge to edge chain") + } + + e, ok := obj.HasEdge(mk) + if !ok { + return nil, nil + } + beforeID := e.AbsID() + tmp := *e + e2 := &tmp + e2.SrcArrow = mk2.Edges[0].SrcArrow == "<" + e2.DstArrow = mk2.Edges[0].DstArrow == ">" + deltas[beforeID] = e2.AbsID() + return deltas, nil + } + + if mk.Key.Path[len(mk.Key.Path)-1].Unbox().ScalarString() == newName { + return deltas, nil + } + + mk.Key.Path[len(mk.Key.Path)-1].Unbox().SetString(newName) + uniqueKeyStr, _, err := generateUniqueKey(g, strings.Join(d2graph.Key(mk.Key), ".")) + if err != nil { + return nil, err + } + uniqueKey, err := d2parser.ParseKey(uniqueKeyStr) + if err != nil { + return nil, err + } + newNameKey := uniqueKey.Path[len(uniqueKey.Path)-1].Unbox().ScalarString() + newNameKey = d2format.Format(d2ast.RawString(newNameKey, true)) + + beforeObjID := obj.ID + + appendNodeDelta := func(ch *d2graph.Object) { + beforeID := ch.AbsID() + obj.ID = newNameKey + deltas[beforeID] = ch.AbsID() + obj.ID = beforeObjID + } + + appendEdgeDelta := func(ch *d2graph.Object) { + for _, e := range obj.Graph.Edges { + if e.Src == ch || e.Dst == ch { + beforeID := e.AbsID() + obj.ID = newNameKey + deltas[beforeID] = e.AbsID() + obj.ID = beforeObjID + } + } + } + + var recurse func(ch *d2graph.Object) + recurse = func(ch *d2graph.Object) { + for _, ch := range ch.ChildrenArray { + appendNodeDelta(ch) + appendEdgeDelta(ch) + recurse(ch) + } + } + appendNodeDelta(obj) + appendEdgeDelta(obj) + recurse(obj) + return deltas, nil +} + +func hasSpace(tag string) bool { + for _, r := range tag { + if unicode.IsSpace(r) { + return true + } + } + return false +} + +func getMostNestedRefs(obj *d2graph.Object) []d2graph.Reference { + most := obj.References[0] + for _, ref := range obj.References { + if len(ref.MapKey.Edges) != 0 { + continue + } + + scopeKey, err := d2parser.ParseKey(ref.ScopeObj.AbsID()) + if err != nil { + scopeKey = &d2ast.KeyPath{} + } + mostKey, err := d2parser.ParseKey(most.ScopeObj.AbsID()) + if err != nil { + mostKey = &d2ast.KeyPath{} + } + _, resolvedScopeKey, err := d2graph.ResolveUnderscoreKey(d2graph.Key(scopeKey), obj) + if err != nil { + continue + } + _, resolvedMostKey, err := d2graph.ResolveUnderscoreKey(d2graph.Key(mostKey), obj) + if err != nil { + continue + } + if len(resolvedScopeKey) > len(resolvedMostKey) { + most = ref + } + } + + var out []d2graph.Reference + for _, ref := range obj.References { + if len(ref.MapKey.Edges) != 0 { + continue + } + if ref.ScopeObj.AbsID() == most.ScopeObj.AbsID() { + out = append(out, ref) + } + } + + return out +} diff --git a/d2oracle/edit_test.go b/d2oracle/edit_test.go new file mode 100644 index 000000000..84090a4e0 --- /dev/null +++ b/d2oracle/edit_test.go @@ -0,0 +1,4989 @@ +package d2oracle_test + +import ( + "fmt" + "path/filepath" + "strconv" + "strings" + "testing" + + "github.com/stretchr/testify/assert" + + "oss.terrastruct.com/xjson" + + "oss.terrastruct.com/diff" + + "oss.terrastruct.com/d2/d2compiler" + "oss.terrastruct.com/d2/d2format" + "oss.terrastruct.com/d2/d2graph" + "oss.terrastruct.com/d2/d2oracle" + "oss.terrastruct.com/d2/d2target" + "oss.terrastruct.com/d2/lib/go2" +) + +// TODO: make assertions less specific +// TODO: move n objects and n edges assertions as fields on test instead of as callback + +func TestCreate(t *testing.T) { + t.Parallel() + + testCases := []struct { + name string + text string + key string + + expKey string + expErr string + exp string + assertions func(t *testing.T, g *d2graph.Graph) + }{ + { + name: "base", + text: ``, + key: `square`, + + expKey: `square`, + exp: `square +`, + assertions: func(t *testing.T, g *d2graph.Graph) { + if len(g.Objects) != 1 { + t.Fatalf("expected 1 objects: %#v", g.Objects) + } + if g.Objects[0].ID != "square" { + t.Fatalf("expected g.Objects[0].ID to be square: %#v", g.Objects[0]) + } + if g.Objects[0].Attributes.Label.MapKey.Value.Unbox() != nil { + t.Fatalf("expected g.Objects[0].Attributes.Label.Node.Value.Unbox() == nil: %#v", g.Objects[0].Attributes.Label.MapKey.Value) + } + if d2format.Format(g.Objects[0].Attributes.Label.MapKey.Key) != "square" { + t.Fatalf("expected g.Objects[0].Attributes.Label.Node.Key to be square: %#v", g.Objects[0].Attributes.Label.MapKey.Key) + } + }, + }, + { + name: "gen_key_suffix", + text: `"x " +`, + key: `"x "`, + + expKey: `x 2`, + exp: `"x " +x 2 +`, + assertions: func(t *testing.T, g *d2graph.Graph) { + if len(g.Objects) != 2 { + t.Fatalf("unexpected objects length: %#v", g.Objects) + } + if g.Objects[1].ID != `x 2` { + t.Fatalf("bad object ID: %#v", g.Objects[1]) + } + }, + }, + { + name: "nested", + text: ``, + key: `b.c.square`, + + expKey: `b.c.square`, + exp: `b.c.square +`, + assertions: func(t *testing.T, g *d2graph.Graph) { + if len(g.Objects) != 3 { + t.Fatalf("unexpected objects length: %#v", g.Objects) + } + if g.Objects[2].AbsID() != "b.c.square" { + t.Fatalf("bad absolute ID: %#v", g.Objects[2].AbsID()) + } + if d2format.Format(g.Objects[2].Attributes.Label.MapKey.Key) != "b.c.square" { + t.Fatalf("bad mapkey: %#v", g.Objects[2].Attributes.Label.MapKey.Key) + } + if g.Objects[2].Attributes.Label.MapKey.Value.Unbox() != nil { + t.Fatalf("expected nil mapkey value: %#v", g.Objects[2].Attributes.Label.MapKey.Value) + } + }, + }, + { + name: "gen_key", + text: `square`, + key: `square`, + + expKey: `square 2`, + exp: `square +square 2 +`, + assertions: func(t *testing.T, g *d2graph.Graph) { + if len(g.Objects) != 2 { + t.Fatalf("expected 2 objects: %#v", g.Objects) + } + if g.Objects[1].ID != "square 2" { + t.Fatalf("expected g.Objects[1].ID to be square 2: %#v", g.Objects[1]) + } + if g.Objects[1].Attributes.Label.MapKey.Value.Unbox() != nil { + t.Fatalf("expected g.Objects[1].Attributes.Label.Node.Value.Unbox() == nil: %#v", g.Objects[1].Attributes.Label.MapKey.Value) + } + if d2format.Format(g.Objects[1].Attributes.Label.MapKey.Key) != "square 2" { + t.Fatalf("expected g.Objects[1].Attributes.Label.Node.Key to be square 2: %#v", g.Objects[1].Attributes.Label.MapKey.Key) + } + }, + }, + { + name: "gen_key_nested", + text: `x.y.z.square`, + key: `x.y.z.square`, + + expKey: `x.y.z.square 2`, + exp: `x.y.z.square +x.y.z.square 2 +`, + assertions: func(t *testing.T, g *d2graph.Graph) { + if len(g.Objects) != 5 { + t.Fatalf("unexpected objects length: %#v", g.Objects) + } + if g.Objects[4].ID != "square 2" { + t.Fatalf("unexpected object id: %#v", g.Objects[4]) + } + }, + }, + { + name: "scope", + text: `x.y.z: { +}`, + key: `x.y.z.square`, + + expKey: `x.y.z.square`, + exp: `x.y.z: { + square +} +`, + assertions: func(t *testing.T, g *d2graph.Graph) { + if len(g.Objects) != 4 { + t.Fatalf("expected 4 objects: %#v", g.Objects) + } + if g.Objects[3].ID != "square" { + t.Fatalf("expected g.Objects[3].ID to be square: %#v", g.Objects[3]) + } + if g.Objects[3].Attributes.Label.MapKey.Value.Unbox() != nil { + t.Fatalf("expected g.Objects[3].Attributes.Label.Node.Value.Unbox() == nil: %#v", g.Objects[3].Attributes.Label.MapKey.Value) + } + if d2format.Format(g.Objects[3].Attributes.Label.MapKey.Key) != "square" { + t.Fatalf("expected g.Objects[3].Attributes.Label.Node.Key to be square: %#v", g.Objects[3].Attributes.Label.MapKey.Key) + } + }, + }, + { + name: "gen_key_scope", + text: `x.y.z: { + square +}`, + key: `x.y.z.square`, + + expKey: `x.y.z.square 2`, + exp: `x.y.z: { + square + square 2 +} +`, + assertions: func(t *testing.T, g *d2graph.Graph) { + if len(g.Objects) != 5 { + t.Fatalf("expected 5 objects: %#v", g.Objects) + } + if g.Objects[4].ID != "square 2" { + t.Fatalf("expected g.Objects[4].ID to be square 2: %#v", g.Objects[4]) + } + if g.Objects[4].Attributes.Label.MapKey.Value.Unbox() != nil { + t.Fatalf("expected g.Objects[4].Attributes.Label.Node.Value.Unbox() == nil: %#v", g.Objects[4].Attributes.Label.MapKey.Value) + } + if d2format.Format(g.Objects[4].Attributes.Label.MapKey.Key) != "square 2" { + t.Fatalf("expected g.Objects[4].Attributes.Label.Node.Key to be square 2: %#v", g.Objects[4].Attributes.Label.MapKey.Key) + } + }, + }, + { + name: "gen_key_n", + text: `x.y.z: { + square + square 2 + square 3 + square 4 + square 5 + square 6 + square 7 + square 8 + square 9 + square 10 +}`, + key: `x.y.z.square`, + + expKey: `x.y.z.square 11`, + exp: `x.y.z: { + square + square 2 + square 3 + square 4 + square 5 + square 6 + square 7 + square 8 + square 9 + square 10 + square 11 +} +`, + assertions: func(t *testing.T, g *d2graph.Graph) { + if len(g.Objects) != 14 { + t.Fatalf("expected 14 objects: %#v", g.Objects) + } + if g.Objects[13].ID != "square 11" { + t.Fatalf("expected g.Objects[13].ID to be square 11: %#v", g.Objects[13]) + } + if d2format.Format(g.Objects[13].Attributes.Label.MapKey.Key) != "square 11" { + t.Fatalf("expected g.Objects[13].Attributes.Label.Node.Key to be square 11: %#v", g.Objects[13].Attributes.Label.MapKey.Key) + } + }, + }, + { + name: "edge", + text: ``, + key: `x -> y`, + + expKey: `(x -> y)[0]`, + exp: `x -> y +`, + assertions: func(t *testing.T, g *d2graph.Graph) { + if len(g.Objects) != 2 { + t.Fatalf("expected 2 objects: %#v", g.Objects) + } + if len(g.Edges) != 1 { + t.Fatalf("expected 1 edge: %#v", g.Edges) + } + if g.Edges[0].Src.ID != "x" { + t.Fatalf("expected g.Edges[0].Src.ID == x: %#v", g.Edges[0].Src.ID) + } + if g.Edges[0].Dst.ID != "y" { + t.Fatalf("expected g.Edges[0].Dst.ID == y: %#v", g.Edges[0].Dst.ID) + } + }, + }, + { + name: "edge_nested", + text: ``, + key: `container.(x -> y)`, + + expKey: `container.(x -> y)[0]`, + exp: `container.(x -> y) +`, + assertions: func(t *testing.T, g *d2graph.Graph) { + if len(g.Objects) != 3 { + t.Fatalf("unexpected objects: %#v", g.Objects) + } + if len(g.Edges) != 1 { + t.Fatalf("unexpected edges: %#v", g.Edges) + } + }, + }, + { + name: "edge_scope", + text: `container: { +}`, + key: `container.(x -> y)`, + + expKey: `container.(x -> y)[0]`, + exp: `container: { + x -> y +} +`, + assertions: func(t *testing.T, g *d2graph.Graph) { + if len(g.Objects) != 3 { + t.Fatalf("expected 3 objects: %#v", g.Objects) + } + }, + }, + { + name: "edge_scope_flat", + text: `container: { +}`, + key: `container.x -> container.y`, + + expKey: `container.(x -> y)[0]`, + exp: `container: { + x -> y +} +`, + assertions: func(t *testing.T, g *d2graph.Graph) { + if len(g.Objects) != 3 { + t.Fatalf("expected 3 objects: %#v", g.Objects) + } + }, + }, + { + name: "edge_scope_nested", + text: `x.y`, + key: `x.y.z -> x.y.q`, + + expKey: `x.y.(z -> q)[0]`, + exp: `x.y: { + z -> q +} +`, + assertions: func(t *testing.T, g *d2graph.Graph) { + if len(g.Objects) != 4 { + t.Fatalf("unexpected objects: %#v", g.Objects) + } + if len(g.Edges) != 1 { + t.Fatalf("unexpected edges: %#v", g.Edges) + } + }, + }, + { + name: "edge_unique", + text: `x -> y +hello.(x -> y) +hello.(x -> y) +`, + key: `hello.(x -> y)`, + + expKey: `hello.(x -> y)[2]`, + exp: `x -> y +hello.(x -> y) +hello.(x -> y) +hello.(x -> y) +`, + assertions: func(t *testing.T, g *d2graph.Graph) { + if len(g.Objects) != 5 { + t.Fatalf("expected 5 objects: %#v", g.Objects) + } + if len(g.Edges) != 4 { + t.Fatalf("expected 4 edges: %#v", g.Edges) + } + }, + }, + { + name: "container", + text: `b`, + key: `b.q`, + + expKey: `b.q`, + exp: `b: { + q +} +`, + assertions: func(t *testing.T, g *d2graph.Graph) { + if len(g.Objects) != 2 { + t.Fatalf("expected 2 objects: %#v", g.Objects) + } + }, + }, + { + name: "container_edge", + text: `b`, + key: `b.x -> b.y`, + + expKey: `b.(x -> y)[0]`, + exp: `b: { + x -> y +} +`, + assertions: func(t *testing.T, g *d2graph.Graph) { + if len(g.Objects) != 3 { + t.Fatalf("expected 3 objects: %#v", g.Objects) + } + }, + }, + { + name: "container_edge_label", + text: `b: zoom`, + key: `b.x -> b.y`, + + expKey: `b.(x -> y)[0]`, + exp: `b: zoom { + x -> y +} +`, + assertions: func(t *testing.T, g *d2graph.Graph) { + if len(g.Objects) != 3 { + t.Fatalf("expected 3 objects: %#v", g.Objects) + } + }, + }, + { + name: "make_scope_multiline", + + text: `rawr: {shape: circle} +`, + key: `rawr.orange`, + + expKey: `rawr.orange`, + exp: `rawr: { + shape: circle + orange +} +`, + }, + { + name: "make_scope_multiline_spacing_1", + + text: `before +rawr: {shape: circle} +after +`, + key: `rawr.orange`, + + expKey: `rawr.orange`, + exp: `before +rawr: { + shape: circle + orange +} +after +`, + }, + { + name: "make_scope_multiline_spacing_2", + + text: `before + +rawr: {shape: circle} + +after +`, + key: `rawr.orange`, + + expKey: `rawr.orange`, + exp: `before + +rawr: { + shape: circle + orange +} + +after +`, + }, + } + + for _, tc := range testCases { + tc := tc + t.Run(tc.name, func(t *testing.T) { + t.Parallel() + + var newKey string + et := editTest{ + text: tc.text, + testFunc: func(g *d2graph.Graph) (*d2graph.Graph, error) { + var err error + g, newKey, err = d2oracle.Create(g, tc.key) + return g, err + }, + + exp: tc.exp, + expErr: tc.expErr, + assertions: func(t *testing.T, g *d2graph.Graph) { + if newKey != tc.expKey { + t.Fatalf("expected %q but got %q", tc.expKey, newKey) + } + if tc.assertions != nil { + tc.assertions(t, g) + } + }, + } + et.run(t) + }) + } +} + +func TestSet(t *testing.T) { + t.Parallel() + + testCases := []struct { + name string + text string + key string + tag *string + value *string + + expErr string + exp string + assertions func(t *testing.T, g *d2graph.Graph) + }{ + { + name: "base", + text: ``, + key: `square`, + + exp: `square +`, + assertions: func(t *testing.T, g *d2graph.Graph) { + if len(g.Objects) != 1 { + t.Fatalf("expected 1 objects: %#v", g.Objects) + } + if g.Objects[0].ID != "square" { + t.Fatalf("expected g.Objects[0].ID to be square: %#v", g.Objects[0]) + } + if g.Objects[0].Attributes.Label.MapKey.Value.Unbox() != nil { + t.Fatalf("expected g.Objects[0].Attributes.Label.Node.Value.Unbox() == nil: %#v", g.Objects[0].Attributes.Label.MapKey.Value) + } + if d2format.Format(g.Objects[0].Attributes.Label.MapKey.Key) != "square" { + t.Fatalf("expected g.Objects[0].Attributes.Label.Node.Key to be square: %#v", g.Objects[0].Attributes.Label.MapKey.Key) + } + }, + }, + { + name: "edge", + text: `x -> y: one`, + key: `(x -> y)[0]`, + value: go2.Pointer(`two`), + + exp: `x -> y: two +`, + assertions: func(t *testing.T, g *d2graph.Graph) { + if len(g.Objects) != 2 { + t.Fatalf("expected 2 objects: %#v", g.Objects) + } + if len(g.Edges) != 1 { + t.Fatalf("expected 1 edge: %#v", g.Edges) + } + if g.Edges[0].Src.ID != "x" { + t.Fatalf("expected g.Edges[0].Src.ID == x: %#v", g.Edges[0].Src.ID) + } + if g.Edges[0].Dst.ID != "y" { + t.Fatalf("expected g.Edges[0].Dst.ID == y: %#v", g.Edges[0].Dst.ID) + } + if g.Edges[0].Attributes.Label.Value != "two" { + t.Fatalf("expected g.Edges[0].Attributes.Label.Value == two: %#v", g.Edges[0].Attributes.Label.Value) + } + }, + }, + { + name: "shape", + text: `square`, + key: `square.shape`, + value: go2.Pointer(`square`), + + exp: `square: {shape: square} +`, + assertions: func(t *testing.T, g *d2graph.Graph) { + if len(g.Objects) != 1 { + t.Fatalf("expected 1 objects: %#v", g.Objects) + } + if g.Objects[0].ID != "square" { + t.Fatalf("expected g.Objects[0].ID to be square: %#v", g.Objects[0]) + } + if g.Objects[0].Attributes.Shape.Value != d2target.ShapeSquare { + t.Fatalf("expected g.Objects[0].Attributes.Shape.Value == square: %#v", g.Objects[0].Attributes.Shape.Value) + } + }, + }, + { + name: "replace_shape", + text: `square.shape: square`, + key: `square.shape`, + value: go2.Pointer(`circle`), + + exp: `square.shape: circle +`, + assertions: func(t *testing.T, g *d2graph.Graph) { + if len(g.Objects) != 1 { + t.Fatalf("expected 1 objects: %#v", g.Objects) + } + if g.Objects[0].ID != "square" { + t.Fatalf("expected g.Objects[0].ID to be square: %#v", g.Objects[0]) + } + if g.Objects[0].Attributes.Shape.Value != d2target.ShapeCircle { + t.Fatalf("expected g.Objects[0].Attributes.Shape.Value == circle: %#v", g.Objects[0].Attributes.Shape.Value) + } + }, + }, + { + name: "new_style", + text: `square +`, + key: `square.style.opacity`, + value: go2.Pointer(`0.2`), + exp: `square: {style.opacity: 0.2} +`, + assertions: func(t *testing.T, g *d2graph.Graph) { + if len(g.AST.Nodes) != 1 { + t.Fatal(g.AST) + } + if len(g.Objects) != 1 { + t.Fatalf("expected 1 object but got %#v", len(g.Objects)) + } + f, err := strconv.ParseFloat(g.Objects[0].Attributes.Style.Opacity.Value, 64) + if err != nil || f != 0.2 { + t.Fatalf("expected g.Objects[0].Map.Nodes[0].MapKey.Value.Number.Value.Float64() == 0.2: %#v", f) + } + }, + }, + { + name: "inline_style", + text: `square: {style.opacity: 0.2} +`, + key: `square.style.fill`, + value: go2.Pointer(`red`), + exp: `square: { + style.opacity: 0.2 + style.fill: red +} +`, + assertions: func(t *testing.T, g *d2graph.Graph) { + if len(g.AST.Nodes) != 1 { + t.Fatal(g.AST) + } + }, + }, + { + name: "expanded_map_style", + text: `square: { + style: { + opacity: 0.1 + } +} +`, + key: `square.style.opacity`, + value: go2.Pointer(`0.2`), + exp: `square: { + style: { + opacity: 0.2 + } +} +`, + assertions: func(t *testing.T, g *d2graph.Graph) { + if len(g.AST.Nodes) != 1 { + t.Fatal(g.AST) + } + if len(g.AST.Nodes[0].MapKey.Value.Map.Nodes) != 1 { + t.Fatalf("expected 1 node within square but got %v", len(g.AST.Nodes[0].MapKey.Value.Map.Nodes)) + } + f, err := strconv.ParseFloat(g.Objects[0].Attributes.Style.Opacity.Value, 64) + if err != nil || f != 0.2 { + t.Fatal(err, f) + } + }, + }, + { + name: "replace_style", + text: `square.style.opacity: 0.1 +`, + key: `square.style.opacity`, + value: go2.Pointer(`0.2`), + exp: `square.style.opacity: 0.2 +`, + assertions: func(t *testing.T, g *d2graph.Graph) { + if len(g.AST.Nodes) != 1 { + t.Fatal(g.AST) + } + f, err := strconv.ParseFloat(g.Objects[0].Attributes.Style.Opacity.Value, 64) + if err != nil || f != 0.2 { + t.Fatal(err, f) + } + }, + }, + { + name: "replace_style_edgecase", + text: `square.style.fill: orange +`, + key: `square.style.opacity`, + value: go2.Pointer(`0.2`), + exp: `square.style.fill: orange +square.style.opacity: 0.2 +`, + assertions: func(t *testing.T, g *d2graph.Graph) { + if len(g.AST.Nodes) != 2 { + t.Fatal(g.AST) + } + f, err := strconv.ParseFloat(g.Objects[0].Attributes.Style.Opacity.Value, 64) + if err != nil || f != 0.2 { + t.Fatal(err, f) + } + }, + }, + { + name: "label_unset", + text: `square: "Always try to do things in chronological order; it's less confusing that way." +`, + key: `square.label`, + value: nil, + + exp: `square +`, + assertions: func(t *testing.T, g *d2graph.Graph) { + if len(g.Objects) != 1 { + t.Fatalf("expected 1 objects: %#v", g.Objects) + } + if g.Objects[0].ID != "square" { + t.Fatalf("expected g.Objects[0].ID to be square: %#v", g.Objects[0]) + } + if g.Objects[0].Attributes.Shape.Value == d2target.ShapeSquare { + t.Fatalf("expected g.Objects[0].Attributes.Shape.Value == square: %#v", g.Objects[0].Attributes.Shape.Value) + } + }, + }, + { + name: "label", + text: `square`, + key: `square.label`, + value: go2.Pointer(`Always try to do things in chronological order; it's less confusing that way.`), + + exp: `square: "Always try to do things in chronological order; it's less confusing that way." +`, + assertions: func(t *testing.T, g *d2graph.Graph) { + if len(g.Objects) != 1 { + t.Fatalf("expected 1 objects: %#v", g.Objects) + } + if g.Objects[0].ID != "square" { + t.Fatalf("expected g.Objects[0].ID to be square: %#v", g.Objects[0]) + } + if g.Objects[0].Attributes.Shape.Value == d2target.ShapeSquare { + t.Fatalf("expected g.Objects[0].Attributes.Shape.Value == square: %#v", g.Objects[0].Attributes.Shape.Value) + } + }, + }, + { + name: "label_replace", + text: `square: I am deeply CONCERNED and I want something GOOD for BREAKFAST!`, + key: `square`, + value: go2.Pointer(`Always try to do things in chronological order; it's less confusing that way.`), + + exp: `square: "Always try to do things in chronological order; it's less confusing that way." +`, + assertions: func(t *testing.T, g *d2graph.Graph) { + if len(g.AST.Nodes) != 1 { + t.Fatal(g.AST) + } + if len(g.Objects) != 1 { + t.Fatal(g.Objects) + } + if g.Objects[0].ID != "square" { + t.Fatal(g.Objects[0]) + } + if g.Objects[0].Attributes.Label.Value == "I am deeply CONCERNED and I want something GOOD for BREAKFAST!" { + t.Fatal(g.Objects[0].Attributes.Label.Value) + } + }, + }, + { + name: "map_key_missing", + text: `a -> b`, + key: `a`, + value: go2.Pointer(`Never offend people with style when you can offend them with substance.`), + + exp: `a -> b +a: Never offend people with style when you can offend them with substance. +`, + assertions: func(t *testing.T, g *d2graph.Graph) { + if len(g.Objects) != 2 { + t.Fatalf("expected 2 objects: %#v", g.Objects) + } + if len(g.Edges) != 1 { + t.Fatalf("expected 1 edge: %#v", g.Edges) + } + }, + }, + { + name: "nested_alex", + text: `this: { + label: do + test -> here: asdf +}`, + key: `this.here`, + value: go2.Pointer(`How much of their influence on you is a result of your influence on them? +A conference is a gathering of important people who singly can do nothing`), + + exp: `this: { + label: do + test -> here: asdf + here: "How much of their influence on you is a result of your influence on them?\nA conference is a gathering of important people who singly can do nothing" +} +`, + assertions: func(t *testing.T, g *d2graph.Graph) { + if len(g.Objects) != 3 { + t.Fatalf("expected 3 objects: %#v", g.Objects) + } + if len(g.Edges) != 1 { + t.Fatalf("expected 1 edge: %#v", g.Edges) + } + }, + }, + { + name: "label_primary", + text: `oreo: { + q -> z +}`, + key: `oreo`, + value: go2.Pointer(`QOTD: "It's been Monday all week today."`), + + exp: `oreo: 'QOTD: "It''s been Monday all week today."' { + q -> z +} +`, + assertions: func(t *testing.T, g *d2graph.Graph) { + if len(g.Objects) != 3 { + t.Fatalf("expected 3 objects: %#v", g.Objects) + } + if len(g.Edges) != 1 { + t.Fatalf("expected 1 edge: %#v", g.Edges) + } + }, + }, + { + name: "edge_index_nested", + text: `oreo: { + q -> z +}`, + key: `(oreo.q -> oreo.z)[0]`, + value: go2.Pointer(`QOTD`), + + exp: `oreo: { + q -> z: QOTD +} +`, + assertions: func(t *testing.T, g *d2graph.Graph) { + if len(g.Objects) != 3 { + t.Fatalf("expected 3 objects: %#v", g.Objects) + } + if len(g.Edges) != 1 { + t.Fatalf("expected 1 edge: %#v", g.Edges) + } + }, + }, + { + name: "edge_index_case", + text: `Square: { + Square -> Square 2 +} +z: { + x -> y +} +`, + key: `Square.(Square -> Square 2)[0]`, + value: go2.Pointer(`two`), + + exp: `Square: { + Square -> Square 2: two +} +z: { + x -> y +} +`, + assertions: func(t *testing.T, g *d2graph.Graph) { + if len(g.Objects) != 6 { + t.Fatalf("expected 6 objects: %#v", g.Objects) + } + if len(g.Edges) != 2 { + t.Fatalf("expected 2 edges: %#v", g.Edges) + } + if g.Edges[0].Attributes.Label.Value != "two" { + t.Fatalf("expected g.Edges[0].Attributes.Label.Value == two: %#v", g.Edges[0].Attributes.Label.Value) + } + }, + }, + { + name: "icon", + text: `meow + `, + key: `meow.icon`, + value: go2.Pointer(`https://icons.terrastruct.com/essentials/087-menu.svg`), + + exp: `meow: {icon: https://icons.terrastruct.com/essentials/087-menu.svg} +`, + assertions: func(t *testing.T, g *d2graph.Graph) { + if len(g.Objects) != 1 { + t.Fatal(g.Objects) + } + if g.Objects[0].Attributes.Icon.String() != "https://icons.terrastruct.com/essentials/087-menu.svg" { + t.Fatal(g.Objects[0].Attributes.Icon.String()) + } + }, + }, + { + name: "edge_chain", + text: `oreo: { + q -> z -> p: wsup +}`, + key: `(oreo.q -> oreo.z)[0]`, + value: go2.Pointer(`QOTD: + "It's been Monday all week today."`), + + exp: `oreo: { + q -> z -> p: wsup + (q -> z)[0]: "QOTD:\n \"It's been Monday all week today.\"" +} +`, + assertions: func(t *testing.T, g *d2graph.Graph) { + if len(g.Objects) != 4 { + t.Fatalf("expected 4 objects: %#v", g.Objects) + } + if len(g.Edges) != 2 { + t.Fatalf("expected 2 edges: %#v", g.Edges) + } + }, + }, + { + name: "edge_nested_label_set", + text: `oreo: { + q -> z: wsup +}`, + key: `(oreo.q -> oreo.z)[0].label`, + value: go2.Pointer(`yo`), + + exp: `oreo: { + q -> z: yo +} +`, + assertions: func(t *testing.T, g *d2graph.Graph) { + if len(g.Objects) != 3 { + t.Fatalf("expected 3 objects: %#v", g.Objects) + } + if len(g.Edges) != 1 { + t.Fatalf("expected 1 edge: %#v", g.Edges) + } + if g.Edges[0].Src.ID != "q" { + t.Fatal(g.Edges[0].Src.ID) + } + }, + }, + { + name: "shape_nested_style_set", + text: `x +`, + key: `x.style.opacity`, + value: go2.Pointer(`0.4`), + + exp: `x: {style.opacity: 0.4} +`, + }, + { + name: "edge_nested_style_set", + text: `oreo: { + q -> z: wsup +} +`, + key: `(oreo.q -> oreo.z)[0].style.opacity`, + value: go2.Pointer(`0.4`), + + exp: `oreo: { + q -> z: wsup {style.opacity: 0.4} +} +`, + assertions: func(t *testing.T, g *d2graph.Graph) { + assert.Equal(t, 3, len(g.Objects)) + assert.Equal(t, 1, len(g.Edges)) + assert.Equal(t, "q", g.Edges[0].Src.ID) + assert.Equal(t, "0.4", g.Edges[0].Attributes.Style.Opacity.Value) + }, + }, + { + name: "edge_chain_append_style", + text: `x -> y -> z +`, + key: `(x -> y)[0].style.animated`, + value: go2.Pointer(`true`), + + exp: `x -> y -> z +(x -> y)[0].style.animated: true +`, + }, + { + name: "edge_chain_existing_style", + text: `x -> y -> z +(y -> z)[0].style.opacity: 0.4 +`, + key: `(y -> z)[0].style.animated`, + value: go2.Pointer(`true`), + + exp: `x -> y -> z +(y -> z)[0].style.opacity: 0.4 +(y -> z)[0].style.animated: true +`, + }, + { + name: "edge_key_and_key", + text: `a +a.b -> a.c +`, + key: `a.(b -> c)[0].style.animated`, + value: go2.Pointer(`true`), + + exp: `a +a.b -> a.c: {style.animated: true} +`, + }, + { + name: "edge_label", + text: `a -> b: "yo" +`, + key: `(a -> b)[0].style.animated`, + value: go2.Pointer(`true`), + + exp: `a -> b: "yo" {style.animated: true} +`, + }, + { + name: "edge_append_style", + text: `x -> y +`, + key: `(x -> y)[0].style.animated`, + value: go2.Pointer(`true`), + + exp: `x -> y: {style.animated: true} +`, + }, + { + name: "edge_merge_style", + text: `x -> y: { + style: { + opacity: 0.4 + } +} +`, + key: `(x -> y)[0].style.animated`, + value: go2.Pointer(`true`), + + exp: `x -> y: { + style: { + opacity: 0.4 + animated: true + } +} +`, + }, + { + name: "edge_chain_nested_set", + text: `oreo: { + q -> z -> p: wsup +}`, + key: `(oreo.q -> oreo.z)[0].style.opacity`, + value: go2.Pointer(`0.4`), + + exp: `oreo: { + q -> z -> p: wsup + (q -> z)[0].style.opacity: 0.4 +} +`, + assertions: func(t *testing.T, g *d2graph.Graph) { + if len(g.Objects) != 4 { + t.Fatalf("expected 4 objects: %#v", g.Objects) + } + if len(g.Edges) != 2 { + t.Fatalf("expected 2 edges: %#v", g.Edges) + } + if g.Edges[0].Src.ID != "q" { + t.Fatal(g.Edges[0].Src.ID) + } + if g.Edges[0].Attributes.Style.Opacity.Value != "0.4" { + t.Fatal(g.Edges[0].Attributes.Style.Opacity.Value) + } + }, + }, + { + name: "block_string_oneline", + + text: ``, + key: `x`, + tag: go2.Pointer("md"), + value: go2.Pointer(`|||what's up|||`), + + exp: `x: ||||md |||what's up||| |||| +`, + }, + { + name: "block_string_multiline", + + text: ``, + key: `x`, + tag: go2.Pointer("md"), + value: go2.Pointer(`# header +He has not acquired a fortune; the fortune has acquired him. +He has not acquired a fortune; the fortune has acquired him.`), + + exp: `x: |md + # header + He has not acquired a fortune; the fortune has acquired him. + He has not acquired a fortune; the fortune has acquired him. +| +`, + }, + // TODO: pass + /* + { + name: "oneline_constraint", + + text: `My Table: { + shape: sql_table + column: int + } + `, + key: `My Table.column.constraint`, + value: utils.Pointer("PK"), + + exp: `My Table: { + shape: sql_table + column: int {constraint: PK} + } + `, + }, + */ + // TODO: pass + /* + { + name: "oneline_style", + + text: `foo: bar + `, + key: `foo.style_fill`, + value: utils.Pointer("red"), + + exp: `foo: bar {style_fill: red} + `, + }, + */ + + { + name: "errors/bad_tag", + + text: `x.icon: hello +`, + key: "x.icon", + tag: go2.Pointer("one two"), + value: go2.Pointer(`three +four +five +six +`), + + expErr: `failed to set "x.icon" to "one two" "\"three\\nfour\\nfive\\nsix\\n\"": spaces are not allowed in blockstring tags`, + }, + } + + for _, tc := range testCases { + tc := tc + t.Run(tc.name, func(t *testing.T) { + t.Parallel() + + et := editTest{ + text: tc.text, + testFunc: func(g *d2graph.Graph) (*d2graph.Graph, error) { + return d2oracle.Set(g, tc.key, tc.tag, tc.value) + }, + + exp: tc.exp, + expErr: tc.expErr, + assertions: tc.assertions, + } + et.run(t) + }) + } +} + +func TestRename(t *testing.T) { + t.Parallel() + + testCases := []struct { + name string + + text string + key string + newName string + + expErr string + exp string + assertions func(t *testing.T, g *d2graph.Graph) + }{ + { + name: "flat", + + text: `nerve-gift-earther +`, + key: `nerve-gift-earther`, + newName: `---`, + + exp: `"---" +`, + assertions: func(t *testing.T, g *d2graph.Graph) { + if len(g.Objects) != 1 { + t.Fatalf("expected one object: %#v", g.Objects) + } + if g.Objects[0].ID != `"---"` { + t.Fatalf("unexpected object id: %q", g.Objects[0].ID) + } + }, + }, + { + name: "generated", + + text: `Square +`, + key: `Square`, + newName: `Square`, + + exp: `Square +`, + }, + { + name: "near", + + text: `x: { + near: y +} +y +`, + key: `y`, + newName: `z`, + + exp: `x: { + near: z +} +z +`, + }, + { + name: "conflict", + + text: `lalal +la +`, + key: `lalal`, + newName: `la`, + + exp: `la 2 +la +`, + }, + { + name: "conflict 2", + + text: `1.2.3: { + 4 + 5 +} +`, + key: "1.2.3.4", + newName: "5", + + exp: `1.2.3: { + 5 2 + 5 +} +`, + }, + { + name: "conflict_with_dots", + + text: `"a.b" +y +`, + key: "y", + newName: "a.b", + + exp: `"a.b" +"a.b 2" +`, + }, + { + name: "nested", + + text: `x.y.z.q.nerve-gift-earther +x.y.z.q: { + nerve-gift-earther +} +`, + key: `x.y.z.q.nerve-gift-earther`, + newName: `nerve-gift-jingler`, + + exp: `x.y.z.q.nerve-gift-jingler +x.y.z.q: { + nerve-gift-jingler +} +`, + assertions: func(t *testing.T, g *d2graph.Graph) { + if len(g.Objects) != 5 { + t.Fatalf("expected five objects: %#v", g.Objects) + } + if g.Objects[4].AbsID() != "x.y.z.q.nerve-gift-jingler" { + t.Fatalf("unexpected object absolute id: %q", g.Objects[4].AbsID()) + } + }, + }, + { + name: "edges", + + text: `q.z -> p.k -> q.z -> l.a -> q.z +q: { + q -> + -> z + z: label +} +`, + key: `q.z`, + newName: `%%%`, + + exp: `q.%%% -> p.k -> q.%%% -> l.a -> q.%%% +q: { + q -> + -> %%% + %%%: label +} +`, + assertions: func(t *testing.T, g *d2graph.Graph) { + if len(g.Objects) != 8 { + t.Fatalf("expected eight objects: %#v", g.Objects) + } + if g.Objects[1].AbsID() != "q.%%%" { + t.Fatalf("unexpected object absolute ID: %q", g.Objects[1].AbsID()) + } + }, + }, + { + name: "container", + + text: `ok.q.z -> p.k -> ok.q.z -> l.a -> ok.q.z +ok.q: { + q -> + -> z + z: label +} +ok: { + q: { + i + } +} +(ok.q.z -> p.k)[0]: "furbling, v.:" +more.(ok.q.z -> p.k): "furbling, v.:" +`, + key: `ok.q`, + newName: ``, + + exp: `ok."".z -> p.k -> ok."".z -> l.a -> ok."".z +ok."": { + q -> + -> z + z: label +} +ok: { + "": { + i + } +} +(ok."".z -> p.k)[0]: "furbling, v.:" +more.(ok.q.z -> p.k): "furbling, v.:" +`, + assertions: func(t *testing.T, g *d2graph.Graph) { + if len(g.Objects) != 16 { + t.Fatalf("expected 16 objects: %#v", g.Objects) + } + if g.Objects[2].AbsID() != `ok."".z` { + t.Fatalf("unexpected object absolute ID: %q", g.Objects[1].AbsID()) + } + }, + }, + { + name: "complex_edge_1", + + text: `a.b.(x -> y).q.z +`, + key: "a.b", + newName: "ooo", + + exp: `a.ooo.(x -> y).q.z +`, + assertions: func(t *testing.T, g *d2graph.Graph) { + if len(g.Objects) != 4 { + t.Fatalf("expected 4 objects: %#v", g.Objects) + } + if len(g.Edges) != 1 { + t.Fatalf("expected 1 edge: %#v", g.Edges) + } + }, + }, + { + name: "complex_edge_2", + + text: `a.b.(x -> y).q.z +`, + key: "a.b.x", + newName: "papa", + + exp: `a.b.(papa -> y).q.z +`, + assertions: func(t *testing.T, g *d2graph.Graph) { + if len(g.Objects) != 4 { + t.Fatalf("expected 4 objects: %#v", g.Objects) + } + if len(g.Edges) != 1 { + t.Fatalf("expected 1 edge: %#v", g.Edges) + } + }, + }, + /* TODO: handle edge keys + { + name: "complex_edge_3", + + text: `a.b.(x -> y).q.z + `, + key: "a.b.(x -> y)[0].q", + newName: "zoink", + + exp: `a.b.(x -> y).zoink.z + `, + assertions: func(t *testing.T, g *d2graph.Graph) { + if len(g.Objects) != 4 { + t.Fatalf("expected 4 objects: %#v", g.Objects) + } + if len(g.Edges) != 1 { + t.Fatalf("expected 1 edge: %#v", g.Edges) + } + }, + }, + */ + { + name: "arrows", + + text: `x -> y +`, + key: "(x -> y)[0]", + newName: "(x <- y)[0]", + + exp: `x <- y +`, + assertions: func(t *testing.T, g *d2graph.Graph) { + if len(g.Objects) != 2 { + t.Fatalf("expected 2 objects: %#v", g.Objects) + } + if len(g.Edges) != 1 { + t.Fatalf("expected 1 edge: %#v", g.Edges) + } + if !g.Edges[0].SrcArrow || g.Edges[0].DstArrow { + t.Fatalf("expected src arrow and no dst arrow: %#v", g.Edges[0]) + } + }, + }, + { + name: "arrows_complex", + + text: `a.b.(x -- y).q.z +`, + key: "a.b.(x -- y)[0]", + newName: "(x <-> y)[0]", + + exp: `a.b.(x <-> y).q.z +`, + assertions: func(t *testing.T, g *d2graph.Graph) { + if len(g.Objects) != 4 { + t.Fatalf("expected 4 objects: %#v", g.Objects) + } + if len(g.Edges) != 1 { + t.Fatalf("expected 1 edge: %#v", g.Edges) + } + if !g.Edges[0].SrcArrow || !g.Edges[0].DstArrow { + t.Fatalf("expected src arrow and dst arrow: %#v", g.Edges[0]) + } + }, + }, + { + name: "arrows_chain", + + text: `x -> y -> z -> q +`, + key: "(x -> y)[0]", + newName: "(x <-> y)[0]", + + exp: `x <-> y -> z -> q +`, + assertions: func(t *testing.T, g *d2graph.Graph) { + if len(g.Objects) != 4 { + t.Fatalf("expected 4 objects: %#v", g.Objects) + } + if len(g.Edges) != 3 { + t.Fatalf("expected 3 edges: %#v", g.Edges) + } + if !g.Edges[0].SrcArrow || !g.Edges[0].DstArrow { + t.Fatalf("expected src arrow and dst arrow: %#v", g.Edges[0]) + } + }, + }, + { + name: "arrows_trim_common", + + text: `x.(x -> y -> z -> q) +`, + key: "(x.x -> x.y)[0]", + newName: "(x.x <-> x.y)[0]", + + exp: `x.(x <-> y -> z -> q) +`, + assertions: func(t *testing.T, g *d2graph.Graph) { + if len(g.Objects) != 5 { + t.Fatalf("expected 5 objects: %#v", g.Objects) + } + if len(g.Edges) != 3 { + t.Fatalf("expected 3 edges: %#v", g.Edges) + } + if !g.Edges[0].SrcArrow || !g.Edges[0].DstArrow { + t.Fatalf("expected src arrow and dst arrow: %#v", g.Edges[0]) + } + }, + }, + { + name: "arrows_trim_common_2", + + text: `x.x -> x.y -> x.z -> x.q) +`, + key: "(x.x -> x.y)[0]", + newName: "(x.x <-> x.y)[0]", + + exp: `x.x <-> x.y -> x.z -> x.q) +`, + assertions: func(t *testing.T, g *d2graph.Graph) { + if len(g.Objects) != 5 { + t.Fatalf("expected 5 objects: %#v", g.Objects) + } + if len(g.Edges) != 3 { + t.Fatalf("expected 3 edges: %#v", g.Edges) + } + if !g.Edges[0].SrcArrow || !g.Edges[0].DstArrow { + t.Fatalf("expected src arrow and dst arrow: %#v", g.Edges[0]) + } + }, + }, + + { + name: "errors/empty_key", + + text: ``, + key: "", + + expErr: `failed to rename "" to "": empty map key: ""`, + }, + { + name: "errors/nonexistent", + + text: ``, + key: "1.2.3.4", + newName: "bic", + + expErr: `failed to rename "1.2.3.4" to "bic": key referenced by from does not exist`, + }, + + { + name: "errors/reserved_keys", + + text: `x.icon: hello +`, + key: "x.icon", + newName: "near", + expErr: `failed to rename "x.icon" to "near": cannot rename to reserved keyword: "near"`, + }, + } + + for _, tc := range testCases { + tc := tc + t.Run(tc.name, func(t *testing.T) { + t.Parallel() + + et := editTest{ + text: tc.text, + testFunc: func(g *d2graph.Graph) (*d2graph.Graph, error) { + return d2oracle.Rename(g, tc.key, tc.newName) + }, + + exp: tc.exp, + expErr: tc.expErr, + assertions: tc.assertions, + } + et.run(t) + }) + } +} + +func TestMove(t *testing.T) { + t.Parallel() + + testCases := []struct { + skip bool + name string + + text string + key string + newKey string + + expErr string + exp string + assertions func(t *testing.T, g *d2graph.Graph) + }{ + { + name: "basic", + + text: `a +`, + key: `a`, + newKey: `b`, + + exp: `b +`, + assertions: func(t *testing.T, g *d2graph.Graph) { + assert.Equal(t, len(g.Objects), 1) + assert.Equal(t, g.Objects[0].ID, "b") + }, + }, + { + name: "basic_nested", + + text: `a: { + b +} +`, + key: `a.b`, + newKey: `a.c`, + + exp: `a: { + c +} +`, + assertions: func(t *testing.T, g *d2graph.Graph) { + assert.Equal(t, len(g.Objects), 2) + assert.Equal(t, g.Objects[1].ID, "c") + }, + }, + { + name: "rename_2", + + text: `a: { + b 2 + y 2 +} +b 2 +x +`, + key: `a`, + newKey: `x.a`, + + exp: `b +y 2 + +b 2 +x: { + a +} +`, + }, + { + name: "parentheses", + + text: `x -> y (z) +z: "" +`, + key: `"y (z)"`, + newKey: `z.y (z)`, + + exp: `x -> z.y (z) +z: "" +`, + }, + { + name: "into_container_existing_map", + + text: `a: { + b +} +c +`, + key: `c`, + newKey: `a.c`, + + exp: `a: { + b + c +} +`, + assertions: func(t *testing.T, g *d2graph.Graph) { + assert.Equal(t, len(g.Objects), 3) + assert.Equal(t, "a", g.Objects[0].ID) + assert.Equal(t, 2, len(g.Objects[0].Children)) + }, + }, + { + name: "into_container_with_flat_keys", + + text: `a +c: { + style.opacity: 0.4 + style.fill: "#FFFFFF" + style.stroke: "#FFFFFF" +} +`, + key: `c`, + newKey: `a.c`, + + exp: `a: { + c: { + style.opacity: 0.4 + style.fill: "#FFFFFF" + style.stroke: "#FFFFFF" + } +} +`, + }, + { + name: "into_container_nonexisting_map", + + text: `a +c +`, + key: `c`, + newKey: `a.c`, + + exp: `a: { + c +} +`, + assertions: func(t *testing.T, g *d2graph.Graph) { + assert.Equal(t, len(g.Objects), 2) + assert.Equal(t, "a", g.Objects[0].ID) + assert.Equal(t, 1, len(g.Objects[0].Children)) + }, + }, + { + name: "basic_out_of_container", + + text: `a: { + b +} +`, + key: `a.b`, + newKey: `b`, + + exp: `a +b +`, + assertions: func(t *testing.T, g *d2graph.Graph) { + assert.Equal(t, len(g.Objects), 2) + assert.Equal(t, "a", g.Objects[0].ID) + assert.Equal(t, 0, len(g.Objects[0].Children)) + }, + }, + { + name: "partial_slice", + + text: `a: { + b +} +a.b +`, + key: `a.b`, + newKey: `b`, + + exp: `a +b +`, + }, + { + name: "partial_edge_slice", + + text: `a: { + b +} +a.b -> c +`, + key: `a.b`, + newKey: `b`, + + exp: `a +b -> c +b +`, + }, + { + name: "full_edge_slice", + + text: `a: { + b: { + c + } + b.c -> d +} +a.b.c -> a.d +`, + key: `a.b.c`, + newKey: `c`, + + exp: `a: { + b + _.c -> d +} +c -> a.d +c +`, + }, + { + name: "full_slice", + + text: `a: { + b: { + c + } + b.c +} +a.b.c +`, + key: `a.b.c`, + newKey: `c`, + + exp: `a: { + b +} +c +`, + }, + { + name: "slice_style", + + text: `a: { + b +} +a.b.icon: https://icons.terrastruct.com/essentials/142-target.svg +`, + key: `a.b`, + newKey: `b`, + + exp: `a +b.icon: https://icons.terrastruct.com/essentials/142-target.svg +b +`, + }, + { + name: "between_containers", + + text: `a: { + b +} +c +`, + key: `a.b`, + newKey: `c.b`, + + exp: `a +c: { + b +} +`, + assertions: func(t *testing.T, g *d2graph.Graph) { + assert.Equal(t, len(g.Objects), 3) + assert.Equal(t, "a", g.Objects[0].ID) + assert.Equal(t, 0, len(g.Objects[0].Children)) + assert.Equal(t, "c", g.Objects[1].ID) + assert.Equal(t, 1, len(g.Objects[1].Children)) + }, + }, + { + name: "hoist_container_children", + + text: `a: { + b + c +} +d +`, + key: `a`, + newKey: `d.a`, + + exp: `b +c + +d: { + a +} +`, + }, + { + name: "middle_container", + + text: `x: { + y: { + z + } +} +`, + key: `x.y`, + newKey: `y`, + + exp: `x: { + z +} +y +`, + }, + { + // a.b does not move from its scope, just extends path + name: "extend_stationary_path", + + text: `a.b +a: { + b + c +} +`, + key: `a.b`, + newKey: `a.c.b`, + + exp: `a.c.b +a: { + c: { + b + } +} +`, + assertions: func(t *testing.T, g *d2graph.Graph) { + assert.Equal(t, len(g.Objects), 3) + }, + }, + { + name: "extend_map", + + text: `a.b: { + e +} +a: { + b + c +} +`, + key: `a.b`, + newKey: `a.c.b`, + + exp: `a: { + e +} +a: { + c: { + b + } +} +`, + }, + { + name: "into_container_with_flat_style", + + text: `x.style.border-radius: 5 +y +`, + key: `y`, + newKey: `x.y`, + + exp: `x: { + style.border-radius: 5 + y +} +`, + }, + { + name: "flat_between_containers", + + text: `a.b +c +`, + key: `a.b`, + newKey: `c.b`, + + exp: `a +c: { + b +} +`, + assertions: func(t *testing.T, g *d2graph.Graph) { + assert.Equal(t, len(g.Objects), 3) + }, + }, + { + name: "flat_middle_container", + + text: `a.b.c +d +`, + key: `a.b`, + newKey: `d.b`, + + exp: `a.c +d: { + b +} +`, + assertions: func(t *testing.T, g *d2graph.Graph) { + assert.Equal(t, len(g.Objects), 4) + }, + }, + { + name: "flat_merge", + + text: `a.b +c.d: meow +`, + key: `a.b`, + newKey: `c.b`, + + exp: `a +c: { + d: meow + b +} +`, + assertions: func(t *testing.T, g *d2graph.Graph) { + assert.Equal(t, len(g.Objects), 4) + }, + }, + { + name: "flat_reparent_with_value", + text: `a.b: "yo" +`, + key: `a.b`, + newKey: `b`, + + exp: `a +b: "yo" +`, + }, + { + name: "flat_reparent_with_map_value", + text: `a.b: { + shape: hexagon +} +`, + key: `a.b`, + newKey: `b`, + + exp: `a +b: { + shape: hexagon +} +`, + }, + { + name: "flat_reparent_with_mixed_map_value", + text: `a.b: { + # this is reserved + shape: hexagon + # this is not + c +} +`, + key: `a.b`, + newKey: `b`, + + exp: `a: { + # this is not + c +} +b: { + # this is reserved + shape: hexagon +} +`, + }, + { + name: "flat_style", + + text: `a.style.opacity: 0.4 +a.style.fill: black +b +`, + key: `a`, + newKey: `b.a`, + + exp: `b: { + a.style.opacity: 0.4 + a.style.fill: black +} +`, + }, + { + name: "flat_nested_merge", + + text: `a.b.c.d.e +p.q.b.m.o +`, + key: `a.b.c`, + newKey: `p.q.z`, + + exp: `a.b.d.e +p.q: { + b.m.o + z +} +`, + }, + { + // We open up only the most nested + name: "flat_nested_merge_multiple_refs", + + text: `a: { + b.c.d + e.f + e.g +} +a.b.c +a.b.c.q +`, + key: `a.e`, + newKey: `a.b.c.e`, + + exp: `a: { + b.c: { + d + e + } + f + g +} +a.b.c +a.b.c.q +`, + }, + { + // TODO + skip: true, + // Choose to move to a reference that is less nested but has an existing map + name: "less_nested_map", + + text: `a: { + b: { + c + } +} +a.b.c: { + d +} +e +`, + key: `e`, + newKey: `a.b.c.e`, + + exp: `a: { + b: { + c + } +} +a.b.c: { + d + e +} +`, + }, + { + name: "near", + + text: `x: { + near: y +} +y +`, + key: `y`, + newKey: `x.y`, + + exp: `x: { + near: x.y + y +} +`, + }, + { + name: "container_near", + + text: `x: { + y: { + near: x.a.b.z + } + a.b.z +} +y +`, + key: `x.a.b`, + newKey: `y.a`, + + exp: `x: { + y: { + near: x.a.z + } + a.z +} +y: { + a +} +`, + }, + { + name: "nhooyr_one", + + text: `a: { + b.c +} +d +`, + key: `a.b`, + newKey: `d.q`, + + exp: `a: { + c +} +d: { + q +} +`, + }, + { + name: "nhooyr_two", + + text: `a: { + b.c -> meow +} +d: { + x +} +`, + key: `a.b`, + newKey: `d.b`, + + exp: `a: { + c -> meow +} +d: { + x + b +} +`, + }, + { + name: "unique_name", + + text: `a: { + b +} +a.b +c: { + b +} +`, + key: `c.b`, + newKey: `a.b`, + + exp: `a: { + b + b 2 +} +a.b +c +`, + }, + { + name: "unique_name_with_references", + + text: `a: { + b +} +d -> c.b +c: { + b +} +`, + key: `c.b`, + newKey: `a.b`, + + exp: `a: { + b + b 2 +} +d -> a.b 2 +c +`, + }, + { + name: "map_transplant", + + text: `a: { + b + style: { + opacity: 0.4 + } + c + label: "yo" +} +d +`, + key: `a`, + newKey: `d.a`, + + exp: `b + +c + +d: { + a: { + style: { + opacity: 0.4 + } + + label: "yo" + } +} +`, + }, + { + name: "map_with_label", + + text: `a: "yo" { + c +} +d +`, + key: `a`, + newKey: `d.a`, + + exp: `c + +d: { + a: "yo" +} +`, + }, + { + name: "underscore_merge", + + text: `a: { + _.b: "yo" +} +b: "what" +c +`, + key: `b`, + newKey: `c.b`, + + exp: `a + +c: { + b: "yo" + b: "what" +} +`, + }, + { + name: "underscore_children", + + text: `a: { + _.b +} +b +`, + key: `b`, + newKey: `c`, + + exp: `a: { + _.c +} +c +`, + }, + { + name: "underscore_transplant", + + text: `a: { + b: { + _.c + } +} +`, + key: `a.c`, + newKey: `c`, + + exp: `a: { + b +} +c +`, + }, + { + name: "underscore_split", + + text: `a: { + b: { + _.c.f + } +} +`, + key: `a.c`, + newKey: `c`, + + exp: `a: { + b: { + _.f + } +} +c +`, + }, + { + name: "underscore_edge_container_1", + + text: `a: { + _.b -> c +} +`, + key: `b`, + newKey: `a.b`, + + exp: `a: { + b -> c +} +`, + }, + { + name: "underscore_edge_container_2", + + text: `a: { + _.b -> c +} +`, + key: `b`, + newKey: `a.c.b`, + + exp: `a: { + c.b -> c +} +`, + }, + { + name: "underscore_edge_container_3", + + text: `a: { + _.b -> c +} +`, + key: `b`, + newKey: `d`, + + exp: `a: { + _.d -> c +} +`, + }, + { + name: "underscore_edge_container_4", + + text: `a: { + _.b -> c +} +`, + key: `b`, + newKey: `a.f`, + + exp: `a: { + f -> c +} +`, + }, + { + name: "underscore_edge_container_5", + + text: `a: { + _.b -> _.c +} +`, + key: `b`, + newKey: `c.b`, + + exp: `a: { + _.c.b -> _.c +} +`, + }, + { + name: "underscore_edge_split", + + text: `a: { + b: { + _.c.f -> yo + } +} +`, + key: `a.c`, + newKey: `c`, + + exp: `a: { + b: { + _.f -> yo + } +} +c +`, + }, + { + name: "underscore_split_out", + + text: `a: { + b: { + _.c.f + } + c: { + e + } +} +`, + key: `a.c.f`, + newKey: `a.c.e.f`, + + exp: `a: { + b: { + _.c + } + c: { + e: { + f + } + } +} +`, + }, + { + name: "underscore_edge_children", + + text: `a: { + _.b -> c +} +b +`, + key: `b`, + newKey: `c`, + + exp: `a: { + _.c -> c +} +c +`, + }, + { + name: "move_container_children", + + text: `b: { + p + q +} +a +d +`, + key: `b`, + newKey: `d.b`, + + exp: `p +q + +a +d: { + b +} +`, + }, + { + name: "move_container_conflict_children", + + text: `x: { + a + b +} +a +d +`, + key: `x`, + newKey: `d.x`, + + exp: `a 2 +b + +a +d: { + x +} +`, + }, + { + name: "edge_conflict", + + text: `x.y.a -> x.y.b +y +`, + key: `x`, + newKey: `y.x`, + + exp: `y 2.a -> y 2.b +y: { + x +} +`, + }, + { + name: "edge_basic", + + text: `a -> b +`, + key: `a`, + newKey: `c`, + + exp: `c -> b +`, + }, + { + name: "edge_nested_basic", + + text: `a: { + b -> c +} +`, + key: `a.b`, + newKey: `a.d`, + + exp: `a: { + d -> c +} +`, + }, + { + name: "edge_into_container", + + text: `a: { + d +} +b -> c +`, + key: `b`, + newKey: `a.b`, + + exp: `a: { + d +} +a.b -> c +`, + }, + { + name: "edge_out_of_container", + + text: `a: { + b -> c +} +`, + key: `a.b`, + newKey: `b`, + + exp: `a: { + _.b -> c +} +`, + }, + { + name: "connected_nested", + + text: `x -> y.z +`, + key: `y.z`, + newKey: `z`, + + exp: `x -> z +y +`, + }, + { + name: "chain_connected_nested", + + text: `y.z -> x -> y.z +`, + key: `y.z`, + newKey: `z`, + + exp: `z -> x -> z +y +`, + }, + { + name: "chain_connected_nested_no_extra_create", + + text: `y.b -> x -> y.z +`, + key: `y.z`, + newKey: `z`, + + exp: `y.b -> x -> z +`, + }, + { + name: "edge_across_containers", + + text: `a: { + b -> c +} +d +`, + key: `a.b`, + newKey: `d.b`, + + exp: `a: { + _.d.b -> c +} +d +`, + }, + { + name: "move_out_of_edge", + + text: `a.b.c -> d.e.f +`, + key: `a.b`, + newKey: `q`, + + exp: `a.c -> d.e.f +q +`, + }, + { + name: "move_out_of_nested_edge", + + text: `a.b.c -> d.e.f +`, + key: `a.b`, + newKey: `d.e.q`, + + exp: `a.c -> d.e.f +d.e: { + q +} +`, + }, + { + name: "append_multiple_styles", + + text: `a: { + style: { + opacity: 0.4 + } +} +a: { + style: { + fill: "red" + } +} +d +`, + key: `a`, + newKey: `d.a`, + + exp: `d: { + a: { + style: { + opacity: 0.4 + } + } + a: { + style: { + fill: "red" + } + } +} +`, + }, + { + name: "move_into_key_with_value", + + text: `a: meow +b +`, + key: `b`, + newKey: `a.b`, + + exp: `a: meow { + b +} +`, + }, + { + name: "gnarly_1", + + text: `a.b.c -> d.e.f +b: meow { + p: "eyy" + q + p.p -> q.q +} +b.p.x -> d +`, + key: `b`, + newKey: `d.b`, + + exp: `a.b.c -> d.e.f +d: { + b: meow +} +p: "eyy" +q +p.p -> q.q + +p.x -> d +`, + }, + { + name: "reuse_map", + + text: `a: { + b: { + hey + } + b.yo +} +k +`, + key: `k`, + newKey: `a.b.k`, + + exp: `a: { + b: { + hey + k + } + b.yo +} +`, + }, + { + // TODO the heuristic for splitting open new maps should be only if the key has no existing maps and it also has either zero or one children. if it has two children or more then we should not be opening a map and just append the key at the most nested map. + // first loop over explicit references from first to last. + // + // explicit ref means its the leaf disregarding reserved fields. + // implicit ref means there is a shape declared after the target element. + // + // then loop over the implicit references and only if there is no explicit ref do you need to add the implicit ref to the scope but only if appended == false (which would be set when looping through explicit refs). + skip: true, + name: "merge_nested_flat", + + text: `a: { + b.c + b.d + b.e.g +} +k +`, + key: `k`, + newKey: `a.b.k`, + + exp: `a: { + b.c + b.d + b.e.g + b.k +} +`, + }, + { + name: "merge_nested_maps", + + text: `a: { + b.c + b.d + b.e.g + b.d: { + o + } +} +k +`, + key: `k`, + newKey: `a.b.k`, + + exp: `a: { + b.c + b.d + b.e.g + b: { + d: { + o + } + k + } +} +`, + }, + { + name: "merge_reserved", + + text: `a: { + b.c + b.label: "yo" + b.label: "hi" + b.e.g +} +k +`, + key: `k`, + newKey: `a.b.k`, + + exp: `a: { + b.c + b.label: "yo" + b.label: "hi" + b: { + e.g + k + } +} +`, + }, + { + name: "multiple_nesting_levels", + + text: `a: { + b: { + c + c.g + } + b.c.d + x +} +a.b.c.f +`, + key: `a.x`, + newKey: `a.b.c.x`, + + exp: `a: { + b: { + c + c: { + g + x + } + } + b.c.d +} +a.b.c.f +`, + }, + { + name: "edge_chain_basic", + + text: `a -> b -> c +`, + key: `a`, + newKey: `d`, + + exp: `d -> b -> c +`, + }, + { + name: "edge_chain_into_container", + + text: `a -> b -> c +d +`, + key: `a`, + newKey: `d.a`, + + exp: `d.a -> b -> c +d +`, + }, + { + name: "edge_chain_out_container", + + text: `a: { + b -> c -> d +} +`, + key: `a.c`, + newKey: `c`, + + exp: `a: { + b -> _.c -> d +} +`, + }, + { + name: "edge_chain_circular", + + text: `a: { + b -> c -> b +} +`, + key: `a.b`, + newKey: `b`, + + exp: `a: { + _.b -> c -> _.b +} +`, + }, + } + + for _, tc := range testCases { + if tc.skip { + continue + } + tc := tc + t.Run(tc.name, func(t *testing.T) { + t.Parallel() + + et := editTest{ + text: tc.text, + testFunc: func(g *d2graph.Graph) (*d2graph.Graph, error) { + objectsBefore := len(g.Objects) + var err error + g, err = d2oracle.Move(g, tc.key, tc.newKey) + if err == nil { + objectsAfter := len(g.Objects) + if objectsBefore != objectsAfter { + println(d2format.Format(g.AST)) + return nil, fmt.Errorf("move cannot destroy or create objects: found %d objects before and %d objects after", objectsBefore, objectsAfter) + } + } + return g, err + }, + + exp: tc.exp, + expErr: tc.expErr, + assertions: tc.assertions, + } + et.run(t) + }) + } +} + +func TestDelete(t *testing.T) { + t.Parallel() + + testCases := []struct { + name string + + text string + key string + + expErr string + exp string + assertions func(t *testing.T, g *d2graph.Graph) + }{ + { + name: "flat", + + text: `nerve-gift-earther +`, + key: `nerve-gift-earther`, + + exp: ``, + assertions: func(t *testing.T, g *d2graph.Graph) { + if len(g.Objects) != 0 { + t.Fatalf("expected zero objects: %#v", g.Objects) + } + }, + }, + { + name: "edge_identical_child", + + text: `x.x.y.z -> x.y.b +`, + key: `x`, + + exp: `x.y.z -> y.b +`, + }, + { + name: "edge_both_identical_childs", + + text: `x.x.y.z -> x.x.b +`, + key: `x`, + + exp: `x.y.z -> x.b +`, + }, + { + name: "edge_conflict", + + text: `x.y.a -> x.y.b +y +`, + key: `x`, + + exp: `y 2.a -> y 2.b +y +`, + }, + { + name: "underscore_remove", + + text: `x: { + _.y + _.a -> _.b + _.c -> d +} +`, + key: `x`, + + exp: `y +a -> b +c -> d +`, + }, + { + name: "underscore_no_conflict", + + text: `x: { + y: { + _._.z + } + z +} +`, + key: `x.y`, + + exp: `x: { + _.z + + z +} +`, + }, + { + name: "nested_underscore_update", + + text: `guitar: { + books: { + _._.pipe + } +} +`, + key: `guitar`, + + exp: `books: { + _.pipe +} +`, + }, + { + name: "node_in_edge", + + text: `x -> y -> z -> q -> p +z.ok: { + what's up +} +`, + key: `z`, + + exp: `x -> y +q -> p +ok: { + what's up +} +`, + assertions: func(t *testing.T, g *d2graph.Graph) { + if len(g.Objects) != 6 { + t.Fatalf("expected 6 objects: %#v", g.Objects) + } + if len(g.Edges) != 2 { + t.Fatalf("expected two edges: %#v", g.Edges) + } + }, + }, + { + name: "node_in_edge_last", + + text: `x -> y -> z -> q -> a.b.p +a.b.p: { + what's up +} +`, + key: `a.b.p`, + + exp: `x -> y -> z -> q +a.b: { + what's up +} +`, + assertions: func(t *testing.T, g *d2graph.Graph) { + if len(g.Objects) != 7 { + t.Fatalf("expected 7 objects: %#v", g.Objects) + } + if len(g.Edges) != 3 { + t.Fatalf("expected three edges: %#v", g.Edges) + } + }, + }, + { + name: "children", + + text: `p: { + what's up + x -> y +} +`, + key: `p`, + + exp: `what's up +x -> y +`, + assertions: func(t *testing.T, g *d2graph.Graph) { + if len(g.Objects) != 3 { + t.Fatalf("expected 3 objects: %#v", g.Objects) + } + if len(g.Edges) != 1 { + t.Fatalf("expected 1 edge: %#v", g.Edges) + } + }, + }, + { + name: "hoist_children", + + text: `a: { + b: { + c + } +} +`, + key: `a.b`, + + exp: `a: { + c +} +`, + }, + { + name: "hoist_edge_children", + + text: `a: { + b + c -> d +} +`, + key: `a`, + + exp: `b +c -> d +`, + }, + { + name: "children_conflicts", + + text: `p: { + x +} +x +`, + key: `p`, + + exp: `x 2 + +x +`, + }, + { + name: "edge_map_style", + + text: `x -> y: { style.stroke: red } +`, + key: `(x -> y)[0].style.stroke`, + + exp: `x -> y +`, + }, + { + // Just checks that removing an object removes the arrowhead field too + name: "breakup_arrowhead", + + text: `x -> y: { + target-arrowhead.shape: diamond +} +(x -> y)[0].source-arrowhead: { + shape: diamond +} +`, + key: `x`, + + exp: `y +`, + }, + { + name: "edge_key_style", + + text: `x -> y +(x -> y)[0].style.stroke: red +`, + key: `(x -> y)[0].style.stroke`, + + exp: `x -> y +`, + }, + { + name: "nested_edge_key_style", + + text: `a: { + x -> y +} +a.(x -> y)[0].style.stroke: red +`, + key: `a.(x -> y)[0].style.stroke`, + + exp: `a: { + x -> y +} +`, + }, + { + name: "multiple_flat_style", + + text: `x.style.opacity: 0.4 +x.style.fill: red +`, + key: `x.style.fill`, + + exp: `x.style.opacity: 0.4 +`, + }, + { + name: "edge_flat_style", + + text: `A -> B +A.style.stroke-dash: 5 +`, + key: `A`, + + exp: `B +`, + }, + { + name: "flat_reserved", + + text: `A -> B +A.style.stroke-dash: 5 +`, + key: `A.style.stroke-dash`, + + exp: `A -> B +`, + }, + { + name: "singular_flat_style", + + text: `x.style.fill: red +`, + key: `x.style.fill`, + + exp: `x +`, + }, + { + name: "nested_flat_style", + + text: `x: { + style.fill: red +} +`, + key: `x.style.fill`, + + exp: `x +`, + }, + { + name: "multiple_map_styles", + + text: `x: { + style: { + opacity: 0.4 + fill: red + } +} +`, + key: `x.style.fill`, + + exp: `x: { + style: { + opacity: 0.4 + } +} +`, + }, + { + name: "singular_map_style", + + text: `x: { + style: { + fill: red + } +} +`, + key: `x.style.fill`, + + exp: `x +`, + }, + { + name: "delete_near", + + text: `x: { + near: y +} +y +`, + key: `x.near`, + + exp: `x +y +`, + }, + { + name: "delete_tooltip", + + text: `x: { + tooltip: yeah +} +`, + key: `x.tooltip`, + + exp: `x +`, + }, + { + name: "delete_link", + + text: `x.link: https://google.com +`, + key: `x.link`, + + exp: `x +`, + }, + { + name: "delete_icon", + + text: `y.x: { + link: https://google.com + icon: https://google.com/memes.jpeg +} +`, + key: `y.x.icon`, + + exp: `y.x: { + link: https://google.com +} +`, + }, + { + name: "delete_redundant_flat_near", + + text: `x + +y +`, + key: `x.near`, + + exp: `x + +y +`, + }, + { + name: "delete_needed_flat_near", + + text: `x.near: y +y +`, + key: `x.near`, + + exp: `x +y +`, + }, + { + name: "children_no_self_conflict", + + text: `x: { + x +} +`, + key: `x`, + + exp: `x +`, + }, + { + name: "near", + + text: `x: { + near: y +} +y +`, + key: `y`, + + exp: `x +`, + }, + { + name: "container_near", + + text: `x: { + y: { + near: x.z + } + z + a: { + near: x.z + } +} +`, + key: `x`, + + exp: `y: { + near: z +} +z +a: { + near: z +} +`, + }, + { + name: "multi_near", + + text: `Starfish: { + API + Bluefish: { + near: Starfish.API + } + Yo: { + near: Blah + } +} +Blah +`, + key: `Starfish`, + + exp: `API +Bluefish: { + near: API +} +Yo: { + near: Blah +} + +Blah +`, + }, + { + name: "children_nested_conflicts", + + text: `p: { + x: { + y + } +} +x +`, + key: `p`, + + exp: `x 2: { + y +} + +x +`, + }, + { + name: "children_referenced_conflicts", + + text: `p: { + x +} +x + +p.x: "hi" +`, + key: `p`, + + exp: `x 2 + +x + +x 2: "hi" +`, + }, + { + name: "children_flat_conflicts", + + text: `p.x +x + +p.x: "hi" +`, + key: `p`, + + exp: `x 2 +x + +x 2: "hi" +`, + }, + { + name: "children_edges_flat_conflicts", + + text: `p.x -> p.y -> p.z +x +z + +p.x: "hi" +p.z: "ey" +`, + key: `p`, + + exp: `x 2 -> y -> z 2 +x +z + +x 2: "hi" +z 2: "ey" +`, + }, + { + name: "children_nested_referenced_conflicts", + + text: `p: { + x.y +} +x + +p.x: "hi" +p.x.y: "hey" +`, + key: `p`, + + exp: `x 2.y + +x + +x 2: "hi" +x 2.y: "hey" +`, + }, + { + name: "children_edge_conflicts", + + text: `p: { + x -> y +} +x + +p.x: "hi" +`, + key: `p`, + + exp: `x 2 -> y + +x + +x 2: "hi" +`, + }, + { + name: "children_multiple_conflicts", + + text: `p: { + x -> y + x + y +} +x +y + +p.x: "hi" +`, + key: `p`, + + exp: `x 2 -> y 2 +x 2 +y 2 + +x +y + +x 2: "hi" +`, + }, + { + name: "multi_path_map_conflict", + + text: `x.y: { + z +} +x: { + z +} +`, + key: `x.y`, + + exp: `x: { + z 2 +} +x: { + z +} +`, + }, + { + name: "multi_path_map_no_conflict", + + text: `x.y: { + z +} +x: { + z +} +`, + key: `x`, + + exp: `y: { + z +} + +z +`, + }, + { + name: "children_scope", + + text: `x.q: { + p: { + what's up + x -> y + } +} +`, + key: `x.q.p`, + + exp: `x.q: { + what's up + x -> y +} +`, + assertions: func(t *testing.T, g *d2graph.Graph) { + if len(g.Objects) != 5 { + t.Fatalf("expected 5 objects: %#v", g.Objects) + } + if len(g.Edges) != 1 { + t.Fatalf("expected 1 edge: %#v", g.Edges) + } + }, + }, + { + name: "children_order", + + text: `c: { + before + y: { + congo + } + after +} +`, + key: `c.y`, + + exp: `c: { + before + + congo + + after +} +`, + assertions: func(t *testing.T, g *d2graph.Graph) { + if len(g.Objects) != 4 { + t.Fatalf("expected 4 objects: %#v", g.Objects) + } + }, + }, + { + name: "edge_first", + + text: `l.p.d: {x -> p -> y -> z} +`, + key: `l.p.d.(x -> p)[0]`, + + exp: `l.p.d: {x; p -> y -> z} +`, + assertions: func(t *testing.T, g *d2graph.Graph) { + if len(g.Objects) != 7 { + t.Fatalf("expected 7 objects: %#v", g.Objects) + } + if len(g.Edges) != 2 { + t.Fatalf("unexpected edges: %#v", g.Objects) + } + }, + }, + { + name: "multiple_flat_middle_container", + + text: `a.b.c +a.b.d +`, + key: `a.b`, + + exp: `a.c +a.d +`, + }, + { + name: "edge_middle", + + text: `l.p.d: {x -> y -> z -> q -> p} +`, + key: `l.p.d.(z -> q)[0]`, + + exp: `l.p.d: {x -> y -> z; q -> p} +`, + assertions: func(t *testing.T, g *d2graph.Graph) { + if len(g.Objects) != 8 { + t.Fatalf("expected 8 objects: %#v", g.Objects) + } + if len(g.Edges) != 3 { + t.Fatalf("expected three edges: %#v", g.Edges) + } + }, + }, + { + name: "edge_last", + + text: `l.p.d: {x -> y -> z -> q -> p} +`, + key: `l.p.d.(q -> p)[0]`, + + exp: `l.p.d: {x -> y -> z -> q; p} +`, + assertions: func(t *testing.T, g *d2graph.Graph) { + if len(g.Objects) != 8 { + t.Fatalf("expected 8 objects: %#v", g.Objects) + } + if len(g.Edges) != 3 { + t.Fatalf("expected three edges: %#v", g.Edges) + } + }, + }, + { + name: "key_with_edges", + + text: `hello.meow -> hello.bark +`, + key: `hello.(meow -> bark)[0]`, + + exp: `hello.meow +hello.bark +`, + assertions: func(t *testing.T, g *d2graph.Graph) { + if len(g.Objects) != 3 { + t.Fatalf("expected three objects: %#v", g.Objects) + } + if len(g.Edges) != 0 { + t.Fatalf("expected zero edges: %#v", g.Edges) + } + }, + }, + { + name: "key_with_edges_2", + + text: `hello.meow -> hello.bark +`, + key: `hello.meow`, + + exp: `hello.bark +`, + assertions: func(t *testing.T, g *d2graph.Graph) { + if len(g.Objects) != 2 { + t.Fatalf("expected 2 objects: %#v", g.Objects) + } + }, + }, + { + name: "key_with_edges_3", + + text: `hello.(meow -> bark) +`, + key: `hello.meow`, + + exp: `hello.bark +`, + assertions: func(t *testing.T, g *d2graph.Graph) { + if len(g.Objects) != 2 { + t.Fatalf("expected 2 objects: %#v", g.Objects) + } + }, + }, + { + name: "key_with_edges_4", + + text: `hello.(meow -> bark) +`, + key: `(hello.meow -> hello.bark)[0]`, + + exp: `hello.meow +hello.bark +`, + assertions: func(t *testing.T, g *d2graph.Graph) { + if len(g.Objects) != 3 { + t.Fatalf("expected three objects: %#v", g.Objects) + } + if len(g.Edges) != 0 { + t.Fatalf("expected zero edges: %#v", g.Edges) + } + }, + }, + { + name: "nested", + + text: `a.b.c.d +`, + key: `a.b`, + + exp: `a.c.d +`, + assertions: func(t *testing.T, g *d2graph.Graph) { + if len(g.Objects) != 3 { + t.Fatalf("expected 3 objects: %#v", g.Objects) + } + }, + }, + { + name: "nested_2", + + text: `a.b.c.d +`, + key: `a.b.c.d`, + + exp: `a.b.c +`, + assertions: func(t *testing.T, g *d2graph.Graph) { + if len(g.Objects) != 3 { + t.Fatalf("expected 3 objects: %#v", g.Objects) + } + }, + }, + { + name: "order_1", + + text: `x -> p -> y -> z +`, + key: `p`, + + exp: `x +y -> z +`, + assertions: func(t *testing.T, g *d2graph.Graph) { + if len(g.Objects) != 3 { + t.Fatalf("expected 3 objects: %#v", g.Objects) + } + }, + }, + { + name: "order_2", + + text: `p -> y -> z +`, + key: `y`, + + exp: `p +z +`, + assertions: func(t *testing.T, g *d2graph.Graph) { + if len(g.Objects) != 2 { + t.Fatalf("expected 2 objects: %#v", g.Objects) + } + }, + }, + { + name: "order_3", + + text: `y -> p -> y -> z +`, + key: `y`, + + exp: `p +z +`, + assertions: func(t *testing.T, g *d2graph.Graph) { + if len(g.Objects) != 2 { + t.Fatalf("expected 2 objects: %#v", g.Objects) + } + }, + }, + { + name: "order_4", + + text: `y -> p +`, + key: `p`, + + exp: `y +`, + assertions: func(t *testing.T, g *d2graph.Graph) { + if len(g.Objects) != 1 { + t.Fatalf("expected 1 object: %#v", g.Objects) + } + }, + }, + { + name: "order_5", + + text: `x: { + a -> b -> c + q -> p +} +`, + key: `x.a`, + + exp: `x: { + b -> c + q -> p +} +`, + assertions: func(t *testing.T, g *d2graph.Graph) { + if len(g.Objects) != 5 { + t.Fatalf("expected 5 objects: %#v", g.Objects) + } + }, + }, + { + name: "order_6", + + text: `x: { + lol +} +x.p.q.z +`, + key: `x.p.q.z`, + + exp: `x: { + lol +} +x.p.q +`, + assertions: func(t *testing.T, g *d2graph.Graph) { + if len(g.Objects) != 4 { + t.Fatalf("expected 4 objects: %#v", g.Objects) + } + }, + }, + { + name: "order_7", + + text: `x: { + lol +} +x.p.q.more +x.p.q.z +`, + key: `x.p.q.z`, + + exp: `x: { + lol +} +x.p.q.more +`, + assertions: func(t *testing.T, g *d2graph.Graph) { + if len(g.Objects) != 5 { + t.Fatalf("expected 5 objects: %#v", g.Objects) + } + }, + }, + { + name: "order_8", + + text: `x -> y +bark +y -> x +zebra +x -> q +kang +`, + key: `x`, + + exp: `bark +y + +zebra +q + +kang +`, + assertions: func(t *testing.T, g *d2graph.Graph) { + if len(g.Objects) != 5 { + t.Fatalf("expected 5 objects: %#v", g.Objects) + } + }, + }, + { + name: "empty_map", + + text: `c: { + y: { + congo + } +} +`, + key: `c.y.congo`, + + exp: `c: { + y +} +`, + assertions: func(t *testing.T, g *d2graph.Graph) { + if len(g.Objects) != 2 { + t.Fatalf("expected 2 objects: %#v", g.Objects) + } + }, + }, + { + name: "edge_common", + + text: `x.a -> x.y +`, + key: "x", + + exp: `a -> y +`, + assertions: func(t *testing.T, g *d2graph.Graph) { + if len(g.Objects) != 2 { + t.Fatalf("expected 2 objects: %#v", g.Objects) + } + if len(g.Edges) != 1 { + t.Fatalf("unexpected edges: %#v", g.Edges) + } + }, + }, + { + name: "edge_common_2", + + text: `x.(a -> y) +`, + key: "x", + + exp: `a -> y +`, + assertions: func(t *testing.T, g *d2graph.Graph) { + if len(g.Objects) != 2 { + t.Fatalf("expected 2 objects: %#v", g.Objects) + } + if len(g.Edges) != 1 { + t.Fatalf("unexpected edges: %#v", g.Edges) + } + }, + }, + { + name: "edge_common_3", + + text: `x.(a -> y) +`, + key: "(x.a -> x.y)[0]", + + exp: `x.a +x.y +`, + assertions: func(t *testing.T, g *d2graph.Graph) { + if len(g.Objects) != 3 { + t.Fatalf("expected 3 objects: %#v", g.Objects) + } + if len(g.Edges) != 0 { + t.Fatalf("unexpected edges: %#v", g.Edges) + } + }, + }, + { + name: "edge_common_4", + + text: `x.a -> x.y +`, + key: "x.(a -> y)[0]", + + exp: `x.a +x.y +`, + assertions: func(t *testing.T, g *d2graph.Graph) { + if len(g.Objects) != 3 { + t.Fatalf("expected 3 objects: %#v", g.Objects) + } + if len(g.Edges) != 0 { + t.Fatalf("unexpected edges: %#v", g.Edges) + } + }, + }, + { + name: "edge_decrement", + + text: `a -> b +a -> b +a -> b +a -> b +a -> b +(a -> b)[0]: zero +(a -> b)[1]: one +(a -> b)[2]: two +(a -> b)[3]: three +(a -> b)[4]: four +`, + key: `(a -> b)[2]`, + + exp: `a -> b +a -> b + +a -> b +a -> b +(a -> b)[0]: zero +(a -> b)[1]: one + +(a -> b)[2]: three +(a -> b)[3]: four +`, + }, + { + name: "shape_class", + text: `D2 Parser: { + shape: class + + # Default visibility is + so no need to specify. + +reader: io.RuneReader + readerPos: d2ast.Position + + # Private field. + -lookahead: "[]rune" + + # Protected field. + # We have to escape the # to prevent the line from being parsed as a comment. + \#lookaheadPos: d2ast.Position + + +peek(): (r rune, eof bool) + rewind() + commit() + + \#peekn(n int): (s string, eof bool) +} + +"github.com/terrastruct/d2parser.git" -> D2 Parser +`, + key: `D2 Parser`, + + exp: `"github.com/terrastruct/d2parser.git" +`, + }, + // TODO: delete disks.id as it's redundant + { + name: "shape_sql_table", + + text: `cloud: { + disks: { + shape: sql_table + id: int {constraint: primary_key} + } + blocks: { + shape: sql_table + id: int {constraint: primary_key} + disk: int {constraint: foreign_key} + blob: blob + } + blocks.disk -> disks.id + + AWS S3 Vancouver -> disks +} +`, + key: "cloud.blocks", + + exp: `cloud: { + disks: { + shape: sql_table + id: int {constraint: primary_key} + } + + disks.id + + AWS S3 Vancouver -> disks +} +`, + }, + { + name: "nested_reserved", + + text: `x.y.z: { + label: Sweet April showers do spring May flowers. + icon: bingo + near: x.y.jingle + shape: parallelogram + style: { + stroke: red + } +} +x.y.jingle +`, + key: "x.y.z", + + exp: `x.y +x.y.jingle +`, + }, + { + name: "only_delete_obj_reserved", + + text: `A: {style.stroke: "#000e3d"} +B +A -> B: {style.stroke: "#2b50c2"} +`, + key: `A.style.stroke`, + exp: `A +B +A -> B: {style.stroke: "#2b50c2"} +`, + }, + { + name: "only_delete_edge_reserved", + + text: `A: {style.stroke: "#000e3d"} +B +A -> B: {style.stroke: "#2b50c2"} +`, + key: `(A->B)[0].style.stroke`, + exp: `A: {style.stroke: "#000e3d"} +B +A -> B +`, + }, + } + + for _, tc := range testCases { + tc := tc + t.Run(tc.name, func(t *testing.T) { + t.Parallel() + + et := editTest{ + text: tc.text, + testFunc: func(g *d2graph.Graph) (*d2graph.Graph, error) { + return d2oracle.Delete(g, tc.key) + }, + + exp: tc.exp, + expErr: tc.expErr, + assertions: tc.assertions, + } + et.run(t) + }) + } +} + +type editTest struct { + text string + testFunc func(*d2graph.Graph) (*d2graph.Graph, error) + + exp string + expErr string + assertions func(*testing.T, *d2graph.Graph) +} + +func (tc editTest) run(t *testing.T) { + d2Path := fmt.Sprintf("d2/testdata/d2oracle/%v.d2", t.Name()) + g, err := d2compiler.Compile(d2Path, strings.NewReader(tc.text), nil) + if err != nil { + t.Fatal(err) + } + + g, err = tc.testFunc(g) + if tc.expErr != "" { + if err == nil { + t.Fatalf("expected error with: %q", tc.expErr) + } + ds, err := diff.Strings(tc.expErr, err.Error()) + if err != nil { + t.Fatal(err) + } + if ds != "" { + t.Fatalf("unexpected error: %s", ds) + } + } else if err != nil { + t.Fatal(err) + } + + if tc.expErr == "" { + if tc.assertions != nil { + t.Run("assertions", func(t *testing.T) { + tc.assertions(t, g) + }) + } + + newText := d2format.Format(g.AST) + ds, err := diff.Strings(tc.exp, newText) + if err != nil { + t.Fatal(err) + } + if ds != "" { + t.Fatalf("tc.exp != newText:\n%s", ds) + } + } + + got := struct { + Graph *d2graph.Graph `json:"graph"` + Err string `json:"err"` + }{ + Graph: g, + Err: fmt.Sprintf("%#v", err), + } + + err = diff.Testdata(filepath.Join("..", "testdata", "d2oracle", t.Name()), got) + if err != nil { + t.Fatal(err) + } +} + +func TestMoveIDDeltas(t *testing.T) { + t.Parallel() + + testCases := []struct { + name string + + text string + key string + newKey string + + exp string + expErr string + }{ + { + name: "rename", + + text: `x +`, + key: "x", + newKey: "y", + + exp: `{ + "x": "y" +}`, + }, + { + name: "rename_identical", + + text: `Square +`, + key: "Square", + newKey: "Square", + + exp: `{}`, + }, + { + name: "children_no_self_conflict", + + text: `x: { + x +} +y +`, + key: `x`, + newKey: `y.x`, + + exp: `{ + "x": "y.x", + "x.x": "x" +}`, + }, + { + name: "into_container", + + text: `x +y +x -> z +`, + key: "x", + newKey: "y.x", + + exp: `{ + "(x -> z)[0]": "(y.x -> z)[0]", + "x": "y.x" +}`, + }, + { + name: "out_container", + + text: `x: { + y +} +x.y -> z +`, + key: "x.y", + newKey: "y", + + exp: `{ + "(x.y -> z)[0]": "(y -> z)[0]", + "x.y": "y" +}`, + }, + { + name: "container_with_edge", + + text: `x { + a + b + a -> b +} +y +`, + key: "x", + newKey: "y.x", + + exp: `{ + "x": "y.x", + "x.(a -> b)[0]": "(a -> b)[0]", + "x.a": "a", + "x.b": "b" +}`, + }, + { + name: "out_conflict", + + text: `x: { + y +} +y +x.y -> z +`, + key: "x.y", + newKey: "y", + + exp: `{ + "(x.y -> z)[0]": "(y 2 -> z)[0]", + "x.y": "y 2" +}`, + }, + { + name: "into_conflict", + + text: `x: { + y +} +y +x.y -> z +`, + key: "y", + newKey: "x.y", + + exp: `{ + "y": "x.y 2" +}`, + }, + { + name: "move_container", + + text: `x: { + a + b +} +y +x.a -> x.b +x.a -> x.b +`, + key: "x", + newKey: "y.x", + + exp: `{ + "x": "y.x", + "x.(a -> b)[0]": "(a -> b)[0]", + "x.(a -> b)[1]": "(a -> b)[1]", + "x.a": "a", + "x.b": "b" +}`, + }, + { + name: "conflicts", + + text: `x: { + a + b +} +a +y +x.a -> x.b +`, + key: "x", + newKey: "y.x", + + exp: `{ + "x": "y.x", + "x.(a -> b)[0]": "(a 2 -> b)[0]", + "x.a": "a 2", + "x.b": "b" +}`, + }, + } + + for _, tc := range testCases { + tc := tc + t.Run(tc.name, func(t *testing.T) { + t.Parallel() + + d2Path := fmt.Sprintf("d2/testdata/d2oracle/%v.d2", t.Name()) + g, err := d2compiler.Compile(d2Path, strings.NewReader(tc.text), nil) + if err != nil { + t.Fatal(err) + } + + deltas, err := d2oracle.MoveIDDeltas(g, tc.key, tc.newKey) + if tc.expErr != "" { + if err == nil { + t.Fatalf("expected error with: %q", tc.expErr) + } + ds, err := diff.Strings(tc.expErr, err.Error()) + if err != nil { + t.Fatal(err) + } + if ds != "" { + t.Fatalf("unexpected error: %s", ds) + } + } else if err != nil { + t.Fatal(err) + } + + ds, err := diff.Strings(tc.exp, xjson.MarshalIndent(deltas)) + if err != nil { + t.Fatal(err) + } + if ds != "" { + t.Fatalf("unexpected deltas: %s", ds) + } + }) + } +} + +func TestDeleteIDDeltas(t *testing.T) { + t.Parallel() + + testCases := []struct { + name string + + text string + key string + + exp string + expErr string + }{ + { + name: "delete_node", + + text: `x.y.p -> x.y.q +x.y.z.w.e.p.l +x.y.z.1.2.3.4 +x.y.3.4.5.6 +x.y.3.4.6.7 +x.y.3.4.6.7 -> x.y.3.4.5.6 +x.y.z.w.e.p.l -> x.y.z.1.2.3.4 +`, + key: "x.y", + + exp: `{ + "x.y.(p -> q)[0]": "x.(p -> q)[0]", + "x.y.3": "x.3", + "x.y.3.4": "x.3.4", + "x.y.3.4.(6.7 -> 5.6)[0]": "x.3.4.(6.7 -> 5.6)[0]", + "x.y.3.4.5": "x.3.4.5", + "x.y.3.4.5.6": "x.3.4.5.6", + "x.y.3.4.6": "x.3.4.6", + "x.y.3.4.6.7": "x.3.4.6.7", + "x.y.p": "x.p", + "x.y.q": "x.q", + "x.y.z": "x.z", + "x.y.z.(w.e.p.l -> 1.2.3.4)[0]": "x.z.(w.e.p.l -> 1.2.3.4)[0]", + "x.y.z.1": "x.z.1", + "x.y.z.1.2": "x.z.1.2", + "x.y.z.1.2.3": "x.z.1.2.3", + "x.y.z.1.2.3.4": "x.z.1.2.3.4", + "x.y.z.w": "x.z.w", + "x.y.z.w.e": "x.z.w.e", + "x.y.z.w.e.p": "x.z.w.e.p", + "x.y.z.w.e.p.l": "x.z.w.e.p.l" +}`, + }, + { + name: "children_no_self_conflict", + + text: `x: { + x +} +`, + key: `x`, + + exp: `{ + "x.x": "x" +}`, + }, + { + name: "delete_container_with_conflicts", + + text: `x { + a + b +} +a +b +c +x.a -> c +`, + key: "x", + + exp: `{ + "(x.a -> c)[0]": "(a 2 -> c)[0]", + "x.a": "a 2", + "x.b": "b 2" +}`, + }, + { + name: "multiword", + + text: `Starfish: { + API +} +Starfish.API +`, + key: "Starfish", + + exp: `{ + "Starfish.API": "API" +}`, + }, + { + name: "delete_container_with_edge", + + text: `x { + a + b + a -> b +} +`, + key: "x", + + exp: `{ + "x.(a -> b)[0]": "(a -> b)[0]", + "x.a": "a", + "x.b": "b" +}`, + }, + { + name: "delete_edge_field", + + text: `a -> b +a -> b +`, + key: "(a -> b)[0].style.opacity", + + exp: "null", + }, + { + name: "delete_edge", + + text: `x.y.z.w.e.p.l -> x.y.z.1.2.3.4 +x.y.z.w.e.p.l -> x.y.z.1.2.3.4 +x.y.z.w.e.p.l -> x.y.z.1.2.3.4 +x.y.z.w.e.p.l -> x.y.z.1.2.3.4 +x.y.z.w.e.p.l -> x.y.z.1.2.3.4 +x.y.z.w.e.p.l -> x.y.z.1.2.3.4 +x.y.z.w.e.p.l -> x.y.z.1.2.3.4 +(x.y.z.w.e.p.l -> x.y.z.1.2.3.4)[0]: meow +(x.y.z.w.e.p.l -> x.y.z.1.2.3.4)[1]: meow +(x.y.z.w.e.p.l -> x.y.z.1.2.3.4)[2]: meow +(x.y.z.w.e.p.l -> x.y.z.1.2.3.4)[3]: meow +(x.y.z.w.e.p.l -> x.y.z.1.2.3.4)[4]: meow +(x.y.z.w.e.p.l -> x.y.z.1.2.3.4)[5]: meow +(x.y.z.w.e.p.l -> x.y.z.1.2.3.4)[6]: meow +`, + key: "(x.y.z.w.e.p.l -> x.y.z.1.2.3.4)[1]", + + exp: `{ + "x.y.z.(w.e.p.l -> 1.2.3.4)[2]": "x.y.z.(w.e.p.l -> 1.2.3.4)[1]", + "x.y.z.(w.e.p.l -> 1.2.3.4)[3]": "x.y.z.(w.e.p.l -> 1.2.3.4)[2]", + "x.y.z.(w.e.p.l -> 1.2.3.4)[4]": "x.y.z.(w.e.p.l -> 1.2.3.4)[3]", + "x.y.z.(w.e.p.l -> 1.2.3.4)[5]": "x.y.z.(w.e.p.l -> 1.2.3.4)[4]", + "x.y.z.(w.e.p.l -> 1.2.3.4)[6]": "x.y.z.(w.e.p.l -> 1.2.3.4)[5]" +}`, + }, + } + + for _, tc := range testCases { + tc := tc + t.Run(tc.name, func(t *testing.T) { + t.Parallel() + + d2Path := fmt.Sprintf("d2/testdata/d2oracle/%v.d2", t.Name()) + g, err := d2compiler.Compile(d2Path, strings.NewReader(tc.text), nil) + if err != nil { + t.Fatal(err) + } + + deltas, err := d2oracle.DeleteIDDeltas(g, tc.key) + if tc.expErr != "" { + if err == nil { + t.Fatalf("expected error with: %q", tc.expErr) + } + ds, err := diff.Strings(tc.expErr, err.Error()) + if err != nil { + t.Fatal(err) + } + if ds != "" { + t.Fatalf("unexpected error: %s", ds) + } + } else if err != nil { + t.Fatal(err) + } + + ds, err := diff.Strings(tc.exp, xjson.MarshalIndent(deltas)) + if err != nil { + t.Fatal(err) + } + if ds != "" { + t.Fatalf("unexpected deltas: %s", ds) + } + }) + } +} + +func TestRenameIDDeltas(t *testing.T) { + t.Parallel() + + testCases := []struct { + name string + + text string + key string + newName string + + exp string + expErr string + }{ + { + name: "rename_node", + + text: `x.y.p -> x.y.q +x.y.z.w.e.p.l +x.y.z.1.2.3.4 +x.y.3.4.5.6 +x.y.3.4.6.7 +x.y.3.4.6.7 -> x.y.3.4.5.6 +x.y.z.w.e.p.l -> x.y.z.1.2.3.4 +`, + key: "x.y", + newName: "papa", + + exp: `{ + "x.y": "x.papa", + "x.y.(p -> q)[0]": "x.papa.(p -> q)[0]", + "x.y.3": "x.papa.3", + "x.y.3.4": "x.papa.3.4", + "x.y.3.4.(6.7 -> 5.6)[0]": "x.papa.3.4.(6.7 -> 5.6)[0]", + "x.y.3.4.5": "x.papa.3.4.5", + "x.y.3.4.5.6": "x.papa.3.4.5.6", + "x.y.3.4.6": "x.papa.3.4.6", + "x.y.3.4.6.7": "x.papa.3.4.6.7", + "x.y.p": "x.papa.p", + "x.y.q": "x.papa.q", + "x.y.z": "x.papa.z", + "x.y.z.(w.e.p.l -> 1.2.3.4)[0]": "x.papa.z.(w.e.p.l -> 1.2.3.4)[0]", + "x.y.z.1": "x.papa.z.1", + "x.y.z.1.2": "x.papa.z.1.2", + "x.y.z.1.2.3": "x.papa.z.1.2.3", + "x.y.z.1.2.3.4": "x.papa.z.1.2.3.4", + "x.y.z.w": "x.papa.z.w", + "x.y.z.w.e": "x.papa.z.w.e", + "x.y.z.w.e.p": "x.papa.z.w.e.p", + "x.y.z.w.e.p.l": "x.papa.z.w.e.p.l" +}`, + }, + { + name: "rename_conflict", + + text: `x +y +`, + key: "x", + newName: "y", + + exp: `{ + "x": "y 2" +}`, + }, + { + name: "rename_conflict_with_dots", + + text: `"a.b" +y +`, + key: "y", + newName: "a.b", + + exp: `{ + "y": "\"a.b 2\"" +}`, + }, + { + name: "rename_identical", + + text: `Square +`, + key: "Square", + newName: "Square", + + exp: `{}`, + }, + { + name: "rename_edge", + + text: `x.y.z.w.e.p.l -> x.y.z.1.2.3.4 +x.y.z.w.e.p.l -> x.y.z.1.2.3.4 +x.y.z.w.e.p.l -> x.y.z.1.2.3.4 +x.y.z.w.e.p.l -> x.y.z.1.2.3.4 +x.y.z.w.e.p.l -> x.y.z.1.2.3.4 +x.y.z.w.e.p.l -> x.y.z.1.2.3.4 +x.y.z.w.e.p.l -> x.y.z.1.2.3.4 +(x.y.z.w.e.p.l -> x.y.z.1.2.3.4)[0]: meow +(x.y.z.w.e.p.l -> x.y.z.1.2.3.4)[1]: meow +(x.y.z.w.e.p.l -> x.y.z.1.2.3.4)[2]: meow +(x.y.z.w.e.p.l -> x.y.z.1.2.3.4)[3]: meow +(x.y.z.w.e.p.l -> x.y.z.1.2.3.4)[4]: meow +(x.y.z.w.e.p.l -> x.y.z.1.2.3.4)[5]: meow +(x.y.z.w.e.p.l -> x.y.z.1.2.3.4)[6]: meow +`, + key: "(x.y.z.w.e.p.l -> x.y.z.1.2.3.4)[1]", + newName: "(x.y.z.w.e.p.l <-> x.y.z.1.2.3.4)[1]", + + exp: `{ + "x.y.z.(w.e.p.l -> 1.2.3.4)[1]": "x.y.z.(w.e.p.l <-> 1.2.3.4)[1]" +}`, + }, + } + + for _, tc := range testCases { + tc := tc + t.Run(tc.name, func(t *testing.T) { + t.Parallel() + + d2Path := fmt.Sprintf("d2/testdata/d2oracle/%v.d2", t.Name()) + g, err := d2compiler.Compile(d2Path, strings.NewReader(tc.text), nil) + if err != nil { + t.Fatal(err) + } + + deltas, err := d2oracle.RenameIDDeltas(g, tc.key, tc.newName) + if tc.expErr != "" { + if err == nil { + t.Fatalf("expected error with: %q", tc.expErr) + } + ds, err := diff.Strings(tc.expErr, err.Error()) + if err != nil { + t.Fatal(err) + } + if ds != "" { + t.Fatalf("unexpected error: %s", ds) + } + } else if err != nil { + t.Fatal(err) + } + + ds, err := diff.Strings(tc.exp, xjson.MarshalIndent(deltas)) + if err != nil { + t.Fatal(err) + } + if ds != "" { + t.Fatalf("unexpected deltas: %s", ds) + } + }) + } +} diff --git a/d2oracle/get.go b/d2oracle/get.go new file mode 100644 index 000000000..2d8e220ab --- /dev/null +++ b/d2oracle/get.go @@ -0,0 +1,51 @@ +package d2oracle + +import ( + "fmt" + + "oss.terrastruct.com/d2/d2graph" + "oss.terrastruct.com/d2/d2parser" +) + +func GetParentID(g *d2graph.Graph, absID string) (string, error) { + mk, err := d2parser.ParseMapKey(absID) + if err != nil { + return "", err + } + obj, ok := g.Root.HasChild(d2graph.Key(mk.Key)) + if !ok { + return "", fmt.Errorf("%v parent not found", absID) + } + + return obj.Parent.AbsID(), nil +} + +func GetObj(g *d2graph.Graph, absID string) *d2graph.Object { + mk, _ := d2parser.ParseMapKey(absID) + obj, _ := g.Root.HasChild(d2graph.Key(mk.Key)) + return obj +} + +func GetEdge(g *d2graph.Graph, absID string) *d2graph.Edge { + for _, e := range g.Edges { + if e.AbsID() == absID { + return e + } + } + return nil +} + +func IsLabelKeyID(key, label string) bool { + mk, err := d2parser.ParseMapKey(key) + if err != nil { + return false + } + if len(mk.Edges) > 0 { + return false + } + if mk.Key == nil { + return false + } + + return mk.Key.Path[len(mk.Key.Path)-1].Unbox().ScalarString() == label +} diff --git a/d2oracle/get_test.go b/d2oracle/get_test.go new file mode 100644 index 000000000..21e695506 --- /dev/null +++ b/d2oracle/get_test.go @@ -0,0 +1,20 @@ +package d2oracle_test + +import ( + "testing" + + "github.com/stretchr/testify/assert" + + "oss.terrastruct.com/d2/d2oracle" +) + +func TestIsLabelKeyID(t *testing.T) { + t.Parallel() + + assert.Equal(t, true, d2oracle.IsLabelKeyID("x", "x")) + assert.Equal(t, true, d2oracle.IsLabelKeyID("y.x", "x")) + assert.Equal(t, true, d2oracle.IsLabelKeyID(`x."y.x"`, "y.x")) + + assert.Equal(t, false, d2oracle.IsLabelKeyID("x", "y")) + assert.Equal(t, false, d2oracle.IsLabelKeyID("x->y", "y")) +} diff --git a/d2parser/parse.go b/d2parser/parse.go new file mode 100644 index 000000000..3c99dc1eb --- /dev/null +++ b/d2parser/parse.go @@ -0,0 +1,1707 @@ +package d2parser + +import ( + "fmt" + "io" + "math/big" + "strconv" + "strings" + "unicode" + "unicode/utf8" + + "oss.terrastruct.com/d2/d2ast" + "oss.terrastruct.com/d2/lib/go2" +) + +type ParseOptions struct { + UTF16 bool +} + +// Parse parses a .d2 Map in r. +// +// The returned Map always represents a valid .d2 file. All encountered errors will be in +// []error. +// +// The map may be compiled via Compile even if there are errors to keep language tooling +// operational. Though autoformat should not run. +// +// If UTF16Mode is true, positions will be recorded in UTF-16 codeunits as required by LSP +// and browser clients. See +// https://microsoft.github.io/language-server-protocol/specifications/specification-current/#textDocuments +// TODO: update godocs +func Parse(path string, r io.RuneReader, opts *ParseOptions) (*d2ast.Map, error) { + if opts == nil { + opts = &ParseOptions{ + UTF16: false, + } + } + + p := &parser{ + path: path, + reader: r, + + utf16: opts.UTF16, + } + + m := p.parseMap(true) + if !p.err.empty() { + return m, p.err + } + return m, nil +} + +func ParseKey(key string) (*d2ast.KeyPath, error) { + p := &parser{ + reader: strings.NewReader(key), + } + + k := p.parseKey() + if !p.err.empty() { + return nil, fmt.Errorf("failed to parse key %q: %w", key, p.err) + } + if k == nil { + return nil, fmt.Errorf("empty key: %q", key) + } + return k, nil +} + +func ParseMapKey(mapKey string) (*d2ast.Key, error) { + p := &parser{ + reader: strings.NewReader(mapKey), + } + + mk := p.parseMapKey() + if !p.err.empty() { + return nil, fmt.Errorf("failed to parse map key %q: %w", mapKey, p.err) + } + if mk == nil { + return nil, fmt.Errorf("empty map key: %q", mapKey) + } + return mk, nil +} + +func ParseValue(value string) (d2ast.Value, error) { + p := &parser{ + reader: strings.NewReader(value), + } + + v := p.parseValue() + if !p.err.empty() { + return nil, fmt.Errorf("failed to parse value %q: %w", value, p.err) + } + if v.Unbox() == nil { + return nil, fmt.Errorf("empty value: %q", value) + } + return v.Unbox(), nil +} + +// TODO: refactor parser to keep entire file in memory as []rune +// - trivial to then convert positions +// - lookahead is gone, just forward back as much as you want :) +// - streaming parser isn't really helpful. +// - just read into a string even and decode runes forward/back as needed +// - the whole file essentially exists within the parser as the AST anyway... +// TODO: ast struct that combines map & errors and pass that around +type parser struct { + path string + pos d2ast.Position + utf16 bool + + reader io.RuneReader + readerPos d2ast.Position + + readahead []rune + lookahead []rune + lookaheadPos d2ast.Position + + ioerr bool + err ParseError + + inEdgeGroup bool + + depth int +} + +// TODO: remove ioerr, just sort (with Append) should be fine but filter non ast errors in API +// TODO: rename to Error and make existing Error a private type errorWithRange +type ParseError struct { + IOError *d2ast.Error `json:"ioerr"` + Errors []d2ast.Error `json:"errs"` +} + +func (pe ParseError) empty() bool { + return pe.IOError == nil && len(pe.Errors) == 0 +} + +func (pe ParseError) Error() string { + var sb strings.Builder + if pe.IOError != nil { + sb.WriteString(pe.IOError.Error()) + sb.WriteByte('\n') + } + for _, err := range pe.Errors { + sb.WriteString(err.Error()) + sb.WriteByte('\n') + } + return sb.String() +} + +func (p *parser) errorf(start d2ast.Position, end d2ast.Position, f string, v ...interface{}) { + r := d2ast.Range{ + Path: p.path, + Start: start, + End: end, + } + f = "%v: " + f + v = append([]interface{}{r}, v...) + p.err.Errors = append(p.err.Errors, d2ast.Error{ + Range: r, + Message: fmt.Sprintf(f, v...), + }) +} + +// _readRune reads the next rune from the underlying reader or from the p.readahead buffer. +func (p *parser) _readRune() (r rune, eof bool) { + if len(p.readahead) > 0 { + r = p.readahead[0] + p.readahead = append(p.readahead[:0], p.readahead[1:]...) + return r, false + } + + if p.ioerr { + p.rewind() + return 0, true + } + + p.readerPos = p.lookaheadPos + + r, _, err := p.reader.ReadRune() + if err != nil { + p.ioerr = true + if err != io.EOF { + p.err.IOError = &d2ast.Error{ + Range: d2ast.Range{ + Path: p.path, + Start: p.readerPos, + End: p.readerPos, + }, + Message: fmt.Sprintf("io error: %v", err), + } + } + p.rewind() + return 0, true + } + return r, false +} + +func (p *parser) read() (r rune, eof bool) { + r, eof = p._readRune() + if eof { + return 0, true + } + p.pos = p.pos.Advance(r, p.utf16) + p.lookaheadPos = p.pos + return r, false +} + +func (p *parser) replay(r rune) { + p.pos = p.pos.Subtract(r, p.utf16) + + // This is more complex than it needs to be to allow reusing the buffer underlying + // p.lookahead. + newcap := len(p.lookahead) + 1 + if newcap > cap(p.lookahead) { + lookahead2 := make([]rune, newcap) + copy(lookahead2[1:], p.lookahead) + p.lookahead = lookahead2 + } else { + p.lookahead = p.lookahead[:newcap] + copy(p.lookahead[1:], p.lookahead) + } + p.lookahead[0] = r + + p.rewind() +} + +// peek returns the next rune without advancing the parser. +// You *must* call commit or rewind afterwards. +func (p *parser) peek() (r rune, eof bool) { + r, eof = p._readRune() + if eof { + return 0, true + } + + p.lookahead = append(p.lookahead, r) + p.lookaheadPos = p.lookaheadPos.Advance(r, p.utf16) + return r, false +} + +// TODO: this can replace multiple peeks i think, just return []rune instead +func (p *parser) peekn(n int) (s string, eof bool) { + var sb strings.Builder + for i := 0; i < n; i++ { + r, eof := p.peek() + if eof { + return sb.String(), true + } + sb.WriteRune(r) + } + return sb.String(), false +} + +func (p *parser) readNotSpace() (r rune, eof bool) { + for { + r, eof = p.read() + if eof { + return 0, true + } + if unicode.IsSpace(r) { + continue + } + return r, false + } +} + +// peekNotSpace returns the next non space rune without advancing the parser. +// +// newline is set if the next non space character is on a different line +// than the current line. +// +// TODO: everywhere this is used, we support newline escapes and so can just +// add the logic here and it should *just* work +// except line comments iirc +// not entirely sure, maybe i can put it into peek somehow +func (p *parser) peekNotSpace() (r rune, newlines int, eof bool) { + for { + r, eof = p.peek() + if eof { + return 0, 0, true + } + if unicode.IsSpace(r) { + if r == '\n' { + newlines++ + } + continue + } + return r, newlines, false + } +} + +// commit advances p.pos by all peeked bytes and then resets the p.lookahead buffer. +func (p *parser) commit() { + p.pos = p.lookaheadPos + p.lookahead = p.lookahead[:0] +} + +// rewind copies p.lookahead to the front of p.readahead and then resets the p.lookahead buffer. +// All peeked bytes will again be available via p.eat or p.peek. +// TODO: +// peek +// peekn +// peekNotSpace +// commit +// rewind +// +// TODO: make each parse function read its delimiter and return nil if not as expected +// TODO: lookahead *must* always be empty in between parse calls. you either commit or +// rewind in each function. if you don't, you pass a hint. +// +// TODO: omg we don't need two buffers, just a single lookahead and an index... +// TODO: get rid of lookaheadPos or at least never use directly. maybe rename to beforePeekPos? +// or better yet keep positions in the lookahead buffer. +// ok so plan here is to get rid of lookaheadPos and add a rewindPos that stores +// the pos to rewind to. +func (p *parser) rewind() { + if len(p.lookahead) == 0 { + return + } + + // This is more complex than it needs to be to allow reusing the buffer underlying + // p.readahead. + newcap := len(p.lookahead) + len(p.readahead) + if cap(p.readahead) < newcap { + readahead2 := make([]rune, newcap) + copy(readahead2[len(p.lookahead):], p.readahead) + p.readahead = readahead2 + } else { + p.readahead = p.readahead[:newcap] + copy(p.readahead[len(p.lookahead):], p.readahead) + } + copy(p.readahead, p.lookahead) + + p.lookahead = p.lookahead[:0] + p.lookaheadPos = p.pos +} + +// TODO: remove isFileMap like in printer. can't rn as we have to subtract delim +func (p *parser) parseMap(isFileMap bool) *d2ast.Map { + m := &d2ast.Map{ + Range: d2ast.Range{ + Path: p.path, + Start: p.pos, + }, + } + defer m.Range.End.From(&p.readerPos) + + if !isFileMap { + m.Range.Start = m.Range.Start.Subtract('{', p.utf16) + p.depth++ + defer dec(&p.depth) + } + + for { + r, eof := p.readNotSpace() + if eof { + if !isFileMap { + p.errorf(m.Range.Start, p.readerPos, "maps must be terminated with }") + } + return m + } + + switch r { + case ';': + continue + case '}': + if isFileMap { + p.errorf(p.pos.Subtract(r, p.utf16), p.pos, "unexpected map termination character } in file map") + continue + } + return m + } + + n := p.parseMapNode(r) + if n.Unbox() != nil { + m.Nodes = append(m.Nodes, n) + // TODO: all subsequent not comment characters on the current line (or till ;) + // need to be considered errors. + // TODO: add specific msg for each bad rune type + } + + if n.BlockComment != nil { + // Anything after a block comment is ok. + continue + } + + after := p.pos + for { + r, newlines, eof := p.peekNotSpace() + if eof || newlines != 0 || r == ';' || r == '}' || r == '#' { + p.rewind() + break + } + p.commit() + } + + // TODO: maybe better idea here is to make parseUnquotedString aware of its delimiters + // better and so it would read technically invalid characters and just complain. + // TODO: that way broken syntax will be parsed more "intently". would work better with + // language tooling I think though not sure. yes definitely, eaterr! + if after != p.pos { + if n.Unbox() != nil { + if n.MapKey != nil && n.MapKey.Value.Unbox() != nil { + p.errorf(after, p.pos, "unexpected text after %v", n.MapKey.Value.Unbox().Type()) + } else { + p.errorf(after, p.pos, "unexpected text after %v", n.Unbox().Type()) + } + } else { + p.errorf(after, p.pos, "invalid text beginning unquoted key") + } + } + } +} + +func (p *parser) parseMapNode(r rune) d2ast.MapNodeBox { + var box d2ast.MapNodeBox + + switch r { + case '#': + box.Comment = p.parseComment() + return box + case '"': + s, eof := p.peekn(2) + if eof { + break + } + if s != `""` { + p.rewind() + break + } + p.commit() + box.BlockComment = p.parseBlockComment() + return box + case '.': + s, eof := p.peekn(3) + if eof { + break + } + if s != "..$" { + p.rewind() + break + } + p.commit() + box.Substitution = p.parseSubstitution(true) + return box + } + + p.replay(r) + box.MapKey = p.parseMapKey() + return box +} + +func (p *parser) parseComment() *d2ast.Comment { + c := &d2ast.Comment{ + Range: d2ast.Range{ + Path: p.path, + Start: p.pos.Subtract('#', p.utf16), + }, + } + defer c.Range.End.From(&p.pos) + + var sb strings.Builder + defer func() { + c.Value = sb.String() + }() + p.parseCommentLine(c, &sb) + + for { + r, newlines, eof := p.peekNotSpace() + if eof { + return c + } + if r != '#' || newlines >= 2 { + p.rewind() + return c + } + p.commit() + + if newlines == 1 { + sb.WriteByte('\n') + } + + p.parseCommentLine(c, &sb) + } +} + +func (p *parser) parseCommentLine(c *d2ast.Comment, sb *strings.Builder) { + firstRune := true + for { + r, eof := p.peek() + if eof { + return + } + if r == '\n' { + p.rewind() + return + } + p.commit() + + if firstRune { + firstRune = false + if r == ' ' { + continue + } + } + sb.WriteRune(r) + } +} + +func (p *parser) parseBlockComment() *d2ast.BlockComment { + bc := &d2ast.BlockComment{ + Range: d2ast.Range{ + Path: p.path, + Start: p.pos.SubtractString(`"""`, p.utf16), + }, + } + defer bc.Range.End.From(&p.pos) + + p.depth++ + defer dec(&p.depth) + + var sb strings.Builder + defer func() { + bc.Value = trimSpaceAfterLastNewline(sb.String()) + bc.Value = trimCommonIndent(bc.Value) + }() + + for { + r, eof := p.peek() + if eof { + p.errorf(bc.Range.Start, p.readerPos, `block comments must be terminated with """`) + return bc + } + + if !unicode.IsSpace(r) { + p.rewind() + break + } + p.commit() + if r == '\n' { + break + } + } + + for { + r, eof := p.read() + if eof { + p.errorf(bc.Range.Start, p.readerPos, `block comments must be terminated with """`) + return bc + } + + if r != '"' { + sb.WriteRune(r) + continue + } + + s, eof := p.peekn(2) + if eof { + p.errorf(bc.Range.Start, p.readerPos, `block comments must be terminated with """`) + return bc + } + if s != `""` { + sb.WriteByte('"') + p.rewind() + continue + } + p.commit() + return bc + } +} + +func trimSpaceAfterLastNewline(s string) string { + lastNewline := strings.LastIndexByte(s, '\n') + if lastNewline == -1 { + return strings.TrimRightFunc(s, unicode.IsSpace) + } + + lastLine := s[lastNewline+1:] + lastLine = strings.TrimRightFunc(lastLine, unicode.IsSpace) + if len(lastLine) == 0 { + return s[:lastNewline] + } + return s[:lastNewline+1] + lastLine +} + +func (p *parser) parseMapKey() (mk *d2ast.Key) { + mk = &d2ast.Key{ + Range: d2ast.Range{ + Path: p.path, + Start: p.pos, + }, + } + defer mk.Range.End.From(&p.pos) + + defer func() { + if mk.Key == nil && len(mk.Edges) == 0 { + mk = nil + } + }() + + // Check for ampersand. + r, eof := p.peek() + if eof { + return mk + } + if r != '&' { + p.rewind() + } else { + p.commit() + mk.Ampersand = true + } + + r, eof = p.peek() + if eof { + return mk + } + if r == '(' { + p.commit() + p.parseEdgeGroup(mk) + return mk + } + p.rewind() + + k := p.parseKey() + if k != nil { + mk.Key = k + } + + r, newlines, eof := p.peekNotSpace() + if eof { + return mk + } + if newlines > 0 { + p.rewind() + return mk + } + switch r { + case '(': + p.commit() + p.parseEdgeGroup(mk) + return mk + case '<', '>', '-': + p.rewind() + mk.Key = nil + p.parseEdges(mk, k) + p.parseMapKeyValue(mk) + return mk + default: + p.rewind() + p.parseMapKeyValue(mk) + return mk + } +} + +func (p *parser) parseMapKeyValue(mk *d2ast.Key) { + r, newlines, eof := p.peekNotSpace() + if eof { + return + } + if newlines > 0 { + p.rewind() + return + } + + switch r { + case '{': + p.rewind() + if mk.Key == nil && len(mk.Edges) == 0 { + return + } + case ':': + p.commit() + if mk.Key == nil && len(mk.Edges) == 0 { + p.errorf(mk.Range.Start, p.pos, "map value without key") + } + default: + p.rewind() + return + } + mk.Value = p.parseValue() + if mk.Value.Unbox() == nil { + p.errorf(p.pos.Subtract(':', p.utf16), p.pos, "missing value after colon") + } + + sb := mk.Value.ScalarBox() + // If the value is a scalar, then check if it's the primary value. + if sb.Unbox() != nil { + r, newlines, eof := p.peekNotSpace() + if eof || newlines > 0 || r != '{' { + p.rewind() + return + } + // Next character is on the same line without ; separator so it must mean + // our current value is the Primary and the next is the Value. + p.commit() + p.replay(r) + mk.Primary = sb + mk.Value = p.parseValue() + } +} + +func (p *parser) parseEdgeGroup(mk *d2ast.Key) { + // To prevent p.parseUnquotedString from consuming terminating parentheses. + p.inEdgeGroup = true + defer func() { + p.inEdgeGroup = false + }() + + src := p.parseKey() + p.parseEdges(mk, src) + + r, newlines, eof := p.peekNotSpace() + if eof || newlines > 0 { + p.rewind() + return + } + if r != ')' { + p.rewind() + p.errorf(mk.Range.Start, p.pos, "edge groups must be terminated with )") + return + } + p.commit() + + r, newlines, eof = p.peekNotSpace() + if eof || newlines > 0 { + p.rewind() + return + } + if r == '[' { + p.commit() + mk.EdgeIndex = p.parseEdgeIndex() + } else { + p.rewind() + } + + r, newlines, eof = p.peekNotSpace() + if eof || newlines > 0 { + p.rewind() + return + } + if r == '.' { + p.commit() + mk.EdgeKey = p.parseKey() + } else { + p.rewind() + } + + p.inEdgeGroup = false + p.parseMapKeyValue(mk) +} + +func (p *parser) parseEdgeIndex() *d2ast.EdgeIndex { + ei := &d2ast.EdgeIndex{ + Range: d2ast.Range{ + Path: p.path, + Start: p.pos.Subtract('[', p.utf16), + }, + } + defer ei.Range.End.From(&p.pos) + + r, newlines, eof := p.peekNotSpace() + if eof || newlines > 0 { + p.rewind() + return nil + } + + if unicode.IsDigit(r) { + p.commit() + var sb strings.Builder + sb.WriteRune(r) + for { + r, newlines, eof = p.peekNotSpace() + if eof || newlines > 0 { + p.rewind() + p.errorf(ei.Range.Start, p.pos, "unterminated edge index") + return nil + } + if r == ']' { + p.rewind() + break + } + p.commit() + if !unicode.IsDigit(r) { + p.errorf(p.pos.Subtract(r, p.utf16), p.pos, "unexpected character in edge index") + continue + } + sb.WriteRune(r) + } + i, _ := strconv.Atoi(sb.String()) + ei.Int = &i + } else if r == '*' { + p.commit() + ei.Glob = true + } else { + p.errorf(p.pos.Subtract(r, p.utf16), p.pos, "unexpected character in edge index") + // TODO: skip to ], maybe add a p.skipTo to skip to certain characters + } + + r, newlines, eof = p.peekNotSpace() + if eof || newlines > 0 || r != ']' { + p.rewind() + p.errorf(ei.Range.Start, p.pos, "unterminated edge index") + return ei + } + p.commit() + return ei +} + +func (p *parser) parseEdges(mk *d2ast.Key, src *d2ast.KeyPath) { + for { + e := &d2ast.Edge{ + Range: d2ast.Range{ + Path: p.path, + }, + Src: src, + } + if src != nil { + e.Range.Start = src.Range.Start + } else { + e.Range.Start = p.pos + } + + r, newlines, eof := p.peekNotSpace() + if eof { + return + } + if newlines > 0 { + p.rewind() + return + } + if r == '<' || r == '*' { + e.SrcArrow = string(r) + } else if r != '-' { + p.rewind() + return + } + if src == nil { + p.errorf(p.lookaheadPos.Subtract(r, p.utf16), p.lookaheadPos, "connection missing source") + e.Range.Start = p.lookaheadPos.Subtract(r, p.utf16) + } + p.commit() + + if !p.parseEdge(e) { + return + } + + dst := p.parseKey() + if dst == nil { + p.errorf(e.Range.Start, p.pos, "connection missing destination") + } else { + e.Dst = dst + e.Range.End = e.Dst.Range.End + } + mk.Edges = append(mk.Edges, e) + src = dst + } +} + +func (p *parser) parseEdge(e *d2ast.Edge) (ok bool) { + defer e.Range.End.From(&p.pos) + + for { + r, eof := p.peek() + if eof { + p.errorf(e.Range.Start, p.readerPos, "unterminated connection") + return false + } + switch r { + case '>', '*': + e.DstArrow = string(r) + p.commit() + return true + case '\\': + p.commit() + r, newlines, eof := p.peekNotSpace() + if eof { + continue + } + if newlines == 0 { + p.rewind() + p.errorf(e.Range.Start, p.readerPos, "only newline escapes are allowed in connections") + return false + } + if newlines > 1 { + p.rewind() + continue + } + p.commit() + p.replay(r) + case '-': + p.commit() + default: + p.rewind() + return true + } + } +} + +func (p *parser) parseKey() (k *d2ast.KeyPath) { + k = &d2ast.KeyPath{ + Range: d2ast.Range{ + Path: p.path, + Start: p.pos, + }, + } + defer k.Range.End.From(&p.pos) + + defer func() { + if len(k.Path) == 0 { + k = nil + } + }() + + for { + r, newlines, eof := p.peekNotSpace() + if eof { + return k + } + if newlines > 0 || r == '(' { + p.rewind() + return k + } + // TODO: error if begin, but see below too + if r == '.' { + continue + } + p.rewind() + + sb := p.parseString(true) + s := sb.Unbox() + if s == nil { + return k + } + + k.Path = append(k.Path, &sb) + + r, newlines, eof = p.peekNotSpace() + if eof { + return k + } + if newlines > 0 || r != '.' { + p.rewind() + return k + } + // TODO: error if not string or ( after, see above too + p.commit() + } +} + +// TODO: inKey -> p.inKey (means I have to restore though) +func (p *parser) parseString(inKey bool) d2ast.StringBox { + var box d2ast.StringBox + + r, newlines, eof := p.peekNotSpace() + if eof || newlines > 0 { + p.rewind() + return box + } + p.commit() + + switch r { + case '"': + box.DoubleQuotedString = p.parseDoubleQuotedString(inKey) + return box + case '\'': + box.SingleQuotedString = p.parseSingleQuotedString() + return box + case '|': + box.BlockString = p.parseBlockString() + return box + default: + p.replay(r) + box.UnquotedString = p.parseUnquotedString(inKey) + return box + } +} + +func (p *parser) parseUnquotedString(inKey bool) (s *d2ast.UnquotedString) { + s = &d2ast.UnquotedString{ + Range: d2ast.Range{ + Path: p.path, + Start: p.pos, + }, + } + // TODO: fix unquoted end whitespace handling to peekNotSpace + lastNonSpace := p.pos + defer s.Range.End.From(&lastNonSpace) + + var sb strings.Builder + var rawb strings.Builder + defer func() { + sv := strings.TrimRightFunc(sb.String(), unicode.IsSpace) + rawv := strings.TrimRightFunc(rawb.String(), unicode.IsSpace) + if sv == "" { + if len(s.Value) > 0 { + return + } + s = nil + // TODO: this should be in the parent and instead they check the delimiters first + // or last really. only in parseMapNode && parseArrayNode + // TODO: give specific descriptions for each kind of special character that could have caused this. + return + } + s.Value = append(s.Value, d2ast.InterpolationBox{String: &sv, StringRaw: &rawv}) + }() + + for { + r, eof := p.peek() + if eof { + return s + } + + if p.inEdgeGroup && r == ')' { + // TODO: need a peekNotSpace across escaped newlines + r2, newlines, eof := p.peekNotSpace() + if eof || newlines > 0 { + p.rewind() + return s + } + switch r2 { + case '\n', '#', '{', '}', '[', ']', ':', '.': + p.rewind() + return s + } + p.rewind() + p.peek() + p.commit() + lastNonSpace = p.pos + sb.WriteRune(r) + rawb.WriteRune(r) + continue + } + + // top: '\n', '#', '{', '}', '[', ']' + // keys: ':', '.' + // edges: '<', '>', '(', ')', + // edges: --, ->, -*, *- + switch r { + case '\n', ';', '#', '{', '}', '[', ']': + p.rewind() + return s + } + if inKey { + switch r { + case ':', '.', '<', '>': + p.rewind() + return s + case '-': + // TODO: need a peekNotSpace across escaped newlines + r2, eof := p.peek() + if eof { + return s + } + if r2 == '-' || r2 == '>' || r2 == '*' { + p.rewind() + return s + } + sb.WriteRune(r) + rawb.WriteRune(r) + r = r2 + case '*': + // TODO: need a peekNotSpace across escaped newlines + r2, eof := p.peek() + if eof { + return s + } + if r2 == '-' { + p.rewind() + return s + } + sb.WriteRune(r) + rawb.WriteRune(r) + r = r2 + } + } + + p.commit() + + if !unicode.IsSpace(r) { + lastNonSpace = p.pos + } + + if !inKey && r == '$' { + subst := p.parseSubstitution(false) + if subst != nil { + if sb.Len() > 0 { + sv := sb.String() + rawv := rawb.String() + s.Value = append(s.Value, d2ast.InterpolationBox{String: &sv, StringRaw: &rawv}) + sb.Reset() + } + s.Value = append(s.Value, d2ast.InterpolationBox{Substitution: subst}) + continue + } + continue + } + + if r != '\\' { + sb.WriteRune(r) + rawb.WriteRune(r) + continue + } + + r2, eof := p.read() + if eof { + p.errorf(p.pos.Subtract('\\', p.utf16), p.readerPos, "unfinished escape sequence") + return s + } + + if r2 == '\n' { + r, newlines, eof := p.peekNotSpace() + if eof || newlines > 0 { + p.rewind() + return s + } + p.commit() + p.replay(r) + continue + } + + sb.WriteRune(decodeEscape(r2)) + rawb.WriteByte('\\') + rawb.WriteRune(r2) + } +} + +// https://go.dev/ref/spec#Rune_literals +// TODO: implement all Go escapes like the unicode ones +func decodeEscape(r2 rune) rune { + switch r2 { + case 'a': + return '\a' + case 'b': + return '\b' + case 'f': + return '\f' + case 'n': + return '\n' + case 'r': + return '\r' + case 't': + return '\t' + case 'v': + return '\v' + case '\\': + return '\\' + case '"': + return '"' + default: + return r2 + } +} + +func (p *parser) parseDoubleQuotedString(inKey bool) *d2ast.DoubleQuotedString { + s := &d2ast.DoubleQuotedString{ + Range: d2ast.Range{ + Path: p.path, + Start: p.pos.Subtract('"', p.utf16), + }, + } + defer s.Range.End.From(&p.pos) + + var sb strings.Builder + var rawb strings.Builder + defer func() { + if sb.Len() > 0 { + sv := sb.String() + rawv := rawb.String() + s.Value = append(s.Value, d2ast.InterpolationBox{String: &sv, StringRaw: &rawv}) + } + }() + + for { + r, eof := p.peek() + if eof { + p.errorf(s.Range.Start, p.readerPos, `double quoted strings must be terminated with "`) + return s + } + if r == '\n' { + p.rewind() + p.errorf(s.Range.Start, p.pos, `double quoted strings must be terminated with "`) + return s + } + + p.commit() + if !inKey && r == '$' { + subst := p.parseSubstitution(false) + if subst != nil { + if sb.Len() > 0 { + s.Value = append(s.Value, d2ast.InterpolationBox{String: go2.Pointer(sb.String())}) + sb.Reset() + } + s.Value = append(s.Value, d2ast.InterpolationBox{Substitution: subst}) + continue + } + } + + if r == '"' { + return s + } + + if r != '\\' { + sb.WriteRune(r) + rawb.WriteRune(r) + continue + } + + r2, eof := p.read() + if eof { + p.errorf(p.pos.Subtract('\\', p.utf16), p.readerPos, "unfinished escape sequence") + p.errorf(s.Range.Start, p.readerPos, `double quoted strings must be terminated with "`) + return s + } + + if r2 == '\n' { + // TODO: deindent + continue + } + sb.WriteRune(decodeEscape(r2)) + rawb.WriteByte('\\') + rawb.WriteRune(r2) + } +} + +func (p *parser) parseSingleQuotedString() *d2ast.SingleQuotedString { + s := &d2ast.SingleQuotedString{ + Range: d2ast.Range{ + Path: p.path, + Start: p.pos.Subtract('\'', p.utf16), + }, + } + defer s.Range.End.From(&p.pos) + + var sb strings.Builder + defer func() { + s.Value = sb.String() + }() + + for { + r, eof := p.peek() + if eof { + p.errorf(s.Range.Start, p.readerPos, `single quoted strings must be terminated with '`) + return s + } + if r == '\n' { + p.rewind() + p.errorf(s.Range.Start, p.pos, `single quoted strings must be terminated with '`) + return s + } + p.commit() + + if r == '\'' { + r, eof = p.peek() + if eof { + return s + } + if r == '\'' { + p.commit() + sb.WriteByte('\'') + continue + } + p.rewind() + return s + } + + if r != '\\' { + sb.WriteRune(r) + continue + } + + r2, eof := p.peek() + if eof { + continue + } + + switch r2 { + case '\n': + p.commit() + continue + default: + sb.WriteRune(r) + p.rewind() + } + } +} + +func (p *parser) parseBlockString() *d2ast.BlockString { + bs := &d2ast.BlockString{ + Range: d2ast.Range{ + Path: p.path, + Start: p.pos.Subtract('|', p.utf16), + }, + } + defer bs.Range.End.From(&p.pos) + + p.depth++ + defer dec(&p.depth) + + var sb strings.Builder + defer func() { + bs.Value = trimSpaceAfterLastNewline(sb.String()) + bs.Value = trimCommonIndent(bs.Value) + }() + + // Do we have more symbol quotes? + bs.Quote = "" + for { + r, eof := p.peek() + if eof { + p.errorf(bs.Range.Start, p.readerPos, `block string must be terminated with %v`, bs.Quote+"|") + return bs + } + + if unicode.IsSpace(r) || unicode.IsLetter(r) || unicode.IsDigit(r) || r == '_' { + p.rewind() + break + } + p.commit() + bs.Quote += string(r) + } + + // Do we have a tag? + for { + r, eof := p.peek() + if eof { + p.errorf(bs.Range.Start, p.readerPos, `block string must be terminated with %v`, bs.Quote+"|") + return bs + } + + if unicode.IsSpace(r) { + p.rewind() + break + } + p.commit() + bs.Tag += string(r) + } + if bs.Tag == "" { + // TODO: no and fix compiler to not set text/markdown shape always. + // reason being not all multiline text is markdown by default. + // for example markdown edge labels or other random text. + // maybe we can be smart about this at some point and only set + // if the block string is being interpreted as markdown. + bs.Tag = "md" + } + + // Skip non newline whitespace. + for { + r, eof := p.peek() + if eof { + p.errorf(bs.Range.Start, p.readerPos, `block string must be terminated with %v`, bs.Quote+"|") + return bs + } + if !unicode.IsSpace(r) { + // Non whitespace characters on the first line have an implicit indent. + sb.WriteString(p.getIndent()) + p.rewind() + break + } + p.commit() + if r == '\n' { + break + } + } + + endHint := '|' + endRest := "" + if len(bs.Quote) > 0 { + var size int + endHint, size = utf8.DecodeLastRuneInString(bs.Quote) + endRest = bs.Quote[size:] + "|" + } + + for { + r, eof := p.read() + if eof { + p.errorf(bs.Range.Start, p.readerPos, `block string must be terminated with %v`, bs.Quote+"|") + return bs + } + + if r != endHint { + sb.WriteRune(r) + continue + } + + s, eof := p.peekn(len(endRest)) + if eof { + p.errorf(bs.Range.Start, p.readerPos, `block string must be terminated with %v`, bs.Quote+"|") + return bs + } + if s != endRest { + sb.WriteRune(endHint) + p.rewind() + continue + } + p.commit() + return bs + } +} + +func (p *parser) parseArray() *d2ast.Array { + a := &d2ast.Array{ + Range: d2ast.Range{ + Path: p.path, + Start: p.pos.Subtract('[', p.utf16), + }, + } + defer a.Range.End.From(&p.readerPos) + + p.depth++ + defer dec(&p.depth) + + for { + r, eof := p.readNotSpace() + if eof { + p.errorf(a.Range.Start, p.readerPos, "arrays must be terminated with ]") + return a + } + + switch r { + case ';': + continue + case ']': + return a + } + + n := p.parseArrayNode(r) + if n.Unbox() != nil { + a.Nodes = append(a.Nodes, n) + } + + if n.BlockComment != nil { + // Anything after a block comment is ok. + continue + } + + after := p.pos + for { + r, newlines, eof := p.peekNotSpace() + if eof || newlines != 0 || r == ';' || r == ']' || r == '#' { + p.rewind() + break + } + p.commit() + } + + if after != p.pos { + if n.Unbox() != nil { + p.errorf(after, p.pos, "unexpected text after %v", n.Unbox().Type()) + } else { + p.errorf(after, p.pos, "invalid text beginning unquoted string") + } + } + } +} + +func (p *parser) parseArrayNode(r rune) d2ast.ArrayNodeBox { + var box d2ast.ArrayNodeBox + + switch r { + case '#': + box.Comment = p.parseComment() + return box + case '"': + s, eof := p.peekn(2) + if eof { + break + } + if s != `""` { + p.rewind() + break + } + p.commit() + box.BlockComment = p.parseBlockComment() + return box + case '.': + s, eof := p.peekn(3) + if eof { + break + } + if s != "..$" { + p.rewind() + break + } + p.commit() + box.Substitution = p.parseSubstitution(true) + return box + } + + p.replay(r) + vbox := p.parseValue() + if vbox.UnquotedString != nil && vbox.UnquotedString.ScalarString() == "" { + p.errorf(p.pos, p.pos.Advance(r, p.utf16), "unquoted strings cannot start on %q", r) + } + box.Null = vbox.Null + box.Boolean = vbox.Boolean + box.Number = vbox.Number + box.UnquotedString = vbox.UnquotedString + box.DoubleQuotedString = vbox.DoubleQuotedString + box.SingleQuotedString = vbox.SingleQuotedString + box.BlockString = vbox.BlockString + box.Array = vbox.Array + box.Map = vbox.Map + return box +} + +func (p *parser) parseValue() d2ast.ValueBox { + var box d2ast.ValueBox + + r, newlines, eof := p.peekNotSpace() + if eof || newlines > 0 { + p.rewind() + return box + } + p.commit() + + switch r { + case '[': + box.Array = p.parseArray() + return box + case '{': + box.Map = p.parseMap(false) + return box + } + + p.replay(r) + sb := p.parseString(false) + if sb.DoubleQuotedString != nil { + box.DoubleQuotedString = sb.DoubleQuotedString + return box + } + if sb.SingleQuotedString != nil { + box.SingleQuotedString = sb.SingleQuotedString + return box + } + if sb.BlockString != nil { + box.BlockString = sb.BlockString + return box + } + + if sb.UnquotedString == nil { + return box + } + + s := sb.UnquotedString + if strings.EqualFold(s.ScalarString(), "null") { + box.Null = &d2ast.Null{ + Range: s.Range, + } + return box + } + + if strings.EqualFold(s.ScalarString(), "true") { + box.Boolean = &d2ast.Boolean{ + Range: s.Range, + Value: true, + } + return box + } + + if strings.EqualFold(s.ScalarString(), "false") { + box.Boolean = &d2ast.Boolean{ + Range: s.Range, + Value: false, + } + return box + } + + // TODO: only if matches regex + rat, ok := big.NewRat(0, 1).SetString(s.ScalarString()) + if ok { + box.Number = &d2ast.Number{ + Range: s.Range, + Raw: s.ScalarString(), + Value: rat, + } + return box + } + + box.UnquotedString = s + return box +} + +func (p *parser) parseSubstitution(spread bool) *d2ast.Substitution { + subst := &d2ast.Substitution{ + Range: d2ast.Range{ + Path: p.path, + Start: p.pos.SubtractString("$", p.utf16), + }, + Spread: spread, + } + defer subst.Range.End.From(&p.pos) + + if subst.Spread { + subst.Range.Start = subst.Range.Start.SubtractString("...", p.utf16) + } + + r, newlines, eof := p.peekNotSpace() + if eof { + return nil + } + if newlines > 0 { + p.rewind() + return nil + } + if r != '{' { + p.rewind() + p.errorf(subst.Range.Start, p.readerPos, "substitutions must begin on {") + return nil + } else { + p.commit() + } + + k := p.parseKey() + if k != nil { + subst.Path = k.Path + } + + r, newlines, eof = p.peekNotSpace() + if eof { + p.errorf(subst.Range.Start, p.readerPos, "substitutions must be terminated by }") + return subst + } + if newlines > 0 || r != '}' { + p.rewind() + p.errorf(subst.Range.Start, p.pos, "substitutions must be terminated by }") + return subst + } + p.commit() + + return subst +} + +// func marshalKey(k *d2ast.Key) string { +// var sb strings.Builder +// for i, s := range k.Path { +// // TODO: Need to encode specials and quotes. +// sb.WriteString(s.Unbox().ScalarString()) +// if i < len(k.Path)-1 { +// sb.WriteByte('.') +// } +// } +// return sb.String() +// } + +func dec(i *int) { + *i -= 1 +} + +func (p *parser) getIndent() string { + return strings.Repeat(" ", p.depth*2) +} + +func trimIndent(s, indent string) string { + lines := strings.Split(s, "\n") + for i, l := range lines { + if l == "" { + continue + } + _, l = splitLeadingIndent(l, len(indent)) + lines[i] = l + } + return strings.Join(lines, "\n") +} + +func trimCommonIndent(s string) string { + commonIndent := "" + for _, l := range strings.Split(s, "\n") { + if l == "" { + continue + } + lineIndent, l := splitLeadingIndent(l, -1) + if lineIndent == "" { + // No common indent return as is. + return s + } + if l == "" { + // Whitespace only line. + continue + } + if commonIndent == "" || len(lineIndent) < len(commonIndent) { + commonIndent = lineIndent + } + } + if commonIndent == "" { + return s + } + return trimIndent(s, commonIndent) +} + +func splitLeadingIndent(s string, maxSpaces int) (indent, rets string) { + var indentb strings.Builder + i := 0 + for _, r := range s { + if !unicode.IsSpace(r) { + break + } + i++ + if r != '\t' { + indentb.WriteRune(r) + } else { + indentb.WriteByte(' ') + indentb.WriteByte(' ') + } + if maxSpaces > -1 && indentb.Len() == maxSpaces { + break + } + } + return indentb.String(), s[i:] +} diff --git a/d2parser/parse_test.go b/d2parser/parse_test.go new file mode 100644 index 000000000..0232cd28d --- /dev/null +++ b/d2parser/parse_test.go @@ -0,0 +1,391 @@ +package d2parser_test + +import ( + "fmt" + "path/filepath" + "strings" + "testing" + + "oss.terrastruct.com/diff" + + "oss.terrastruct.com/d2/d2ast" + "oss.terrastruct.com/d2/d2parser" +) + +// TODO: next step for parser is writing as many tests and grouping them nicely +// TODO: add assertions +// to layout *all* expected behavior. +func TestParse(t *testing.T) { + t.Parallel() + + testCases := []struct { + name string + text string + + // exp is in testdata/d2parser/TestParse/${name}.json + }{ + + { + name: "empty", + text: ``, + }, + { + name: "semicolons", + text: `;;;;;`, + }, + { + name: "bad_curly", + text: `;;;};;;`, + }, + { + name: "one_line_comment", + text: ` +# hello +`, + }, + { + name: "multiline_comment", + text: ` + + # hello +# world +# earth +# +#globe + # very good + # not so bad +# +#yes indeed +#The good (I am convinced, for one) +#Is but the bad one leaves undone. +#Once your reputation's done +#You can live a life of fun. +# -- Wilhelm Busch + + +`, + }, + { + name: "one_line_block_comment", + text: ` +""" dmaslkmdlksa """ +`, + }, + { + name: "block_comment", + text: ` +""" dmaslkmdlksa + +dasmlkdas +mkdlasdmkas + dmsakldmklsadsa + + dsmakldmaslk + damklsdmklas + + echo hi +x """ + +""" ok +meow +""" +`, + }, + { + name: "key", + text: ` +x +`, + }, + { + name: "edge", + text: ` +x -> y +`, + }, + { + name: "multiple_edges", + text: ` +x -> y -> z +`, + }, + { + name: "key_with_edge", + text: ` +x.(z->q) +`, + }, + { + name: "edge_key", + text: ` +x.(z->q)[343].hola: false +`, + }, + { + name: "subst", + text: ` +x -> y: ${meow.ok} +`, + }, + { + name: "primary", + text: ` +x -> y: ${meow.ok} { + label: | +"Hi, I'm Preston A. Mantis, president of Consumers Retail Law Outlet. As you +can see by my suit and the fact that I have all these books of equal height +on the shelves behind me, I am a trained legal attorney. Do you have a car +or a job? Do you ever walk around? If so, you probably have the makings of +an excellent legal case. Although of course every case is different, I +would definitely say that based on my experience and training, there's no +reason why you shouldn't come out of this thing with at least a cabin +cruiser. + +"Remember, at the Preston A. Mantis Consumers Retail Law Outlet, our motto +is: 'It is very difficult to disprove certain kinds of pain.'" + -- Dave Barry, "Pain and Suffering" +| +} +`, + }, + { + name: "()_keys", + text: ` +my_fn() -> wowa() +meow.(x -> y -> z)[3].shape: "all hail corn" +`, + }, + { + name: "errs", + text: ` +--: meow]]] +meow][: ok +ok: "dmsadmakls" dsamkldkmsa + +s.shape: orochimaru +x.shape: dasdasdas + +wow: + +: + +[] + + {} + +""" +wsup +""" + +' + +meow: ${ok} +meow.(x->)[: +x -> x + +x: [][]𐀀𐀀𐀀𐀀𐀀𐀀 +`, + }, + { + name: "block_string", + text: ` +x: || +meow +meo +# ok + code +yes +|| +x: || meow +meo +# ok + code +yes || + +# compat +x: |` + "`" + ` +meow +meow +meow +` + "`" + `| { +} +`, + }, + { + name: "trailing_whitespace", + text: ` +s.shape: orochimaru +`, + }, + { + name: "table_and_class", + text: ` +sql_example: sql_example { + board: { + shape: sql_table + id: int {constraint: primary_key} + frame: int {constraint: foreign_key} + diagram: int {constraint: foreign_key} + board_objects: jsonb + last_updated: timestamp with time zone + last_thumbgen: timestamp with time zone + dsl: text + } + + # Normal. + board.diagram -> diagrams.id + + # Self referential. + diagrams.id -> diagrams.representation + + # SrcArrow test. + diagrams.id <- views.diagram + diagrams.id <-> steps.diagram + + diagrams: { + shape: sql_table + id: {type: int, constraint: primary_key} + representation: {type: jsonb} + } + + views: { + shape: sql_table + id: {type: int, constraint: primary_key} + representation: {type: jsonb} + diagram: int {constraint: foreign_key} + } + + # steps: { + # shape: sql_table + # id: {type: int, constraint: primary_key} + # representation: {type: jsonb} + # diagram: int {constraint: foreign_key} + # } + # Uncomment to make autolayout panic: + meow <- diagrams.id +} + +D2 AST Parser: { + shape: class + + +prevRune: rune + prevColumn: int + + +eatSpace(eatNewlines bool): (rune, error) + unreadRune() + + \#scanKey(r rune): (k Key, _ error) +} +`, + }, + { + name: "missing_map_value", + text: ` +x: + `, + }, + { + name: "edge_line_continuation", + text: ` +super long shape id here --\ + -> super long shape id even longer here + `, + }, + { + name: "edge_line_continuation_2", + text: ` +super long shape id here --\ +> super long shape id even longer here + `, + }, + { + name: "field_line_continuation", + text: ` +meow \ + ok \ + super: yes \ + wow so cool + \ +xd \ +\ + ok does it work: hopefully + `, + }, + { + name: "block_with_delims", + text: ` +a: || + |pipe| +|| + +""" +b: "" +""" +`, + }, + { + name: "block_one_line", + text: ` +a: | hello | +""" hello """ +`, + }, + { + name: "block_trailing_space", + text: ` +x: | + meow +| +""" hello +""" +`, + }, + { + name: "block_edge_case", + text: ` +x: | meow + hello +yes +| +`, + }, + { + name: "single_quote_block_string", + text: ` +x: |' + bs +'| +not part of block string +`, + }, + { + name: "edge_group_value", + text: ` +q.(x -> y).z: (rawr) +`, + }, + } + + for _, tc := range testCases { + tc := tc + t.Run(tc.name, func(t *testing.T) { + t.Parallel() + + d2Path := fmt.Sprintf("d2/testdata/d2parser/%v.d2", t.Name()) + ast, err := d2parser.Parse(d2Path, strings.NewReader(tc.text), nil) + + got := struct { + AST *d2ast.Map `json:"ast"` + Err error `json:"err"` + }{ + AST: ast, + Err: err, + } + + err = diff.Testdata(filepath.Join("..", "testdata", "d2parser", t.Name()), got) + if err != nil { + t.Fatal(err) + } + }) + } +} diff --git a/d2plugin/exec.go b/d2plugin/exec.go new file mode 100644 index 000000000..467fcdc40 --- /dev/null +++ b/d2plugin/exec.go @@ -0,0 +1,116 @@ +package d2plugin + +import ( + "bytes" + "context" + "encoding/json" + "errors" + "fmt" + "os/exec" + "time" + + "oss.terrastruct.com/xdefer" + + "oss.terrastruct.com/d2/d2graph" +) + +// execPlugin uses the binary at pathname with the plugin protocol to implement +// the Plugin interface. +// +// The layout plugin protocol works as follows. +// +// Info +// 1. The binary is invoked with info as the first argument. +// 2. The stdout of the binary is unmarshalled into PluginInfo. +// +// Layout +// 1. The binary is invoked with layout as the first argument and the json marshalled +// d2graph.Graph on stdin. +// 2. The stdout of the binary is unmarshalled into a d2graph.Graph +// +// PostProcess +// 1. The binary is invoked with postprocess as the first argument and the +// bytes of the SVG render on stdin. +// 2. The stdout of the binary is bytes of SVG with any post-processing. +// +// If any errors occur the binary will exit with a non zero status code and write +// the error to stderr. +type execPlugin struct { + path string +} + +func (p execPlugin) Info(ctx context.Context) (_ *PluginInfo, err error) { + ctx, cancel := context.WithTimeout(ctx, time.Second*10) + defer cancel() + cmd := exec.CommandContext(ctx, p.path, "info") + defer xdefer.Errorf(&err, "failed to run %v", cmd.Args) + + stdout, err := cmd.Output() + if err != nil { + ee := &exec.ExitError{} + if errors.As(err, &ee) && len(ee.Stderr) > 0 { + return nil, fmt.Errorf("%v\nstderr:\n%s", ee, ee.Stderr) + } + return nil, err + } + + var info PluginInfo + + err = json.Unmarshal(stdout, &info) + if err != nil { + return nil, fmt.Errorf("failed to unmarshal json: %w", err) + } + + return &info, nil +} + +func (p execPlugin) Layout(ctx context.Context, g *d2graph.Graph) error { + ctx, cancel := context.WithTimeout(ctx, time.Minute) + defer cancel() + + graphBytes, err := d2graph.SerializeGraph(g) + if err != nil { + return err + } + + cmd := exec.CommandContext(ctx, p.path, "layout") + + buffer := bytes.Buffer{} + buffer.Write(graphBytes) + cmd.Stdin = &buffer + + stdout, err := cmd.Output() + if err != nil { + ee := &exec.ExitError{} + if errors.As(err, &ee) && len(ee.Stderr) > 0 { + return fmt.Errorf("%v\nstderr:\n%s", ee, ee.Stderr) + } + return err + } + err = d2graph.DeserializeGraph(stdout, g) + if err != nil { + return fmt.Errorf("failed to unmarshal json: %w", err) + } + + return nil +} + +func (p execPlugin) PostProcess(ctx context.Context, in []byte) ([]byte, error) { + ctx, cancel := context.WithTimeout(ctx, time.Minute) + defer cancel() + + cmd := exec.CommandContext(ctx, p.path, "postprocess") + + cmd.Stdin = bytes.NewBuffer(in) + + stdout, err := cmd.Output() + if err != nil { + ee := &exec.ExitError{} + if errors.As(err, &ee) && len(ee.Stderr) > 0 { + return nil, fmt.Errorf("%v\nstderr:\n%s", ee, ee.Stderr) + } + return nil, err + } + + return stdout, nil +} diff --git a/d2plugin/plugin.go b/d2plugin/plugin.go new file mode 100644 index 000000000..0354b8355 --- /dev/null +++ b/d2plugin/plugin.go @@ -0,0 +1,110 @@ +// Package d2plugin enables the d2 CLI to run functions bundled +// with the d2 binary or via external plugin binaries. +// +// Binary plugins are stored in $PATH with the prefix d2plugin-*. i.e the binary for +// dagre might be d2plugin-dagre. See ListPlugins() below. +package d2plugin + +import ( + "context" + "os/exec" + + "oss.terrastruct.com/d2/d2graph" + "oss.terrastruct.com/d2/lib/xexec" +) + +// plugins contains the bundled d2 plugins. +// +// See plugin_* files for the plugins available for bundling. +var plugins []Plugin + +type Plugin interface { + // Info returns the current info information of the plugin. + Info(context.Context) (*PluginInfo, error) + + // Layout runs the plugin's autolayout algorithm on the input graph + // and returns a new graph with the computed placements. + Layout(context.Context, *d2graph.Graph) error + + // PostProcess makes changes to the default render + PostProcess(context.Context, []byte) ([]byte, error) +} + +// PluginInfo is the current info information of a plugin. +// note: The two fields Type and Path are not set by the plugin +// itself but only in ListPlugins. +type PluginInfo struct { + Name string `json:"name"` + ShortHelp string `json:"shortHelp"` + LongHelp string `json:"longHelp"` + + // These two are set by ListPlugins and not the plugin itself. + // bundled | binary + Type string `json:"type"` + // If Type == binary then this contains the absolute path to the binary. + Path string `json:"path"` +} + +const binaryPrefix = "d2plugin-" + +func ListPlugins(ctx context.Context) ([]*PluginInfo, error) { + // 1. Run Info on all bundled plugins in the global plugins array. + // - set Type for each bundled plugin to "bundled". + // 2. Iterate through directories in $PATH and look for executables within these + // directories with the prefix d2plugin-* + // 3. Run each plugin binary with the argument info. e.g. d2plugin-dagre info + + var infoSlice []*PluginInfo + + for _, p := range plugins { + info, err := p.Info(ctx) + if err != nil { + return nil, err + } + info.Type = "bundled" + infoSlice = append(infoSlice, info) + } + + matches, err := xexec.SearchPath(binaryPrefix) + if err != nil { + return nil, err + } + for _, path := range matches { + p := &execPlugin{path: path} + info, err := p.Info(ctx) + if err != nil { + return nil, err + } + info.Type = "binary" + info.Path = path + infoSlice = append(infoSlice, info) + } + + return infoSlice, nil +} + +// FindPlugin finds the plugin with the given name. +// 1. It first searches the bundled plugins in the global plugins slice. +// 2. If not found, it then searches each directory in $PATH for a binary with the name +// d2plugin-. +// **NOTE** When D2 upgrades to go 1.19, remember to ignore exec.ErrDot +// 3. If such a binary is found, it builds an execPlugin in exec.go +// to get a plugin implementation around the binary and returns it. +func FindPlugin(ctx context.Context, name string) (Plugin, string, error) { + for _, p := range plugins { + info, err := p.Info(ctx) + if err != nil { + return nil, "", err + } + if info.Name == name { + return p, "", nil + } + } + + path, err := exec.LookPath(binaryPrefix + name) + if err != nil { + return nil, "", err + } + + return &execPlugin{path: path}, path, nil +} diff --git a/d2plugin/plugin_dagre.go b/d2plugin/plugin_dagre.go new file mode 100644 index 000000000..c0285787f --- /dev/null +++ b/d2plugin/plugin_dagre.go @@ -0,0 +1,41 @@ +//go:build cgo && !nodagre + +package d2plugin + +import ( + "context" + + "oss.terrastruct.com/d2/d2graph" + "oss.terrastruct.com/d2/d2layouts/d2dagrelayout" +) + +var DagrePlugin = dagrePlugin{} + +func init() { + plugins = append(plugins, DagrePlugin) +} + +type dagrePlugin struct{} + +func (p dagrePlugin) Info(context.Context) (*PluginInfo, error) { + return &PluginInfo{ + Name: "dagre", + ShortHelp: "The directed graph layout library Dagre", + LongHelp: `dagre is a directed graph layout library for JavaScript. +See https://github.com/dagrejs/dagre +The implementation of this plugin is at: https://github.com/terrastruct/d2/tree/master/d2plugin/d2dagrelayout + +note: dagre is the primary layout algorithm for text to diagram generator Mermaid.js. + See https://github.com/mermaid-js/mermaid + We have a useful comparison at https://text-to-diagram.com/?example=basic&a=d2&b=mermaid +`, + }, nil +} + +func (p dagrePlugin) Layout(ctx context.Context, g *d2graph.Graph) error { + return d2dagrelayout.Layout(ctx, g) +} + +func (p dagrePlugin) PostProcess(ctx context.Context, in []byte) ([]byte, error) { + return in, nil +} diff --git a/d2plugin/serve.go b/d2plugin/serve.go new file mode 100644 index 000000000..919eab48b --- /dev/null +++ b/d2plugin/serve.go @@ -0,0 +1,96 @@ +package d2plugin + +import ( + "context" + "encoding/json" + "errors" + "fmt" + "io" + + "oss.terrastruct.com/d2/d2graph" + "oss.terrastruct.com/d2/lib/xmain" +) + +// Serve returns a xmain.RunFunc that will invoke the plugin p as necessary to service the +// calling d2 CLI. +// +// See implementation of d2plugin-dagre in the ./cmd directory. +// +// Also see execPlugin in exec.go for the d2 binary plugin protocol. +func Serve(p Plugin) func(context.Context, *xmain.State) error { + return func(ctx context.Context, ms *xmain.State) (err error) { + if len(ms.Args) < 1 { + return errors.New("expected first argument to plugin binary to be function name") + } + reqFunc := ms.Args[0] + + switch ms.Args[0] { + case "info": + return info(ctx, p, ms) + case "layout": + return layout(ctx, p, ms) + case "postprocess": + return postProcess(ctx, p, ms) + default: + return fmt.Errorf("unrecognized command: %s", reqFunc) + } + } +} + +func info(ctx context.Context, p Plugin, ms *xmain.State) error { + info, err := p.Info(ctx) + if err != nil { + return err + } + b, err := json.Marshal(info) + if err != nil { + return err + } + _, err = ms.Stdout.Write(b) + if err != nil { + return err + } + return nil +} + +func layout(ctx context.Context, p Plugin, ms *xmain.State) error { + in, err := io.ReadAll(ms.Stdin) + if err != nil { + return err + } + var g d2graph.Graph + if err := d2graph.DeserializeGraph(in, &g); err != nil { + return fmt.Errorf("failed to unmarshal input to graph: %s", in) + } + err = p.Layout(ctx, &g) + if err != nil { + return err + } + b, err := d2graph.SerializeGraph(&g) + if err != nil { + return err + } + _, err = ms.Stdout.Write(b) + if err != nil { + return err + } + return nil +} + +func postProcess(ctx context.Context, p Plugin, ms *xmain.State) error { + in, err := io.ReadAll(ms.Stdin) + if err != nil { + return err + } + + out, err := p.PostProcess(ctx, in) + if err != nil { + return err + } + + _, err = ms.Stdout.Write(out) + if err != nil { + return err + } + return nil +} diff --git a/d2renderers/d2fonts/NOTICE.txt b/d2renderers/d2fonts/NOTICE.txt new file mode 100644 index 000000000..03854fa54 --- /dev/null +++ b/d2renderers/d2fonts/NOTICE.txt @@ -0,0 +1,6 @@ +The fonts bundled with D2 are open-source fonts licensed under SIL OPEN FONT +LICENSE. + +Attribution: + +http://scripts.sil.org/OFL diff --git a/d2renderers/d2fonts/README.md b/d2renderers/d2fonts/README.md new file mode 100644 index 000000000..0cd528d42 --- /dev/null +++ b/d2renderers/d2fonts/README.md @@ -0,0 +1,16 @@ +# d2fonts + +The SVG renderer embeds fonts directly into the SVG as base64 data. This is to give +determinstic outputs and load without a network call. + +To include your own font, e.g. `Helvetica`, you must include the Truetype glyphs: +- `./ttf/Helvetica-Bold.ttf` +- `./ttf/Helvetica-Italic.ttf` +- `./ttf/Helvetica-Regular.ttf` + +You must also include an encoded version of these of mimetype `application/font-woff`: +- `./ttf/Helvetica-Bold.txt` +- `./ttf/Helvetica-Italic.txt` +- `./ttf/Helvetica-Regular.txt` + +If you include a font to contribute, it must have an open license. diff --git a/d2renderers/d2fonts/d2fonts.go b/d2renderers/d2fonts/d2fonts.go new file mode 100644 index 000000000..a2b57829e --- /dev/null +++ b/d2renderers/d2fonts/d2fonts.go @@ -0,0 +1,141 @@ +// d2fonts holds fonts for renderings + +// TODO write a script to do this as part of CI +package d2fonts + +import ( + "embed" + "strings" +) + +type FontFamily int +type FontStyle string + +type Font struct { + Family FontFamily + Style FontStyle + Size int +} + +func (f FontFamily) Font(size int, style FontStyle) Font { + return Font{ + Family: f, + Style: style, + Size: size, + } +} + +const ( + FONT_SIZE_XS = 13 + FONT_SIZE_S = 14 + FONT_SIZE_M = 16 + FONT_SIZE_L = 20 + FONT_SIZE_XL = 24 + FONT_SIZE_XXL = 28 + FONT_SIZE_XXXL = 32 + + FONT_STYLE_REGULAR FontStyle = "regular" + FONT_STYLE_BOLD FontStyle = "bold" + FONT_STYLE_ITALIC FontStyle = "italic" + + SourceSansPro FontFamily = iota + SourceCodePro FontFamily = iota +) + +var FontSizes = []int{ + FONT_SIZE_XS, + FONT_SIZE_S, + FONT_SIZE_M, + FONT_SIZE_L, + FONT_SIZE_XL, + FONT_SIZE_XXL, + FONT_SIZE_XXXL, +} + +var FontStyles = []FontStyle{ + FONT_STYLE_REGULAR, + FONT_STYLE_BOLD, + FONT_STYLE_ITALIC, +} + +var FontFamilies = []FontFamily{ + SourceSansPro, + SourceCodePro, +} + +//go:embed encoded/SourceSansPro-Regular.txt +var sourceSansProRegularBase64 string + +//go:embed encoded/SourceSansPro-Bold.txt +var sourceSansProBoldBase64 string + +//go:embed encoded/SourceSansPro-Italic.txt +var sourceSansProItalicBase64 string + +//go:embed encoded/SourceCodePro-Regular.txt +var sourceCodeProRegularBase64 string + +//go:embed ttf/* +var fontFacesFS embed.FS + +var FontEncodings map[Font]string +var FontFaces map[Font][]byte + +func init() { + FontEncodings = map[Font]string{ + { + Family: SourceSansPro, + Style: FONT_STYLE_REGULAR, + }: sourceSansProRegularBase64, + { + Family: SourceSansPro, + Style: FONT_STYLE_BOLD, + }: sourceSansProBoldBase64, + { + Family: SourceSansPro, + Style: FONT_STYLE_ITALIC, + }: sourceSansProItalicBase64, + { + Family: SourceCodePro, + Style: FONT_STYLE_REGULAR, + }: sourceCodeProRegularBase64, + } + + for k, v := range FontEncodings { + FontEncodings[k] = strings.TrimSuffix(v, "\n") + } + + FontFaces = map[Font][]byte{} + b, err := fontFacesFS.ReadFile("ttf/SourceSansPro-Regular.ttf") + if err != nil { + panic(err) + } + FontFaces[Font{ + Family: SourceSansPro, + Style: FONT_STYLE_REGULAR, + }] = b + b, err = fontFacesFS.ReadFile("ttf/SourceCodePro-Regular.ttf") + if err != nil { + panic(err) + } + FontFaces[Font{ + Family: SourceCodePro, + Style: FONT_STYLE_REGULAR, + }] = b + b, err = fontFacesFS.ReadFile("ttf/SourceSansPro-Bold.ttf") + if err != nil { + panic(err) + } + FontFaces[Font{ + Family: SourceSansPro, + Style: FONT_STYLE_BOLD, + }] = b + b, err = fontFacesFS.ReadFile("ttf/SourceSansPro-Italic.ttf") + if err != nil { + panic(err) + } + FontFaces[Font{ + Family: SourceSansPro, + Style: FONT_STYLE_ITALIC, + }] = b +} diff --git a/d2renderers/d2fonts/encoded/SourceCodePro-Regular.txt b/d2renderers/d2fonts/encoded/SourceCodePro-Regular.txt new file mode 100644 index 000000000..d806243f0 --- /dev/null +++ b/d2renderers/d2fonts/encoded/SourceCodePro-Regular.txt @@ -0,0 +1 @@ +data:application/font-woff;base64,AAEAAAAPAIAAAwBwQkFTRWUeXb0AAejUAAAARkRTSUcAAAABAAIdsAAAAAhHREVG8Yj03gAB6RwAAALqR1BPU6UIFdkAAewIAAAUXEdTVUIB/10FAAIAZAAAHUpPUy8yld/X+AAAAXgAAABgY21hcAdzcEIAAA4cAAAzZmdseWYb7v/zAABNyAABUS5oZWFkGanOOgAAAPwAAAA2aGhlYQYzAIgAAAE0AAAAJGhtdHgMtA+PAAAB2AAADEJsb2NhJ2DThAAAQYQAAAxCbWF4cAZUAmEAAAFYAAAAIG5hbWXcnQMfAAGe+AAAEM5wb3N0K4oCyQABr8gAADkMAAEAAAACCboWS6s0Xw889QADA+gAAAAA3B0N9wAAAADcHHNL/z/+OgMZBCQAAAADAAIAAAAAAAAAAQAAA9j+7wAAAlj/P/8/AxkAAQAAAAAAAAAAAAAAAAAAAAEAAQAABiAB+AAqAGUABgABAAAAAAAAAAAAAAAAAAMAAwADAlgBkAAFAAACigJYAAAASwKKAlgAAAFeADIBIwAAAgsFCQMEAwICBCAAAvcCADgDAAAAAAAAAABBREJPAEAAIP//Au7/BgAAA9gBEWAAAZ8AAAAAAeYClAAAACAAAwJYAD4AAAAgAGMAQQBXAHIAhQA1AE8AXwBRAGIAhgBIAFIAMABmADAAZABDACoATwArAAoANgAmAEEAUQBdAFAAPABEAGcASABdAFoANwBqAEoAOgBdADwAXQA8AJIARwBFAE0AMwAIAEAAMQBHACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIP///////wAaAGMAQQBBAEEAQQBBAFcAVwBXAFcADAAUAHIAcgByAHIAcgByAHIAcgBzAHIAcgByAHIAcgByAHIAcgByADUANQA1ADUANQA1ADUANQA1AE8ATwBPABsATwAKAF8AXwBfAF8AXwBfAF8AXwBfAF8AXwBfAFEAYgBiAGIAfACGAIYAhgA3AIYACgCGAEgASABIAFIAUgBSAFIAUgBSAFIAUgAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAkACQAIQBkAGQAZABkAGQAZABkAEMAQwBDAEMAQwBDAEMAQwBOACoAKgAqACoAKgAqAE8ATwBPAE8ATwBPAE8ATwBPAE8ATwBPAE8ATwBPAE8ATwBPAE8ATwBPAE8ATwArAAoACgAKAAoAJgAmACYAJgAmACYAJgAmAEEAQQBBAEEAQQBBAAwAZQA7AFUAcABEAFkAUQBRAFEAUQBRAFEAUQBRAFEAUQBRAFEAUQBRAEkAUQBRAFEAUQBRAFEAUQBRABEAEQARABQAXQBQAFAAUABQAFAANgA8ADwAPAA8AEQARABEAEQARABEAEQARABEAEQARABEAEQARABEAEQARABEAEgASABIAEgASABIAEgASP/v//UAXQBdACcAXQAUAFoAWgBaAFoAWgBaAFoAWgBaAFoAWgBaADcAagBqAGoAagBKAEoASgBKAEoASgBKACMAOgA6ADoAXQBdAF0AXQBdAF0AXQBd/+oAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwANQA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8AAsAkgBmAJIAkgCDAIMAQABHAEcARwBHAEcARwBHAEcAWABnAEUARQBFAEUARQBFAEUATQBNAE0ATQBNAE0ATQBNAE0ATQBNAE0ATQBNAE0ATQBNAE0ATQBNAE0ATQBNADMACAAIAAgACAAxADEAMQAxADEAMQAxADEARwBHAEcARwBHAEcAPABdAF0ANwBd//gAUABeAF0AXQA9AFAAPAA8AD8APABzAEUAFgBbAD4APQA3ADwAPABOADMAPABNAF0AXQBdAFoAVgA4ABwASgBKAEoATwCUACoAKgA6//sAXQBgADwAIQAsAD8APwA/AJIAkgBjAGMARwA4ADgANgBFAAIAMgBNADMACAAxADkARwBHADsAAAAZADAARwBZAEcAUgBUADwAUgA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAOQA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPABjAGMAYwBjAGMAYwBjAGMAYwBjAGMAYwBjAGMAWgBjAFoAYwA4AGMAYwBjAGMAYwBjAGMAYwAt//wAYwBjACAAYwCHACsAcgBBAE8AMABfAGIAKwBIAFIARgAwAE8AZgBLACoAJgAaADYALAAmACQAGAAYABgAXwAYACgAJgAYADkAXQAwAEEAWwB0AF0ASABRAGQAOABUAC8AXABAABsAXQA8AEIATwAsADgANQAiAFoAXQBPACwAJQA5AFsAXQBRAFEAQABPAE8AIgBRAE8AZAA+AFsAkgBEAMUA2wDbAQEA8AEJAPAAiwELAPsA6ADoANwA0QEJAJAAigCQAJQAnwCfAH8AkQCLAJMA5QDkAPYA8ACqAKoAqgCsALYAtgAgAGMAYwCHABYAcgABAD4ATgBOAGYAAgBIAE8AMABPAGYAQQAqAC8AGgA2AE8AQQAoACYAEwA3AGIALgAsAB4AcgByAAUAhwBCAEMAXwBfAFH/+AAnAAUAZgBOAC8ASwAYADAAJgCHADwAAQA+AGYAEwBPAEEAJgAmADYAQQBbAF8AAQAg//8AcgA7AE4AMAAwAC8ALwBRAEsAaACSACoARAAGAD4AZABkAG4AHQBAAF0APABdAF0AUABCADEAIABAAF4AWAA6ADoAIwBGAH0APQAsADcARABEABQAkgBQAEcAWgBaADf/+QA6ABQAbgBkADEAZwApADwARgCiAEgABgA+AG4AIQBdAFAAMwAzAEAAWABdAAYASgBRABEARABFAGQAPAA8ADEAMQA8ADwAVQBjAGMAYwACACoARwBhAEUAOQAnADgATQBGAEQAQwBHAGEARwBhAEUAOQAnADgATgBGAEQAQwBHAGEARwBhAEUAOQAnADgATQBGAEQAQwBHAGEA2wDFANsAxQAgAOMA4wBtAHkA9QCCANEA2QBeAGYA2QBmANQAxQDTAFIAYABVAFUAVQBQAAAAUAAAANsAlwCLAKYAmgCLAHUApgCaAIsAdQCKAHUAmAAAADwAPAA+/2YA0AB6AOEAYgB4AGMAYwEHAGMBBwBUAH8AfwBbAEgAnABdAA4AVwAOAF4AdADhAGIA4QBiALoAYgDiAGIA4QBiAB4AHgBw//sADwAxADEAVwBoAIYAhgCGAFUAjQCvAJIAjgCUAI4AlwCcAJcAkQDsANMA+wD0AI0ArwCSAI4AlACOAJcAnACXAJEA7ADTAPsA9AChANAArQCsAKwArACwALcArwCtAOwA1QD7APQAoQDQAK0ArACsAKwAsAC3AK8ArQDsANUA+wD0AKMAiQCOAKMArAC1AIkAkQDGAJUArwCvAIwAvQDEAEYArwCOAKwAiQDzAKIApACfAIsANACfAIwAkgCRAJEAkQCOAK8AkgCgAIkAiQCtAPsA3gClAD0AOgBVAE0ANQA6AHEAMQBgAE4ALgAqABwAbQAqAFQAPQBgAGwALQA3ADcAKgBFABwAHAAcABsAMAAcABwAHwAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAUwAbAFUAVQBmAFUA1wBVAFUAeABrAFUAVQBVAG8AVQBMAEwAVQBVAGAAVf/8AK8BAQCpAPAAVABMALoBCQCZAD4AKwAmACAARgBPAEYANAAbAHQAGgARACEAHQAhAGAAUQBWAGcAEQAhAB0AIf/0AFUAPABKAD4AVwBJAEkAIQA+AD4APgA+AD4APgAqACoAFf/nAEQAM//n/+f/+gBNAAQACQAJAAUACQAJAB3/uf/g//z/5gAtADz/9P/9AGAAMQEBANEA2QDiAL4AoADKAMoAgACkAOwAkQCRAPkApwDsAKQA+QB/AJQApwCQAL4AxQDqAM0A0gA1AKQAsQDRAOwA6wEJAJEAmAB/AHsApwCmAKcApgCQAI8AmgCVAOoA8QCUAJ4A6ADoAIsAkwC+AMsAxQC5AJEAmAD/AGsAagCQAJoA9QDcAPcA6ADgANAA4AEjAOAAuAC4ALgAuADqAJQAvgDNAN4AzQDNANIA0wEJALEAkQCQAJAAfwCnAG8A7gCxALEAgQDOAH8AewEL/z//ZgCeAJgAiwCeAJgAkQCTAJ4AmACeAJgApgCrADUAWQCmAKsAowCbAJAAmgCQAJoAkACaAJwAmwCrAKMApwCmAJEAlQCUAIoAnwCQAJAAnwAAAAAAAAAA/9n/2QEFAN4AIQAhAQUA3gATABMBBQDeAQUBBQDeAN7/2f/Z/9n/2QEFAQUA3gDe/9n/2f/Z/9kBBQEFAN4A3gDeAN4A3gDe/9n/2f/Z/9n/2f/Z/9n/2f/Z/9n/2f/Z/9n/2f/Z/9n/2f/Z/9n/2f/Z/9n/2f/Z/9n/2f/Z/9n/2f/Z/9n/2f/Z/9n/2f/Z/9n/2f/Z/9kASwBLAQUA3v/ZALcBBQC3ALf/2f/Z/9kBBQC3ALf/2f/Z/9kBBQC3ALf/2f/Z/9n/2f/Z/9n/2f/Z/9n/2f/Z/9kBBf/Z/9kBBQAAAAAAAP/ZAQUBBQEF/9kA3gEFAN7/2QDe/9kA3gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAASz/6P/c/8oAAAINAAABLAAAAAAAAAAAAAABLAAAAAAAAAAAAE0ABAA0ADkAYwBT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AXUAuwGJALwBigC/AYsAvQGMAMMBkQDEAZIAxwGVAMUBkwDNAZwAzAGbANEBoQDVAaUA1wGnANgBqADZAakA2gGqANwBrADsAbwA8AHAAPEA9gHGAPgByAD3AccBmgEdBFcAdwCyAYEA4wGzAD8BDACFAVAAqQF2ANsBqwDdAa0A3gGuAN8BrwDgAbAATwEcAHQBQACqAXcAbwE7AJoBZwA+AQsATgEbALoBiADIAZYAzgGdAdMB2wHUAdUB1gHXAdgB2QHaAd0B3gHfAeAB7QHwAfEB8gHzAhwB3AHrAe4B7wH0BDIEOgQ/BEEE3wT0BPcE9QT5BPEE9gTnBEgENAQ7BEAESQT7BP4FAQUDBQUFBwUJBQ0FDwURBRUFFwUZBRwFEwUeBSAFIgUtBS4FLwUwBTIFNAU2BTcE/QUABUMFIwVKBUUCsQKzAnYCrQJ3AngCeQJ8An4CpQJ6An0CnAKdAp4CnwKmApcCkAKRApICkwKUApUClgKgAqMCoQKiAqQC/wNKAwADSwMBA0wDAgNNAwMDTgMEA08DBQNQAwYDUQMHA1IDCANTAwkDVAMKA1UDCwNWAwwDVwMNA1gDDgNZAw8DEANaA1sDEQNcAxIDXQMTA14DFANfAxUDYAMWA2EDFwNiAxgDYwMZA2QEKgQsBC0EMwQ1BDgEPAQ9AFEBHgBYASUAWQEmAFoBJwBuAToAdQFBAHoBRQB5AUQAewFHAHwBSACMAVgAjQFZAJEBXgCSAV8AkwFgAJYBYwCXAWQAmAFlAJ4BawCfAWwAoAFtALgBgAC+AY0AwAGOAMEBjwDCAZAAyQGXAMoBmADGAZQAzwGeANABnwDpAbkA6gG6AOsBuwDtAb0A8gHCAPkByQD6AcoA+wHLAUYBoABBAQ4AQgEPAEMBEABEAREARQESAEYBEwBHARQASAEVAEkBFgBKARcASwEYAEwBGQBmATIAZwEzAGgBNABpATUAagE2AGsBNwBsATgAbQE5AIcBUgCIAVMAqwF4AKwBeQCtAXoArgF7AK8BfACwAX0AsQF+ALMBggC0AYMAtQGEALYBhQC3AYYA4QGxAOIBsgDkAbQA5QG1AOYBtgDnAbcA6AG4AO4BvgDzAcMA9AHEAPUBxQK2ArUCtwLBAsQCuwK9Ar8CvAK+AsACwgLDArkCugK4A6wDqgOrA60D0AO+A5wDnQOg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ASAAAAByAAABIQAAASEAAAE+AAABIgAAASIAAABzAAABIwAAASMAAAE/AAABJAAAASQAAAB4AAABJQAAASUAAAFDAAABJgAAASYAAAB9AAABJwAAAScAAAFJAAABKAAAASgAAACBAAABKQAAASkAAAFNAAABKgAAASoAAACDAAABKwAAASsAAAFPAAABLAAAASwAAACJAAABLQAAAS0AAAFUAAABLgAAAS4AAACGAAABLwAAAS8AAAFRAAABMAAAATAAAACEAAABMQAAATEAAAFVAAABMgAAATIAAAEAAAABMwAAATMAAAHQAAABNAAAATQAAACKAAABNQAAATUAAAFWAAABNgAAATYAAACLAAABNwAAATcAAAFXAAABOAAAATgAAAFaAAABOQAAATkAAACOAAABOgAAAToAAAFbAAABOwAAATsAAACQAAABPAAAATwAAAFdAAABPQAAAT0AAACPAAABPgAAAT4AAAFcAAABPwAAAT8AAACVAAABQAAAAUAAAAFiAAABQQAAAUEAAACUAAABQgAAAUIAAAFhAAABQwAAAUMAAACZAAABRAAAAUQAAAFmAAABRQAAAUUAAACdAAABRgAAAUYAAAFqAAABRwAAAUcAAACbAAABSAAAAUgAAAFoAAABSQAAAUkAAAFuAAABSgAAAUoAAAD/AAABSwAAAUsAAAHOAAABTAAAAUwAAACmAAABTQAAAU0AAAF0AAABTgAAAU4AAACoAAABTwAAAU8AAAF/AAABUAAAAVAAAACnAAABUQAAAVEAAAF1AAABUgAAAVIAAAC7AAABUwAAAVMAAAGJAAABVAAAAVQAAAC8AAABVQAAAVUAAAGKAAABVgAAAVYAAAC/AAABVwAAAVcAAAGLAAABWAAAAVgAAAC9AAABWQAAAVkAAAGMAAABWgAAAVoAAADDAAABWwAAAVsAAAGRAAABXAAAAVwAAADEAAABXQAAAV0AAAGSAAABXgAAAV4AAADHAAABXwAAAV8AAAGVAAABYAAAAWAAAADFAAABYQAAAWEAAAGTAAABYgAAAWIAAADNAAABYwAAAWMAAAGcAAABZAAAAWQAAADMAAABZQAAAWUAAAGbAAABZgAAAWYAAADRAAABZwAAAWcAAAGhAAABaAAAAWgAAADVAAABaQAAAWkAAAGlAAABagAAAWoAAADXAAABawAAAWsAAAGnAAABbAAAAWwAAADYAAABbQAAAW0AAAGoAAABbgAAAW4AAADZAAABbwAAAW8AAAGpAAABcAAAAXAAAADaAAABcQAAAXEAAAGqAAABcgAAAXIAAADcAAABcwAAAXMAAAGsAAABdAAAAXQAAADsAAABdQAAAXUAAAG8AAABdgAAAXYAAADwAAABdwAAAXcAAAHAAAABeAAAAXgAAADxAAABeQAAAXkAAAD2AAABegAAAXoAAAHGAAABewAAAXsAAAD4AAABfAAAAXwAAAHIAAABfQAAAX0AAAD3AAABfgAAAX4AAAHHAAABfwAAAX8AAAGaAAABgAAAAYAAAAEdAAABigAAAYoAAABcAAABjwAAAY8AAAD+AAABkgAAAZIAAARXAAABkwAAAZMAAAB3AAABoAAAAaAAAACyAAABoQAAAaEAAAGBAAABrwAAAa8AAADjAAABsAAAAbAAAAGzAAABwgAAAcIAAAIbAAABzQAAAc0AAAA/AAABzgAAAc4AAAEMAAABzwAAAc8AAACFAAAB0AAAAdAAAAFQAAAB0QAAAdEAAACpAAAB0gAAAdIAAAF2AAAB0wAAAdMAAADbAAAB1AAAAdQAAAGrAAAB1QAAAdUAAADdAAAB1gAAAdYAAAGtAAAB1wAAAdcAAADeAAAB2AAAAdgAAAGuAAAB2QAAAdkAAADfAAAB2gAAAdoAAAGvAAAB2wAAAdsAAADgAAAB3AAAAdwAAAGwAAAB4gAAAeIAAABPAAAB4wAAAeMAAAEcAAAB5gAAAeYAAAB0AAAB5wAAAecAAAFAAAAB6gAAAeoAAACqAAAB6wAAAesAAAF3AAAB9AAAAfQAAABvAAAB9QAAAfUAAAE7AAAB+AAAAfgAAACaAAAB+QAAAfkAAAFnAAAB+gAAAfoAAAA+AAAB+wAAAfsAAAELAAAB/AAAAfwAAABOAAAB/QAAAf0AAAEbAAAB/gAAAf4AAAC6AAAB/wAAAf8AAAGIAAACGAAAAhgAAADIAAACGQAAAhkAAAGWAAACGgAAAhoAAADOAAACGwAAAhsAAAGdAAACNwAAAjcAAAHPAAACQwAAAkMAAABQAAACUAAAAlAAAAHTAAACUQAAAlEAAAHbAAACUgAAAlgAAAHUAAACWQAAAlwAAAHdAAACXgAAAmcAAAHhAAACaAAAAmgAAAHsAAACagAAAmoAAAHtAAACawAAAm4AAAHwAAACbwAAAnYAAAH1AAACeAAAAnsAAAH9AAACfQAAAn4AAAIBAAACgAAAAoQAAAIDAAAChwAAApIAAAIIAAAClAAAApUAAAIXAAACmAAAApgAAAIcAAACmQAAApkAAAHcAAACnAAAApwAAAHrAAACnQAAAp4AAAHuAAACnwAAAp8AAAH0AAACoQAAAqIAAAIZAAACpAAAAqQAAAIUAAACpgAAAqcAAAIVAAACsAAAArAAAAQwAAACsgAAArIAAAQyAAACswAAArMAAAQ6AAACtwAAArcAAAQ/AAACuAAAArgAAARBAAACuQAAArkAAATfAAACuwAAArwAAATgAAACvgAAAr8AAATiAAACwQAAAsEAAATkAAACxgAAAswAAATqAAAC0AAAAtEAAATlAAAC2AAAAtgAAAT0AAAC2QAAAtkAAAT3AAAC2gAAAtoAAAT1AAAC2wAAAtsAAAT5AAAC3AAAAtwAAATxAAAC3QAAAt0AAAT2AAAC3gAAAt4AAATnAAAC4AAAAuAAAARIAAAC4QAAAuEAAAQ0AAAC4gAAAuIAAAQ7AAAC4wAAAuMAAARAAAAC5AAAAuQAAARJAAADAAAAAwAAAAT7AAADAQAAAwEAAAT+AAADAgAAAwIAAAUBAAADAwAAAwMAAAUDAAADBAAAAwQAAAUFAAADBQAAAwUAAAUHAAADBgAAAwYAAAUJAAADBwAAAwcAAAUNAAADCAAAAwgAAAUPAAADCQAAAwkAAAURAAADCgAAAwoAAAUVAAADCwAAAwsAAAUXAAADDAAAAwwAAAUZAAADDwAAAw8AAAUcAAADEAAAAxAAAAUTAAADEQAAAxEAAAUeAAADEgAAAxIAAAUgAAADEwAAAxMAAAUiAAADGAAAAyAAAAUkAAADIwAAAyYAAAUtAAADJwAAAycAAAUyAAADKAAAAygAAAU0AAADKQAAAyoAAAU2AAADLAAAAywAAAU4AAADLgAAAzEAAAU5AAADNAAAAzQAAAU9AAADOQAAAz0AAAU+AAADQAAAA0AAAAT9AAADQQAAA0EAAAUAAAADQgAAA0IAAAVDAAADQwAAA0MAAAUjAAADRAAAA0QAAAVKAAADRQAAA0UAAAVFAAADXwAAA18AAAVGAAADYQAAA2EAAAVHAAADdAAAA3UAAAKvAAADegAAA3oAAAK0AAADfgAAA34AAAKsAAADhAAAA4QAAAKxAAADhQAAA4UAAAKzAAADhgAAA4YAAAJ2AAADhwAAA4cAAAKtAAADiAAAA4oAAAJ3AAADjAAAA4wAAAJ7AAADjgAAA44AAAJ8AAADjwAAA48AAAJ+AAADkAAAA5AAAAKlAAADkQAAA6EAAAJeAAADowAAA6kAAAJvAAADqgAAA6oAAAJ6AAADqwAAA6sAAAJ9AAADrAAAA68AAAKcAAADsAAAA7AAAAKmAAADsQAAA8EAAAJ/AAADwgAAA8IAAAKXAAADwwAAA8kAAAKQAAADygAAA8oAAAKgAAADywAAA8sAAAKjAAADzAAAA80AAAKhAAADzgAAA84AAAKkAAAD0AAAA9EAAAKYAAAD1QAAA9UAAAKaAAAD1wAAA9cAAAKnAAAD2QAAA9kAAAKoAAAD2wAAA9sAAAKpAAAD3QAAA90AAAKqAAAD4QAAA+EAAAKrAAAEAAAABA8AAALvAAAEEAAABC8AAALPAAAEMAAABF8AAAMaAAAEYgAABGIAAAL/AAAEYwAABGMAAANKAAAEcgAABHIAAAMAAAAEcwAABHMAAANLAAAEdAAABHQAAAMBAAAEdQAABHUAAANMAAAEkAAABJAAAAMCAAAEkQAABJEAAANNAAAEkgAABJIAAAMDAAAEkwAABJMAAANOAAAElgAABJYAAAMEAAAElwAABJcAAANPAAAEmAAABJgAAAMFAAAEmQAABJkAAANQAAAEmgAABJoAAAMGAAAEmwAABJsAAANRAAAEoAAABKAAAAMHAAAEoQAABKEAAANSAAAEogAABKIAAAMIAAAEowAABKMAAANTAAAEqgAABKoAAAMJAAAEqwAABKsAAANUAAAErgAABK4AAAMKAAAErwAABK8AAANVAAAEsAAABLAAAAMLAAAEsQAABLEAAANWAAAEsgAABLIAAAMMAAAEswAABLMAAANXAAAEtgAABLYAAAMNAAAEtwAABLcAAANYAAAEugAABLoAAAMOAAAEuwAABLsAAANZAAAEwAAABMEAAAMPAAAEwgAABMIAAANaAAAEzwAABM8AAANbAAAE0AAABNAAAAMRAAAE0QAABNEAAANcAAAE1AAABNQAAAMSAAAE1QAABNUAAANdAAAE1gAABNYAAAMTAAAE1wAABNcAAANeAAAE2AAABNgAAAMUAAAE2QAABNkAAANfAAAE4gAABOIAAAMVAAAE4wAABOMAAANgAAAE5gAABOYAAAMWAAAE5wAABOcAAANhAAAE6AAABOgAAAMXAAAE6QAABOkAAANiAAAE7gAABO4AAAMYAAAE7wAABO8AAANjAAAE8gAABPIAAAMZAAAE8wAABPMAAANkAAAdQwAAHUMAAAQpAAAdRwAAHUcAAAQqAAAdSAAAHUkAAAQsAAAdTQAAHU0AAAQvAAAdTwAAHU8AAAQzAAAdUAAAHVAAAAQ1AAAdUgAAHVIAAAQ3AAAdVgAAHVYAAAQ4AAAdVwAAHVgAAAQ8AAAdWwAAHVsAAAQ+AAAdnAAAHZwAAAQrAAAdoAAAHaAAAAQuAAAduwAAHbsAAARCAAAeBgAAHgYAAABRAAAeBwAAHgcAAAEeAAAeDAAAHgwAAABYAAAeDQAAHg0AAAElAAAeDgAAHg4AAABZAAAeDwAAHg8AAAEmAAAeEAAAHhAAAABaAAAeEQAAHhEAAAEnAAAeFgAAHhYAAABuAAAeFwAAHhcAAAE6AAAeIAAAHiAAAAB1AAAeIQAAHiEAAAFBAAAeJAAAHiQAAAB6AAAeJQAAHiUAAAFFAAAeJgAAHiYAAAB5AAAeJwAAHicAAAFEAAAeKAAAHigAAAB7AAAeKQAAHikAAAFHAAAeKgAAHioAAAB8AAAeKwAAHisAAAFIAAAeMgAAHjIAAACMAAAeMwAAHjMAAAFYAAAeNAAAHjQAAACNAAAeNQAAHjUAAAFZAAAeNgAAHjYAAACRAAAeNwAAHjcAAAFeAAAeOAAAHjgAAACSAAAeOQAAHjkAAAFfAAAeOgAAHjoAAACTAAAeOwAAHjsAAAFgAAAePgAAHj4AAACWAAAePwAAHj8AAAFjAAAeQAAAHkAAAACXAAAeQQAAHkEAAAFkAAAeQgAAHkIAAACYAAAeQwAAHkMAAAFlAAAeRAAAHkQAAACeAAAeRQAAHkUAAAFrAAAeRgAAHkYAAACfAAAeRwAAHkcAAAFsAAAeSAAAHkgAAACgAAAeSQAAHkkAAAFtAAAeUgAAHlIAAAC4AAAeUwAAHlMAAAGAAAAeWAAAHlgAAAC+AAAeWQAAHlkAAAGNAAAeWgAAHloAAADAAAAeWwAAHlsAAAGOAAAeXAAAHlwAAADBAAAeXQAAHl0AAAGPAAAeXgAAHl4AAADCAAAeXwAAHl8AAAGQAAAeYAAAHmAAAADJAAAeYQAAHmEAAAGXAAAeYgAAHmIAAADKAAAeYwAAHmMAAAGYAAAeZgAAHmYAAADGAAAeZwAAHmcAAAGUAAAebAAAHmwAAADPAAAebQAAHm0AAAGeAAAebgAAHm4AAADQAAAebwAAHm8AAAGfAAAefgAAHn4AAADpAAAefwAAHn8AAAG5AAAegAAAHoAAAADqAAAegQAAHoEAAAG6AAAeggAAHoIAAADrAAAegwAAHoMAAAG7AAAehAAAHoQAAADtAAAehQAAHoUAAAG9AAAejgAAHo4AAADyAAAejwAAHo8AAAHCAAAekAAAHpAAAAD5AAAekQAAHpEAAAHJAAAekgAAHpIAAAD6AAAekwAAHpMAAAHKAAAelAAAHpQAAAD7AAAelQAAHpUAAAHLAAAelgAAHpYAAAFGAAAelwAAHpcAAAGgAAAengAAHp4AAADLAAAeoAAAHqAAAABBAAAeoQAAHqEAAAEOAAAeogAAHqIAAABCAAAeowAAHqMAAAEPAAAepAAAHqQAAABDAAAepQAAHqUAAAEQAAAepgAAHqYAAABEAAAepwAAHqcAAAERAAAeqAAAHqgAAABFAAAeqQAAHqkAAAESAAAeqgAAHqoAAABGAAAeqwAAHqsAAAETAAAerAAAHqwAAABHAAAerQAAHq0AAAEUAAAergAAHq4AAABIAAAerwAAHq8AAAEVAAAesAAAHrAAAABJAAAesQAAHrEAAAEWAAAesgAAHrIAAABKAAAeswAAHrMAAAEXAAAetAAAHrQAAABLAAAetQAAHrUAAAEYAAAetgAAHrYAAABMAAAetwAAHrcAAAEZAAAeuAAAHrgAAABmAAAeuQAAHrkAAAEyAAAeugAAHroAAABnAAAeuwAAHrsAAAEzAAAevAAAHrwAAABoAAAevQAAHr0AAAE0AAAevgAAHr4AAABpAAAevwAAHr8AAAE1AAAewAAAHsAAAABqAAAewQAAHsEAAAE2AAAewgAAHsIAAABrAAAewwAAHsMAAAE3AAAexAAAHsQAAABsAAAexQAAHsUAAAE4AAAexgAAHsYAAABtAAAexwAAHscAAAE5AAAeyAAAHsgAAACHAAAeyQAAHskAAAFSAAAeygAAHsoAAACIAAAeywAAHssAAAFTAAAezAAAHswAAACrAAAezQAAHs0AAAF4AAAezgAAHs4AAACsAAAezwAAHs8AAAF5AAAe0AAAHtAAAACtAAAe0QAAHtEAAAF6AAAe0gAAHtIAAACuAAAe0wAAHtMAAAF7AAAe1AAAHtQAAACvAAAe1QAAHtUAAAF8AAAe1gAAHtYAAACwAAAe1wAAHtcAAAF9AAAe2AAAHtgAAACxAAAe2QAAHtkAAAF+AAAe2gAAHtoAAACzAAAe2wAAHtsAAAGCAAAe3AAAHtwAAAC0AAAe3QAAHt0AAAGDAAAe3gAAHt4AAAC1AAAe3wAAHt8AAAGEAAAe4AAAHuAAAAC2AAAe4QAAHuEAAAGFAAAe4gAAHuIAAAC3AAAe4wAAHuMAAAGGAAAe5AAAHuQAAADhAAAe5QAAHuUAAAGxAAAe5gAAHuYAAADiAAAe5wAAHucAAAGyAAAe6AAAHugAAADkAAAe6QAAHukAAAG0AAAe6gAAHuoAAADlAAAe6wAAHusAAAG1AAAe7AAAHuwAAADmAAAe7QAAHu0AAAG2AAAe7gAAHu4AAADnAAAe7wAAHu8AAAG3AAAe8AAAHvAAAADoAAAe8QAAHvEAAAG4AAAe8gAAHvIAAADuAAAe8wAAHvMAAAG+AAAe9AAAHvQAAADzAAAe9QAAHvUAAAHDAAAe9gAAHvYAAAD0AAAe9wAAHvcAAAHEAAAe+AAAHvgAAAD1AAAe+QAAHvkAAAHFAAAfvQAAH70AAAK2AAAfvgAAH74AAAK1AAAfvwAAH78AAAK3AAAfwAAAH8AAAALBAAAfwQAAH8EAAALEAAAfzQAAH80AAAK7AAAfzgAAH84AAAK9AAAfzwAAH88AAAK/AAAf3QAAH90AAAK8AAAf3gAAH94AAAK+AAAf3wAAH98AAALAAAAf7QAAH+4AAALCAAAf7wAAH+8AAAK5AAAf/QAAH/0AAAK6AAAf/gAAH/4AAAK4AAAgBwAAIAcAAAVwAAAgEAAAIBAAAAOpAAAgEgAAIBIAAAOsAAAgEwAAIBQAAAOqAAAgFQAAIBUAAAOtAAAgFgAAIBYAAAPQAAAgFwAAIBcAAAO+AAAgGAAAIBkAAAOcAAAgGgAAIBoAAAOgAAAgGwAAIBsAAAOiAAAgHAAAIB0AAAOeAAAgHgAAIB4AAAOhAAAgIAAAICEAAAPMAAAgIgAAICIAAAOvAAAgJgAAICYAAAOVAAAgLwAAIC8AAAYTAAAgMAAAIDAAAARsAAAgMgAAIDMAAASWAAAgNQAAIDUAAASYAAAgOQAAIDoAAAOjAAAgPAAAIDwAAAPRAAAgPQAAID0AAAPVAAAgPgAAID8AAAO/AAAgRAAAIEQAAARoAAAgRwAAIEcAAAPSAAAgSAAAIEgAAAPUAAAgSQAAIEkAAAPTAAAgcAAAIHAAAAPuAAAgcQAAIHEAAAQxAAAgdAAAIHkAAAPyAAAgfQAAIH4AAAP4AAAgfwAAIH8AAAQ2AAAggAAAIIkAAAP8AAAgjQAAII4AAAQGAAAglAAAIJQAAARGAAAgoQAAIKEAAARYAAAgowAAIKMAAARnAAAgpAAAIKQAAARZAAAgpgAAIKcAAARaAAAgqQAAIKkAAARcAAAgqwAAIKsAAARdAAAgrAAAIKwAAARVAAAgrgAAIK4AAARkAAAgsQAAILIAAAReAAAgtAAAILUAAARgAAAguAAAILgAAARlAAAguQAAILoAAARiAAAgvQAAIL0AAARmAAAhBQAAIQUAAASmAAAhEwAAIRMAAASnAAAhFgAAIRYAAANrAAAhFwAAIRcAAAPiAAAhIAAAISAAAAPlAAAhIgAAISIAAAPkAAAhJgAAISYAAASgAAAhLgAAIS4AAASoAAAhUAAAIVAAAAR4AAAhUQAAIVIAAAR9AAAhUwAAIVoAAARwAAAhWwAAIV4AAAR5AAAhiQAAIYkAAAR/AAAhkAAAIZMAAASpAAAhlAAAIZUAAAS1AAAhlgAAIZkAAAStAAAhqAAAIagAAAS3AAAh0AAAIdMAAASxAAAiAAAAIgAAAAShAAAiAgAAIgIAAASaAAAiAwAAIgMAAASiAAAiBgAAIgYAAASfAAAiDwAAIg8AAASlAAAiEQAAIhEAAASkAAAiEgAAIhIAAASBAAAiFQAAIhUAAARpAAAiGQAAIhkAAASEAAAiGgAAIhoAAASeAAAiHgAAIh4AAASUAAAiHwAAIh8AAASTAAAiKQAAIikAAASSAAAiKwAAIisAAASbAAAiNwAAIjcAAASjAAAiSAAAIkgAAASPAAAiYAAAImAAAASNAAAiYQAAImEAAASGAAAiZAAAImUAAASJAAAjAgAAIwIAAATeAAAjEAAAIxAAAASRAAAjHAAAIx8AAAPXAAAjIAAAIyEAAAScAAAlAAAAJZ8AAAVzAAAloAAAJaEAAAS6AAAlqgAAJasAAAOxAAAlrAAAJawAAAO8AAAlsgAAJbMAAAS+AAAltAAAJbUAAAOzAAAltgAAJbcAAATAAAAluAAAJbkAAAO1AAAlugAAJboAAATGAAAlvAAAJb0AAATCAAAlvgAAJb8AAAO3AAAlwAAAJcEAAATEAAAlwgAAJcMAAAO5AAAlxAAAJcQAAATHAAAlxgAAJcYAAAS9AAAlyQAAJckAAATJAAAlygAAJcoAAATdAAAlywAAJcsAAAS5AAAlzAAAJcwAAAT6AAAlzwAAJc8AAAS4AAAl2AAAJdgAAAO7AAAl2QAAJdkAAATIAAAl5gAAJeYAAAOwAAAmEAAAJhEAAATKAAAmFQAAJhUAAATWAAAmOgAAJjsAAATTAAAmPAAAJjwAAATcAAAmQAAAJkAAAATaAAAmQgAAJkIAAATbAAAmYAAAJmAAAATSAAAmYwAAJmMAAATQAAAmZQAAJmUAAATPAAAmZgAAJmYAAATRAAAmagAAJmsAAATNAAAnEwAAJxMAAATMAAAnUgAAJ1IAAAS8AAAnZAAAJ2QAAATVAAAn5gAAJ+cAAAPbAAAuGAAALhgAAAPWAAAuIgAALiUAAAPdAADgoAAA4KIAAAYZAADgsAAA4LMAAAYcAAD7AQAA+wIAAAYXAAD+/wAA/v8AAAYUAAHztQAB87YAAAYVAAH0qQAB9KkAAATXAAH1EgAB9RIAAATZAAH5FgAB+RYAAATYAAAAAAAqACoATQCBALAAzQDjAPcBJwE+AVMBdAGOAZ0BywHtAhkCPAJ4Ap8C4wL0AxgDNANxA54DvAPSBA4EQgRxBKUE2gT9BWcFigWVBaAFuQXWBggGKgZWBooGvgbeBxsHQQdjB4AHtQfgCA4IJAgvCDoIRQhQCFsIZghxCHwIwwjOCQsJFgkhCSwJNwlCCU0JWwlmCXEJfAmHCZUJuwnGCdEKDAoXCiIKLQo4CkMKTgpZCmQKbwp6CoIKsAq7CsYK0QrcCucK8gr9CwgLOgtFC1ALWwtmC3ELfAuHC5ULoAurC7YLwQvMC9cL4gvtC/gMPwxKDFUMYAxsDHcMnAynDLIMvQzIDNMM3gzpDPQNIw0uDTkNRA1PDVoNZQ1wDXsNhg2RDZwNqg21Dc8N2w3mDfEN/A4HDhIOHQ4oDjMOPg5JDlQOXw5qDnUOgA6LDpYOoQ6sDrcO+w8GDxEPHA8nDzIPPQ9LD4cPkg+dD6gPsw++D8kQCRAUEDsQRhBREFwQZxByEIAQixCWEKEQrBC3EMIQzRDYEOMRHhEpETQRPxFKEVURcBF7EYYRkRGcEacRshG9EcgR0xHeEhcSIhItEjgSQxJOElkSjRKYEqMSrhK5EsQSzxLaEuUS8BL7EwYTERMcEycTMhM9E0gTUxNeE2kTdBN/E4oTlRO7E98UFBRIFGoUkRShFKwUtxTCFM0U2BTjFO4U+RVaFWUVuhXFFdAV2xXmFfEV/BYKFhUWIBYrFjYWRBalFrAWuxb3FwIXDRcYFyMXLhc5F3UXgBeLF5YX0hfdF+gX8xf+GAkYFBgfGG0YeBiDGI4YmRikGK8YuhjFGNMY3hjpGPQY/xkKGRUZIBkrGTYZQhlOGVkZZBlwGXsZphmxGbwZxxnSGd0Z6BnzGf4aCRoUGh8aLho5GkQaTxpaGnMafhqKGpUaoBquGrka4RrtGvgbAxsOGxkbJBsvGzobRRtQG1sbZhuhG6wbtxvCG80b2BvjG+4b+Rw+HEkcVBxfHGocdRyAHI4cmRykHOMc7hz5HQQdDx0aHVsdZh26HcUd0B3bHeYd8R3/HgoeFR4gHiseNh5BHkweVx5iHqoeyR7VHuAe6x72HwEfDR88H0cfUh9dH2gfcx9+H4kflB+fH6of5B/vH/ogBSAQIBsgJiBaIGUgcCB7IIYgkSCcIKcgsiC9IMgg0yDeIOkg9CD/IQshFiEhISwhNyFCIU0hWCFjIa8h5CIWIjYieSLAIvEjKyNeI58jziQZJF0koCTWJQklESVGJZQl0CXYJhcmPyaQJtUnCCdFJ40nsCfgKCEoKSg0KEkoVChuKHootSjUKQspGilOKYIpxSn3KikqUCqDKroq9CsWKzcrZyuZK7Qr2Sv+LE4seiytLNMs+i0oLWEtkC2uLeUuFC4yLlsumC7NLysvby+5L+EwCTA2MGMwgjC6MO4w9jEBMQwxFzEiMS0xODFDMU4xpTGwMbsxxjHRMdwx5zHyMgAyCzIWMiEyLDI6MoUyjTKYMqMyrjK5MsQyzzLaMuUy8DMCMw0zGDMjMy4zOTNEM08zWjNlM3AzezOGM64z2zPyNAw0SDRaNGU0cTR8NIc0lTSgNL40yjT5NQU1ODVANUg1VzV3NX81hzWPNcM1yzXTNe819zX/Nhk2ITYzNjs2UzZbNmM2mDagNsI2+jclN0I3YDd9N4U3tDfaN+I4HDhjOK842jkkOWQ5oTnLOfs6HDpPOnY6sDrROyU7UTuEO7g77DwRPEQ8fjycPNM9Fj1QPZ494D3oPig+Mz4+Pkk+VD5fPmo+dT6APos+lj6hPt0/ED9EP1w/jz+XP6A/qT+4P8Y/zj/dP+U/7UALQBNAG0AjQCtAM0A7QENAS0BTQFtAY0BrQHNAe0CDQKBAvEDKQNJA8kETQTNBVEGOQchB0EH0QfxCBEI2Qj5Ch0LGQuhC80MdQ0dDT0NXQ19DZ0NvQ3dDf0OoQ91D5UP8RB5ENERQRHREm0S8RO1FHEVERUxFVEWJRZRFxUXNRdVF3UXlRiRGTkZxRnxGh0aSRqhG0UcERy9HQUdZR6dH6UgZSERIYUiUSJxIwUj0SRtJPElESU9JWkliSW1JdUmASYtJk0meSalJsUn3SihKN0pgSmhKqUrhSwhLE0s4S19LlkuqS7JLxEvMS9RL5UvtTEJMSkxhTIBMlkyyTNJM900VTUVNc02ZTaFNqU3mTfFOIU4pTjFOOU5BTn1OpE6sTrdOwk7NTuNPCU8RTzxPTk9lT6tP51ASUDhQUlCEUKNQylD7USBRKFEzUTtRRlFOUVlRYVFsUXdRf1GKUZVRnVGoUfZR/lIGUg5Sa1LMUwFTGFNCU4BTpFPZVBlUM1SFVMVU+VUOVUNVWlWCVcBV5FYZViFWPFZEVoRWtVbKVv9XFldAV35XolfXWBdYMViDWMNY9FkJWR9ZP1lLWVdZi1msWc1aBVo+Wk9aWlp6WplapFqvWrhaxVrkWvZbB1sSWx1bJVstWzVbQVtNW1lbYVtqW4Zbslu/W9Jb4lv3XAdcHVwuXERcVVxrXIhclFygXLNcwFzbXPZdEF0hXTJdc120XcNd0F3fXfNeEF4pXk9er17MXtde419MX59f8WAvYG1gfGCLYJpgqWDBYNhg6GD4YQdhFmFtYbhiB2IyYodi1WMjY1NjcWN9Y4VjjWPtY/Zj/2QIZBFkGmQjZCxkNWQ+ZEdkUGRZZGJka2SRZKhkz2UIZSFlTWWHZZ9l6WYjZj9mXGZyZpFmt2bKZu5nJGc8Z2pnoWe4Z/9oN2hSaG1og2iiaKtotGi9aMZoz2jYaOFo6mjzaPxpBWkOaRdpIGkoaTBpOGlwaaJpzGn+ajBqU2q0atVq9WsjazxrWmuJa6pr1mwJbDtsWmyWbLts3Wz6bSBtTG16bY5tx24Abkxufm6ubuhvDm9Ab4Bvo2+wb7xvyW/WcBZwVnCQcLxxBHE+cXlx03IdclxyinLNcw9zV3OMc990GHREdHp0oHS6dOp1BXUZdSF1KXU5daZ1tnXGddZ15nX2dgZ2FnYmdjZ2RnZWdmZ2dnaGdpZ2pna2dvx3DHcgdy13Rndzd3x3h3eXd6t3vnfZd/R4DngkeER4bHh3eId4lni1eMR5EXk8eUx5V3lneW95r3nkegJ6HXo+ekZ6Tnpxeod6lHqvesJ7G3tZe6B7uHvQe+d7/3wafDN8TnxofIh8p3zGfOZ9BX0kfUh9ZH2WfaN9uH3QfeB98H4GfhZ+LX4+flV+Zn59fo1+nn7Wfx1/NX9tf4x/wH/1gBqAZYB6gK+BJ4GVgb6CQIKpgyiDaIOmg+aEO4RchHmEgYSJhJGEqoTEhOqE/YULhSqFMoU6hUKFSoVZhWGFaYVxhX+Fh4WPhZeFn4Wnha+Ft4W/hceGg4aRhp+GrYa7hsmG14bqhv2HJYdLh1iHZYdth3WHloe0h9CH7ogFiByIQYhmiICImojKiPWJG4lBiVaJa4l/iZOJoom3icyJ7IoHiiiKQopiimqKeoqKipmKs4rNit2K7YsBiw2LFosfiyiLQotdi3qLl4u6i92L64v7jASMDYwWjB+MKIxPjGiMeIyJjLaM0IzYjOCM/Y0JjSSNUI18jamN1Y4Bji6Oco6djsmO+48tj0ePYY97j5WPvI/hkBKQQ5BrkI6QtpDZkQ6RPpF7kbWR3JIDkheSK5JOknGSkpKzkuyTDpMwk2qTapNqk2qTapN3k4OTkZOek7aTzZPplASUIZQ+lF2Ue5SMlJyUrZS9lM2U3ZTtlP2VDpUelS6VPZVNlV2VbZV8lY+VopW4lc6V4ZX2lguWHpYxlkSWWZZuloGWlparlr6W0ZbmlvuXDpchlzeXTJdfl3KXiJedl7CXw5fXl+uX/pgXmDCYSJhgmHmYkpirmMWY35j5mROZK5lDmVyZdJmMmZ6ZsJnFmdmZ7JoAmhWaKppDmliabZqGmpuar5rImt2a8psLmyObPJtbm3Obi5uqm8Kb2Zv4nBKcKZxInGqci5y3nNKc7J0HnSKdMp1DnWeddJ2C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FQ8PFRVVCg4OCgoODgoKDg4KCg4OCgoODgoKDg4AACr/3P5MAioDugALABcAIwAvADsARwBTAF8AawB3AIMAjwCbAKcAswC/AMsA1wDjAO8A+wEHARMBHwErATcBQwFPAVsBZwFzAX8BiwGXAaMBrwG7AccB0wHfAesB9wAAATQ2MzIWFRQGIyImJzQ2MzIWFRQGIyImJzQ2MzIWFRQGIyImBTQ2MzIWFRQGIyImJzQ2MzIWFRQGIyImJzQ2MzIWFRQGIyImBTQ2MzIWFRQGIyImJzQ2MzIWFRQGIyImJzQ2MzIWFRQGIyImBTQ2MzIWFRQGIyImJzQ2MzIWFRQGIyImJzQ2MzIWFRQGIyImBTQ2MzIWFRQGIyImJzQ2MzIWFRQGIyImJzQ2MzIWFRQGIyImBTQ2MzIWFRQGIyImJzQ2MzIWFRQGIyImJzQ2MzIWFRQGIyImBTQ2MzIWFRQGIyImJzQ2MzIWFRQGIyImJzQ2MzIWFRQGIyImBTQ2MzIWFRQGIyImJzQ2MzIWFRQGIyImJzQ2MzIWFRQGIyImBTQ2MzIWFRQGIyImJzQ2MzIWFRQGIyImJzQ2MzIWFRQGIyImBTQ2MzIWFRQGIyImJzQ2MzIWFRQGIyImJzQ2MzIWFRQGIyImBTQ2MzIWFRQGIyImJzQ2MzIWFRQGIyImJzQ2MzIWFRQGIyImBTQ2MzIWFRQGIyImJzQ2MzIWFRQGIyImJzQ2MzIWFRQGIyImBTQ2MzIWFRQGIyImJzQ2MzIWFRQGIyImJzQ2MzIWFRQGIyImBTQ2MzIWFRQGIyImJzQ2MzIWFRQGIyImJzQ2MzIWFRQGIyImAb4gFhcfHxcWIMggFhcfHxcWIMggFhcfHxcWIAE+FQ8PFRUPDxXIFQ8PFRUPDxXIFQ8PFRUPDxUB4iAWFx8fFxYgyCAWFx8fFxYgyCAWFx8fFxYgAT4VDw8VFQ8PFcgVDw8VFQ8PFcgVDw8VFQ8PFQHiIBYXHx8XFiDIIBYXHx8XFiDIIBYXHx8XFiABPhUPDxUVDw8VyBUPDxUVDw8VyBUPDxUVDw8VAeIgFhcfHxcWIMggFhcfHxcWIMggFhcfHxcWIAE+FQ8PFRUPDxXIFQ8PFRUPDxXIFQ8PFRUPDxUB4iAWFx8fFxYgyCAWFx8fFxYgyCAWFx8fFxYgAT4VDw8VFQ8PFcgVDw8VFQ8PFcgVDw8VFQ8PFQHiIBYXHx8XFiDIIBYXHx8XFiDIIBYXHx8XFiABPhUPDxUVDw8VyBUPDxUVDw8VyBUPDxUVDw8VAeIgFhcfHxcWIMggFhcfHxcWIMggFhcfHxcWIAE+FQ8PFRUPDxXIFQ8PFRUPDxXIFQ8PFRUPDxUDhBcfHxcWICAWFx8fFxYgIBYXHx8XFiAgTg8VFQ8PFRUPDxUVDw8VFQ8PFRUPDxUVVRcfHxcWICAWFx8fFxYgIBYXHx8XFiAgTg8VFQ8PFRUPDxUVDw8VFQ8PFRUPDxUVVRcfHxcWICAWFx8fFxYgIBYXHx8XFiAgTg8VFQ8PFRUPDxUVDw8VFQ8PFRUPDxUVVRcfHxcWICAWFx8fFxYgIBYXHx8XFiAgTg8VFQ8PFRUPDxUVDw8VFQ8PFRUPDxUVVRcfHxcWICAWFx8fFxYgIBYXHx8XFiAgTg8VFQ8PFRUPDxUVDw8VFQ8PFRUPDxUVVRcfHxcWICAWFx8fFxYgIBYXHx8XFiAgTg8VFQ8PFRUPDxUVDw8VFQ8PFRUPDxUVVRcfHxcWICAWFx8fFxYgIBYXHx8XFiAgTg8VFQ8PFRUPDxUVDw8VFQ8PFRUPDxUVAAAq/8r+OgJFA9UACwAXACMALwA7AEcAUwBfAGsAdwCDAI8AmwCnALMAvwDLANcA4wDvAPsBBwETAR8BKwE3AUMBTwFbAWcBcwF/AYsBlwGjAa8BuwHHAdMB3wHrAfcAAAE0NjMyFhUUBiMiJic0NjMyFhUUBiMiJic0NjMyFhUUBiMiJgU0NjMyFhUUBiMiJic0NjMyFhUUBiMiJic0NjMyFhUUBiMiJgU0NjMyFhUUBiMiJic0NjMyFhUUBiMiJic0NjMyFhUUBiMiJgU0NjMyFhUUBiMiJic0NjMyFhUUBiMiJic0NjMyFhUUBiMiJgU0NjMyFhUUBiMiJic0NjMyFhUUBiMiJic0NjMyFhUUBiMiJgU0NjMyFhUUBiMiJic0NjMyFhUUBiMiJic0NjMyFhUUBiMiJgU0NjMyFhUUBiMiJic0NjMyFhUUBiMiJic0NjMyFhUUBiMiJgU0NjMyFhUUBiMiJic0NjMyFhUUBiMiJic0NjMyFhUUBiMiJgU0NjMyFhUUBiMiJic0NjMyFhUUBiMiJic0NjMyFhUUBiMiJgU0NjMyFhUUBiMiJic0NjMyFhUUBiMiJic0NjMyFhUUBiMiJgU0NjMyFhUUBiMiJic0NjMyFhUUBiMiJic0NjMyFhUUBiMiJgU0NjMyFhUUBiMiJic0NjMyFhUUBiMiJic0NjMyFhUUBiMiJgU0NjMyFhUUBiMiJic0NjMyFhUUBiMiJic0NjMyFhUUBiMiJgU0NjMyFhUUBiMiJic0NjMyFhUUBiMiJic0NjMyFhUUBiMiJgGjLyIiLy8iIi/ILyIiLy8iIi/ILyIiLy8iIi8BRyAWFx8fFxYgyCAWFx8fFxYgyCAWFx8fFxYgAdkvIiIvLyIiL8gvIiIvLyIiL8gvIiIvLyIiLwFHIBYXHx8XFiDIIBYXHx8XFiDIIBYXHx8XFiAB2S8iIi8vIiIvyC8iIi8vIiIvyC8iIi8vIiIvAUcgFhcfHxcWIMggFhcfHxcWIMggFhcfHxcWIAHZLyIiLy8iIi/ILyIiLy8iIi/ILyIiLy8iIi8BRyAWFx8fFxYgyCAWFx8fFxYgyCAWFx8fFxYgAdkvIiIvLyIiL8gvIiIvLyIiL8gvIiIvLyIiLwFHIBYXHx8XFiDIIBYXHx8XFiDIIBYXHx8XFiAB2S8iIi8vIiIvyC8iIi8vIiIvyC8iIi8vIiIvAUcgFhcfHxcWIMggFhcfHxcWIMggFhcfHxcWIAHZLyIiLy8iIi/ILyIiLy8iIi/ILyIiLy8iIi8BRyAWFx8fFxYgyCAWFx8fFxYgyCAWFx8fFxYgA4QiLy8iIi8vIiIvLyIiLy8iIi8vIiIvL0IXHx8XFiAgFhcfHxcWICAWFx8fFxYgIE4iLy8iIi8vIiIvLyIiLy8iIi8vIiIvL0IXHx8XFiAgFhcfHxcWICAWFx8fFxYgIE4iLy8iIi8vIiIvLyIiLy8iIi8vIiIvL0IXHx8XFiAgFhcfHxcWICAWFx8fFxYgIE4iLy8iIi8vIiIvLyIiLy8iIi8vIiIvL0IXHx8XFiAgFhcfHxcWICAWFx8fFxYgIE4iLy8iIi8vIiIvLyIiLy8iIi8vIiIvL0IXHx8XFiAgFhcfHxcWICAWFx8fFxYgIE4iLy8iIi8vIiIvLyIiLy8iIi8vIiIvL0IXHx8XFiAgFhcfHxcWICAWFx8fFxYgIE4iLy8iIi8vIiIvLyIiLy8iIi8vIiIvL0IXHx8XFiAgFhcfHxcWICAWFx8fFxYgIAAAAQAAAzkCWAPo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DEoDsQPAA7sDzAAgAGEDsQPAA7sDzAAgAGcAaQAgACYAIABsACADvAO1ACADsQO6A8EDtQO8A8wDvQO1A8IDowOsA7wDtwAgAUoDwQOtA8kDvQAgA7IDwQOtA8kDvQAgA7gDwQOtA8kDvQAgA8YDowOtA8EDsgO5A7oDvwAgBDEDugPFA8EDuQO7A7sDuQO6A8wAIAOyA8EDsQPHA80AIABbAtgAXQO8A7cDtAOtA70AIAO8A7UAIAO6A6wDuAO1A8QDvwAgAFsAMABdA8QDxQPAA78DswPBA7EDxgO5A7oDrgAgA8ADsQPNA7sDsQAgAFsALQBdA8QDxQPAA78DswPBA7EDxgO5A7oDvwPCACADsQPDA8QDtQPBA68DwwO6A78DwgAgAFsAKgBdA8MDzQO8A7IDvwO7A78AIAPEA78DxQAgA7QDvwO7A7EDwQOvA78DxQAgA7wDtQAgA7oDrAO4A7UDxAO/ACAAWwAkAF0DxAPFA8ADvwOzA8EDsQPGA7kDugOsACADtQO9A7EDuwO7A7EDugPEA7kDugOsACAAWwAtACwAKgBdA8EDrQPJA70AIAOyACwAIAOxA8ADuwPMACAAYQPBA60DyQO9ACADuAAsACADsQPAA7sDzAAgAGcALAAgA6MDrQPBA7IDuQO6A78AIAQxA8EDrQPJA70AIAPGACwAIAOjA6wDvAO3ACABSgCpACAAMgAwADEAMAAgAC0AIAAyADAAMgAwACAAQQBkAG8AYgBlACAAUwB5AHMAdABlAG0AcwAgAEkAbgBjAG8AcgBwAG8AcgBhAHQAZQBkACAAKABoAHQAdABwADoALwAvAHcAdwB3AC4AYQBkAG8AYgBlAC4AYwBvAG0ALwApACwAIAB3AGkAdABoACAAUgBlAHMAZQByAHYAZQBkACAARgBvAG4AdAAgAE4AYQBtAGUAICAYAFMAbwB1AHIAYwBlIBkALgBTAG8AdQByAGMAZQAgAEMAbwBkAGUAIABQAHIAbwBSAGUAZwB1AGwAYQByADIALgAwADMAOAA7AEEARABCAE8AOwBTAG8AdQByAGMAZQBDAG8AZABlAFAAcgBvAC0AUgBlAGcAdQBsAGEAcgA7AEEARABPAEIARQBWAGUAcgBzAGkAbwBuACAAMgAuADAAMwA4ADsAaABvAHQAYwBvAG4AdgAgADEALgAwAC4AMQAxADYAOwBtAGEAawBlAG8AdABmAGUAeABlACAAMgAuADUALgA2ADUANgAwADEAUwBvAHUAcgBjAGUAQwBvAGQAZQBQAHIAbwAtAFIAZQBnAHUAbABhAHIAUwBvAHUAcgBjAGUAIABpAHMAIABhACAAdAByAGEAZABlAG0AYQByAGsAIABvAGYAIABBAGQAbwBiAGUAIABTAHkAcwB0AGUAbQBzACAASQBuAGMAbwByAHAAbwByAGEAdABlAGQAIABpAG4AIAB0AGgAZQAgAFUAbgBpAHQAZQBkACAAUwB0AGEAdABlAHMAIABhAG4AZAAvAG8AcgAgAG8AdABoAGUAcgAgAGMAbwB1AG4AdAByAGkAZQBzAC4AQQBkAG8AYgBlACAAUwB5AHMAdABlAG0AcwAgAEkAbgBjAG8AcgBwAG8AcgBhAHQAZQBkAFAAYQB1AGwAIABEAC4AIABIAHUAbgB0ACwAIABUAGUAbwAgAFQAdQBvAG0AaQBuAGUAbgBoAHQAdABwADoALwAvAHcAdwB3AC4AYQBkAG8AYgBlAC4AYwBvAG0ALwB0AHkAcABlAFQAaABpAHMAIABGAG8AbgB0ACAAUwBvAGYAdAB3AGEAcgBlACAAaQBzACAAbABpAGMAZQBuAHMAZQBkACAAdQBuAGQAZQByACAAdABoAGUAIABTAEkATAAgAE8AcABlAG4AIABGAG8AbgB0ACAATABpAGMAZQBuAHMAZQAsACAAVgBlAHIAcwBpAG8AbgAgADEALgAxAC4AIABUAGgAaQBzACAAbABpAGMAZQBuAHMAZQAgAGkAcwAgAGEAdgBhAGkAbABhAGIAbABlACAAdwBpAHQAaAAgAGEAIABGAEEAUQAgAGEAdAA6ACAAaAB0AHQAcAA6AC8ALwBzAGMAcgBpAHAAdABzAC4AcwBpAGwALgBvAHIAZwAvAE8ARgBMAC4AIABUAGgAaQBzACAARgBvAG4AdAAgAFMAbwBmAHQAdwBhAHIAZQAgAGkAcwAgAGQAaQBzAHQAcgBpAGIAdQB0AGUAZAAgAG8AbgAgAGEAbgAgIBgAQQBTACAASQBTIBkAIABCAEEAUwBJAFMALAAgAFcASQBUAEgATwBVAFQAIABXAEEAUgBSAEEATgBUAEkARQBTACAATwBSACAAQwBPAE4ARABJAFQASQBPAE4AUwAgAE8ARgAgAEEATgBZACAASwBJAE4ARAAsACAAZQBpAHQAaABlAHIAIABlAHgAcAByAGUAcwBzACAAbwByACAAaQBtAHAAbABpAGUAZAAuACAAUwBlAGUAIAB0AGgAZQAgAFMASQBMACAATwBwAGUAbgAgAEYAbwBuAHQAIABMAGkAYwBlAG4AcwBlACAAZgBvAHIAIAB0AGgAZQAgAHMAcABlAGMAaQBmAGkAYwAgAGwAYQBuAGcAdQBhAGcAZQAsACAAcABlAHIAbQBpAHMAcwBpAG8AbgBzACAAYQBuAGQAIABsAGkAbQBpAHQAYQB0AGkAbwBuAHMAIABnAG8AdgBlAHIAbgBpAG4AZwAgAHkAbwB1AHIAIAB1AHMAZQAgAG8AZgAgAHQAaABpAHMAIABGAG8AbgB0ACAAUwBvAGYAdAB3AGEAcgBlAC4AaAB0AHQAcAA6AC8ALwBzAGMAcgBpAHAAdABzAC4AcwBpAGwALgBvAHIAZwAvAE8ARgBMAHMAaQBtAHAAbABlACAAYQBzAGkAbQBwAGwAZQAgAGcAcwBlAHIAaQBmAGUAZAAgAGkAIAAmACAAbABTAGEAbQBpACABSgBjAHUAcgBzAGkAdgBlACADsgBjAHUAcgBzAGkAdgBlACADuABjAHUAcgBzAGkAdgBlACADxgBTAGUAcgBiAGkAYQBuACADxgBDAHkAcgBpAGwAbABpAGMAIABiAHIAZQB2AGUAIABbAtgAXQBzAGwAYQBzAGgAZQBkACAAegBlAHIAbwAgAFsAMABdAHQAeQBwAG8AZwByAGEAcABoAGkAYwAgAGgAeQBwAGgAZQBuACAAWwAtAF0AdAB5AHAAbwBnAHIAYQBwAGgAaQBjACAAYQBzAHQAZQByAGkAcwBrACAAWwAqAF0AcwBsAGEAcwBoAGUAZAAgAGQAbwBsAGwAYQByACAAcwBpAGcAbgAgAFsAJABdAGEAbAB0AGUAcgBuAGEAdABlACAAbgB1AG0AZQByAGEAbAAgAG8AbgBlACAAWwAxAF0AdAB5AHAAbwBnAHIAYQBwAGgAaQBjACAAYQBsAHQAZQByAG4AYQB0AGUAcwAgAFsALQAsACoAXQBzAGkAbQBwAGwAZQAgAGEALAAgAGMAdQByAHMAaQB2AGUAIAOyAHMAaQBtAHAAbABlACAAZwAsACAAYwB1AHIAcwBpAHYAZQAgA7gALAAgAFMAZQByAGIAaQBhAG4AIAQxAFMAYQBtAGkAIAFKACwAIABjAHUAcgBzAGkAdgBlACADxgQ/BEAEPgRBBEIEPgQ5ACAEMAQ/BEAEPgRBBEIEPgQ5ACAAZwRWACAEOAAgBM8AIARBACAENwQwBEEENQRHBDoEMAQ8BDgEQQQwBDAEPARBBDoEOAQ5ACABSgRBBDoEPgRABD4EPwQ4BEEEPQRLBDkAIAOyBEEEOgQ+BEAEPgQ/BDgEQQQ9BEsEOQAgA7gEQQQ6BD4EQAQ+BD8EOARBBD0ESwQ5ACADxgRBBDUEQAQxBEEEOgQ4BDkAIAQxBDoEOARABDgEOwQ7BDgERwQ1BEEEOgQwBE8AIAQ6BEAEMARCBDoEMAAgAFsC2ABdBDcEMARHBDUEQAQ6BD0EQwRCBEsEOQAgBD0EPgQ7BEwAIABbADAAXQRCBDgEPwQ+BDMEQAQwBEQEQQQ6BDgEOQAgBDQENQREBDgEQQAgAFsALQBdBEIEOAQ/BD4EMwRABDAERARBBDoEMARPACAENwQyBDUENwQ0BD4ERwQ6BDAAIABbACoAXQQ3BDAERwQ1BEAEOgQ9BEMEQgRLBDkAIAQ3BD0EMAQ6ACAENAQ+BDsEOwQwBEAEMAAgAFsAJABdBEIEOAQ/BD4EMwRABDAERARBBDoEOAQ1ACAENwQwBDwENQRBBEIEOARCBDUEOwQ4ACAAWwAtACwAKgBdBD8EQAQ+BEEEQgQ+BDkAIAQwACwAIARBBDoEPgRABD4EPwQ4BEEEPQRLBDkAIAOyBEEENQRABDEEQQQ6BDgEOQAgBDEALAAgBD8EQAQ+BEEEQgQ+BDkAIABnACwAIARBBDoEPgRABD4EPwQ4BEEEPQRLBDkAIAO4BEEEMAQwBDwEQQQ6BDgEOQAgAUoALAAgBEEEOgQ+BEAEPgQ/BDgEQQQ9BEsEOQAgA8YAAAACAAAAAAAA/7UAMgAAAAEAAAAAAAAAAAAAAAAAAAAABiAAAAADACQAJQAmACcAKAApACoAKwAsAC0ALgAvADAAMQAyADMANAA1ADYANwA4ADkAOgA7ADwAPQBEAEUARgBHAEgASQBKAEsATABNAE4ATwBQAFEAUgBTAFQAVQBWAFcAWABZAFoAWwBcAF0ArQDJAMcArgBiAQIBAwBjAQQBBQEGAQcBCAEJAQoBCwEMAQ0BDgEPARABEQESAJABEwEUARUBFgBkAP0BFwD/ARgBGQEaARsBHAEdAR4AywBlAMgBHwDKASABIQEiASMBJAElASYBJwEoASkBKgErASwBLQEuAPgBLwEwATEBMgEzATQBNQE2ATcBOAE5AToAzwDMAM0BOwDOATwA+gE9AT4BPwFAAUEBQgFDAUQBRQFGAUcBSAFJAUoBSwDiAUwBTQFOAU8BUAFRAVIAZgFTAVQBVQFWANMA0ADRAK8AZwFXAVgBWQFaAVsBXAFdAV4BXwFgAWEBYgFjAWQBZQFmAWcBaAFpAJEBagCwAWsBbAFtAW4BbwFwAXEBcgFzAOQBdAF1AXYBdwF4AXkBegF7AXwBfQF+AX8A1gDUANUBgABoAYEBggGDAYQBhQGGAYcBiAGJAYoBiwGMAY0BjgGPAZABkQGSAZMBlAGVAZYBlwGYAOsBmQC7AZoBmwGcAZ0BngDmAZ8BoAGhAaIA6QDtAaMBpAGlAaYBpwBqAGkAawBtAGwBqAGpAG4BqgGrAawBrQGuAa8BsAGxAbIBswG0AbUBtgG3AbgAoAG5AboBuwG8AG8A/gG9AQABvgG/AcABwQHCAQEAcQBwAHIBwwBzAcQBxQHGAccByAHJAcoBywHMAc0BzgHPAdAB0QHSAPkB0wHUAdUB1gHXAdgB2QHaAdsB3AHdAd4AdQB0AHYB3wB3AeAB4QHiAeMB5AHlANcB5gHnAegB6QHqAesB7AHtAe4B7wHwAOMB8QHyAfMB9AH1AfYB9wB4AfgB+QH6AfsB/AB6AHkAewB9AHwB/QH+Af8CAAIBAgICAwIEAgUCBgIHAggCCQIKAgsCDAINAg4CDwChAhAAsQIRAhICEwIUAhUCFgIXAhgCGQDlAhoCGwIcAh0CHgCJAh8CIAIhAiICIwIkAiUCJgB/AH4AgAInAIECKAIpAioCKwIsAi0CLgIvAjACMQIyAjMCNAI1AjYCNwI4AjkCOgI7AjwCPQI+Aj8A7AJAALoCQQJCAkMCRAJFAOcCRgJHAkgCSQDqAO4CSgJLAkwCTQJOAk8CUAJRAlICUwJUAlUCVgJXAlgCWQJaAlsCXAJdAl4CXwJgAmECYgJjAmQCZQJmAmcCaAJpAmoCawJsAm0CbgJvAnACcQJyAnMCdAJ1AnYCdwJ4AnkCegJ7AnwCfQJ+An8CgAKBAoICgwKEAoUChgKHAogCiQKKAosCjAKNAo4CjwKQApECkgKTApQClQKWApcCmAKZApoCmwKcAp0CngKfAqACoQKiAqMCpAKlAqYCpwKoAqkCqgKrAqwCrQKuAq8CsAKxArICswK0ArUCtgK3ArgCuQK6ArsCvAK9Ar4CvwLAAsECwgLDAsQCxQLGAscCyALJAsoCywLMAs0CzgLPAtAC0QLSAtMC1ALVAtYC1wLYAtkC2gLbAtwC3QLeAt8C4ALhAuIC4wLkAuUC5gLnAugC6QLqAusC7ALtAu4C7wLwAvEC8gLzAvQC9QL2AvcC+AL5AvoC+wL8Av0C/gL/AwADAQMCAwMDBAMFAwYDBwMIAwkAmwMKAwsDDAMNAw4DDwMQAxEDEgMTAxQDFQMWAxcDGAMZAxoDGwMcAx0DHgMfAyADIQMiAyMDJAMlAyYDJwMoAykDKgMrAywDLQMuAy8DMAMxAzIDMwM0AzUDNgM3AzgDOQM6AzsDPAM9Az4DPwNAA0EDQgNDA0QDRQNGA0cDSANJA0oDSwNMA00DTgNPA1ADUQNSA1MDVANVA1YDVwNYA1kDWgNbA1wDXQNeA18DYANhA2IDYwNkA2UDZgNnA2gDaQNqA2sDbANtA24DbwNwA3EDcgNzA3QDdQN2A3cDeAN5A3oDewN8A30DfgN/A4ADgQOCA4MDhAOFA4YDhwOIA4kDigOLA4wDjQOOA48DkAORA5IDkwOUA5UDlgOXA5gDmQOaA5sDnAOdA54DnwOgA6EDogOjA6QDpQOmA6cDqAOpA6oDqwOsA60DrgOvA7ADsQOyA7MDtAO1A7YDtwO4A7kDugO7A7wDvQO+A78DwAPBA8IDwwPEA8UDxgPHA8gDyQPKA8sDzAPNA84DzwPQA9ED0gPTA9QD1QPWA9cD2APZA9oD2wPcA90D3gPfA+AD4QPiA+MD5APlA+YACQATABQAFQAWABcAGAAZABoAGwAcA+cD6APpA+oD6wPsA+0D7gPvA/AD8QPyA/MD9AP1A/YD9wP4A/kD+gP7A/wD/QP+A/8EAAARAA8AHQAeAKsABACjACIAogAKAAUAtgC3ALQAtQDEAMUEAQC+AL8AqQCqABAEAgQDALIAswQEBAUAwwCHBAYEBwQIBAkECgQLBAwEDQQOBA8EEAQRBBIAQgQTBBQEFQALAAwAPgBAAF4AYAASAF8APwDoAA0AggDCAIYAiAQWBBcEGAQZBBoEGwQcBB0EHgQfBCAEIQQiBCMEJAQlBCYAiwQnAIoAjAQoACMEKQAGBCoEKwQsBC0ELgQvBDAEMQQyBDMENAQ1BDYENwQ4BDkEOgQ7BDwEPQQ+BD8EQARBBEIEQwREBEUERgRHBEgESQRKBEsETARNBE4ETwRQBFEEUgRTBFQEVQRWBFcEWARZBFoEWwRcBF0EXgRfBGAEYQRiBGMEZARlBGYAnQRnAJ4EaARpBGoEawRsBG0EbgRvBHAEcQRyBHMEdAR1BHYEdwR4BHkEegR7BHwEfQR+BH8EgASBBIIEgwSEBIUEhgSHBIgEiQSKBIsEjASNBI4EjwC9AAcAhQCWBJAAhASRBJIEkwSUBJUElgSXBJgEmQSaBJsEnASdBJ4EnwSgAPcAvAShBKIACADGAPUA9AD2BKMEpASlBKYEpwSoBKkEqgSrBKwErQSuBK8EsASxBLIADgDvAPAAuASzACAEtAAfACEAlACVAJMAQQCPAGEApwCkBLUEtgS3AJIAgwS4BLkEugS7AJgAnAS8BL0ApQS+BL8EwATBBMIAmQCaBMMExATFBMYExwTIBMkEygTLBMwEzQTOBM8E0ATRBNIE0wTUBNUE1gTXBNgE2QTaBNsE3ATdBN4E3wTgBOEE4gTjBOQE5QTmBOcE6ATpBOoE6wTsBO0E7gTvBPAE8QTyBPME9AT1BPYE9wT4BPkAuQT6BPsE/AT9BP4E/wUABQEFAgUDAEMAjQDYAOEFBAUFBQYFBwUIANkAjgDaANsA3QDfANwA3gDgBQkFCgULBQwFDQUOBQ8FEAURBRIFEwUUBRUFFgUXBRgFGQUaBRsFHAUdBR4FHwUgBSEFIgUjBSQFJQUmBScFKAUpBSoFKwUsBS0FLgUvBTAFMQUyBTMFNAU1BTYFNwU4BTkFOgU7BTwFPQU+BT8FQAVBBUIFQwVEBUUFRgVHBUgFSQVKBUsFTAVNBU4FTwVQBVEFUgVTBVQFVQVWBVcFWAVZBVoFWwVcBV0FXgVfBWAFYQViBWMFZAVlBWYFZwVoBWkFagVrBWwFbQVuBW8FcAVxBXIFcwV0BXUFdgV3BXgFeQV6BXsFfAV9BX4FfwWABYEFggWDBYQFhQWGBYcFiAWJBYoFiwWMBY0FjgWPBZAFkQWSBZMFlAWVBZYFlwWYBZkFmgWbBZwFnQWeBZ8FoAWhBaIFowWkBaUFpgWnBagFqQWqBasFrAWtBa4FrwWwBbEFsgWzBbQFtQW2BbcFuAW5BboFuwW8Bb0FvgW/BcAFwQXCBcMFxAXFBcYFxwXIBckFygXLBcwFzQXOBc8F0AXRBdIF0wXUBdUF1gXXBdgF2QXaBdsF3AXdBd4F3wXgBeEF4gXjBeQF5QXmBecF6AXpBeoF6wXsBe0F7gXvBfAF8QXyBfMF9AX1BfYF9wX4BfkF+gX7BfwF/QX+Bf8GAAYBBgIGAwYEBgUGBgYHBggGCQYKBgsGDAYNBg4GDwYQBhEGEgYTBhQGFQYWBhcGGAYZBhoGGwYcBh0GHgYfBiAGIQYiBiMGJAYlBiYGJwYoBikGKgYrBiwGLQYuB0FtYWNyb24GQWJyZXZlCkFyaW5nYWN1dGUHdW5pMDFDRAdBb2dvbmVrB3VuaTFFQTAHdW5pMUVBMgd1bmkxRUE0B3VuaTFFQTYHdW5pMUVBOAd1bmkxRUFBB3VuaTFFQUMHdW5pMUVBRQd1bmkxRUIwB3VuaTFFQjIHdW5pMUVCNAd1bmkxRUI2B0FFYWN1dGUHdW5pMDFFMgd1bmkwMjQzB3VuaTFFMDYLQ2NpcmN1bWZsZXgKQ2RvdGFjY2VudAZEY2Fyb24HdW5pMUUwQwd1bmkxRTBFB3VuaTFFMTAGRGNyb2F0B3VuaTAxOEEGRWNhcm9uB0VtYWNyb24GRWJyZXZlCkVkb3RhY2NlbnQHRW9nb25lawd1bmkxRUI4B3VuaTFFQkEHdW5pMUVCQwd1bmkxRUJFB3VuaTFFQzAHdW5pMUVDMgd1bmkxRUM0B3VuaTFFQzYHdW5pMUUxNgd1bmkwMUY0C0djaXJjdW1mbGV4Ckdkb3RhY2NlbnQHdW5pMDEyMgZHY2Fyb24HdW5pMUUyMAt1bmkwMDQ3MDMwMwd1bmkwMTkzC0hjaXJjdW1mbGV4B3VuaTFFMjYHdW5pMUUyNAd1bmkxRTI4B3VuaTFFMkEESGJhcgZJdGlsZGUHSW1hY3Jvbgd1bmkwMUNGB0lvZ29uZWsHdW5pMUVDOAd1bmkxRUNBBklicmV2ZQtKY2lyY3VtZmxleAd1bmkwMTM2B3VuaTFFMzIHdW5pMUUzNAZMYWN1dGUGTGNhcm9uB3VuaTAxM0IHdW5pMUUzNgd1bmkxRTM4B3VuaTFFM0EETGRvdAd1bmkxRTNFB3VuaTFFNDAHdW5pMUU0MgZOYWN1dGUHdW5pMDFGOAZOY2Fyb24HdW5pMDE0NQd1bmkxRTQ0B3VuaTFFNDYHdW5pMUU0OAdPbWFjcm9uDU9odW5nYXJ1bWxhdXQGT2JyZXZlB3VuaTAxRDEHdW5pMDFFQQd1bmkxRUNDB3VuaTFFQ0UHdW5pMUVEMAd1bmkxRUQyB3VuaTFFRDQHdW5pMUVENgd1bmkxRUQ4BU9ob3JuB3VuaTFFREEHdW5pMUVEQwd1bmkxRURFB3VuaTFFRTAHdW5pMUVFMgd1bmkxRTUyC09zbGFzaGFjdXRlBlJhY3V0ZQZSY2Fyb24HdW5pMUU1OAd1bmkwMTU2B3VuaTFFNUEHdW5pMUU1Qwd1bmkxRTVFBlNhY3V0ZQtTY2lyY3VtZmxleAd1bmkxRTY2B3VuaTAxNUUHdW5pMDIxOAd1bmkxRTYwB3VuaTFFNjIHdW5pMUU5RQZUY2Fyb24HdW5pMDE2Mgd1bmkwMjFBB3VuaTFFNkMHdW5pMUU2RQRUYmFyBlV0aWxkZQdVbWFjcm9uBlVicmV2ZQVVcmluZw1VaHVuZ2FydW1sYXV0B3VuaTAxRDMHVW9nb25lawd1bmkwMUQ1B3VuaTAxRDcHdW5pMDFEOQd1bmkwMURCB3VuaTFFRTQHdW5pMUVFNgVVaG9ybgd1bmkxRUU4B3VuaTFFRUEHdW5pMUVFQwd1bmkxRUVFB3VuaTFFRjAHdW5pMUU3RQZXZ3JhdmUGV2FjdXRlC1djaXJjdW1mbGV4CVdkaWVyZXNpcwZZZ3JhdmULWWNpcmN1bWZsZXgHdW5pMUU4RQd1bmkxRUY0B3VuaTFFRjYHdW5pMUVGOAZaYWN1dGUKWmRvdGFjY2VudAd1bmkxRTkwB3VuaTFFOTIHdW5pMUU5NAd1bmkwMThGA0VuZwJJSg91bmkwMDRDMDBCNzAwNEMLdW5pMDEzMjAzMDEHYW1hY3JvbgZhYnJldmUKYXJpbmdhY3V0ZQd1bmkwMUNFB2FvZ29uZWsHdW5pMUVBMQd1bmkxRUEzB3VuaTFFQTUHdW5pMUVBNwd1bmkxRUE5B3VuaTFFQUIHdW5pMUVBRAd1bmkxRUFGB3VuaTFFQjEHdW5pMUVCMwd1bmkxRUI1B3VuaTFFQjcHYWVhY3V0ZQd1bmkwMUUzB3VuaTAxODAHdW5pMUUwNwtjY2lyY3VtZmxleApjZG90YWNjZW50BmRjYXJvbgd1bmkxRTBEB3VuaTFFMEYHdW5pMUUxMQZlY2Fyb24HZW1hY3JvbgZlYnJldmUHZW9nb25lawplZG90YWNjZW50B3VuaTFFQjkHdW5pMUVCQgd1bmkxRUJEB3VuaTFFQkYHdW5pMUVDMQd1bmkxRUMzB3VuaTFFQzUHdW5pMUVDNwd1bmkxRTE3B3VuaTAxRjULZ2NpcmN1bWZsZXgKZ2RvdGFjY2VudAd1bmkwMTIzBmdjYXJvbgd1bmkxRTIxC3VuaTAwNjcwMzAzC2hjaXJjdW1mbGV4B3VuaTFFMjcHdW5pMUUyNQd1bmkxRTk2B3VuaTFFMjkHdW5pMUUyQgRoYmFyBml0aWxkZQdpbWFjcm9uB3VuaTAxRDAHaW9nb25lawd1bmkxRUM5B3VuaTFFQ0IGaWJyZXZlC2pjaXJjdW1mbGV4B3VuaTAxMzcHdW5pMUUzMwd1bmkxRTM1DGtncmVlbmxhbmRpYwZsYWN1dGUGbGNhcm9uB3VuaTAxM0MHdW5pMUUzNwd1bmkxRTM5B3VuaTFFM0IEbGRvdAd1bmkxRTNGB3VuaTFFNDEHdW5pMUU0MwZuYWN1dGUHdW5pMDFGOQZuY2Fyb24HdW5pMDE0Ngd1bmkxRTQ1B3VuaTFFNDcHdW5pMUU0OQtuYXBvc3Ryb3BoZQdvbWFjcm9uDW9odW5nYXJ1bWxhdXQHdW5pMDFEMgd1bmkwMUVCB3VuaTFFQ0QHdW5pMUVDRgd1bmkxRUQxB3VuaTFFRDMHdW5pMUVENQd1bmkxRUQ3B3VuaTFFRDkGb2JyZXZlB3VuaTFFNTMFb2hvcm4HdW5pMUVEQgd1bmkxRUREB3VuaTFFREYHdW5pMUVFMQd1bmkxRUUzC29zbGFzaGFjdXRlBnJhY3V0ZQd1bmkwMTU3BnJjYXJvbgd1bmkxRTU5B3VuaTFFNUIHdW5pMUU1RAd1bmkxRTVGBnNhY3V0ZQtzY2lyY3VtZmxleAd1bmkxRTY3B3VuaTAxNUYHdW5pMDIxOQd1bmkxRTYxB3VuaTFFNjMFbG9uZ3MGdGNhcm9uB3VuaTAxNjMHdW5pMDIxQgd1bmkxRTZEB3VuaTFFNkYHdW5pMUU5NwR0YmFyBnV0aWxkZQd1bWFjcm9uBnVicmV2ZQV1cmluZw11aHVuZ2FydW1sYXV0B3VuaTAxRDQHdW9nb25lawd1bmkwMUQ2B3VuaTAxRDgHdW5pMDFEQQd1bmkwMURDB3VuaTFFRTUHdW5pMUVFNwV1aG9ybgd1bmkxRUU5B3VuaTFFRUIHdW5pMUVFRAd1bmkxRUVGB3VuaTFFRjEHdW5pMUU3RgZ3Z3JhdmUGd2FjdXRlC3djaXJjdW1mbGV4CXdkaWVyZXNpcwZ5Z3JhdmULeWNpcmN1bWZsZXgHdW5pMUU4Rgd1bmkxRUY1B3VuaTFFRjcHdW5pMUVGOQZ6YWN1dGUKemRvdGFjY2VudAd1bmkxRTkxB3VuaTFFOTMHdW5pMUU5NQNlbmcHdW5pMDIzNwJpag91bmkwMDZDMDBCNzAwNkMLdW5pMDEzMzAzMDEHdW5pMDI1MAd1bmkwMjUyB3VuaTAyNTMHdW5pMDI1NAd1bmkwMjU1B3VuaTAyNTYHdW5pMDI1Nwd1bmkwMjU4B3VuaTAyNTEHdW5pMDI5OQd1bmkwMjU5B3VuaTAyNUEHdW5pMDI1Qgd1bmkwMjVDB3VuaTAyNUUHdW5pMDI1Rgd1bmkwMjYwB3VuaTAyNjEHdW5pMDI2Mgd1bmkwMjYzB3VuaTAyNjQHdW5pMDI2NQd1bmkwMjY2B3VuaTAyNjcHdW5pMDI5Qwd1bmkwMjY4B3VuaTAyNkEHdW5pMDI5RAd1bmkwMjlFB3VuaTAyNkIHdW5pMDI2Qwd1bmkwMjZEB3VuaTAyNkUHdW5pMDI5Rgd1bmkwMjZGB3VuaTAyNzAHdW5pMDI3MQd1bmkwMjcyB3VuaTAyNzMHdW5pMDI3NAd1bmkwMjc1B3VuaTAyNzYHdW5pMDI3OAd1bmkwMjc5B3VuaTAyN0EHdW5pMDI3Qgd1bmkwMjdEB3VuaTAyN0UHdW5pMDI4MAd1bmkwMjgxB3VuaTAyODIHdW5pMDI4Mwd1bmkwMjg0B3VuaTAyODcHdW5pMDI4OAd1bmkwMjg5B3VuaTAyOEEHdW5pMDI4Qgd1bmkwMjhDB3VuaTAyOEQHdW5pMDI4RQd1bmkwMjhGB3VuaTAyOTAHdW5pMDI5MQd1bmkwMjkyB3VuaTAyQTQHdW5pMDJBNgd1bmkwMkE3B3VuaTAyOTQHdW5pMDI5NQd1bmkwMkExB3VuaTAyQTIHdW5pMDFDMgd1bmkwMjk4CXVuaTAxNEEuYQNhLmEIYWdyYXZlLmEIYWFjdXRlLmENYWNpcmN1bWZsZXguYQhhdGlsZGUuYQthZGllcmVzaXMuYQlhbWFjcm9uLmEIYWJyZXZlLmEHYXJpbmcuYQxhcmluZ2FjdXRlLmEJdW5pMDFDRS5hCXVuaTFFQTEuYQl1bmkxRUEzLmEJdW5pMUVBNS5hCXVuaTFFQTcuYQl1bmkxRUE5LmEJdW5pMUVBQi5hCXVuaTFFQUQuYQl1bmkxRUFGLmEJdW5pMUVCMS5hCXVuaTFFQjMuYQl1bmkxRUI1LmEJdW5pMUVCNy5hCWFvZ29uZWsuYQNnLmEJdW5pMDFGNS5hDWdjaXJjdW1mbGV4LmEIZ2JyZXZlLmEMZ2RvdGFjY2VudC5hCXVuaTAxMjMuYQhnY2Fyb24uYQl1bmkxRTIxLmENdW5pMDA2NzAzMDMuYQNpLmEKZG90bGVzc2kuYQhpZ3JhdmUuYQhpYWN1dGUuYQ1pY2lyY3VtZmxleC5hCGl0aWxkZS5hC2lkaWVyZXNpcy5hCWltYWNyb24uYQl1bmkwMUQwLmEJaW9nb25lay5hCXVuaTFFQzkuYQl1bmkxRUNCLmEJdW5pMDEyRC5hCXVuaTAyNjguYQlpb2dvbmVrLmQKaW9nb25lay5kYQl1bmkwMjY4LmQKdW5pMDI2OC5kYQl1bmkwMjlELmQDbC5hCGxhY3V0ZS5hCGxjYXJvbi5hCXVuaTAxM0MuYQl1bmkxRTM3LmEJdW5pMUUzOS5hCXVuaTFFM0IuYQhsc2xhc2guYQZsZG90LmERdW5pMDA2QzAwQjcwMDZDLmEJdW5pMDI2Qi5hCXVuaTAyNkMuYQVBbHBoYQRCZXRhBUdhbW1hB3VuaTAzOTQHRXBzaWxvbgRaZXRhA0V0YQVUaGV0YQRJb3RhBUthcHBhBkxhbWJkYQJNdQJOdQJYaQdPbWljcm9uAlBpA1JobwVTaWdtYQNUYXUHVXBzaWxvbgNQaGkDQ2hpA1BzaQd1bmkwM0E5CkFscGhhdG9ub3MMRXBzaWxvbnRvbm9zCEV0YXRvbm9zCUlvdGF0b25vcwxJb3RhZGllcmVzaXMMT21pY3JvbnRvbm9zDFVwc2lsb250b25vcw9VcHNpbG9uZGllcmVzaXMKT21lZ2F0b25vcwVhbHBoYQRiZXRhBWdhbW1hBWRlbHRhB2Vwc2lsb24EemV0YQNldGEFdGhldGEEaW90YQVrYXBwYQZsYW1iZGEHdW5pMDNCQwJudQJ4aQdvbWljcm9uA3JobwVzaWdtYQN0YXUHdXBzaWxvbgNwaGkDY2hpA3BzaQVvbWVnYQd1bmkwM0MyB3VuaTAzRDAHdW5pMDNEMQd1bmkwM0Q1BXBoaS5hCmFscGhhdG9ub3MMZXBzaWxvbnRvbm9zCGV0YXRvbm9zCWlvdGF0b25vcwxpb3RhZGllcmVzaXMMb21pY3JvbnRvbm9zDHVwc2lsb250b25vcw91cHNpbG9uZGllcmVzaXMKb21lZ2F0b25vcxFpb3RhZGllcmVzaXN0b25vcxR1cHNpbG9uZGllcmVzaXN0b25vcwd1bmkwM0Q3B3VuaTAzRDkHdW5pMDNEQgd1bmkwM0REB3VuaTAzRTEHdW5pMDM3RQlhbm90ZWxlaWENYW5vdGVsZWlhLmNhcAd1bmkwMzc0B3VuaTAzNzUFdG9ub3MJdG9ub3MuY2FwDWRpZXJlc2lzdG9ub3MHdW5pMDM3QQd1bmkxRkJFB3VuaTFGQkQHdW5pMUZCRgd1bmkxRkZFB3VuaTFGRUYHdW5pMUZGRAd1bmkxRkNEB3VuaTFGREQHdW5pMUZDRQd1bmkxRkRFB3VuaTFGQ0YHdW5pMUZERgd1bmkxRkMwB3VuaTFGRUQHdW5pMUZFRQd1bmkxRkMxC3VuaTFGQkQuY2FwC3VuaTFGRkUuY2FwC3VuaTFGRUYuY2FwC3VuaTFGRkQuY2FwC3VuaTFGQ0QuY2FwC3VuaTFGREQuY2FwC3VuaTFGQ0UuY2FwC3VuaTFGREUuY2FwC3VuaTFGQ0YuY2FwC3VuaTFGREYuY2FwB3VuaTA0MTAHdW5pMDQxMQd1bmkwNDEyB3VuaTA0MTMHdW5pMDQxNAd1bmkwNDE1B3VuaTA0MTYHdW5pMDQxNwd1bmkwNDE4B3VuaTA0MTkHdW5pMDQxQQd1bmkwNDFCB3VuaTA0MUMHdW5pMDQxRAd1bmkwNDFFB3VuaTA0MUYHdW5pMDQyMAd1bmkwNDIxB3VuaTA0MjIHdW5pMDQyMwd1bmkwNDI0B3VuaTA0MjUHdW5pMDQyNgd1bmkwNDI3B3VuaTA0MjgHdW5pMDQyOQd1bmkwNDJBB3VuaTA0MkIHdW5pMDQyQwd1bmkwNDJEB3VuaTA0MkUHdW5pMDQyRgd1bmkwNDAwB3VuaTA0MDEHdW5pMDQwMgd1bmkwNDAzB3VuaTA0MDQHdW5pMDQwNQd1bmkwNDA2B3VuaTA0MDcHdW5pMDQwOAd1bmkwNDA5B3VuaTA0MEEHdW5pMDQwQgd1bmkwNDBDB3VuaTA0MEQHdW5pMDQwRQd1bmkwNDBGB3VuaTA0NjIHdW5pMDQ3Mgd1bmkwNDc0B3VuaTA0OTAHdW5pMDQ5Mgd1bmkwNDk2B3VuaTA0OTgHdW5pMDQ5QQd1bmkwNEEwB3VuaTA0QTIHdW5pMDRBQQd1bmkwNEFFB3VuaTA0QjAHdW5pMDRCMgd1bmkwNEI2B3VuaTA0QkEHdW5pMDRDMAd1bmkwNEMxB3VuaTA0RDAHdW5pMDRENAd1bmkwNEQ2B3VuaTA0RDgHdW5pMDRFMgd1bmkwNEU2B3VuaTA0RTgHdW5pMDRFRQd1bmkwNEYyB3VuaTA0MzAHdW5pMDQzMQd1bmkwNDMyB3VuaTA0MzMHdW5pMDQzNAd1bmkwNDM1B3VuaTA0MzYHdW5pMDQzNwd1bmkwNDM4B3VuaTA0MzkHdW5pMDQzQQd1bmkwNDNCB3VuaTA0M0MHdW5pMDQzRAd1bmkwNDNFB3VuaTA0M0YHdW5pMDQ0MAd1bmkwNDQxB3VuaTA0NDIHdW5pMDQ0Mwd1bmkwNDQ0B3VuaTA0NDUHdW5pMDQ0Ngd1bmkwNDQ3B3VuaTA0NDgHdW5pMDQ0OQd1bmkwNDRBB3VuaTA0NEIHdW5pMDQ0Qwd1bmkwNDREB3VuaTA0NEUHdW5pMDQ0Rgd1bmkwNDUwB3VuaTA0NTEHdW5pMDQ1Mgd1bmkwNDUzB3VuaTA0NTQHdW5pMDQ1NQd1bmkwNDU2B3VuaTA0NTcHdW5pMDQ1OAd1bmkwNDU5B3VuaTA0NUEHdW5pMDQ1Qgd1bmkwNDVDB3VuaTA0NUQHdW5pMDQ1RQd1bmkwNDVGB3VuaTA0NjMHdW5pMDQ3Mwd1bmkwNDc1B3VuaTA0OTEHdW5pMDQ5Mwd1bmkwNDk3B3VuaTA0OTkHdW5pMDQ5Qgd1bmkwNEExB3VuaTA0QTMHdW5pMDRBQgd1bmkwNEFGB3VuaTA0QjEHdW5pMDRCMwd1bmkwNEI3B3VuaTA0QkIHdW5pMDRDMgd1bmkwNENGB3VuaTA0RDEHdW5pMDRENQd1bmkwNEQ3B3VuaTA0RDkHdW5pMDRFMwd1bmkwNEU3B3VuaTA0RTkHdW5pMDRFRgd1bmkwNEYzCXVuaTA0MzAuYQl1bmkwNEQxLmELdW5pMDQzMS5zcmIJdW5pMDQ1Ni5hCXVuaTA0NTcuYQl1bmkwNENGLmEHdW5pMjExNgZ6ZXJvLmEFb25lLmEJemVyby5vbnVtCG9uZS5vbnVtCHR3by5vbnVtCnRocmVlLm9udW0JZm91ci5vbnVtCWZpdmUub251bQhzaXgub251bQpzZXZlbi5vbnVtCmVpZ2h0Lm9udW0JbmluZS5vbnVtBnplcm8uYgVvbmUuYgh6ZXJvLmNhcAdvbmUuY2FwB3R3by5jYXAJdGhyZWUuY2FwCGZvdXIuY2FwCGZpdmUuY2FwB3NpeC5jYXAJc2V2ZW4uY2FwCWVpZ2h0LmNhcAhuaW5lLmNhcAZ6ZXJvLmMFb25lLmMNcXVvdGVyZXZlcnNlZAd1bmkwMEFEB3VuaTIwMTAKZmlndXJlZGFzaAd1bmkyMDE1B3VuaTI1RTYHdW5pMjVBQQd1bmkyNUFCB3VuaTI1QjQHdW5pMjVCNQd1bmkyNUI4B3VuaTI1QjkHdW5pMjVCRQd1bmkyNUJGB3VuaTI1QzIHdW5pMjVDMwlpbnZidWxsZXQKZmlsbGVkcmVjdA11bmRlcnNjb3JlZGJsB3VuaTIwM0UHdW5pMjAzRgd1bmkyMDE2CWV4Y2xhbWRibAd1bmkyMDQ3B3VuaTIwNDkHdW5pMjA0OAd1bmkyMDNEB3VuaTJFMTgHdW5pMjMxQwd1bmkyMzFEB3VuaTIzMUUHdW5pMjMxRgd1bmkyN0U2B3VuaTI3RTcHdW5pMkUyMgd1bmkyRTIzB3VuaTJFMjQHdW5pMkUyNQd1bmkyMTE3B3VuaTIxMjAHYXQuY2FzZQphc3Rlcmlzay5hCGh5cGhlbi5hCXVuaTAwQUQuYQl1bmkyMDEwLmEIZG9sbGFyLmEJemVyby5zdXBzCG9uZS5zdXBzCHR3by5zdXBzCnRocmVlLnN1cHMJZm91ci5zdXBzCWZpdmUuc3VwcwhzaXguc3VwcwpzZXZlbi5zdXBzCmVpZ2h0LnN1cHMJbmluZS5zdXBzDnBhcmVubGVmdC5zdXBzD3BhcmVucmlnaHQuc3VwcwtwZXJpb2Quc3Vwcwpjb21tYS5zdXBzCXplcm8uc3VicwhvbmUuc3Vicwh0d28uc3Vicwp0aHJlZS5zdWJzCWZvdXIuc3VicwlmaXZlLnN1YnMIc2l4LnN1YnMKc2V2ZW4uc3VicwplaWdodC5zdWJzCW5pbmUuc3Vicw5wYXJlbmxlZnQuc3Vicw9wYXJlbnJpZ2h0LnN1YnMLcGVyaW9kLnN1YnMKY29tbWEuc3Vicwl6ZXJvLmRub20Ib25lLmRub20IdHdvLmRub20KdGhyZWUuZG5vbQlmb3VyLmRub20JZml2ZS5kbm9tCHNpeC5kbm9tCnNldmVuLmRub20KZWlnaHQuZG5vbQluaW5lLmRub20OcGFyZW5sZWZ0LmRub20PcGFyZW5yaWdodC5kbm9tC3BlcmlvZC5kbm9tCmNvbW1hLmRub20JemVyby5udW1yCG9uZS5udW1yCHR3by5udW1yCnRocmVlLm51bXIJZm91ci5udW1yCWZpdmUubnVtcghzaXgubnVtcgpzZXZlbi5udW1yCmVpZ2h0Lm51bXIJbmluZS5udW1yDnBhcmVubGVmdC5udW1yD3BhcmVucmlnaHQubnVtcgtwZXJpb2QubnVtcgpjb21tYS5udW1yDW9yZGZlbWluaW5lLmEGYS5zdXBzBmIuc3VwcwZjLnN1cHMGZC5zdXBzBmUuc3VwcwZmLnN1cHMGZy5zdXBzBmguc3VwcwZpLnN1cHMGai5zdXBzBmsuc3VwcwZsLnN1cHMGbS5zdXBzBm4uc3VwcwZvLnN1cHMGcC5zdXBzBnEuc3VwcwZyLnN1cHMGcy5zdXBzBnQuc3VwcwZ1LnN1cHMGdi5zdXBzBncuc3VwcwZ4LnN1cHMGeS5zdXBzBnouc3VwcwtlZ3JhdmUuc3VwcwtlYWN1dGUuc3Vwcwxlb2dvbmVrLnN1cHMMdW5pMDI1OS5zdXBzDHVuaTAyNjYuc3Vwcwd1bmkwMkUwB3VuaTAyRTQGYS5zdXBhBmcuc3VwYQZpLnN1cGEKY29sb24uc3VwcwtoeXBoZW4uc3VwcwtlbmRhc2guc3VwcwtlbWRhc2guc3VwcwRFdXJvB3VuaTAxOTINY29sb25tb25ldGFyeQRsaXJhB3VuaTIwQTYGcGVzZXRhB3VuaTIwQTkEZG9uZwd1bmkyMEIxB3VuaTIwQjIHdW5pMjBCNAd1bmkyMEI1B3VuaTIwQjkHdW5pMjBCQQd1bmkyMEFFB3VuaTIwQjgHdW5pMjBCRAd1bmkyMjE1CnNsYXNoLmZyYWMIb25ldGhpcmQJdHdvdGhpcmRzB3VuaTIxNTUHdW5pMjE1Ngd1bmkyMTU3B3VuaTIxNTgHdW5pMjE1OQd1bmkyMTVBB3VuaTIxNTAJb25lZWlnaHRoDHRocmVlZWlnaHRocwtmaXZlZWlnaHRocwxzZXZlbmVpZ2h0aHMHdW5pMjE1MQd1bmkyMTUyB3VuaTIxODkHdW5pMjIxOQtlcXVpdmFsZW5jZQ1yZXZsb2dpY2Fsbm90DGludGVyc2VjdGlvbgpvcnRob2dvbmFsB3VuaTIwMzIHdW5pMjAzMwd1bmkyMDM1B3VuaTAwQjUKaW50ZWdyYWx0cAppbnRlZ3JhbGJ0B3VuaTIyMDYHdW5pMjEyNgd1bmkyMjAwB3VuaTIyMDMHdW5pMjIzNwd1bmkyMTA1B3VuaTIxMTMJZXN0aW1hdGVkB3VuaTIxOTAHYXJyb3d1cAd1bmkyMTkyCWFycm93ZG93bgd1bmkyMTk2B3VuaTIxOTcHdW5pMjE5OAd1bmkyMTk5B3VuaTIxRDAHdW5pMjFEMQd1bmkyMUQyB3VuaTIxRDMJYXJyb3dib3RoCWFycm93dXBkbgxhcnJvd3VwZG5ic2UHdW5pMjVDRgd1bmkyNUNCB3VuaTI1QTAHdW5pMjVBMQd1bmkyNzUyB3VuaTI1QzYHdHJpYWd1cAd1bmkyNUIzB3VuaTI1QjYHdW5pMjVCNwd0cmlhZ2RuB3VuaTI1QkQHdW5pMjVDMAd1bmkyNUMxB3RyaWFncnQHdHJpYWdsZglpbnZjaXJjbGUHdW5pMjVDOQd1bmkyNjEwB3VuaTI2MTEHdW5pMjcxMwttdXNpY2Fsbm90ZQ5tdXNpY2Fsbm90ZWRibAVoZWFydARjbHViB2RpYW1vbmQFc3BhZGUJc21pbGVmYWNlDGludnNtaWxlZmFjZQd1bmkyNzY0B3VuaTI2MTUGdTFGNEE5BnUxRjkxNgZ1MUY1MTIGZmVtYWxlBG1hbGUDc3VuBWhvdXNlB3VuaTAyQjkHdW5pMDJCQgd1bmkwMkJDB3VuaTAyQkUHdW5pMDJCRgd1bmkwMkMxB3VuaTAyRDAHdW5pMDJEMQd1bmkwMkRFB3VuaTAyQzgHdW5pMDJDOQd1bmkwMkNBB3VuaTAyQ0IHdW5pMDJDQwd1bmkyNUNDB3VuaTAzMDALdW5pMDMwMC5jYXAHdW5pMDM0MAd1bmkwMzAxC3VuaTAzMDEuY2FwCXVuaTAzMDEuZwd1bmkwMzAyC3VuaTAzMDIuY2FwB3VuaTAzMDMLdW5pMDMwMy5jYXAHdW5pMDMwNAt1bmkwMzA0LmNhcAd1bmkwMzA1C3VuaTAzMDUuY2FwB3VuaTAzMDYJdW5pMDMwNi5jC3VuaTAzMDYuY2FwDHVuaTAzMDYuY2NhcAd1bmkwMzA3C3VuaTAzMDcuY2FwB3VuaTAzMDgLdW5pMDMwOC5jYXAHdW5pMDMwOQt1bmkwMzA5LmNhcAd1bmkwMzEwC3VuaTAzMTAuY2FwB3VuaTAzMEELdW5pMDMwQS5jYXAHdW5pMDMwQgt1bmkwMzBCLmNhcAd1bmkwMzBDC3VuaTAzMEMuY2FwCXVuaTAzMEMuYQd1bmkwMzBGC3VuaTAzMEYuY2FwB3VuaTAzMTELdW5pMDMxMS5jYXAHdW5pMDMxMgl1bmkwMzEyLmcHdW5pMDMxMwd1bmkwMzQzB3VuaTAzMTgHdW5pMDMxOQd1bmkwMzFBB3VuaTAzMUIHdW5pMDMxQwd1bmkwMzFEB3VuaTAzMUUHdW5pMDMxRgd1bmkwMzIwB3VuaTAzMjMHdW5pMDMyNAd1bmkwMzI1B3VuaTAzMjYJdW5pMDMyNi5hB3VuaTAzMjcLdW5pMDMyNy5jYXAHdW5pMDMyOAt1bmkwMzI4LmNhcAd1bmkwMzI5B3VuaTAzMkEHdW5pMDMyQwd1bmkwMzJFB3VuaTAzMkYHdW5pMDMzMAd1bmkwMzMxB3VuaTAzMzQHdW5pMDMzOQd1bmkwMzNBB3VuaTAzM0IHdW5pMDMzQwd1bmkwMzNEB3VuaTAzNDILdW5pMDM0Mi5jYXAHdW5pMDM0NQd1bmkwMzVGB3VuaTAzNjELdW5pMDMwODAzMDEPdW5pMDMwODAzMDEuY2FwDXVuaTAzMDgwMzAxLmcLdW5pMDMwODAzMDAPdW5pMDMwODAzMDAuY2FwDXVuaTAzMDgwMzAwLmcLdW5pMDMwODAzMDMLdW5pMDMwODAzMDQPdW5pMDMwODAzMDQuY2FwC3VuaTAzMDgwMzBDD3VuaTAzMDgwMzBDLmNhcAt1bmkwMzAyMDMwMQ91bmkwMzAyMDMwMS5jYXALdW5pMDMwMjAzMDAPdW5pMDMwMjAzMDAuY2FwC3VuaTAzMDIwMzA5D3VuaTAzMDIwMzA5LmNhcAt1bmkwMzAyMDMwMw91bmkwMzAyMDMwMy5jYXALdW5pMDMwNjAzMDEPdW5pMDMwNjAzMDEuY2FwC3VuaTAzMDYwMzAwD3VuaTAzMDYwMzAwLmNhcAt1bmkwMzA2MDMwOQ91bmkwMzA2MDMwOS5jYXALdW5pMDMwNjAzMDMPdW5pMDMwNjAzMDMuY2FwC3VuaTAzMDIwMzA2D3VuaTAzMDIwMzA2LmNhcAt1bmkwMzA0MDMwMQ91bmkwMzA0MDMwMS5jYXALdW5pMDMwQzAzMDcPdW5pMDMwQzAzMDcuY2FwC3VuaTAzMTIwMzAxC3VuaTAzMTIwMzAwC3VuaTAzMTIwMzAzC3VuaTAzMTMwMzAxC3VuaTAzMTMwMzAwC3VuaTAzMTMwMzAzB3VuaTAwQTAHdW5pMjAwNwpzcGFjZS5mcmFjDG5ic3BhY2UuZnJhYwd1bmkyNTAwB3VuaTI1MDEHdW5pMjUwMgd1bmkyNTAzB3VuaTI1MDQHdW5pMjUwNQd1bmkyNTA2B3VuaTI1MDcHdW5pMjUwOAd1bmkyNTA5B3VuaTI1MEEHdW5pMjUwQgd1bmkyNTBDB3VuaTI1MEQHdW5pMjUwRQd1bmkyNTBGB3VuaTI1MTAHdW5pMjUxMQd1bmkyNTEyB3VuaTI1MTMHdW5pMjUxNAd1bmkyNTE1B3VuaTI1MTYHdW5pMjUxNwd1bmkyNTE4B3VuaTI1MTkHdW5pMjUxQQd1bmkyNTFCB3VuaTI1MUMHdW5pMjUxRAd1bmkyNTFFB3VuaTI1MUYHdW5pMjUyMAd1bmkyNTIxB3VuaTI1MjIHdW5pMjUyMwd1bmkyNTI0B3VuaTI1MjUHdW5pMjUyNgd1bmkyNTI3B3VuaTI1MjgHdW5pMjUyOQd1bmkyNTJBB3VuaTI1MkIHdW5pMjUyQwd1bmkyNTJEB3VuaTI1MkUHdW5pMjUyRgd1bmkyNTMwB3VuaTI1MzEHdW5pMjUzMgd1bmkyNTMzB3VuaTI1MzQHdW5pMjUzNQd1bmkyNTM2B3VuaTI1MzcHdW5pMjUzOAd1bmkyNTM5B3VuaTI1M0EHdW5pMjUzQgd1bmkyNTNDB3VuaTI1M0QHdW5pMjUzRQd1bmkyNTNGB3VuaTI1NDAHdW5pMjU0MQd1bmkyNTQyB3VuaTI1NDMHdW5pMjU0NAd1bmkyNTQ1B3VuaTI1NDYHdW5pMjU0Nwd1bmkyNTQ4B3VuaTI1NDkHdW5pMjU0QQd1bmkyNTRCB3VuaTI1NEMHdW5pMjU0RAd1bmkyNTRFB3VuaTI1NEYHdW5pMjU1MAd1bmkyNTUxB3VuaTI1NTIHdW5pMjU1Mwd1bmkyNTU0B3VuaTI1NTUHdW5pMjU1Ngd1bmkyNTU3B3VuaTI1NTgHdW5pMjU1OQd1bmkyNTVBB3VuaTI1NUIHdW5pMjU1Qwd1bmkyNTVEB3VuaTI1NUUHdW5pMjU1Rgd1bmkyNTYwB3VuaTI1NjEHdW5pMjU2Mgd1bmkyNTYzB3VuaTI1NjQHdW5pMjU2NQd1bmkyNTY2B3VuaTI1NjcHdW5pMjU2OAd1bmkyNTY5B3VuaTI1NkEHdW5pMjU2Qgd1bmkyNTZDB3VuaTI1NkQHdW5pMjU2RQd1bmkyNTZGB3VuaTI1NzAHdW5pMjU3MQd1bmkyNTcyB3VuaTI1NzMHdW5pMjU3NAd1bmkyNTc1B3VuaTI1NzYHdW5pMjU3Nwd1bmkyNTc4B3VuaTI1NzkHdW5pMjU3QQd1bmkyNTdCB3VuaTI1N0MHdW5pMjU3RAd1bmkyNTdFB3VuaTI1N0YHdW5pMjU4MAd1bmkyNTgxB3VuaTI1ODIHdW5pMjU4Mwd1bmkyNTg0B3VuaTI1ODUHdW5pMjU4Ngd1bmkyNTg3B3VuaTI1ODgHdW5pMjU4OQd1bmkyNThBB3VuaTI1OEIHdW5pMjU4Qwd1bmkyNThEB3VuaTI1OEUHdW5pMjU4Rgd1bmkyNTkwB3VuaTI1OTEHdW5pMjU5Mgd1bmkyNTkzB3VuaTI1OTQHdW5pMjU5NQd1bmkyNTk2B3VuaTI1OTcHdW5pMjU5OAd1bmkyNTk5B3VuaTI1OUEHdW5pMjU5Qgd1bmkyNTlDB3VuaTI1OUQHdW5pMjU5RQd1bmkyNTlGB3VuaTIwMkYHdW5pRkVGRgZ1MUYzQjUGdTFGM0I2A2ZfaQNmX2wHdW5pRTBBMAd1bmlFMEEx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APwA/AE+APwA/AFEAPwBSgFQAVYBXAFiAWgBbgF0AXoBOAD8AYABhgGMAZIBmAD8APwA/AGeAWIBpAGqASYA/AD8AVYBsAFoAXoA/AD8AYABtgFuAbABRAFEAbwBwgHIAPwBVgEyAc4B1AHaAdoB4AHmAPwB7AFEAbYA/AFoAPwB8gH4AXoB/gIEAgoBCAIQAhYCHAIcAiICKAGMAbACLgI0AjoCQAD8AkYA/AD8AbAA/AJMAlICWAJeATIBVgHaAmQCZAJkAfICZAJkAmQCZAD8APwA/AJqAnAA/AABASz/7AABAVj/7AABASb/7AABAU3/7AABALX/7AABAUr/7AABAVL/7AABAV3/7AABAIz/7AABAUD/7AABATn/7AABAS7/7AABATz/7AABATb/7AABAVT/7AABATD/7AABASP/7AABATr/7AABAVz/7AABAO3/JQABAU//7AABAYH/7AABAIn/JQABAc3/JQABAL//7AABATX/7AABAXz/7AABAQv/JQABAVD/7AABASL/7AABATL/7AABAWn/JQABARj/7AABAWj/7AABATP/JQABAOH/7AABAR//7AABASb/JQABAUb/7AABASz/HgABAWH/owABAN//JQABAcL/JQABAYH/JQABAWX/JQABAVf/7AABAK7/JQABAa7/JQABAQ//7AABATD/JQABAUj/JQABATb/JQABAQD/JQABAWD/uAABAXz/JQABAS//7AABAR7/HgABAU7/7AABAUv/JQABARf/7AABAUj/7AABARb/7AABAIf/7AABBsoG0AABAAwAEgABAAAAEAAEABAAFgAcAAoAAQEsAPQAAQCwAVEAAQEgAYEAAQFRAYEAAQaoBq4AAQAMABIAAQAAABAABAAQABYAHAAiAAEBLAHmAAEBpAKGAAEB9wKaAAEBmwHmAAEBnwHmAAEGgAaIAAEADAAWAAIAAABIAAAASAAeAEQASgA+AD4APgA+AFAAVgA+AFwAYgBEAEQARABoAD4AbgBQAFAAUAB0AFYAPgBKAEoASgBKAHoAegA+AAEBLAAAAAEB+AAAAAEBrgAAAAEBtAAAAAEBZAAAAAEBqgAAAAEBBv+XAAEBrQAAAAEBNgAAAAEBlAAAAAEBUAAAAAECnAYyAAEADAFaAFMAAAFoAAABbgAAAWgAAAFoAAABbgAAAWgAAAFo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AGoAcgB6AIIAigCRAJcAnwCnAK8AtwC/AMcAzwDXAN8A5wDvAPcA/wEHAAQAAAAA//8AIgADAAsAEwAbACMAKwAzADsAQwBLAFMAWwBjAGsAcwB7AIMAiwCSAJgAoACoALAAuADAAMgA0ADYAOAA6ADwAPgBAAEIABYAA0FUSCAAXk5TTSAAplNLUyAA8AAA//8AIQAEAAwAFAAcACQALAA0ADwARABMAFQAXABkAGwAdAB8AIQAjACZAKEAqQCxALkAwQDJANEA2QDhAOkA8QD5AQEBCQAA//8AIQAFAA0AFQAdACUALQA1AD0ARQBNAFUAXQBlAG0AdQB9AIUAjQCaAKIAqgCyALoAwgDKANIA2gDiAOoA8gD6AQIBCgAA//8AIgAGAA4AFgAeACYALgA2AD4ARgBOAFYAXgBmAG4AdgB+AIYAjgCTAJsAowCrALMAuwDDAMsA0wDbAOMA6wDzAPsBAwELAAD//wAiAAcADwAXAB8AJwAvADcAPwBHAE8AVwBfAGcAbwB3AH8AhwCPAJQAnACkAKwAtAC8AMQAzADUANwA5ADsAPQA/AEEAQwBDWNhc2UGUGNhc2UGVmNhc2UGXGNhc2UGYmNhc2UGaGNhc2UGbmNhc2UGdGNhc2UGemNjbXAGgGNjbXAGjmNjbXAGnGNjbXAGqmNjbXAGuGNjbXAGxmNjbXAG1GNjbXAG4mN2MDEG8GN2MDEG9mN2MDEG/GN2MDEHAmN2MDEHCGN2MDEHDmN2MDEHFGN2MDEHGmN2MDIHIGN2MDIHJmN2MDIHLGN2MDIHMmN2MDIHOGN2MDIHPmN2MDIHRGN2MDIHSmN2MDQHUGN2MDQHVmN2MDQHXGN2MDQHYmN2MDQHaGN2MDQHbmN2MDQHdGN2MDQHemN2MDYHgGN2MDYHhmN2MDYHjGN2MDYHkmN2MDYHmGN2MDYHnmN2MDYHpGN2MDYHqmN2MDcHsGN2MDcHtmN2MDcHvGN2MDcHwmN2MDcHyGN2MDcHzmN2MDcH1GN2MDcH2mN2MDgH4GN2MDgH5mN2MDgH7GN2MDgH8mN2MDgH+GN2MDgH/mN2MDgIBGN2MDgICmN2MDkIEGN2MDkIFmN2MDkIHGN2MDkIImN2MDkIKGN2MDkILmN2MDkINGN2MDkIOmN2MTAIQGN2MTAIRmN2MTAITGN2MTAIUmN2MTAIWGN2MTAIXmN2MTAIZGN2MTAIamN2MTEIcGN2MTEIdmN2MTEIfGN2MTEIgmN2MTEIiGN2MTEIjmN2MTEIlGN2MTEImmN2MTIIoGN2MTIIpmN2MTIIrGN2MTIIsmN2MTIIuGN2MTIIvmN2MTIIxGN2MTIIymN2MTQI0GN2MTQI1mN2MTQI3GN2MTQI4mN2MTQI6GN2MTQI7mN2MTQI9GN2MTQI+mN2MTUJAGN2MTUJBmN2MTUJDGN2MTUJEmN2MTUJGGN2MTUJHmN2MTUJJGN2MTUJKmN2MTYJMGN2MTYJNmN2MTYJPGN2MTYJQmN2MTYJSGN2MTYJTmN2MTYJVGN2MTYJWmN2MTcJYGN2MTcJZmN2MTcJbGN2MTcJcmN2MTcJeGN2MTcJfmN2MTcJhGN2MTcJimRub20JkGRub20JlmRub20JnGRub20JomRub20JqGRub20JrmRub20JtGRub20JumZyYWMJwGZyYWMJzGZyYWMJ2GZyYWMJ5GZyYWMJ8GZyYWMJ/GZyYWMKCGZyYWMKFGxvY2wKIGxvY2wKJmxvY2wKLmxvY2wKNGxvY2wKOm51bXIKQG51bXIKRm51bXIKTG51bXIKUm51bXIKWG51bXIKXm51bXIKZG51bXIKam9udW0KcG9udW0Kdm9udW0KfG9udW0Kgm9udW0KiG9udW0Kjm9udW0KlG9udW0Kmm9yZG4KoG9yZG4Kpm9yZG4KrG9yZG4Ksm9yZG4KuG9yZG4Kvm9yZG4KxG9yZG4KynNhbHQK0HNhbHQK7HNhbHQLCHNhbHQLJHNhbHQLQHNhbHQLXHNhbHQLeHNhbHQLlHNpbmYLsHNpbmYLtnNpbmYLvHNpbmYLwnNpbmYLyHNpbmYLznNpbmYL1HNpbmYL2nNzMDEL4HNzMDEL6HNzMDEL8HNzMDEL+HNzMDEMAHNzMDEMCHNzMDEMEHNzMDEMGHNzMDIMIHNzMDIMKHNzMDIMMHNzMDIMOHNzMDIMQHNzMDIMSHNzMDIMUHNzMDIMWHNzMDMMYHNzMDMManNzMDMMdHNzMDMMfnNzMDMMiHNzMDMMknNzMDMMnHNzMDMMpnNzMDQMsHNzMDQMtnNzMDQMvHNzMDQMwnNzMDQMyHNzMDQMznNzMDQM1HNzMDQM2nNzMDUM4HNzMDUM6HNzMDUM8HNzMDUM+HNzMDUNAHNzMDUNCHNzMDUNEHNzMDUNGHNzMDYNIHNzMDYNJnNzMDYNLHNzMDYNMnNzMDYNOHNzMDYNPnNzMDYNRHNzMDYNSnNzMDcNUHNzMDcNVnNzMDcNXHNzMDcNYnNzMDcNaHNzMDcNbnNzMDcNdHNzMDcNenN1YnMNgHN1YnMNhnN1YnMNjHN1YnMNknN1YnMNmHN1YnMNnnN1YnMNpHN1YnMNqnN1cHMNsHN1cHMNunN1cHMNxHN1cHMNznN1cHMN2HN1cHMN4nN1cHMN7HN1cHMN9nplcm8OAHplcm8OBnplcm8ODHplcm8OEnplcm8OGHplcm8OHnplcm8OJHplcm8OKgAAAAEAFAAAAAEAFAAAAAEAFAAAAAEAFAAAAAEAFAAAAAEAFAAAAAEAFAAAAAEAFAAAAAUABQAGAAcACAAJAAAABQAFAAYABwAIAAkAAAAFAAUABgAHAAgACQAAAAUABQAGAAcACAAJAAAABQAFAAYABwAIAAkAAAAFAAUABgAHAAgACQAAAAUABQAGAAcACAAJAAAABQAFAAYABwAIAAkHQAABABUHOgABABUHNAABABUHLgABABUHKAABABUHIgABABUHHAABABUHFgABABUHHgABABYHGAABABYHEgABABYHDAABABYHBgABABYHAAABABYG+gABABYG9AABABYG/AABABcG9gABABcG8AABABcG6gABABcG5AABABcG3gABABcG2AABABcG0gABABcG2gABAAAG1AABAAAGzgABAAAGyAABAAAGwgABAAAGvAABAAAGtgABAAAGsAABAAAGuAABABgGsgABABgGrAABABgGpgABABgGoAABABgGmgABABgGlAABABgGjgABABgGlgABABkGkAABABkGigABABkGhAABABkGfgABABkGeAABABkGcgABABkGbAABABkGdAABABoGbgABABoGaAABABoGYgABABoGXAABABoGVgABABoGUAABABoGSgABABoGUgABAAMGTAABAAMGRgABAAMGQAABAAMGOgABAAMGNAABAAMGLgABAAMGKAABAAMGMAABAAIGKgABAAIGJAABAAIGHgABAAIGGAABAAIGEgABAAIGDAABAAIGBgABAAIGDgABABsGCAABABsGAgABABsF/AABABsF9gABABsF8AABABsF6gABABsF5AABABsF7AABABwF5gABABwF4AABABwF2gABABwF1AABABwFzgABABwFyAABABwFwgABABwFygABAB0FxAABAB0FvgABAB0FuAABAB0FsgABAB0FrAABAB0FpgABAB0FoAABAB0FqAABAB4FogABAB4FnAABAB4FlgABAB4FkAABAB4FigABAB4FhAABAB4FfgABAB4FhgABAB8FgAABAB8FegABAB8FdAABAB8FbgABAB8FaAABAB8FYgABAB8FXAABAB8AAAABAAsAAAABAAsAAAABAAsAAAABAAsAAAABAAsAAAABAAsAAAABAAsAAAABAAsAAAAEAAoADAANAA4AAAAEAAoADAANAA4AAAAEAAoADAANAA4AAAAEAAoADAANAA4AAAAEAAoADAANAA4AAAAEAAoADAANAA4AAAAEAAoADAANAA4AAAAEAAoADAANAA4AAAABAAIAAAACAAIAAwAAAAEAAQAAAAEAAAAAAAEAAAAAAAEACgAAAAEACgAAAAEACgAAAAEACgAAAAEACgAAAAEACgAAAAEACgAAAAEACgAAAAEAEwAAAAEAEwAAAAEAEwAAAAEAEwAAAAEAEwAAAAEAEwAAAAEAEwAAAAEAEwAAAAEADwAAAAEADwAAAAEADwAAAAEADwAAAAEADwAAAAEADwAAAAEADwAAAAEADwAAAAwAAAAVABYAFwAYABkAGgAbABwAHQAeACAAAAAMAAAAFQAWABcAGAAZABoAGwAcAB0AHgAgAAAADAAAABUAFgAXABgAGQAaABsAHAAdAB4AIAAAAAwAAAAVABYAFwAYABkAGgAbABwAHQAeACAAAAAMAAAAFQAWABcAGAAZABoAGwAcAB0AHgAgAAAADAAAABUAFgAXABgAGQAaABsAHAAdAB4AIAAAAAwAAAAVABYAFwAYABkAGgAbABwAHQAeACAAAAAMAAAAFQAWABcAGAAZABoAGwAcAB0AHgAgAAAAAQASAAAAAQASAAAAAQASAAAAAQASAAAAAQASAAAAAQASAAAAAQASAAAAAQASAxQAAgAcAB0DDAACABwAHQMEAAIAHAAdAvwAAgAcAB0C9AACABwAHQLsAAIAHAAdAuQAAgAcAB0C3AACABwAHQLYAAIAFQAYAtAAAgAVABgCyAACABUAGALAAAIAFQAYArgAAgAVABgCsAACABUAGAKoAAIAFQAYAqAAAgAV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 diff --git a/d2renderers/d2fonts/encoded/SourceSansPro-Bold.txt b/d2renderers/d2fonts/encoded/SourceSansPro-Bold.txt new file mode 100644 index 000000000..bbf9561fd --- /dev/null +++ b/d2renderers/d2fonts/encoded/SourceSansPro-Bold.txt @@ -0,0 +1 @@ +data:application/font-woff;base64,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AHQAZQAgAGcAQQBsAHQAZQByAG4AYQB0AGUAIABhAFMAdAByAGEAaQBnAGgAdAAgAGwAUwBsAGEAcwBoAGUAZAAgAHoAZQByAG8AUAByAGUAZgBlAHIAcgBlAGQAIABBAHQAaABhAGIAYQBzAGsAYQBuACAAbwBnAG8AbgBlAGsAcwBoAHQAdABwADoALwAvAHMAYwByAGkAcAB0AHMALgBzAGkAbAAuAG8AcgBnAC8ATwBGAEwAVABoAGkAcwAgAEYAbwBuAHQAIABTAG8AZgB0AHcAYQByAGUAIABpAHMAIABsAGkAYwBlAG4AcwBlAGQAIAB1AG4AZABlAHIAIAB0AGgAZQAgAFMASQBMACAATwBwAGUAbgAgAEYAbwBuAHQAIABMAGkAYwBlAG4AcwBlACwAIABWAGUAcgBzAGkAbwBuACAAMQAuADEALgAgAFQAaABpAHMAIABsAGkAYwBlAG4AcwBlACAAaQBzACAAYQB2AGEAaQBsAGEAYgBsAGUAIAB3AGkAdABoACAAYQAgAEYAQQBRACAAYQB0ADoAIABoAHQAdABwADoALwAvAHMAYwByAGkAcAB0AHMALgBzAGkAbAAuAG8AcgBnAC8ATwBGAEwALgAgAFQAaABpAHMAIABGAG8AbgB0ACAAUwBvAGYAdAB3AGEAcgBlACAAaQBzACAAZABpAHMAdAByAGkAYgB1AHQAZQBkACAAbwBuACAAYQBuACAgGABBAFMAIABJAFMgGQAgAEIAQQBTAEkAUwAsACAAVwBJAFQASABPAFUAVAAgAFcAQQBSAFIAQQBOAFQASQBFAFMAIABPAFIAIABDAE8ATgBEAEkAVABJAE8ATgBTACAATwBGACAAQQBOAFkAIABLAEkATgBEACwAIABlAGkAdABoAGUAcgAgAGUAeABwAHIAZQBzAHMAIABvAHIAIABpAG0AcABsAGkAZQBkAC4AIABTAGUAZQAgAHQAaABlACAAUwBJAEwAIABPAHAAZQBuACAARgBvAG4AdAAgAEwAaQBjAGUAbgBzAGUAIABmAG8AcgAgAHQAaABlACAAcwBwAGUAYwBpAGYAaQBjACAAbABhAG4AZwB1AGEAZwBlACwAIABwAGUAcgBtAGkAcwBzAGkAbwBuAHMAIABhAG4AZAAgAGwAaQBtAGkAdABhAHQAaQBvAG4AcwAgAGcAbwB2AGUAcgBuAGkAbgBnACAAeQBvAHUAcgAgAHUAcwBlACAAbwBmACAAdABoAGkAcwAgAEYAbwBuAHQAIABTAG8AZgB0AHcAYQByAGUALgBoAHQAdABwADoALwAvAHcAdwB3AC4AYQBkAG8AYgBlAC4AYwBvAG0ALwB0AHkAcABlAFAAYQB1AGwAIABEAC4AIABIAHUAbgB0AEEAZABvAGIAZQAgAFMAeQBzAHQAZQBtAHMAIABJAG4AYwBvAHIAcABvAHIAYQB0AGUAZABTAG8AdQByAGMAZQAgAGkAcwAgAGEAIAB0AHIAYQBkAGUAbQBhAHIAawAgAG8AZgAgAEEAZABvAGIAZQAgAFMAeQBzAHQAZQBtAHMAIABJAG4AYwBvAHIAcABvAHIAYQB0AGUAZAAgAGkAbgAgAHQAaABlACAAVQBuAGkAdABlAGQAIABTAHQAYQB0AGUAcwAgAGEAbgBkAC8AbwByACAAbwB0AGgAZQByACAAYwBvAHUAbgB0AHIAaQBlAHMALgBTAG8AdQByAGMAZQBTAGEAbgBzAFAAcgBvAC0AQgBvAGwAZABWAGUAcgBzAGkAbwBuACAAMgAuADAANAA1ADsAaABvAHQAYwBvAG4AdgAgADEALgAwAC4AMQAwADkAOwBtAGEAawBlAG8AdABmAGUAeABlACAAMgAuADUALgA2ADUANQA5ADYAUwBvAHUAcgBjAGUAIABTAGEAbgBzACAAUAByAG8AIABCAG8AbABkADIALgAwADQANQA7AEEARABCAE8AOwBTAG8AdQByAGMAZQBTAGEAbgBzAFAAcgBvAC0AQgBvAGwAZAA7AEEARABPAEIARQBCAG8AbABkAFMAbwB1AHIAYwBlACAAUwBhAG4AcwAgAFAAcgBvAKkAIAAyADAAMQAwACAALQAgADIAMAAxADgAIABBAGQAbwBiAGUAIABTAHkAcwB0AGUAbQBzACAASQBuAGMAbwByAHAAbwByAGEAdABlAGQAIAAoAGgAdAB0AHAAOgAvAC8AdwB3AHcALgBhAGQAbwBiAGUALgBjAG8AbQAvACkALAAgAHcAaQB0AGgAIABSAGUAcwBlAHIAdgBlAGQAIABGAG8AbgB0ACAATgBhAG0AZQAgIBgAUwBvAHUAcgBjAGUgGQAuAAAAAAAsACwATwCDAK8A0gDnAPoBKgE/AUsBaQGDAZIBxAHlAhECMgJuApQC1ALlAwMDHwNZA4YDowO5A/AEIQRMBH4EsQTXBT4FYAVsBXgFkAWsBd4GAAYsBlwGjwavBuoHDwcxB0wHgwevB94H8gf+CAoIFggiCC4IOghGCFIIXghqCHYIggiOCJoIpgi2CMIIzgjaCOYI9gkzCXAJfAmkCbAJvAn6CgYKEgoeCioKNgpCCk4KWgpmCnIKfgqGCpIKngqqCrYKwgrOCtoK5gryCv4LCgsWCyILLgs6C0oLfQuvC7sL3gvqC/YMAgwODBoMJgwyDD4MSgySDJ4Mqgy2DMIM5QzxDP0NCQ0VDSENLQ05DUUNUQ1dDYINjg2aDaYNsg2+DcoN1g3tDfkOBQ4RDiEOLQ5HDlMOXw5rDncOgw6PDpsOpw6zDr8Oyw7XDuMO7w77DwcPEw8fDysPNw9DD08PWw9nD3MPgw+PD8gQChA3EHYQghCOEJoQphCyEPYRAhEOERoRJhEyET4RShFaEWYRchF+EYoRlhGiEa4RuhH0EgASDBIYEiQSMBI8EkgSYhJuEnoShhKSEp4SqhK2EsISzhLaEuYS8hL+EwoTFhMiE1MTXxNrE3cTgxOPE8cT0xPfE+sT9xQDFA8UGxQnFDMUPxRLFFcUYxRvFHsUhxSTFJ8UyxTtFR8VUBV0FYAVjBWYFaQVsBW8FcgV1BXgFewV+BYEFhAWHBYoFjgWRBZQFlwWaBZ4FssXHRcpF4oXlheiF98X6xf3GAMYDxgbGCcYMxhuGHoYhhiSGM4Y2hjmGPIY/hkKGRYZIhkuGToZRhlSGV4Zahl2GYIZkhneGicaMxpzGn8aixqXGqMarxsqGzYbQhtOG1obZhtyG34bqBu0G8AbzBvYG+Qb8Bv8HAgcFBxLHFccYxxvHHschxyTHJ8ctxzDHOgc9B0AHQwdHB0oHU8dWx1nHXMdfx2LHZcdox2vHbsdxx3THd8d6x33HgMeDx4bHiceMx4/HkseVx5jHm8eex6HHpceox7cHx0fcR+wH7wfyB/UH+Af7CAwIDwgSCBUIGAgbCB4IIQglCCgIKwguCDEINAg3CDoIPQhPCFpIXUhgSGNIZkhpSGxId4h6iH2IgIiDiIaIiYiMiI+IkoiViJiIm4ieiKGIpIiniLTIt8i6yL3IwMjDyNLI4ojliOiI64juiPGI9Ij3iPqI/YkAiQOJBokJiQyJD4kSiRWJGIkqyTbJQ8lLSU5JXElrSXsJiwmbyadJuEnIidVJ5QnnCf0KCgodiiyKO4pKylQKaMp5yoXKlEqdCqlKugq8Cr8KxErLSs5K0UrbyuNK8ErzywCLDUseSysLOAtBi0yLXotpi3eLhguUi5zLpQuxi74LxcvOy9fL60v3DASMDgwhjC1MOgxETEsMWMxkTGuMdYyFzJFMnwyozLJMvgzJzNFM2UzoDPgM+wz+DQ2NI40ozSvNLs0xzTTNN806zT3NQM1DzUbNSc1VzVjNZc1yDXUNeA17DX4NgQ2EDYcNig2NDZANkw2WDZkNnA2fDaMNpg2pDawNrw2zDcXN183azdzN383izeXN6M3+zgHOBM4HzgrODc4TDhYOGQ4cDiAOIw4pDiwONc47DkfOSc5Lzk+OVc5XzlnOW85oTmpObE5zTnVOd059jn+OhA6GDovOjc6Pzp1On06ojrXOuI67Tr4OwM7CzsWOyI7KjtnO6c78jwdPGM8pTzdPQc9OD1ZPYs9sD3mPgg+WD6EPrg+6D8bP0A/cT+rP8hAAkBFQHpAyEEJQUlBVUFhQW1BeUGFQZFBnUGpQbVBwUHNQdhB40HuQfZCAkIOQhpCJkIxQjxCREJMQlhCZEJvQndCg0KPQptCp0KzQr9CykLSQt5C6kL2QwJDDkMaQyZDMkM9Q0VDUUNdQ2lDdUOBQ41DlUOdQ6lDtEO/Q8dD00PfQ+tD90QDRA9EG0QjRC9EO0RHRFNEX0SrRPZFM0U7RY5F4UY0RodG8EdXR2NHb0d7R4dHk0efR6tHt0fDR89H20fnR/NH/0gLSBdII0gvSH5IikiWSKJIrki6SMZI0kjeSOpI9kkCSQ5JGkkmSTJJPklKSVZJYkluSXpJhkmSSZ5Jqkm2ScJJzknaSeZJ8kn+SgpKFkoiSi5KOkpGSlJKXkpqSnZKgkqOSppKpkqySr5KykrWSuJK7kr6SwZLEkseSypLNktCS05LWktmS3JLfkuKS5ZLokuuS7pLxkvSS95L6kv2TAJMDkwaTCZMMkw+TEpMVkxiTG5MekyGTJJMnkyqTLZMwkzOTNpM5kzyTP5NCk0WTSJNLk06TUZNUk1eTWpNdk2CTY5Nmk2mTbJNvk3KTdZN4k3uTfpOBk4STh5OKk42TkJOTk5aTmZOck5+TopOyE76TytPQU9xT3lPgk+LT5pPqE+xT79PyE/RT/FP+lADUAxQFVAeUCdQMFA5UEJQS1BUUF1QZlBvUHhQlFCwUL5Q4VEEUSdRSlGDUbtRw1HoUfBR+FIqUjJSeFK0UtVS4VMKUzVTPVNFU01TVVNdU2VTbVOTU8lT0VPpVAtUIVQ9VGBUiFSpVNdVCVUuVTZVPlVvVXtVqlWyVbpVwlXuVfZWNlZgVoRWkFacVqhWv1bpVxxXSFdbV3NXvlf9WCtYV1hyWKJYqljPWQFZKFlJWVFZXVlpWXFZfVmFWZFZnVmlWbFZvVnFWgpaP1pOWndaf1q/WvlbH1srW1FbeluxW8VbzVvfW+db71wAXAhcXlxmXH5cn1y1XNFc810ZXThdaF2ZXb5dxl3OXgpeFl5GXk5eVl5eXopekl7OXvZe/l8KXxZfIl85X2BfaF+UX6ZfvWACYEBga2CUYK5g3GD6YR9hUGF2YX5himGSYZ5hpmGyYbphxmHSYdph5mHyYjxipmMHYzNjSmN2Y7Nj12QIZEdkYGSuZO5lKWVfZY9lomXLZdNl22XjZetmBGYMZhRmUWaLZrdmzmb6ZzdnWmeLZ5NnrWe1Z/Nn+2gOaDdoP2hHaE9oV2hxaHlogWitaMRo72kpaU1pgGnBadtqKWppan9qnmqqarZqxmrmawdrQGt6a4prlmu2a9Nr32vra/RsAGwRbCJsLmw6bEZsUmxebGpsd2yDbItslGywbLxsxWzgbPptFG0lbTZtdW20bcJtz23dbfFuD24obk5up27EbtBu3G7obvRvAG88b0pvWG9nb3ZvjW+kb7Nvwm/Rb+BwO3CLcNJw/XFRcZdx0HI9cqdy1nLecwBzMnNec35zknOkc9Jz5nPydA50JnQ0dF90gHSsdM51CnUvdW51f3Wddbh17nYbdjh2THZYdmR2cHZ8doh2lHagdqx2uHbEdtB23HbodvR3AHcQdxx3KHc0d0B3UHeMd8l31Xf7eAd4E3hPeFt4Z3hzeH94i3iXeKN4r3i7eMd403jbeOd483j/eQt5F3kjeS95O3lHeVN5X3lreXd5g3mPeZ950Hnceeh6CnoWeiJ6Lno6ekZ6Unpeemp6dnq6esZ60nreeup7DHsYeyR7MHs8e0h7VHtge2x7eHuEe5B7t3vDe89723vne/N7/3wWfCJ8Lnw6fEp8VnxvfHt8h3yT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Af0AEAJmAE0CZgBNAmYATQIGAE0CBgBNAgYATQIGAE0CBgBNAgYAAwIGAE0CDP/pAvoATQL6AE0C+gBNApkATQKZAE0CmQBNApkATQKZAE0CmQBNApkATQKZAE0CrAAuAqwALgKsAC4CrAAuAqwALgKsAC4CrAAuAqwALgKsAC4CrAAuAqwALgKsAC4CrAAuAqwALgKsAC4CrAAuAqwALgKsACgDZwAuAqwALwKsAC8CrAAvAqwALwKsAC8CrAAvAqwALgKsAC4CVABNAmUATQJlAE0CZQBNAmUATQJlAE0CZQBNAmUATQIsACMCLAAjAiwAIwIsACMCLAAjAiwAIwIsACMCwQBQAiwAGQIsABkCLAAZAiwAGQIsABkCLAAZAiwAGQIsABkCmQBJApkASQKZAEkCmQBJApkASQKZAEkCmQBJApkASQKZAEkCmQBJApkASQKZAEkCmQBJApkASQKZAEkCmQBJAqsASQKrAEkCqwBJAqsASQKrAEkCqwBJApkASQKZAEkDLQAOAy0ADgMtAA4DLQAOAg3/+AIN//gCDf/4Ag3/+AIN//gCDf/4Ag3/+AIN//gCHQAkAh0AJAIdACQCHQAkAh0AJAKUABoCaQBNAqMAMwKaAE0CWgBNAg8AKgIPACoCDwAqAg8AKgIPACoCDwAqAg8AKgIPACoCDwAqAg8AKgIPACoCDwAqAg//+wIPACoCDwAqAg8AKgIPACoCDwAqAg8AKgIPACoCDwAqAg8AKgIPACoCDwAqAxIALwMSAC8DEgAvAjv//QI9AEECPQBBAdMAJAHTACQB0wAkAdMAJAHTACQCZgAnAj0AJwI9ACcCPQAnAj0AJwIGACQCBgAkAgYAJAIGACQCBgAkAgYAJAIGACQCBgAkAgYAJAIGACQCBgAkAgYAJAIG//MCBgAkAgYAJAIGACQCBgAkAgYAJAIGACQCBgAkAVUAGAIWACICFgAiAhYAIgIWACICFgAiAhYAIgIWACICFgAiAjsAQQI7AEECOwBBAjsAQQI7//0BFP/LARQAQQEU/9MBFP/MART/1QEU//YBFP/TARQAMAEUADcBFAApARQAKQEU/+EBFABBARb/zQIkAEECJABBAiQAQQIkAEEBHgBBAT4AQQHFAEEBHgAyAR4AQQEe//gBHgAPAVP/7ANZAEEDWQBBA1kAQQI8AEECPABBAjwAQQI8AEECPABBAjwAQQI8AEECPABBA1IARwIrACQCKwAkAisAJAIrACQCKwAkAisAJAIrACQCKwAkAisAJAIrACQCKwAkAiv//QIrACQCKwAkAisAJAIrACQCKwAkAisAJAM2ACQCKwAkAisAJAIrACQCKwAkAisAJAIrACQCKwAkAisAJAI9AEEBjgBBAY4AFgGOAEEBjgBBAY4ANAGOADQBjv/zAbsAFQG7ABUBuwAVAbsAFQG7ABUBuwAVAbsAFQJ4AEEBfwARAX8AEQF/ABEBfwARAX8AEQF/ABEBf//2AX8AEQI4ADwCOAA8AjgAPAI4ADwCOAA8AjgAPAI4ADwCOAA8AjgAPAI4ADwCOAA8AjgAPAI4ADwCOAA8AjgAPAI4ADwCOAA8AjgAPAI4ADwCOAA8AjgAPAI4ADwCOAA8AjgAPAI4ADwDCAAYAwgAGAMIABgDCAAYAgkADAIJAAwCCQAMAgkADAIJAAwCCQAMAgkADAIJAAwBzAAmAcwAJgHMACYBzAAmAcwAJgIwACoCPQBBAjwAQQEW/80CKgA3AhYAOgI+AAwCPQBBAlgAQQHcACQB7f/+Aj0AJwI9ACcCBgAkAj4AJwIQAEEDgAAnAgYAJALXACQBzgAuAdwAIQI2ACQBYv/yAj0AJwI9ACcCBQAkAgsADAI8ADwCOwBBAjsAQQJGAEEBYgAQAYsANAEeAEEBh//sAav/9AG2//sBHgBBAm8AQQGwAEEDWQA/A1kAPwNZAEECPP/fAjwAQQIxAEEB0wAXAjkAEAIrACQC1gAkAusAKALiACQBjv//AY7//wGO//8BjgBBAXkAPQIUAEECFABBAbsAFQEW/80BYv/yAX8AEQJOABECigAQAjgAIgIoADwCCwAMAwgAGAIJAAwB0v/4AcwAJgIIACYBzAAFAjkAEAHA//oBwAARAcoABAHKABEBzQAcAPgAIwIsADACkQAYA6UAGAOvABgCsAAYA+wAGAGMADQBjAAZAYwANAGMABwBjAAAAYwAEQGMAC8BjAA0AYwAHAGMADQBjAA0AYwAIwGMADQBjAA0ApkATQI9ACcCPQAnAj0AJwI9ACcCPQAnAj0AJwI9ACcCPQAnAj0AJwI9ACcCPQAnAj0AJwI9ACcCPQAFAj0AJwI9ACcCPQAnAj0AJwI9ACcCPQAnAj0AJwI9ACcCPQAnAj0AJwI9ACcCPQAnAj0AJwI9ACcCPQAnAj0AJwI9ACcCPQAnAj0AJwI9ACcBFABBARQAQQE+AEEBxQBBARQAGAEUADcBFP/zART/9QFJ/+8CewAYARQAKQFiABABh//sAj3/+gJdAE0CCQBNAoAAIgIkAE0CHQAkAqIATQKsAC4BLQBNAmYATQIs//kC+gBNApkATQI7ADUCrAAuApcATQJUAE0CJQAmAiwAGQIN//gC+AAwAjcACwLwADQCxwAsAm7/+wKb//QDGP/0AaT/9AEt/+MDCf/0AsD/9AIN//gDI//sAlMAJAJYAEACFf//AiQAKQHXACQB0gApAjIANgIlADABLQBBAiIANQIoAA0CUgBBAgv//wHVABECKQAkAnsAEgI5AD0CPQAkAewAGgIUACsC4gAkAg4ACALwACwC6gAoAb4AJAJQAEACJQAyAuIAJAJTACQB1wAkAjIANgEtAEEBLf/VAikAJAIUACsCFAArAuoAKAEt/80CFAArAo//+QJ///QCbv/xAm7/+wM2//cDNf/0Ayz/9wMr//QCp//oAqf/6AI9//oCPf/6Asf/9wLH//QCm//qApv/9ANq//cDaf/0A2D/9wNf//QDRP/3A0T/9AMY/+oDGP/0A+f/9wPm//QD3v/3A9z/9AOA/+gDgP/oAdD/9wHQ//QBpP/qAaT/9AJz//cCcv/0Amn/9wJo//QCDP/oAgz/6AEt//UBLQABAzv/9wMo//QDFv/qAwn/9APY//cD5P/0A87/9wPN//QC9//0Atv/9ALA/+oCwP/0A47/9AOE//QDGv/oAg3/+AIN//gDVf/3A0P/9AMr/+oDI//sA/r/9wP5//QD8P/3A+//9ANt/+gDbf/oA2P/+gO1//kDpf/0BFz/9wRb//QEUv/3BFH/9APN/+gDzf/oA8gATQRr//cEa//0BQ7/9wUN//QFBP/3BQP/9ASm/+gEpv/oA+0ALAR7//cEaf/0BSH/9wUf//QFF//3BRb/9ASU/+gElP/oAlMAJAJTACQCUwAkAlMAJAJTACQCUwAkAlMAJAJTACQCUwAkAlMAJAJTACQCUwAkAlMAJAHXACQB1wAkAdcAJAHXACQB1wAkAdcAJAHXACQB1wAkAjIANgIyADYCMgA2AjIANgIyADYCMgA2AjIANgIyADYCMgA2AjIANgIyADYBLQAwAS0AKQEt/8sBLQBBAS3/yAEt/8cBLf/IAS3/0QEt/+4BLf/uAS3/4QEt//YBLf/MAS3/zQEt/80BLf/fAikAJAIpACQCKQAkAikAJAIpACQCKQAkAikAJAIpACQCOQA9AjkAPQIUACsCFAArAhQAKwIUACsCFAArAhQAKwIUACsCFAArAhQAKwIUACsCFAArAhQAKwIUACsCFAArAhQAKwIUACsC6gAoAuoAKALqACgC6gAoAuoAKALqACgC6gAoAuoAKALqACgC6gAoAuoAKAJTACQCUwAkAlMAJAJTACQCUwAkAlMAJAJTACQCUwAkAlMAJAJTACQCUwAkAlMAJAIyADYCMgA2AjIANgIyADYCMgA2AjIANgIyADYCMgA2AjIANgIyADYCMgA2AjIANgLqACgC6gAoAuoAKALqACgC6gAoAuoAKALqACgC6gAoAuoAKALqACgC6gAoAuoAKAIiADUCKQAkAeoAJAGxAEECGAAJASwALgEsAD0BLAA9ASwAUgEsADUCKwDgAHf/9AIrAFoCKwDeAS0AQQIrALwCKwC8AisAtQIrAJwCKwDgAisAVAIrAFMCKwBUAisAXQIrAHoCKwB6AisAWAIrAFkCKwBZAisAawCk//cAof/0AHf/6gFG//cBRf/0AUb/9wE9//QA3//oAN//6AI9//oCWABNAl0ATQIJAE0CngANAiQATQNkAAICNAAjAqQATQKkAE0CbgBNApH/9gL6AE0CogBNAqwALgKXAE0CVABNAkYALgIsABkCKwABAvwALQI3AAsCnQBNAnYAPAOOAE0DngBNAtoAGQNVAE0CWABNAkYAFgO2AE0CaQAMAiQATQIkAE0CvQAZAgkATQJGAC4CLAAjAS0ATQEt/+MBLQAMAf0AEAOYAAMDpQBNAs4AGQJuAE0CpABNAisAAQKXAE0CcAAZAqwALgI+//kCCQBNAiIAGgOJAAICNAAjApsATQLtABkCsQBNAkYALgIN//gCDf/4Al0ACwKFADwCdgBNAS0ATQNkAAICPf/6A03/8gIkAE0CowAzAqQATQKsAC4CrAAuAisAAQIrAAECDwAqAjEAKgIQAEEBsABBAkgACwIGACQC+QAGAdwAHAJHAEECRwBBAiIAQQI9AAYClABBAkYAQQIrACQCPgBBAj0AQQHTACQB7AAaAgkADAMLACcCAgAOAlMAQQImADADIwBBAz0AQQJvABoC4wBBAgQAQQHTABUDCABBAiAADwIGACQCBgAkAjz//QGwAEEB0wAkAbsAFQEUADcBFP/VASsACQEW/80DDAAGAxQAQQI7//0CIgBBAkcAQQIJAAwCQgBBAlgAGgIrACQCFQAMAbEAQQHXABUDIwAGAdwAHAJMAEECkAAaAmAAQwHTACQCCwAMAgsADAIkAA4CPwAwAjsAQQL5AAYBHgBBAg8AKgMSAC8CBgAkAgYAJAJHAEECKwAkAisAJAIJAAwCCQAMAiIAJwPHAC0CmwAZAhAAJQIQAEYCEAAeAhAAFgIQABMCEAAXAhAAKQIQACwCEAAqAhAAIgIQACUCEAAlAkQANQGaACcCDgAhAhAAFgIwACUCEAAXAjIAOgIEACwCJQA0AjIAMgJEADUCRAA1AhAAJQIQAEYCEAAeAhAAFgIQABMCEAAXAhAAKQIQACwCEAAqAhAAGgIhAC0BmgAnAgYAIAIQABYCIQAbAhAAFwIhADECBAAsAiMAMgIhACICEAAlAhAARgIQAB4CEAAWAhAAEwIQABcCEAApAhAALAIQACoCEAAiASwAPQEsAC4BLAA9ASwALgPSAEwBVABRAVQAUQHPACkBzwAqASwATAIZAEwBLAA3ASwARwIZADcCGQBHASwARwIZAEcBJAAxASQANgHgADEB4AA2AUwAKwHgACsDIAArBdwAKwiYACsCEAArAyAAKwEsAD0BWQAoAfQADAH0AAwCSwAAAVgASAFYADABWABXAVgALgFYAB8BWAAuAVMADQEMAFYBUwAcAQwAVgHJACYB/gAsAf4ALAIQACUCfAAnAcYAVgJnAFEDaQApAu8AUQLvACkB4AAQAVgAVwFYAC4BWABXAVgALgG1AFcBtQAuAVgAVwFYAC4BWABXAVgALgLuAC0C7gAtAc4AIAKqAAQCqgASAqoAGALPABgDhwAxAz4AMQIQACIBFAA3Aff/+gIiAE0CCAAuAkQATQHzAE0B3ABNAkAALgJtAE0BLQBNAdYAEAIrAE0B1wBNAq0ATQJeAE0CaAAuAicATQJmACwCMQBNAfgAIwHrABkCXwBJAev/+QLNAA4B/QALAdT/+AHhACQB9//6Aff/+gH3//oB9//6Aff/+gH3//oB9//6Aff/+gH3//oB9//6Aff/+gH3//oB9//6Aff/+gH3//oB9//6Aff/+gH3//oB9//6Aff/+gH3//oB9//6Aff/+gH3//oC5f/yAuX/8gLl//ICOgAaAiIATQIiAE0CCAAuAggALgIIAC4CCAAuAggALgJEAE0CRABNAkQATQJEAE0CXAAaAfMATQHzAE0B8wBNAfMATQHzAE0B8wBNAfMATQHzAE0B8wBNAfMATQHzAEYB8wBNAfMADwHzAE0B8wBNAfMATQHzAE0B8wBNAfMATQHzAE0B3ABNAkAALgJAAC4CQAAuAkAALgJAAC4CQAAuAkAALgJAAC4CQAAuAm0ATQJtAE0CbQBNAm0ATQKUABkBLf/qAS0ASwEt/+0BLf/RAS3/4gEtAAABLQBCAS3/7QEtAD0BLQBEAS0AKgEtACoBLf/0AdYAEAIrAE0CKwBNAisATQHXAE0B1wBNAdcATQHXAE0B1wBNAdcABAHXAE0B1//pAq0ATQKtAE0CrQBNAl4ATQJeAE0CXgBNAl4ATQJeAE0CXgBNAl4ATQJeAE0CaAAuAmgALgJoAC4CaAAuAmgALgJoAC4CaAAuAmgALgJoAC4CaAAuAmgALgJoAC4CaAAuAmgALgJoAC4CaAAuAv4ALgJoAC4CaAAuAmgALgJoAC4CaAAuAmgALgJoAC4CaAAuAmgALgJoAC4CJwBNAjEATQIxAE0CMQBNAjEATQIxAE0CMQBNAjEATQH4ACMB+AAjAfgAIwH4ACMB+AAjAfgAIwH4ACMD5QAjAnwAUAHrABkB6wAZAesAGQHrABkB6wAZAesAGQHrABkB6wAZAl8ASQJfAEkCXwBJAl8ASQJfAEkCXwBJAl8ASQJfAEkCXwBJAl8ASQJfAEkCXwBJAl8ASQJfAEkCXwBJAl8ASQJxAEkCcQBJAnEASQJxAEkCcQBJAnEASQJfAEkCXwBJAs0ADgLNAA4CzQAOAs0ADgHU//gB1P/4AdT/+AHU//gB1P/4AdT/+AHU//gB1P/4AeEAJAHhACQB4QAkAeEAJAHhACQCXAAaAjIATQJcADMCWgBNAloATQJeAE0B9//6AiIATQHYAE0COgAiAfMATQHhACQCbQBNAmgALgEtAE0CKwBNAej/+AKtAE0CXgBNAgEANQJoAC4CZwBNAicATQHmACYB6wAZAdT/+ALEADAB/QALAqoANAJ5ACwBLf/iAdT/+AMl//oDmwBNA6QALAH3//oCHwBNAiIATQHYAE0CXAANAfMATQL+AAIB9AAjAl4ATQJeAE0CNwBNAk7/9gKtAE0CbQBNAmgALgJnAE0CJwBNAggALgHrABkB5wABAqUALQH9AAsCYgBNAkAAPAM3AE0DRQBNAn8AGQMLAE0CIABNAgQAFgNRAE0CMQAMAfMATQHzAE0CaQAZAdgATQIDAC4B+AAjAS0ATQEt/+IBLQAMAdYAEAMR//YDNQBNAn8AGQI3AE0CXgBNAecAAQJbAE0CNQAZAmgALgH5//kB2ABNAfEAGgMtAAIB9AAjAmQATQKiABkCfABNAggALgHU//gB1P/4AiMACwJPADwCQABNAS0ATQL+AAIB9//6AuX/8gHzAE0CXAAzAl4ATQJoAC4CaAAuAecAAQHnAAECVAAZAiYANQGQACcB4gAaAe8AFgILACYB7gAYAgcANgHQACEB/wAvAgEAKwFUAFEBVABRAc8AMwHPADQBLABMAhkATAEsADcBLABHAdcANwHXAEcBTAArAaIAKwK4ACsBWABIAVgAMAFYAFcBWAAuAVgAHwFYAC4BeAAaAXgATAF4ABsBeAAbAXgAIwF4ABsBeAAkAXgAMgF4ACYBeAAjAXgAGgF4ABoBeAAaAQwAPwEMACMA0AApANAAHwF4ABoBeABMAXgAGwF4ABsBeAAjAXgAGwF4ACQBeAAyAXgAJgF4ACMBeAAaAXgAGgF4ABoBDAA/AQwAIwDQACkA0AAfAXgAGgF4AEwBeAAbAXgAGwF4ACMBeAAbAXgAJAF4ADIBeAAmAXgAIwEMAD8BDAAjANAAKQDQAB8BeAAaAXgATAF4ABsBeAAbAXgAIwF4ABsBeAAkAXgAMgF4ACYBeAAjAQwAPwEMACMA0AApANAAHwFnAB0BgQAaAXUAGAGD//sBlwAyAYYAHgGrADIBcQAyAWIAMgGvAB4BxAAyAMsAMgFYAAkBngAyAV0AMgICADIBvgAyAc0AHgGYADIBzQAbAaAAMgF2ABYBeAAQAcAAMAF6//oCJQAIAYIABwFk//oBbAAXAWcAHQGBACoBOQAYAYEAGgFaABgA6AAPAWkAFwGAACoAvAAjAL7/3wFzACoAwgAqAkEAKgGAACoBdQAYAYEAKgGBABoBEAAqASkADwEDAAwBfwAnAWMACAILABABXAAIAWEACAE4ABkBVwAc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AAACrgAAA5EAAAOhAAACaAAAA6MAAAOpAAACeQAAA6oAAAOqAAAChAAAA6sAAAOrAAAChwAAA6wAAAOvAAACpQAAA7AAAAOwAAACrwAAA7EAAAPBAAACiQAAA8IAAAPCAAACoQAAA8MAAAPJAAACmgAAA8oAAAPKAAACqQAAA8sAAAPLAAACrAAAA8wAAAPNAAACqgAAA84AAAPOAAACrQAAA9AAAAPRAAACogAAA9UAAAPVAAACnQAAA9cAAAPXAAADiQAAA9kAAAPZAAADigAAA9sAAAPbAAADiwAAA90AAAPdAAADjAAAA+EAAAPhAAADjQAABAAAAAQHAAAD0AAABAgAAAQPAAAD2QAABBAAAAQvAAADsAAABDAAAARXAAAD/AAABFgAAARfAAAEJQAABGIAAARiAAAD4QAABGMAAARjAAAELQAABHIAAARyAAAD4gAABHMAAARzAAAELgAABHQAAAR0AAAD4wAABHUAAAR1AAAELwAABJAAAASQAAAD5AAABJEAAASRAAAEMAAABJIAAASSAAAD5QAABJMAAASTAAAEMQAABJYAAASWAAAD5gAABJcAAASXAAAEMgAABJgAAASYAAAD5wAABJkAAASZAAAEMwAABJoAAASaAAAD6AAABJsAAASbAAAENAAABKAAAASgAAAD6QAABKEAAAShAAAENQAABKIAAASiAAAD6gAABKMAAASjAAAENgAABKoAAASqAAAD6wAABKsAAASrAAAENwAABK4AAASuAAAD7AAABK8AAASvAAAEOAAABLAAAASwAAAD7QAABLEAAASxAAAEOQAABLIAAASyAAAD7gAABLMAAASzAAAEOgAABLYAAAS2AAAD7wAABLcAAAS3AAAEOwAABLoAAAS6AAAD8AAABLsAAAS7AAAEPAAABMAAAATBAAAD8QAABMIAAATCAAAEPQAABM8AAATPAAAEPgAABNAAAATQAAAD8wAABNEAAATRAAAEPwAABNQAAATUAAAD9AAABNUAAATVAAAEQAAABNYAAATWAAAD9QAABNcAAATXAAAEQQAABNgAAATYAAAD9gAABNkAAATZAAAEQgAABOIAAATiAAAD9wAABOMAAATjAAAEQwAABOYAAATmAAAD+AAABOcAAATnAAAERAAABOgAAAToAAAD+QAABOkAAATpAAAERQAABO4AAATu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BvoEiATIAAIAAwAEAAUABgAHAAgACQAKAAsADAANAA4ADwAQABEAEgATABQAFQAWABcAGAAZABoAGwSkBKoEpQb+BJ8HJgAcAB0AHgAfACAAIQAiACMAJAAlACYAJwAoACkAKgArACwALQAuAC8AMAAxADIAMwA0ADUEpgSpBKcHAAABBIcGygbGBsQGxwSrBK8HMATBBn0ElAcCBJYEwwcxBsMG/QZBBkIHJwKUBLAEnQc2BkAGfwSVBuAG4QbiBIkANgA3ADgAOQA6AD0ATgBUAF4AXwBgAGIAgQCCAIMAhQEBAKAApQCmAKcAqACpBvUAtgDYANkA2gDcAPUBAgGgAQYBBwEIAQkBCgENAR4BJAEuAS8BMAEyAVABUQFSAVQB0wFwAXYBdwF4AXkBegb2AYcBqQGqAasBrQHHAdQByQA7AQsAPAEMAEsBGwBVASUAVgEmAFgBKABXAScAWQEpAF0BLQBjATMAZAE0AGUBNQBuAT4AYQExAHQBRAB1AUUAdgFGAHcBRwB8AUsAgAFPAIQBUwCGAVUAjQFbAIsBWQCHAVwBBQHXAI4BXQCPAV4BYQCSAWIAlAFlAJMBYwCVAWQAmQFpAJ0BbQChAXEAnwFvAXUBBAHVAKoBewC0AYUAqwF8ALcBiADBAZIAxAGTAMIBlADIAZkAyQGaAMsBnADKAZsA0gGjANABoQDXAagA2wGsAN0BrgDeAa8A3wGwAOABsQDuAb8A8gHEAPYByAD3APwBzgD+AdAA/QHPBssAewC4AYkA6AG5AD4BDgCIAVYArAF9AOEBsgDiAbMA4wG0AOQBtQDlAbYAUAEgAHgBSAC+AY8AcwFDAJ4BbgBPAR8AzAGdANMBpAHYAeEB2QHaAgEB3AHeAd8B4AHkAeUB5gHnAegB6QHqAesB7AHtAgIB7gHvAfAB8gH0AfMB9gH3AfgB+QH7AfwB/QH+Af8CAAIDAgQCBQIGAgcCCAIJAhECEwIUAhUCFgIXAhgCGQIaAhsCHAIkAeIB8QH1BqMGqwawBrIHIwcyBzUHMwc3By8HNAa3BrgGpQasBrEHOQc8Bz8HQQdDB0UHRwdLB00HTwdRB1MHVQdZB1sHXQdoB2kHagdrB2wHbgdwB3EHfQd/B4AHgQOTA5UCgAOPAoECggKDAoYCiAKuAmgCaQJqAmsCbAJtAm4CbwJwAnECcgJzAnQCdQJ2AncCeAJ5AnoCewJ8An0CfgJ/AoQChwKlAqYCpwKoAq8CiQKKAosCjAKNAo4CjwKQApECkgKTApQClQKWApcCmAKZAqECmgKbApwCnQKeAp8CoAKpAqwCqgKrAq0D0APRA9ID0wPUA9UD1gPXA9kD2gPbA9wD3QPeA98D4AOwA7EDsgOzA7QDtQO2A7cDuAO5A7oDuwO8A70DvgO/A8ADwQPCA8MDxAPFA8YDxwPIA8kDygPLA8wDzQPOA88D/AP9A/4D/wQABAEEAgQDBAQEBQQGBAcECAQJBAoECwQMBA0EDgQPBBAEEQQSBBMEFAQVBBYEFwQYBBkEGgQbBBwEHQQeBB8EIAQhBCIEIwQlBCYEJwQoBCkEKgQrBCwD4QQtA+IELgPjBC8D5AQwA+UEMQPmBDID5wQzA+gENAPpBDUD6gQ2A+sENwPsBDgD7QQ5A+4EOgPvBDsD8AQ8A/ED8gQ9BD4D8wQ/A/QEQAP1BEED9gRCA/cEQwP4BEQD+QRFA/oERgP7BEcGmwadBp4GpAamBqkGrQauAFIBIgBTASMAWgEqAFsBKwBcASwAcQFBAHIBQgB5AUkAfQFMAH4BTgCQAV8AkQFgAJYBZgCXAWcAmAFoAJoBagCbAWsAnAFsAKIBcgCjAXMApAF0ALUBhgDAAZEAwwGVAMUBlgDGAZcAxwGYAM0BngDOAZ8A0QGiANQBpQDVAaYA8AHCAPEBwwDzAcUA+AHKAP8B0QEAAdIBTQGnAD8BDwBAARAAQQERAEIBEgBDARMARAEUAEUBFQBGARYARwEXAEgBGABJARkASgEaAGYBNgBnATcAaAE4AGkBOQBqAToAawE7AGwBPABtAT0AiQFXAIoBWACtAX4ArgF/AK8BgACwAYEAsQGCALIBgwCzAYQAuQGKALoBiwC7AYwAvAGNAL0BjgDmAbcA5wG4AOkBugDqAbsA6wG8AOwBvQDtAb4A9AHGAPkBywD6AcwA+wHNAxADEQMUAxUDFgMXAxgDGQKwArECtAK1ArYCtwK4ArkDHQMeAyEDIgMjAyQCvAK9AsACwQLCAsMDJQMmAykDKgMrAywDLQMuAsQCxQLIAskCygLLAswCzQMwAzEDNAM1AzYDNwM4AzkCzgLPAtIC0wLUAtUC1gLXA0ADQQNEA0UDRgNHAtoC2wLeAt8C4ALhA0oDSwNOA08DUANRA1IDUwLoA1oDWwNeA18DYANhA2IDYwLrAuwC7wLwAvEC8gLzAvQDEgMTAx8DIAMnAygDMgMzA0IDQwNMA00DXANdA2YDZwNqA2sDbANtA24DbwL2AvcC+AL5AvoC+wL8Av0DcgNzA3YDdwN4A3kDegN7Av8DAAMBAwIDAwMEAwUDBgN+A38DggODA4QDhQOGA4cDCAMJAwoDCwMMAw0DDgMPAxoDGwNoA2UDaQMcA3ACugK7ArICswL1A5gDlwOZA6MDpgN0A3EDdQMvA3wCvgK/AsYCxwL+A50DnwOhAzoDOwM9Az4DPAM/AtgC2QLQAtEDngOgA6IDVQNWA1cDWANIA0kDVANZAukC6gLkAuUC4gOkA6UDmwOAA30DgQNkA4gC3ALdAu0C7gMHA5wDmgSWBJYEmwSXBJgEnASxBIwEjQSQBI4EjwSRBK0ErgSeB7AG3wSyBLYEoAShBLMEtQS0Bj8GogZDBkQGRQZGBkcGSAZJBkoGSwZMBk0GpwZQBlEGUgZTBlQGVQZWBlcGWAZZBloGWwZcBl0GXgbRBskG2QbWBtcESQTCBusG8AbxBuMG5AblBuYG5wboBukG6gbsBu0G7gbvBwcG9Ab3BwYHEQcfAiUHsgezAiYCJwABAAAACgMCCyoABERGTFQCvmN5cmwCRGdyZWsCCGxhdG4AGgG2AAdBVEggAX5BWkUgAUZDUlQgAQ5OQVYgANZOU00gAJ5TS1MgAGZUUksgAC4AAP//ABkACwAXACMALwA7AEcAUwBeAGoAdgCCAI4AmgCmALIAvgDKANYA4gDuAPoBBgESAR4BKgAA//8AGQAKABYAIgAuADoARgBSAF0AaQB1AIEAjQCZAKUAsQC9AMkA1QDhAO0A+QEFAREBHQEpAAD//wAZAAkAFQAhAC0AOQBFAFEAXABoAHQAgACMAJgApACwALwAyADUAOAA7AD4AQQBEAEcASgAAP//ABkACAAUACAALAA4AEQAUABbAGcAcwB/AIsAlwCjAK8AuwDHANMA3wDrAPcBAwEPARsBJwAA//8AGQAHABMAHwArADcAQwBPAFoAZgByAH4AigCWAKIArgC6AMYA0gDeAOoA9gECAQ4BGgEmAAD//wAZAAYAEgAeACoANgBCAE4AWQBlAHEAfQCJAJUAoQCtALkAxQDRAN0A6QD1AQEBDQEZASUAAP//ABkABQARAB0AKQA1AEEATQBYAGQAcAB8AIgAlACgAKwAuADEANAA3ADoAPQBAAEMARgBJAAA//8AGQAEABAAHAAoADQAQABMAFcAYwBvAHsAhwCTAJ8AqwC3AMMAzwDbAOcA8wD/AQsBFwEjAAQAAAAA//8AGQADAA8AGwAnADMAPwBLAFYAYgBuAHoAhgCSAJ4AqgC2AMIAzgDaAOYA8gD+AQoBFgEiAEIAAVNSQiAACgAA//8AGQACAA4AGgAmADIAPgBKAFUAYQBtAHkAhQCRAJ0AqQC1AMEAzQDZAOUA8QD9AQkBFQEhAAD//wAZAAEADQAZACUAMQA9AEkAVABgAGwAeACEAJAAnACoALQAwADMANgA5ADwAPwBCAEUASAABAAAAAD//wAYAAAADAAYACQAMAA8AEgAXwBrAHcAgwCPAJsApwCzAL8AywDXAOMA7wD7AQcBEwEfASthYWx0CCBhYWx0CCBhYWx0CCBhYWx0CCBhYWx0CCBhYWx0CCBhYWx0CCBhYWx0CCBhYWx0CCBhYWx0CCBhYWx0CCBhYWx0CCBjMnNjCBZjMnNjCBZjMnNjCBZjMnNjCBZjMnNjCBZjMnNjCBZjMnNjCBZjMnNjCBZjMnNjCBZjMnNjCBZjMnNjCBZjMnNjCBZjYXNlCApjYXNlCApjYXNlCApjYXNlCApjYXNlCApjYXNlCApjYXNlCApjYXNlCApjYXNlCApjYXNlCApjYXNlCApjYXNlCApjY21wB/hjY21wB/hjY21wB/hjY21wB/hjY21wB/hjY21wB/hjY21wB/hjY21wB/hjY21wB/hjY21wB/hjY21wB/hjY21wB/hkbm9tB/Jkbm9tB/Jkbm9tB/Jkbm9tB/Jkbm9tB/Jkbm9tB/Jkbm9tB/Jkbm9tB/Jkbm9tB/Jkbm9tB/Jkbm9tB/Jkbm9tB/JmcmFjB+hmcmFjB+hmcmFjB+hmcmFjB+hmcmFjB+hmcmFjB+hmcmFjB+hmcmFjB+hmcmFjB+hmcmFjB+hmcmFjB+hmcmFjB+hsaWdhB+JsaWdhB+JsaWdhB+JsaWdhB+JsaWdhB+JsaWdhB+JsaWdhB+JsaWdhB+JsaWdhB+JsaWdhB+JsaWdhB+JsaWdhB+Jsb2NsB9xsb2NsB9Rsb2NsB85sb2NsB8hsb2NsB8Bsb2NsB7hsb2NsB7hsb2NsB8Bsb2NsB7Bsb2NsB7Bsb2NsB7hudW1yB6pudW1yB6pudW1yB6pudW1yB6pudW1yB6pudW1yB6pudW1yB6pudW1yB6pudW1yB6pudW1yB6pudW1yB6pudW1yB6pvbnVtB6RvbnVtB6RvbnVtB6RvbnVtB6RvbnVtB6RvbnVtB6RvbnVtB6RvbnVtB6RvbnVtB6RvbnVtB6RvbnVtB6RvbnVtB6RvcmRuB55vcmRuB55vcmRuB55vcmRuB55vcmRuB55vcmRuB55vcmRuB55vcmRuB55vcmRuB55vcmRuB55vcmRuB55vcmRuB55wbnVtB5hwbnVtB5hwbnVtB5hwbnVtB5hwbnVtB5hwbnVtB5hwbnVtB5hwbnVtB5hwbnVtB5hwbnVtB5hwbnVtB5hwbnVtB5hzYWx0B3xzYWx0B3xzYWx0B3xzYWx0B3xzYWx0B3xzYWx0B3xzYWx0B3xzYWx0B3xzYWx0B3xzYWx0B3xzYWx0B3xzYWx0B3xzaW5mB3ZzaW5mB3ZzaW5mB3ZzaW5mB3ZzaW5mB3ZzaW5mB3ZzaW5mB3ZzaW5mB3ZzaW5mB3ZzaW5mB3ZzaW5mB3ZzaW5mB3ZzbWNwB2hzbWNwB2hzbWNwB2hzbWNwB2hzbWNwB2hzbWNwB2hzbWNwB2hzbWNwB2hzbWNwB2hzbWNwB2hzbWNwB2hzbWNwB2hzczAxB1pzczAxB1pzczAxB1pzczAxB1pzczAxB1pzczAxB1pzczAxB1pzczAxB1pzczAxB1pzczAxB1pzczAxB1pzczAxB1pzczAyB05zczAyB05zczAyB05zczAyB05zczAyB05zczAyB05zczAyB05zczAyB05zczAyB05zczAyB05zczAyB05zczAyB05zczAzB0JzczAzB0JzczAzB0JzczAzB0JzczAzB0JzczAzB0JzczAzB0JzczAzB0JzczAzB0JzczAzB0JzczAzB0JzczAzB0JzczA0BzRzczA0BzRzczA0BzRzczA0BzRzczA0BzRzczA0BzRzczA0BzRzczA0BzRzczA0BzRzczA0BzRzczA0BzRzczA0BzRzczA1BypzczA1BypzczA1BypzczA1BypzczA1BypzczA1BypzczA1BypzczA1BypzczA1BypzczA1BypzczA1BypzczA1BypzczE4ByBzczE4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BNwE3QTeBN8E4AThBOIE4wTkBOUE5gTnBOgE6QTqBOsE7ATtBO4E7wTwBPEE8gTzBPQE9QT2BPcE+AT5BPoE+wT8BP0E/gT/BQAFAQUCBQMFBAUFBQYFBwUIBQkFCgULBQwFDQUOBQ8FEAURBRIFEwUUBRUFFgUXBRgFGQUaBRsFHAUdBR4FHwUgBSEFIgUjBSQFJQUmBScFKAUpBSoFLAUtBS8FLgUwBTEFMgUzBTQFNQU2BTgFOQU6BTwFOwU9BT4FPwVABUEFQgVDBUUFRAVGBUcFSAVJBUoFSwVMBU0FTgVPBVAFUQVSBVMFVAVVBVYFVwVYBVkFWgVbBVwFXQVeBV8FYAVhBWIFYwVuBW8FZAVlBWYFZwVoBWkFagVrBWwFbQVwBXEFdAVzBXIFdQV2BXcFeAV5BXoFewV8BX0FfgV/BYEFggWDBYQFhQWGBYcFiAWJBYoFiwWMBY0FjgWPBZAFkQWSBZMFlAWVBZYFlwWYBZkFmgWbBZwFnQWeBZ8FnwWgBaEFogWjBaQFpQWmBacFqAWpBaoFqwWsBa0FrgWvBbAFsQWyBbMFtQW2BbQFKwU8BTcAAgAKABwANQAAAQYBWwAaAV0BYABwAWIBdAB0AXYB1QCHAdcB1wDnAeQB5ADoAeoB6gDpAmUCZQDqBMsEywDrAAEAAAABAAgAAgAuABQGIQYsBi0GLgYvBjAGMQYyBjMGNAY1BjYGNwY4BjkGOgY7BjwGPQY+AAIABARKBEoAAASGBI8AAQSWBJgACwSiBKcADgABAAAAAQAIAAEFQgHXAAEAAAABAAgAAgN0AbcEzATNBM4EzwTQBNEE0gTTBNQE1QTWBNcE2ATZBNoE2wTcBN0E3gTfBOAE4QTiBOME5ATlBOYE5wToBOkE6gTrBOwE7QTuBO8E8ATxBPIE8wT0BPUE9gT3BPgE+QT6BPsE/AT9BP4E/wUABQEFAgUDBQQFBQUGBQcFCAUJBQoFCwUMBQ0FDgUPBRAFEQUSBRMFFAUVBRYFFwUYBRkFGgUbBRwFHQUeBR8FIAUhBSIFIwUkBSUFJgUnBSgFKQUqBSsFLAUtBS4FLwUwBTEFMgUzBTQFNQU2BTcFOAU5BToFPAU7BT0FPgU/BUAFQQVCBUMFRAVFBUYFRwVIBUkFSgVLBUwFTQVOBU8FUAVRBVIFUwVUBVUFVgVXBVgFWQVaBVsFXAVdBV4FXwVgBWEFYgVjBW4FbwVkBWUFZgVnBWgFaQVqBWsFbAVtBXAFcQVzBXIFdAV1BXYFdwV4BXkFegV7BXwFfQV+BYAFgQWCBYMFhAWFBYYFhwWIBYkFigWLBYwFjQWOBY8FkAWRBZIFkwWUBZUFlgWXBZgFmQWaBZsFnAWdBZ4FnwWgBaEFogWjBaQFpQWmBacFqAWpBaoFqwWsBa0FrgWvBbAFsQWyBbMFtAW1BbYFtwW4BbkFugW7BbwFvQW+Bb8FwAXBBcIFwwXEBcUFxgXHBcgFyQXKBcsFzAXNBc4FzwW4BbwFvgXABdAFxgXLBdEFzwW4BbgFuAW4BbgFuAW4BbgFuAW4BbgFuAW8BbwFvAW8BbwFvAW8BbwFvgW+Bb4FvgW+Bb4FvgW+Bb4FvgXABcAFwAXABcAFwAXABcAFwAXABcAFwAXGBcYFxgXGBcYFxgXGBcYFyAXLBcsFywXLBcsFywXLBcsFzwXPBc8FzwXPBc8FzwXPBc8FzwXSBdIF0gXSBdIF0gXSBdIF0gXTBdMF0wXTBdMF0wXTBdMF0wXUBdQF1AXUBdQF1AXUBdQF1AXVBdYF1wXYBdkF2gXbBdwF3QXeBd8F4AXhBeIF4wXkBeUF5gXnBegF6QXqBesF7AXtBe4F7wXwBfEF8gXzBfQF9QX2BfcF+AX5BfoF+wX8Bf4F/wYABgEGAgYDBgQGBQYGBgcGCAYJBgoGCwYMBg0GDgYPBhAGEQYSBhMGFAYVBhYGFwYYBhkGGgYbBhwGHQYeBh8GIAACAAcAAgAbAAAANgEFABoCOAI4AOoCaAKIAOsCsAMPAQwDsAPXAWwD2QP7AZQAAQAAAAEACAACAPgAeQW4BbgFuAW4BbgFuAW4BbgFuAW4BbgFuAW4BbwFvAW8BbwFvAW8BbwFvAW+Bb4FvgW+Bb4FvgW+Bb4FvgW+Bb4FwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXQBdAF0AXGBcYFxgXGBcYFxgXGBcYFyAXIBcsFywXLBcsFywXLBcsFywXLBcsFywXLBcsF0QXRBdEFzwXPBc8FzwXPBc8FzwXPBc8FzwXPBdIF0gXSBdIF0gXSBdIF0gXSBdIF0gXSBdMF0wXTBdMF0wXTBdMF0wXTBdMF0wXTBdQF1AXUBdQF1AXUBdQF1AXUBdQF1AXUAAIAAQMQ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ALAAqACgAJgAkACIAIAAeAByAGwAZgBgAFoAVABOAEgAQgA8ADYAMAMtAAIHpAMpAAIHowMrAAIHogMuAAIHoQMqAAIHoAMsAAIHnwNxAAIHgQMvAAIHfQMlAAIHXgMmAAIHXAMoAAIHPAMnAAIHOQN6AAMHgQekA3YAAweBB6MDeAADB4EHogN7AAMHgQehA3cAAweBB6ADeQADB4EHnwN8AAMHgQd9A3IAAweBB14DcwADB4EHXAN1AAMHgQc8A3QAAweBBzkACAA8ADYAMAAqACQAHgAYABIDIQACB6MDIwACB6IDIgACB6ADJAACB58DHQACB14DHgACB1wDIAACBzwDHwACBzkAGQDYANAAyADAALgAsACoAKAAmACQAIgAggB8AHYAcABqAGQAXgBYAFIATABGAEAAOgA0AxgAAgekAxQAAgejAxYAAgeiAxkAAgehAxUAAgegAxcAAgefA2UAAgeBAxwAAgd9AxAAAgdeAxEAAgdcAxoAAgdHAxsAAgdDAxMAAgc8AxIAAgc5A24AAweBB6QDagADB4EHowNsAAMHgQeiA28AAweBB6EDawADB4EHoANtAAMHgQefA3AAAweBB30DZgADB4EHXgNnAAMHgQdcA2kAAweBBzwDaAADB4EHOQAcAPoA8gDqAOIA2gDSAMoAwgC6ALIAqgCiAJoAkgCKAIIAfAB2AHAAagBkAF4AWABSAEwARgBAADoC8wACB6QC7wACB6MC9AACB6EC8AACB6AC8gACB58DBwACB4EC7AACB1wC7gACBzwC7QACBzkC8QACA58C6wACA5kDBwACA5cDDgADB4EHpAMKAAMHgQejAwwAAweBB6IDDwADB4EHoQMLAAMHgQegAw0AAweBB58DCAADB4EHXgMJAAMHgQdcAw4AAwOXB6QDCgADA5cHowMMAAMDlweiAw8AAwOXB6EDCwADA5cHoAMNAAMDlwefAwgAAwOXB14DCQADA5cHXAAJAEQAPgA4ADIALAAmACAAGgAUAugAAgehAuYAAgegAucAAgefAuMAAgdcAocAAgdNAukAAgdHAuoAAgdDAuUAAgc8AuQAAgc5AAEABALiAAIHXAAIADwANgAwACoAJAAeABgAEgLeAAIHowLgAAIHogLfAAIHoALhAAIHnwLaAAIHXgLbAAIHXALdAAIHPALcAAIHOQANAGQAXgBYAFIATABGAEAAOgA0AC4AKAAiABwC1gACB6QC0gACB6MC1AACB6IC0wACB6AC1QACB58CzgACB14CzwACB1wChAACB00C2AACB0cC2QACB0MC0QACBzwC0AACBzkC1wACA6IAHAD6APIA6gDiANoA0gDKAMIAugCyAKoAogCaAJIAigCCAHwAdgBwAGoAZABeAFgAUgBMAEYAQAA6AswAAgekAsgAAgejAsoAAgeiAs0AAgehAskAAgegAssAAgefAv4AAgeBAsQAAgdeAsUAAgdcAscAAgc8AsYAAgc5Av4AAgOXAwUAAweBB6QDAQADB4EHowMDAAMHgQeiAwYAAweBB6EDAgADB4EHoAMEAAMHgQefAv8AAweBB14DAAADB4EHXAMFAAMDlwekAwEAAwOXB6MDAwADA5cHogMGAAMDlwehAwIAAwOXB6ADBAADA5cHnwL/AAMDlwdeAwAAAwOXB1wACAA8ADYAMAAqACQAHgAYABICwAACB6MCwgACB6ICwQACB6ACwwACB58CvAACB14CvQACB1wCvwACBzwCvgACBzkAHgEKAQIA+gDyAOoA4gDaANIAygDCALoAsgCqAKIAmgCSAIwAhgCAAHoAdABuAGgAYgBcAFYAUABKAEQAPgK4AAIHpAK0AAIHowK2AAIHogK5AAIHoQK1AAIHoAK3AAIHnwL1AAIHgQKwAAIHXgKxAAIHXAK6AAIHRwK7AAIHQwKzAAIHPAKyAAIHOQL1AAIDlwL8AAMHgQekAvgAAweBB6MC+gADB4EHogL9AAMHgQehAvkAAweBB6AC+wADB4EHnwL2AAMHgQdeAvcAAweBB1wC/AADA5cHpAL4AAMDlwejAvoAAwOXB6IC/QADA5cHoQL5AAMDlwegAvsAAwOXB58C9gADA5cHXgL3AAMDlwdcAAEAFgJoAmwCbgJwAnYCeAJ7An8CiQKNAo8CkQKXApkCnAKgAvUC/gMHA2UDcQN9AAQAAAABAAgAAQIaABsB/AHeAdQBtgGYAXoBXAFSATQBIgEEAPoA3ADSALQAqgCgAJYAjACCAHgAbgBkAFoAUABGADwAAQAEAlcAAgdsAAEABAHlAAIGtwABAAQBwQACBzwAAQAEAZAAAgc8AAEABAFaAAIHPAABAAQBQAACBzwAAQAEAR0AAgc8AAEABADvAAIHPAABAAQAvwACBzwAAQAEAIwAAgc8AAEABABwAAIHPAABAAQATQACBzwAAwAWAA4ACAG/AAIHbgHBAAMHbgc8AcEAAwc8B24AAQAEAaEAAgdVAAMAFgAOAAgBjwACB24BkAADB24HPAGQAAMHPAduAAEABAFjAAIHVQADABYADgAIAVkAAgduAVoAAwduBzwBWgADBzwHbgACAAwABgFHAAIHbAFKAAIHQQADABYADgAIAT4AAgduAUAAAwduBzwBQAADBzwHbgABAAQBKQACB1UAAwAWAA4ACAEbAAIHbgEdAAMHbgc8AR0AAwc8B24AAwAWAA4ACADuAAIHbgDvAAMHbgc8AO8AAwc8B24AAwAWAA4ACAC+AAIHbgC/AAMHbgc8AL8AAwc8B24AAwAWAA4ACACLAAIHbgCMAAMHbgc8AIwAAwc8B24AAQAEAHoAAgdBAAMAFgAOAAgAbgACB24AcAADB24HPABwAAMHPAduAAMAFgAOAAgASwACB24ATQADB24HPABNAAMHPAduAAEAGwACAAYACAAKABAAFgAcAB8AIAAiACQAJwAqAC8AMABLAG4AiwC+AO4BGwE+AVkBjwG/AeQCUgAEAAAAAQAIAAEBCgAFAOAAtgB0AEIAEAAGACwAJgAgABoAFAAOB6QAAgd9B6QAAgdBB6IAAgc+B6IAAgc8B6MAAgc7B6MAAgc5AAYALAAmACAAGgAUAA4HoQACB30HoQACB0EHnwACBz4HnwACBzwHoAACBzsHoAACBzkACAA8ADYAMAAqACQAHgAYABIHiQACB30HjAACB1UHigACB0MHiQACB0EHgAACBz4HhAACBzwHiAACBzsHhgACBzkABQAkAB4AGAASAAwHnAACB30HmgACB08HnAACB0EHlgACBzwHmAACBzkABQAkAB4AGAASAAwHkgACB08HngACB0cHlAACB0EHjgACBzwHkAACBzkAAQAFBz8HRwdNB1wHXgAGAAAAAwBAAB4ADAADAAAAAQAmAAEA2AABAAAANgADAAAAAQAUAAIBugDGAAEAAAA2AAEABQAkACUBWQHyAfUAAwAAAAIAGgAUAAEApAABAAAANQABAAEHbgABAAEAJAAGAAAABQFmAHIATgAqABAAAwAAAAEAEgABACwAAQAAAAIAAQACA9cEIwADAAAAAQAYAAEAEgABAAAAAgABAAEHPAABAAQAYwCqATMBewADAAAAAQAYAAEAEgABAAAAAgABAAEHRwABAAQAYACnATABeAADAAAAAQBUAAEAEgABAAAAAgABAB8HOQc7BzwHPgc/B0EHQwdFB0cHSAdLB00HTwdRB1MHVQdXB1kHWwdcB10HXgdhB2IHbAduB3cHfAd9B38HgAABAE4APwBTAFQAWwBcAGYAdwB9AH4AfwCKAI8AkACRAJQAlgCYAJwAoQCjAKQArQC9AMQAxQDHAMsAzADOANIA0wDUANUA1gDmAO0A+QD/AQABDwEjASQBKwEsATYBRwFMAU0BTgFYAV4BXwFgAWUBZgFoAWwBcQFzAXQBfgGOAZMBlgGYAZwBnQGfAaMBpAGlAaYBpwG3Ab4BywHRAdIAAwAAAAEANAABABIAAQAAAAIAAgAFB18HYAAAB2MHawACB3AHdgALB3gHewASB4EHgQAWAAIAQAA2AD4AAABAAEQACQBGAEkADgBNAE0AEgBPAFAAEwBSAFIAFQBVAFoAFgBeAGUAHABnAGwAJABwAHYAKgB4AHoAMQB8AHwANACBAIYANQCIAIkAOwCMAI4APQCSAJMAQACaAJsAQgCdAKAARACiAKIASAClAKwASQCuALIAUQC0ALUAVgC5ALwAWAC/AMMAXADIAMoAYQDNAM0AZADQANEAZQDYAOUAZwDnAOcAdQDpAOwAdgDvAPgAegD6AP4AhAEGAQ4AiQEQARQAkgEWARkAlwEdAR0AmwEfASAAnAEiASIAngElASoAnwEuATUApQE3ATwArQFAAUYAswFIAUsAugFQAVcAvgFaAVsAxgFdAV0AyAFiAWMAyQFqAWsAywFtAXAAzQFyAXIA0QF2AX0A0gF/AYMA2gGFAYYA3wGKAY0A4QGQAZIA5QGUAZUA6AGZAZsA6gGeAZ4A7QGhAaIA7gGpAbYA8AG4AbgA/gG6Ab0A/wHBAcoBAwHMAdABDQACAAAAAQAIAAEC4gFuDMIMvAy2DLAMqgykDJ4MmAySDIwMhgx+DHYMbgxmDF4MVgxODEYMPgw2DDAMKgwkDB4MGAwSDAwMBgwAC/oL9AvuC+gL4gvcC9YL0AvKC8QLvgu4C7ILrAumC6ALmAuQC4gLgAt4C3ILagtkC14LWAtSC0wLRgtACzoLNAsuCygLIgscCxYLEAsKCwQK/gr4CvIK7ArmCuAK2grUCs4KyArCCrwKtgqwCqoKogqcCpYKkAqKCoQKfgp4CnIKbApmCmAKWgpUCk4KSApCCjwKNgowCioKJAoeChYKDgoGCf4J9gnwCegJ4gncCdYJ0AnKCcQJvgm4CbIJrAmmCaAJmAmSCYwJhgmACXoJdAluCWgJYglcCVYJUAlKCUQJPgk4CTIJLAkmCSAJGgkUCQ4JCAkCCPoI8gjqCOII3AjWCNAIygjECL4IuAiyCKwIpgigCJoIlAiOCIgIggh8CHYIcAhqCGQIXghYCFIITAhGCEAIOgg0CC4IKAgiCBwIFggQCAoIAgf6B/IH6gfiB9oH0gfKB8IHuge0B64HqAeiB5wHlgeQB4oHhAd+B3gHcgdsB2YHYAdaB1QHTgdIB0IHPAc2BzAHKgckBxwHFAcMBwQG/Ab2Bu4G6AbiBtwG1gbQBsoGxAa+BrgGsgasBqYGoAaaBpQGjgaIBoIGfAZ2BnAGagZkBl4GWAZSBkwGRgZABjoGNAYuBiYGIAYaBhQGDgYIBgIF/AX2BfAF6gXkBd4F2AXSBcwFxgXABboFtAWuBagFogWaBZIFigWCBXoFdAVsBWYFYAVaBVQFTgVIBUIFPAU2BTAFKgUkBRwFFgUQBQoFBAT+BPgE8gTsBOYE4ATaBNQEzgTIBMIEvAS2BLAEqgSkBJ4EmASSBIwEhgR+BHYEbgRmBGAEWgRUBE4ESARCBDwENgQwBCoEJAQeBBgEEgQMBAYEAAP6A/QD7gPoA+ID3APWA9AK/gaCAAIAJwA2AEoAAABNAE0AFQBPAFAAFgBSAFwAGABeAG0AIwBwAHoAMwB8AH8APgCBAIYAQgCIAIoASACMAJQASwCWAJgAVACaALUAVwC5AL0AcwC/AM4AeADQANYAiADYAOcAjwDpAO0AnwDvAQAApAEGARoAtgEdAR0AywEfASAAzAEiASwAzgEuAT0A2QFAAU4A6QFQAVgA+AFaAVsBAQFdAWABAwFiAWMBBwFlAWgBCQFqAXQBDQF2AYYBGAGKAY4BKQGQAZ8BLgGhAacBPgGpAbgBRQG6Ab4BVQHBAdIBWgPXA9cBbAQjBCMBbQACADUHdgACADUHaAACADUHSwACADUHVQACADUHPAACADQHQQACADQHTwACADQHaAACADQHSwACADQHTQACADQHPwACADQHPAACADQHOQACADIHTQACADIHPwACADIHPAACADIHOQACAb8HPAACAbkHaAACAbkHQQACAbkHTwACAbkHOQACAbkHPAACADAHTwACADAHaAADADAHTQc5AAMAMAdNB1UAAwAwB00HPAADADAHTQdDAAIAMAdVAAIAMAdTAAIAMAdRAAIAMAdHAAIAMAdDAAIAMAdNAAIAMAdBAAIAMAc/AAIAMAc8AAIAMAc5AAIALwdNAAIALwd2AAIALwdoAAIALwdrAAIALwdsAAIALwdLAAIALwdVAAIALgdoAAIALgdLAAIALgdrAAIALgdsAAIALgdVAAIALgc/AAIALgc8AAIALQd2AAMALQdoB0MAAgAtB2gAAgAtB0sAAgAtB1UAAgAtB2sAAgAtBzwAAgArB0sAAgGPBzwAAgGJB2gAAgGJB0EAAgGJB08AAgGJBzkAAgGJBzwAAwAqB0MHPAACACoHRwADACoHPwdoAAMAKgc/B0EAAwAqBz8HTwADACoHPwc5AAMAKgc/BzwAAgAqB08AAgAqB2gAAgAqB1UAAgAqB1MAAgAqB0MAAgAqB00AAgAqB0EAAgAqBz8AAgAqBzwAAgAqBzkAAgApB3YAAgApB2gAAgApB0sAAgApB2sAAgApB0EAAgApB1UAAgApBzkAAgApBzwAAgAoB2gAAgAoB0sAAgAoBzwAAgAnB3YAAwAnB2gHRAACACcHaAACACcHawACACcHVQACACcHPQACACYHdgACACYHaAACACYHawACAdYHPwACAVwHRwACAmUHPAACACQHaAACAVwHTwACAVwHVQACAVwHQwACAVwHTQACAVwHQQACAVwHPwACAVwHPAACAVwHOQACACMHcwACACMHdgACACMHaAACACMHQAACACIHQQACACIHQwACACIHVQACACIHawACACIHSwACACIHRwACACIHPwACACIHPAACACEHSwADACAHQwc8AAIBPgc8AAMAIAc/B2gAAwAgBz8HQQADACAHPwdPAAMAIAc/BzkAAwAgBz8HPAACACAHQQACACAHTwACACAHaAACACAHSwACACAHRwACACAHQwACACAHTQACACAHVQACACAHPwACACAHPAACACAHOQACAB8HdgACAB8HaAACAB8HTAACAB8HVQACAB4HSwACAB4HVQACAB4HPwACAB4HPAACAB4HbAACAB0HdgACAB0HTAACAR4HQwACAR4HPAACARsHPAADABwHRwdoAAMAHAdHB0EAAwAcB0cHTwADABwHRwc5AAMAHAdHBzwAAwAcBz8HaAADABwHPwdBAAMAHAc/B08AAwAcBz8HOQADABwHPwc8AAIAHAdPAAIAHAdoAAIAHAdVAAIAHAdRAAIAHAdHAAIAHAdDAAIAHAdNAAIAHAdBAAIAHAc/AAIAHAc8AAIAHAc5AAIAGwd2AAIAGwdoAAIAGwdMAAIAGwdWAAIAGwc9AAIAGgdCAAIAGgdQAAIAGgdoAAIAGgdMAAIAGgdOAAIAGgdAAAIAGgc9AAIAGgc6AAIAGAdOAAIAGAdAAAIAGAc9AAIAGAc6AAIA7gc9AAIA6AdoAAIA6AdCAAIA6AdQAAIA6Ac6AAIA6Ac9AAIAFgdQAAIAFgdoAAMAFgdOBzoAAwAWB04HVgADABYHTgc9AAMAFgdOB0QAAgAWB1YAAgAWB1QAAgAWB1IAAgAWB0kAAgAWB0QAAgAWB04AAgAWB0IAAgAWB0AAAgAWBz0AAgAWBzoAAgAVB04AAgAVB3YAAgAVB2gAAgAVB2sAAgAVB20AAgAVB0wAAgAVB1YAAgAUB2gAAgAUB0wAAgAUB2sAAgAUB20AAgAUB1YAAgAUB0AAAgAUBz0AAgATB3YAAwATB2gHRAACABMHaAACABMHawACABMHTAACABMHVgACABMHPQACABEHTAACAL4HPQACALgHaAACALgHQgACALgHUAACALgHOgACALgHPQADABAHRAc9AAIAEAdJAAMAEAdAB2gAAwAQB0AHQgADABAHQAdQAAMAEAdABzoAAwAQB0AHPQACABAHUAACABAHaAACABAHVgACABAHVAACABAHRAACABAHTgACABAHQgACABAHQAACABAHPQACABAHOgACAA8HdgACAA8HaAACAA8HTAACAA8HawACAA8HQgACAA8HVgACAA8HOgACAA8HPQACAA4HaAACAA4HTAACAA4HPQACAA0HdgADAA0HaAdEAAIADQdoAAIADQdrAAIADQdWAAIADQc9AAIADAd2AAIADAdoAAIADAdrAAIACwdAAAIACgdJAAIAiwc9AAIACgdoAAIACgdQAAIACgdWAAIACgdEAAIACgdOAAIACgdCAAIACgdAAAIACgc9AAIACgc6AAIACQd2AAIACQdz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AAIE4gaWAAIE4QaVAAIE4AaUAAIE3waTAAIE3gaSAAIE3QaRAAIE3AaQAAIE2waPAAIE2gaOAAIE2QaNAAIE2AaMAAIE1waLAAIE1gaKAAIE1QaJAAME1AaIAioAAgTTBocAAgTSBoYAAgTRBoUAAgTQBoQAAgTPBoMAAgTOBoIAAgTNBoEAAgTMBoAAAQAAAAEACAACBXwCuwTmBOcE6ATpBOoE6wTsBO0E7gTvBPAE8QTyBPME9AT1BPYE9wT4BPkE+gT8BP0E/gT/BQAFAQUCBQMFBAUFBQYFBwUIBQkFCgULBQwFDQUOBQ8FEAURBRIFEwUUBRUFFgUXBRgFGQUaBRsFHAUdBR8FIAUhBSIFIwUkBSUFJgUnBSgFKQUqBSsFLAUtBS4FLwUwBT4FPwVABUEFQgVDBUQFRQVGBUcFSAVJBUoFSwVMBU0FTgVPBVAFUQVSBVMFVAVVBVYFVwVYBVkFWgVbBVwFXQVeBV8FYAVhBWIFYwVuBW8FZAVlBWYFZwVoBWkFagVrBWwFbQVwBXEFcwVyBXQFdQV2BXcFeAV5BXoFewV8BX0FfgWABYEFggWDBYQFhQWGBYcFiAWJBYoFiwWMBY0FjgWPBZAFkQWSBZMFlAWVBZYFlwWYBZkFmgWbBZwFnQWeBZ8FoAWhBaIFowWkBaUFpgWnBagFqQWqBasFrAWtBa4FrwWwBbEFsgWzBbQFtgT+BP8FAAUBBQIFAwUEBQUFBgUHBQgFCQUKBQsFDAUNBRAFEQUSBRMFFAUVBRYFFwUYBRkFGgUbBRwFHQUfBSAFIQUiBSwFLQUuBTAFMQUyBTMFNAU1BTYFOAU5BToFPAU7BT0FPgU/BUAFQQVKBUsFTAVNBU4FTwVQBVEFUgVTBVQFVQVWBVcFWAVZBVoFWwVcBV0FXgVfBWAFYQViBWMFbgVvBWQFZQVmBWcFaAVpBWoFawVsBW0FcAVxBXQFcwVyBXUFdgV3BXgFeQV6BXsFfAV9BX4FfwWBBYIFgwWEBYUFhgWIBYkFigWLBYwFjQWOBY8FkAWRBZIFkwWUBZUFlgWXBZgFmQWaBZsFnAWdBZ4FnwWgBaEFogWjBaQFpQWmBacFqAWpBaoFqwWsBa0FrgWvBbAFsQWyBbMFtQW2BSsFtwU8BbgFuQW6BbsFvAW9Bb4FvwXBBcIFwwXEBcUFxgXHBcgFyQXKBcsFzAXNBc4FzwW4BbwFvgXABdAFxgXLBdEFzwHhAe0CowH0AhQB3QW4BbgFuAW4BbgFuAW4BbgFuAW4BbgFuAW8BbwFvAW8BbwFvAW8BbwFvgW+Bb4FvgW+Bb4FvgW+Bb4FvgXABcAFwAXABcAFwAXABcAFwAXABcYFxgXGBcYFxgXGBcYFxgXIBcsFywXLBcsFywXLBcsFywXPBc8FzwXPBc8FzwXPBc8FzwXPBdIF0gXSBdIF0gXSBdIF0gXSBdMF0wXTBdMF0wXTBdMF0wXTBdQF1AXUBdQF1AXUBdQF1AXUA5AF1QXWBdcF2AXZBdoF2wXcBd0F3gXfBeAF4QXiBeMF5AXlBeYF5wXoBekF6gXrBewF7QXuBe8F8AXxBfIF8wX0BfUF9gX3BfgF+QX6BfsF/AX+Bf8GAAYBBgIGAwYEBgUGBgYHBggGCQYKBgsGDAYNBg4GDwYQBhEGEgYTBhQGFQYWBhcGGAYZBhoGGwYcBh0GHgYfBiAF1QXXBdgF2QXaBdsF3AXdBd4F3wXgBeEF4gXjBeQF5QXmBecF6AXpBeoF6wXsBe0F7gXvBfAF8QXyBfMF9AX1BfYF9wX4BfkF+gX7BfwF/gX/BgAGAQYCBgMGBAYFBgYGBwYIBgkGCgYLBgwGDQYOBg8GEAYRBhIGEwYUBhUGFwYYBhkGGgYbBhwGHQYeBh8GIAXWBiEEbgRvBHAEcQRyBHMEdAR1BHYEbQRuBG8EcARxBHIEcwR0BHUEdga/BiwGLQYuBi8GMAYxBjIGMwY0BjUGOwY8Bj0GPgTJBTcGfga8Br0GvgbIB0AHQgdEB0YHSgdKB0wHTgdQB1IHVAdWB1gHWgdcB14HbQdvB34CZAACAEAANgBKAAAATABtABUAbwCAADcAjgEDAEkBBQEFAL8BHgEtAMABMAE9ANABPwFCAN4BSwFMAOIBTgFbAOQBXQFgAPIBagF0APYBdgGmAQEBqAG+ATIBwAHVAUkB1wHXAV8B6gHqAWACOAI4AWECZQJlAWICaAJvAWMCcQKJAWsCiwKLAYQCkAKRAYUCnAKcAYcCngKeAYgCsALXAYkC2gMPAbEDjwOPAecDsAPXAegD2QP8AhAD/gQjAjQEJQQ9AloEPwRIAnMESgRKAn0EWARgAn4EYwRsAocEgwSDApEEhgSPApIEpASnApwEyATIAqAEywTLAqEGfQZ9AqIGmgaaAqMGoAagAqQGpQalAqUGxwbHAqYHPwc/AqcHQQdBAqgHQwdDAqkHRQdFAqoHSQdLAqsHTQdNAq4HTwdPAq8HUQdRArAHUwdTArEHVQdVArIHVwdXArMHWQdZArQHWwdbArUHXQddArYHbAdsArcHbgduArgHfQd9ArkHswezAroAAgAAAAAAAP/OADIAAAAAAAAAAAAAAAAAAAAAAAAAAAe0AAAAAwAkACUAJgAnACgAKQAqACsALAAtAC4ALwAwADEAMgAzADQANQA2ADcAOAA5ADoAOwA8AD0ARABFAEYARwBIAEkASgBLAEwATQBOAE8AUABRAFIAUwBUAFUAVgBXAFgAWQBaAFsAXABdAK0AyQDHAK4AYgECAQMAYwEEAQUBBgEHAQgBCQEKAQsBDAENAQ4BDwEQAREBEgETAJABFAEVARYBFwEYAGQA/QEZAP8BGgEbARwBHQEeAR8AywBlAMgBIADKASEBIgEjASQBJQEmAScBKAEpASoBKwEsAS0BLgEvATABMQEyAPgBMwE0ATUBNgE3ATgBOQE6ATsBPAE9AM8AzADNAT4AzgE/APoBQAFBAUIBQwFEAUUBRgFHAUgBSQFKAUsBTAFNAU4BTwFQAOIBUQFSAVMBVAFVAVYAZgFXAVgBWQFaANMA0ADRAK8AZwFbAVwBXQFeAV8BYAFhAWIBYwFkAWUBZgCRALABZwFoAWkBagFrAWwBbQFuAW8BcAFxAXIBcwF0AXUBdgF3AXgA5AF5AXoBewF8AX0BfgF/AYABgQGCAYMBhAGFANYA1ADVAYYAaAGHAYgBiQGKAYsBjAGNAY4BjwGQAZEBkgGTAZQBlQGWAZcBmAGZAZoBmwGcAZ0BngDrAZ8AuwGgAaEBogGjAaQA5gGlAaYBpwDpAO0BqAGpAaoAagBpAGsAbQBsAasBrABuAa0BrgGvAbABsQGyAbMBtAG1AbYBtwG4AbkBugG7AbwAoAG9Ab4BvwHAAcEAbwD+AcIBAAHDAcQBxQHGAccBAQBxAHAAcgHIAHMByQHKAcsBzAHNAc4BzwHQAdEB0gHTAdQB1QHWAdcB2AHZAdoA+QHbAdwB3QHeAd8B4AHhAeIB4wHkAHUAdAB2AeUAdwHmAecB6AHpAeoB6wHsANcB7QHuAe8B8AHxAfIB8wH0AfUB9gH3AfgA4wH5AfoB+wH8Af0B/gB4Af8CAAIBAgICAwB6AHkAewB9AHwCBAIFAgYCBwIIAgkCCgILAgwCDQIOAg8AoQCxAhACEQISAhMCFAIVAhYCFwIYAhkCGgIbAhwCHQIeAh8CIAIhAOUCIgIjAiQCJQCJAiYCJwIoAikCKgIrAiwCLQB/AH4AgAIuAIECLwIwAjECMgIzAjQCNQI2AjcCOAI5AjoCOwI8Aj0CPgI/AkACQQJCAkMCRAJFAkYCRwDsAkgAugJJAkoCSwJMAk0A5wJOAk8CUADqAO4CUQJSAlMCVAJVAlYCVwJYAlkCWgJbAlwCXQJeAl8CYAJhAmICYwJkAmUCZgJnAmgCaQJqAmsCbAJtAm4CbwJwAnECcgJzAnQCdQJ2AncCeAJ5AnoCewJ8An0CfgJ/AoACgQKCAoMChAKFAoYChwKIAokCigKLAowCjQKOAo8CkAKRApICkwKUApUClgKXApgCmQKaApsCnAKdAp4CnwKgAqECogKjAqQCpQKmAqcCqAKpAqoCqwKsAq0CrgKvArACsQKyArMCtAK1ArYCtwK4ArkCugK7ArwCvQK+Ar8CwALBAsICwwLEAsUCxgLHAsgCyQLKAssCzALNAs4CzwLQAtEC0gLTAtQC1QLWAtcC2ALZAtoC2wLcAt0C3gLfAuAC4QLiAuMC5ALlAuYAqALnAugC6QLqAusC7ALtAu4C7wLwAvEC8gLzAvQC9QL2AvcC+AL5AJ8C+gL7AvwC/QL+Av8DAAMBAwIDAwMEAwUDBgMHAwgDCQMKAwsDDAMNAJcDDgMPAxAAmwMRAxIDEwMUAxUDFgMXAxgDGQMaAxsDHAMdAx4DHwMgAyEDIgMjAyQDJQMmAycDKAMpAyoDKwMsAy0DLgMvAzADMQMyAzMDNAM1AzYDNwM4AzkDOgM7AzwDPQM+Az8DQANBA0IDQwNEA0UDRgNHA0gDSQNKA0sDTANNA04DTwNQA1EDUgNTA1QDVQNWA1cDWANZA1oDWwNcA10DXgNfA2ADYQNiA2MDZANlA2YDZwNoA2kDagNrA2wDbQNuA28DcANxA3IDcwN0A3UDdgN3A3gDeQN6A3sDfAN9A34DfwOAA4EDggODA4QDhQOGA4cDiAOJA4oDiwOMA40DjgOPA5ADkQOSA5MDlAOVA5YDlwOYA5kDmgObA5wDnQOeA58DoAOhA6IDowOkA6UDpgOnA6gDqQOqA6sDrAOtA64DrwOwA7EDsgOzA7QDtQO2A7cDuAO5A7oDuwO8A70DvgO/A8ADwQPCA8MDxAPFA8YDxwPIA8kDygPLA8wDzQPOA88D0APRA9ID0wPUA9UD1gPXA9gD2QPaA9sD3APdA94D3wPgA+ED4gPjA+QD5QPmA+cD6APpA+oD6wPsA+0D7gPvA/AD8QPyA/MD9AP1A/YD9wP4A/kD+gP7A/wD/QP+A/8EAAQBBAIEAwQEBAUEBgQHBAgECQQKBAsEDAQNBA4EDwQQBBEEEgQTBBQEFQQWBBcEGAQZBBoEGwQcBB0EHgQfBCAEIQQiBCMEJAQlBCYEJwQoBCkEKgQrBCwELQQuBC8EMAQxBDIEMwQ0BDUENgQ3BDgEOQQ6BDsEPAQ9BD4EPwRABEEEQgRDBEQERQRGBEcESARJBEoESwRMBE0ETgRPBFAEUQRSBFMEVARVBFYEVwRYBFkEWgRbBFwEXQReBF8EYARhBGIEYwRkBGUEZgRnBGgEaQRqBGsEbARtBG4EbwRwBHEEcgRzBHQEdQR2BHcEeAR5BHoEewR8BH0EfgR/BIAEgQSCBIMEhASFBIYEhwSIBIkEigSLBIwEjQSOBI8EkASRBJIEkwSUBJUElgSXBJgEmQSaBJsEnASdBJ4EnwSgBKEEogSjBKQEpQSmBKcEqASpBKoEqwSsBK0ErgSvBLAEsQSyBLMEtAS1BLYEtwS4BLkEugS7BLwEvQS+BL8EwATBAAkAEwAUABUAFgAXABgAGQAaABsAHATCBMMExATFBMYExwTIBMkEygTLBMwEzQTOBM8E0ATRBNIE0wTUBNUE1gTXBNgE2QTaBNsE3ATdBN4E3wTgBOEE4gTjBOQE5QTmBOcE6ATpBOoE6wTsBO0AEQAPAB0AHgCrAAQAowAiAKIACgAFALYAtwC0ALUAxADFAL4AvwCpAKoAEACyALME7gTvBPAE8QDDAIcAQgTyBPMACwAMAD4AQABeAGAAEgBfAD8A6AANAIIAwgCGAIgE9AT1BPYE9wT4BPkE+gT7BPwE/QT+BP8FAAUBBQIFAwCLBQQAigCMBQUFBgUHACMFCAAGBQkFCgULBQwFDQUOBQ8FEAURBRIFEwUUBRUFFgUXBRgFGQUaBRsFHAUdBR4FHwUgBSEFIgUjBSQFJQUmBScFKAUpBSoFKwUsBS0FLgUvBTAFMQUyBTMFNAU1BTYFNwU4BTkFOgU7BTwFPQU+BT8FQAVBBUIFQwVEBUUFRgVHBUgFSQVKBUsFTAVNBU4FTwVQBVEFUgVTBVQFVQVWBVcFWAVZBVoFWwVcBV0FXgVfBWAFYQViBWMFZAVlBWYFZwVoBWkFagVrBWwFbQVuBW8FcAVxBXIFcwV0BXUFdgV3BXgFeQV6BXsFfAV9BX4FfwWABYEFggWDBYQFhQWGBYcFiAWJBYoFiwWMBY0FjgWPBZAFkQWSBZMFlAWVBZYFlwWYBZkFmgWbBZwFnQWeBZ8FoAWhBaIFowWkBaUFpgWnBagFqQWqBasFrAWtBa4FrwWwBbEFsgWzBbQFtQW2BbcFuAW5BboFuwW8Bb0FvgW/BcAFwQXCBcMFxAXFBcYFxwXIBckFygXLBcwFzQXOBc8F0AXRBdIF0wXUBdUF1gXXBdgF2QXaBdsF3AXdBd4F3wXgBeEF4gXjBeQF5QXmBecF6AXpBeoF6wXsBe0F7gXvBfAF8QXyBfMF9AX1BfYF9wX4BfkF+gX7BfwF/QX+Bf8GAAYBBgIGAwYEBgUGBgYHBggGCQYKBgsGDAYNBg4GDwYQBhEGEgYTBhQGFQYWBhcGGAYZBhoGGwYcBh0GHgYfBiAGIQYiBiMGJAYlBiYGJwYoBikGKgYrBiwGLQYuBi8GMAYxBjIGMwY0BjUGNgY3BjgGOQY6BjsGPAY9Bj4GPwZABkEGQgZDBkQGRQZGBkcGSAZJBkoGSwZMBk0GTgZPBlAGUQZSBlMGVAZVBlYGVwZYBlkGWgZbBlwGXQZeBl8GYAZhBmIGYwZkBmUGZgZnBmgGaQZqBmsGbAZtBm4GbwZwBnEGcgZzBnQGdQZ2BncGeAZ5BnoGewZ8Bn0GfgZ/BoAGgQaCBoMGhAaFBoYGhwaIBokGigaLBowGjQaOBo8GkAaRBpIGkwaUBpUGlgaXBpgGmQaaBpsGnAadBp4GnwagBqEGogajBqQGpQamBqcGqAapBqoGqwasBq0GrgavBrAGsQayBrMGtAa1BrYGtwa4BrkGugCdBrsAnga8Br0Gvga/BsAGwQbCBsMGxAbFBsYGxwbIBskGygbLBswGzQbOBs8G0AbRBtIG0wbUBtUG1gbXBtgG2QbaBtsG3AbdBt4G3wbgBuEG4gbjBuQG5QbmBucG6AbpBuoG6wbsBu0G7gbvBvAG8QbyBvMG9Ab1BvYG9wb4BvkG+gb7BvwG/Qb+AIMAvQAHAIUAlgb/BwAAhAcBBwIHAwcEBwUHBgcHBwgHCQcKBwsHDAcNBw4HDwcQALwHEQcSAAgAxgD1APQA9gcTBxQHFQcWBxcHGAcZBxoHGwccBx0HHgcfByAHIQciAA4A7wDwALgHIwAgAB8AIQCUAJUAkwBBAI8AYQCnAKQAkgCYAJwApQCZAJoHJAclByYHJwcoBykHKgcrBywHLQcuBy8HMAcxBzIHMwc0BzUHNgc3BzgHOQC5BzoHOwc8Bz0HPgc/AEMAjQDYAOEHQAdBB0IHQwdEANkAjgDaANsA3QDfANwA3gDgB0UHRgdHB0gHSQdKB0sHTAdNB04HTwdQB1EHUgdTB1QHVQdWB1cHWAdZB1oHWwdcB10HXgdfB2AHYQdiB2MHZAdlB2YHZwdoB2kHagdrB2wHbQduB28HcAdxB3IHcwd0B3UHdgd3B3gHeQd6B3sHfAd9B34HfweAB4EHggeDB4QHhQeGB4cHiAeJB4oHiweMB40HjgePB5AHkQeSB5MHlAeVB5YHlweYB5kHmgebB5wHnQeeB58HoAehB6IHowekB6UHpgenB6gHqQeqB6sHrAetB64HrwewB7EHsgezB7QHtQe2B7cHuAe5B7oHuwe8B70HvgDAAMEHQW1hY3JvbgZBYnJldmUHdW5pMDFDRAd1bmkxRUEwB3VuaTFFQTIHdW5pMUVBNAd1bmkxRUE2B3VuaTFFQTgHdW5pMUVBQQd1bmkxRUFDB3VuaTFFQUUHdW5pMUVCMAd1bmkxRUIyB3VuaTFFQjQHdW5pMUVCNgdBb2dvbmVrCUFvZ29uZWsuZAt1bmkwMTA0MDMwMQd1bmkwMUZDB3VuaTAxRTIHdW5pMDI0Mwd1bmkxRTAyB3VuaTFFMDYLQ2NpcmN1bWZsZXgKQ2RvdGFjY2VudAZEY2Fyb24HdW5pMUUwQQd1bmkxRTBDB3VuaTFFMEUGRGNyb2F0BkVjYXJvbgdFbWFjcm9uBkVicmV2ZQpFZG90YWNjZW50B3VuaTFFQjgHdW5pMUVCQQd1bmkxRUJDB3VuaTFFQkUHdW5pMUVDMAd1bmkxRUMyB3VuaTFFQzQHdW5pMUVDNgdFb2dvbmVrCUVvZ29uZWsuZAt1bmkwMTE4MDMwMQd1bmkxRTE2B3VuaTFFMUUHdW5pMDFGNAtHY2lyY3VtZmxleApHZG90YWNjZW50B3VuaTAxMjIGR2Nhcm9uB3VuaTFFMjALdW5pMDA0NzAzMDMHdW5pMDE5MwtIY2lyY3VtZmxleAd1bmkxRTI0B3VuaTFFMkEJdW5pMUU5Ni5jBEhiYXIGSXRpbGRlB0ltYWNyb24HdW5pMDFDRgd1bmkxRUM4B3VuaTFFQ0EHSW9nb25lawt1bmkwMTJFMDMwMQd1bmkwMTJDC0pjaXJjdW1mbGV4B3VuaTAxMzYHdW5pMUUzMgd1bmkxRTM0BkxhY3V0ZQZMY2Fyb24HdW5pMDEzQgRMZG90B3VuaTFFMzYHdW5pMUUzOAd1bmkxRTNBB3VuaTFFM0UHdW5pMUU0MAd1bmkxRTQyBk5hY3V0ZQd1bmkwMUY4Bk5jYXJvbgd1bmkwMTQ1B3VuaTFFNDQHdW5pMUU0Ngd1bmkxRTQ4B09tYWNyb24NT2h1bmdhcnVtbGF1dAd1bmkwMUQxB3VuaTFFQ0MHdW5pMUVDRQd1bmkxRUQwB3VuaTFFRDIHdW5pMUVENAd1bmkxRUQ2B3VuaTFFRDgHdW5pMDE0RQd1bmkxRTUyBU9ob3JuB3VuaTFFREEHdW5pMUVEQwd1bmkxRURFB3VuaTFFRTAHdW5pMUVFMgd1bmkwMUVBC3VuaTAxRUEwMzAxB3VuaTFFNTYGUmFjdXRlBlJjYXJvbgd1bmkxRTU4B3VuaTAxNTYHdW5pMUU1QQd1bmkxRTVDB3VuaTFFNUUGU2FjdXRlC1NjaXJjdW1mbGV4B3VuaTAxNUUHdW5pMDIxOAd1bmkxRTYwB3VuaTFFNjIHdW5pMUU5RQZUY2Fyb24HdW5pMUU2QQd1bmkwMTYyB3VuaTAyMUEHdW5pMUU2Qwd1bmkxRTZFCXVuaTFFOTcuYwd1bmkwMTY2BlV0aWxkZQdVbWFjcm9uBlVicmV2ZQVVcmluZw1VaHVuZ2FydW1sYXV0B3VuaTAxRDMHdW5pMDFENQd1bmkwMUQ3B3VuaTAxRDkHdW5pMDFEQgd1bmkxRUU0B3VuaTFFRTYFVWhvcm4HdW5pMUVFOAd1bmkxRUVBB3VuaTFFRUMHdW5pMUVFRQd1bmkxRUYwB1VvZ29uZWsLdW5pMDE3MjAzMDEGV2dyYXZlBldhY3V0ZQtXY2lyY3VtZmxleAlXZGllcmVzaXMGWWdyYXZlC1ljaXJjdW1mbGV4B3VuaTFFOEUHdW5pMUVGNAd1bmkxRUY2B3VuaTFFRjgGWmFjdXRlClpkb3RhY2NlbnQHdW5pMUU5Mgd1bmkxRTk0B3VuaTAxOEYHdW5pMDE0QQd1bmkwMTMyB2FtYWNyb24GYWJyZXZlB3VuaTAxQ0UHdW5pMUVBMQd1bmkxRUEzB3VuaTFFQTUHdW5pMUVBNwd1bmkxRUE5B3VuaTFFQUIHdW5pMUVBRAd1bmkxRUFGB3VuaTFFQjEHdW5pMUVCMwd1bmkxRUI1B3VuaTFFQjcHYW9nb25lawlhb2dvbmVrLmQLdW5pMDEwNTAzMDEHdW5pMDFGRAd1bmkwMUUzB3VuaTAxODAHdW5pMUUwMwd1bmkxRTA3C2NjaXJjdW1mbGV4CmNkb3RhY2NlbnQGZGNhcm9uB3VuaTFFMEIHdW5pMUUwRAd1bmkxRTBGBmVjYXJvbgdlbWFjcm9uBmVicmV2ZQplZG90YWNjZW50B3VuaTFFQjkHdW5pMUVCQgd1bmkxRUJEB3VuaTFFQkYHdW5pMUVDMQd1bmkxRUMzB3VuaTFFQzUHdW5pMUVDNwdlb2dvbmVrCWVvZ29uZWsuZAt1bmkwMTE5MDMwMQd1bmkxRTE3B3VuaTFFMUYHdW5pMDFGNQtnY2lyY3VtZmxleApnZG90YWNjZW50B3VuaTAxMjMGZ2Nhcm9uB3VuaTFFMjELdW5pMDA2NzAzMDMLaGNpcmN1bWZsZXgHdW5pMUUyNQd1bmkxRTk2B3VuaTFFMkIEaGJhcgZpdGlsZGUHaW1hY3Jvbgd1bmkwMUQwB3VuaTFFQzkHdW5pMUVDQgdpb2dvbmVrC3VuaTAxMkYwMzAxB3VuaTAxMkQLamNpcmN1bWZsZXgHdW5pMDEzNwd1bmkxRTMzB3VuaTFFMzUMa2dyZWVubGFuZGljBmxhY3V0ZQZsY2Fyb24EbGRvdAd1bmkwMTNDB3VuaTFFMzcHdW5pMUUzOQd1bmkxRTNCB3VuaTFFM0YHdW5pMUU0MQd1bmkxRTQzBm5hY3V0ZQd1bmkwMUY5Bm5jYXJvbgd1bmkwMTQ2B3VuaTFFNDUHdW5pMUU0Nwd1bmkxRTQ5C25hcG9zdHJvcGhlB29tYWNyb24Nb2h1bmdhcnVtbGF1dAd1bmkwMUQyB3VuaTFFQ0QHdW5pMUVDRgd1bmkxRUQxB3VuaTFFRDMHdW5pMUVENQd1bmkxRUQ3B3VuaTFFRDkHdW5pMDE0Rgd1bmkxRTUzBW9ob3JuB3VuaTFFREIHdW5pMUVERAd1bmkxRURGB3VuaTFFRTEHdW5pMUVFMwd1bmkwMUVCC3VuaTAxRUIwMzAxB3VuaTFFNTcGcmFjdXRlB3VuaTAxNTcGcmNhcm9uB3VuaTFFNTkHdW5pMUU1Qgd1bmkxRTVEB3VuaTFFNUYGc2FjdXRlC3NjaXJjdW1mbGV4B3VuaTAxNUYHdW5pMDIxOQd1bmkxRTYxB3VuaTFFNjMGdGNhcm9uB3VuaTFFNkIHdW5pMDE2Mwd1bmkwMjFCB3VuaTFFNkQHdW5pMUU2Rgd1bmkxRTk3B3VuaTAxNjcGdXRpbGRlB3VtYWNyb24GdWJyZXZlBXVyaW5nDXVodW5nYXJ1bWxhdXQHdW5pMDFENAd1bmkwMUQ2B3VuaTAxRDgHdW5pMDFEQQd1bmkwMURDB3VuaTFFRTUHdW5pMUVFNwV1aG9ybgd1bmkxRUU5B3VuaTFFRUIHdW5pMUVFRAd1bmkxRUVGB3VuaTFFRjEHdW9nb25lawl1b2dvbmVrLmQLdW5pMDE3MzAzMDEGd2dyYXZlBndhY3V0ZQt3Y2lyY3VtZmxleAl3ZGllcmVzaXMGeWdyYXZlC3ljaXJjdW1mbGV4B3VuaTFFOEYHdW5pMUVGNQd1bmkxRUY3B3VuaTFFRjkGemFjdXRlCnpkb3RhY2NlbnQHdW5pMUU5Mwd1bmkxRTk1B3VuaTAxNEIHdW5pMDIzNwd1bmkwMTMzB3VuaTAyNTAHdW5pMDI1Mgd1bmkwMjUzB3VuaUE3QjUHdW5pMDI1NQd1bmlBQjUzB3VuaTAyNTYHdW5pMDI1Nwd1bmkwMjU4B3VuaTAyNTEHdW5pMDI5OQd1bmkwMkE0B3VuaTAyNTkHdW5pMDI1QQd1bmkwMjVCB3VuaTAyNUMHdW5pMDI1RQd1bmkwMjVGB3VuaTAyNjAHdW5pMDI2MQd1bmkwMjYyB3VuaTAyNjMHdW5pMDI2NQd1bmkwMjY2B3VuaTAyNjcHdW5pMDI5Qwd1bmkwMjY4B3VuaTAyNkEHdW5pMDI2OQd1bmkwMjlEB3VuaTAyNkIHdW5pMDI2Qwd1bmkwMjZEB3VuaTAyNkUHdW5pMDI5Rgd1bmkwMjZGB3VuaTAyNzAHdW5pMDI3MQd1bmkwMjcyB3VuaTAyNzMHdW5pMDI3NAd1bmkwMjU0B3VuaTAyNjQHdW5pMDI3NQd1bmkwMjc2B3VuaTAyNzcHdW5pMDI3OAd1bmkwMjc5B3VuaTAyN0EHdW5pMDI3Qgd1bmkwMjdEB3VuaTAyN0UHdW5pMDI4MAd1bmkwMjgxB3VuaTAyODIHdW5pMDI4Mwd1bmkwMjg0B3VuaTAyODgHdW5pMDJBNwd1bmkwMjg5B3VuaTAyOEEHdW5pMDI4Qgd1bmkwMjhDB3VuaTAyOEQHdW5pMDI4RQd1bmkwMjhGB3VuaTAyOTAHdW5pMDI5MQd1bmkwMjkyB3VuaTFEMjUHdW5pMDI5NAd1bmkwMjk1B3VuaTAyQTEHdW5pMDJBMgd1bmkwMUMyB3VuaTAxQzMHdW5pMDI5OANmX2YFZl9mX2kFZl9mX2wDZl90BWZfZl90A0kuYQhJZ3JhdmUuYQhJYWN1dGUuYQ1JY2lyY3VtZmxleC5hCEl0aWxkZS5hC0lkaWVyZXNpcy5hCUltYWNyb24uYQxJZG90YWNjZW50LmEJdW5pMDFDRi5hCXVuaTFFQzguYQl1bmkxRUNBLmEJdW5pMDEyQy5hCUlvZ29uZWsuYQ11bmkwMTJFMDMwMS5hCXVuaTAxNEEuYQNhLmEIYWdyYXZlLmEIYWFjdXRlLmENYWNpcmN1bWZsZXguYQhhdGlsZGUuYQthZGllcmVzaXMuYQlhbWFjcm9uLmEIYWJyZXZlLmEHYXJpbmcuYQl1bmkwMUNFLmEJdW5pMUVBMS5hCXVuaTFFQTMuYQl1bmkxRUE1LmEJdW5pMUVBNy5hCXVuaTFFQTkuYQl1bmkxRUFCLmEJdW5pMUVBRC5hCXVuaTFFQUYuYQl1bmkxRUIxLmEJdW5pMUVCMy5hCXVuaTFFQjUuYQl1bmkxRUI3LmEJYW9nb25lay5hCWFvZ29uZWsuYg11bmkwMTA1MDMwMS5hA2cuYQl1bmkwMUY1LmENZ2NpcmN1bWZsZXguYQhnYnJldmUuYQxnZG90YWNjZW50LmEJdW5pMDEyMy5hCGdjYXJvbi5hCXVuaTFFMjEuYQ11bmkwMDY3MDMwMy5hA2wuYQhsYWN1dGUuYQhsY2Fyb24uYQZsZG90LmEJdW5pMDEzQy5hCXVuaTFFMzcuYQl1bmkxRTM5LmEJdW5pMUUzQi5hCGxzbGFzaC5hBGZsLmEJaW9nb25lay54CXVuaTAyNjgueAl1bmkwMjlELngFQWxwaGEEQmV0YQVHYW1tYQdFcHNpbG9uBFpldGEDRXRhBVRoZXRhBElvdGEFS2FwcGEGTGFtYmRhAk11Ak51AlhpB09taWNyb24CUGkDUmhvBVNpZ21hA1RhdQdVcHNpbG9uA1BoaQNDaGkDUHNpCkFscGhhdG9ub3MMRXBzaWxvbnRvbm9zCEV0YXRvbm9zCUlvdGF0b25vcwxJb3RhZGllcmVzaXMMT21pY3JvbnRvbm9zDFVwc2lsb250b25vcw9VcHNpbG9uZGllcmVzaXMKT21lZ2F0b25vcwVhbHBoYQRiZXRhBWdhbW1hBWRlbHRhB2Vwc2lsb24EemV0YQNldGEFdGhldGEEaW90YQVrYXBwYQZsYW1iZGECbnUCeGkHb21pY3JvbgNyaG8Fc2lnbWEDdGF1B3Vwc2lsb24DcGhpA2NoaQNwc2kFb21lZ2EHdW5pMDNDMgd1bmkwM0QwB3VuaTAzRDEFcGhpLmEKYWxwaGF0b25vcwxlcHNpbG9udG9ub3MIZXRhdG9ub3MJaW90YXRvbm9zDGlvdGFkaWVyZXNpcwxvbWljcm9udG9ub3MMdXBzaWxvbnRvbm9zD3Vwc2lsb25kaWVyZXNpcwpvbWVnYXRvbm9zEWlvdGFkaWVyZXNpc3Rvbm9zFHVwc2lsb25kaWVyZXNpc3Rvbm9zB3VuaTFGMDgHdW5pMUYwOQd1bmkxRkJBB3VuaTFGQkIHdW5pMUYwQQd1bmkxRjBCB3VuaTFGMEMHdW5pMUYwRAd1bmkxRjBFB3VuaTFGMEYHdW5pMUZCOAd1bmkxRkI5B3VuaTFGMTgHdW5pMUYxOQd1bmkxRkM4B3VuaTFGQzkHdW5pMUYxQQd1bmkxRjFCB3VuaTFGMUMHdW5pMUYxRAd1bmkxRjI4B3VuaTFGMjkHdW5pMUZDQQd1bmkxRkNCB3VuaTFGMkEHdW5pMUYyQgd1bmkxRjJDB3VuaTFGMkQHdW5pMUYyRQd1bmkxRjJGB3VuaTFGMzgHdW5pMUYzOQd1bmkxRkRBB3VuaTFGREIHdW5pMUYzQQd1bmkxRjNCB3VuaTFGM0MHdW5pMUYzRAd1bmkxRjNFB3VuaTFGM0YHdW5pMUZEOAd1bmkxRkQ5B3VuaTFGNDgHdW5pMUY0OQd1bmkxRkY4B3VuaTFGRjkHdW5pMUY0QQd1bmkxRjRCB3VuaTFGNEMHdW5pMUY0RAd1bmkxRkVDB3VuaTFGNTkHdW5pMUZFQQd1bmkxRkVCB3VuaTFGNUIHdW5pMUY1RAd1bmkxRjVGB3VuaTFGRTgHdW5pMUZFOQd1bmkxRjY4B3VuaTFGNjkHdW5pMUZGQQd1bmkxRkZCB3VuaTFGNkEHdW5pMUY2Qgd1bmkxRjZDB3VuaTFGNkQHdW5pMUY2RQd1bmkxRjZGB3VuaTFGQkMHdW5pMUY4OAd1bmkxRjg5B3VuaTFGOEEHdW5pMUY4Qgd1bmkxRjhDB3VuaTFGOEQHdW5pMUY4RQd1bmkxRjhGB3VuaTFGQ0MHdW5pMUY5OAd1bmkxRjk5B3VuaTFGOUEHdW5pMUY5Qgd1bmkxRjlDB3VuaTFGOUQHdW5pMUY5RQd1bmkxRjlGB3VuaTFGRkMHdW5pMUZBOAd1bmkxRkE5B3VuaTFGQUEHdW5pMUZBQgd1bmkxRkFDB3VuaTFGQUQHdW5pMUZBRQd1bmkxRkFGB3VuaTFGMDAHdW5pMUYwMQd1bmkxRjcwB3VuaTFGNzEHdW5pMUYwMgd1bmkxRjAzB3VuaTFGMDQHdW5pMUYwNQd1bmkxRjA2B3VuaTFGMDcHdW5pMUZCMAd1bmkxRkIxB3VuaTFGQjYHdW5pMUYxMAd1bmkxRjExB3VuaTFGNzIHdW5pMUY3Mwd1bmkxRjEyB3VuaTFGMTMHdW5pMUYxNAd1bmkxRjE1B3VuaTFGMjAHdW5pMUYyMQd1bmkxRjc0B3VuaTFGNzUHdW5pMUYyMgd1bmkxRjIzB3VuaTFGMjQHdW5pMUYyNQd1bmkxRjI2B3VuaTFGMjcHdW5pMUZDNgd1bmkxRjMwB3VuaTFGMzEHdW5pMUY3Ngd1bmkxRjc3B3VuaTFGMzIHdW5pMUYzMwd1bmkxRjM0B3VuaTFGMzUHdW5pMUYzNgd1bmkxRjM3B3VuaTFGRDAHdW5pMUZEMQd1bmkxRkQ2B3VuaTFGRDIHdW5pMUZEMwd1bmkxRkQ3B3VuaTFGNDAHdW5pMUY0MQd1bmkxRjc4B3VuaTFGNzkHdW5pMUY0Mgd1bmkxRjQzB3VuaTFGNDQHdW5pMUY0NQd1bmkxRkU0B3VuaTFGRTUHdW5pMUY1MAd1bmkxRjUxB3VuaTFGN0EHdW5pMUY3Qgd1bmkxRjUyB3VuaTFGNTMHdW5pMUY1NAd1bmkxRjU1B3VuaTFGNTYHdW5pMUY1Nwd1bmkxRkU2B3VuaTFGRTAHdW5pMUZFMQd1bmkxRkUyB3VuaTFGRTMHdW5pMUZFNwd1bmkxRjYwB3VuaTFGNjEHdW5pMUY3Qwd1bmkxRjdEB3VuaTFGNjIHdW5pMUY2Mwd1bmkxRjY0B3VuaTFGNjUHdW5pMUY2Ngd1bmkxRjY3B3VuaTFGRjYHdW5pMUZCMwd1bmkxRjgwB3VuaTFGODEHdW5pMUZCMgd1bmkxRkI0B3VuaTFGODIHdW5pMUY4Mwd1bmkxRjg0B3VuaTFGODUHdW5pMUY4Ngd1bmkxRjg3B3VuaTFGQjcHdW5pMUZDMwd1bmkxRjkwB3VuaTFGOTEHdW5pMUZDMgd1bmkxRkM0B3VuaTFGOTIHdW5pMUY5Mwd1bmkxRjk0B3VuaTFGOTUHdW5pMUY5Ngd1bmkxRjk3B3VuaTFGQzcHdW5pMUZGMwd1bmkxRkEwB3VuaTFGQTEHdW5pMUZGMgd1bmkxRkY0B3VuaTFGQTIHdW5pMUZBMwd1bmkxRkE0B3VuaTFGQTUHdW5pMUZBNgd1bmkxRkE3B3VuaTFGRjcHdW5pMDNENwd1bmkwM0Q5B3VuaTAzREIHdW5pMDNERAd1bmkwM0UxB3VuaTAzN0UJYW5vdGVsZWlhDWFub3RlbGVpYS5jYXAHdW5pMDM3NAd1bmkwMzc1BXRvbm9zCXRvbm9zLmNhcA1kaWVyZXNpc3Rvbm9zB3VuaTAzN0EHdW5pMUZCRQd1bmkxRkJEB3VuaTFGQkYHdW5pMUZGRQd1bmkxRkVGB3VuaTFGRkQHdW5pMUZDRAd1bmkxRkREB3VuaTFGQ0UHdW5pMUZERQd1bmkxRkNGB3VuaTFGREYHdW5pMUZDMAd1bmkxRkVEB3VuaTFGRUUHdW5pMUZDMQt1bmkxRkJELmNhcAt1bmkxRkZFLmNhcAt1bmkxRkVGLmNhcAt1bmkxRkNELmNhcAt1bmkxRkRELmNhcAt1bmkxRkNFLmNhcAt1bmkxRkRFLmNhcAt1bmkxRkNGLmNhcAt1bmkxRkRGLmNhcAd1bmkwNDEwB3VuaTA0MTEHdW5pMDQxMgd1bmkwNDEzB3VuaTA0MTQHdW5pMDQxNQd1bmkwNDE2B3VuaTA0MTcHdW5pMDQxOAd1bmkwNDE5B3VuaTA0MUEHdW5pMDQxQgd1bmkwNDFDB3VuaTA0MUQHdW5pMDQxRQd1bmkwNDFGB3VuaTA0MjAHdW5pMDQyMQd1bmkwNDIyB3VuaTA0MjMHdW5pMDQyNAd1bmkwNDI1B3VuaTA0MjYHdW5pMDQyNwd1bmkwNDI4B3VuaTA0MjkHdW5pMDQyQQd1bmkwNDJCB3VuaTA0MkMHdW5pMDQyRAd1bmkwNDJFB3VuaTA0MkYHdW5pMDQwMAd1bmkwNDAxB3VuaTA0MDIHdW5pMDQwMwd1bmkwNDA0B3VuaTA0MDUHdW5pMDQwNgd1bmkwNDA3CXVuaTA0MDcuYQd1bmkwNDA4B3VuaTA0MDkHdW5pMDQwQQd1bmkwNDBCB3VuaTA0MEMHdW5pMDQwRAd1bmkwNDBFB3VuaTA0MEYHdW5pMDQ2Mgd1bmkwNDcyB3VuaTA0NzQHdW5pMDQ5MAd1bmkwNDkyB3VuaTA0OTYHdW5pMDQ5OAd1bmkwNDlBB3VuaTA0QTAHdW5pMDRBMgd1bmkwNEFBB3VuaTA0QUUHdW5pMDRCMAd1bmkwNEIyB3VuaTA0QjYHdW5pMDRCQQd1bmkwNEMwB3VuaTA0QzEHdW5pMDREMAd1bmkwNEQ0B3VuaTA0RDYHdW5pMDREOAd1bmkwNEUyB3VuaTA0RTYHdW5pMDRFOAd1bmkwNEVFB3VuaTA0RjIHdW5pMDQzMAd1bmkwNDMxB3VuaTA0MzIHdW5pMDQzMwd1bmkwNDM0B3VuaTA0MzUHdW5pMDQzNgd1bmkwNDM3B3VuaTA0MzgHdW5pMDQzOQd1bmkwNDNBB3VuaTA0M0IHdW5pMDQzQwd1bmkwNDNEB3VuaTA0M0UHdW5pMDQzRgd1bmkwNDQwB3VuaTA0NDEHdW5pMDQ0Mgd1bmkwNDQzB3VuaTA0NDQHdW5pMDQ0NQd1bmkwNDQ2B3VuaTA0NDcHdW5pMDQ0OAd1bmkwNDQ5B3VuaTA0NEEHdW5pMDQ0Qgd1bmkwNDRDB3VuaTA0NEQHdW5pMDQ0RQd1bmkwNDRGB3VuaTA0NTAHdW5pMDQ1MQd1bmkwNDUyB3VuaTA0NTMHdW5pMDQ1NAd1bmkwNDU1B3VuaTA0NTYHdW5pMDQ1Nwl1bmkwNDU3LmEHdW5pMDQ1OAd1bmkwNDU5B3VuaTA0NUEHdW5pMDQ1Qgd1bmkwNDVDB3VuaTA0NUQHdW5pMDQ1RQd1bmkwNDVGB3VuaTA0NjMHdW5pMDQ3Mwd1bmkwNDc1B3VuaTA0OTEHdW5pMDQ5Mwd1bmkwNDk3B3VuaTA0OTkHdW5pMDQ5Qgd1bmkwNEExB3VuaTA0QTMHdW5pMDRBQgd1bmkwNEFGB3VuaTA0QjEHdW5pMDRCMwd1bmkwNEI3B3VuaTA0QkIHdW5pMDRDMgd1bmkwNENGB3VuaTA0RDEHdW5pMDRENQd1bmkwNEQ3B3VuaTA0RDkHdW5pMDRFMwd1bmkwNEU3B3VuaTA0RTkHdW5pMDRFRgd1bmkwNEYzC3VuaTA0MzEuc3JiB3VuaTIxMTYGemVyby4wB3plcm8uMHMJemVyby5wbnVtCG9uZS5wbnVtCHR3by5wbnVtCnRocmVlLnBudW0JZm91ci5wbnVtCWZpdmUucG51bQhzaXgucG51bQpzZXZlbi5wbnVtCmVpZ2h0LnBudW0JbmluZS5wbnVtB3plcm8uMHAIemVyby4wcHMJemVyby50bnVtCG9uZS50bnVtCHR3by50bnVtCnRocmVlLnRudW0JZm91ci50bnVtCWZpdmUudG51bQhzaXgudG51bQpzZXZlbi50bnVtCmVpZ2h0LnRudW0JbmluZS50bnVtCXplcm8ub251bQhvbmUub251bQh0d28ub251bQp0aHJlZS5vbnVtCWZvdXIub251bQlmaXZlLm9udW0Ic2l4Lm9udW0Kc2V2ZW4ub251bQplaWdodC5vbnVtCW5pbmUub251bQZ6ZXJvLmMFb25lLmMFdHdvLmMHdGhyZWUuYwZmb3VyLmMGZml2ZS5jBXNpeC5jB3NldmVuLmMHZWlnaHQuYwZuaW5lLmMHdW5pMkUzQQd1bmkyRTNCCmZpZ3VyZWRhc2gHdW5pMjAxNQd1bmkyMDNFB3VuaTIwM0YHdW5pMjAxNgd1bmkyMDNDB3VuaTIwNDcHdW5pMjA0OQd1bmkyMDQ4B3VuaTIwM0QHdW5pMjMxQwd1bmkyMzFEB3VuaTIzMUUHdW5pMjMxRgd1bmkyN0U2B3VuaTI3RTcHdW5pMkUyMgd1bmkyRTIzB3VuaTJFMjQHdW5pMkUyNQd1bmkyMTE3B3VuaTIxMjAGdTFGMTZBBnUxRjE2QgdhdC5jYXNlA2kudANBLnMDQi5zA0MucwNELnMDRS5zA0YucwNHLnMDSC5zA0kucwNKLnMDSy5zA0wucwNNLnMDTi5zA08ucwNQLnMDUS5zA1IucwNTLnMDVC5zA1UucwNWLnMDVy5zA1gucwNZLnMDWi5zCEFncmF2ZS5zCEFhY3V0ZS5zDUFjaXJjdW1mbGV4LnMIQXRpbGRlLnMLQWRpZXJlc2lzLnMJQW1hY3Jvbi5zCEFicmV2ZS5zB0FyaW5nLnMJdW5pMDFDRC5zCXVuaTFFQTAucwl1bmkxRUEyLnMJdW5pMUVBNC5zCXVuaTFFQTYucwl1bmkxRUE4LnMJdW5pMUVBQS5zCXVuaTFFQUMucwl1bmkxRUFFLnMJdW5pMUVCMC5zCXVuaTFFQjIucwl1bmkxRUI0LnMJdW5pMUVCNi5zCUFvZ29uZWsucwpBb2dvbmVrLnNhDXVuaTAxMDQwMzAxLnMEQUUucwl1bmkwMUZDLnMJdW5pMDFFMi5zCXVuaTAyNDMucwl1bmkxRTAyLnMJdW5pMUUwNi5zCkNjZWRpbGxhLnMIQ2FjdXRlLnMNQ2NpcmN1bWZsZXgucwhDY2Fyb24ucwxDZG90YWNjZW50LnMIRGNhcm9uLnMJdW5pMUUwQS5zCXVuaTFFMEMucwl1bmkxRTBFLnMIRGNyb2F0LnMIRWdyYXZlLnMIRWFjdXRlLnMNRWNpcmN1bWZsZXgucwhFY2Fyb24ucwtFZGllcmVzaXMucwlFbWFjcm9uLnMIRWJyZXZlLnMMRWRvdGFjY2VudC5zCXVuaTFFQjgucwl1bmkxRUJBLnMJdW5pMUVCQy5zCXVuaTFFQkUucwl1bmkxRUMwLnMJdW5pMUVDMi5zCXVuaTFFQzQucwl1bmkxRUM2LnMJRW9nb25lay5zCkVvZ29uZWsuc2ENdW5pMDExODAzMDEucwl1bmkxRTE2LnMJdW5pMUUxRS5zCXVuaTAxRjQucw1HY2lyY3VtZmxleC5zCEdicmV2ZS5zDEdkb3RhY2NlbnQucwl1bmkwMTIyLnMIR2Nhcm9uLnMJdW5pMUUyMC5zDXVuaTAwNDcwMzAzLnMJdW5pMDE5My5zDUhjaXJjdW1mbGV4LnMJdW5pMUUyNC5zCXVuaTFFMkEucwl1bmkxRTk2LnMGSGJhci5zCElncmF2ZS5zCElhY3V0ZS5zDUljaXJjdW1mbGV4LnMISXRpbGRlLnMLSWRpZXJlc2lzLnMJSW1hY3Jvbi5zDElkb3RhY2NlbnQucwl1bmkwMUNGLnMJdW5pMUVDOC5zCXVuaTFFQ0Eucw11bmkwMTJFMDMwMS5zCUlvZ29uZWsucwl1bmkwMTJDLnMNSmNpcmN1bWZsZXgucwl1bmkwMTM2LnMJdW5pMUUzMi5zCXVuaTFFMzQucwhMYWN1dGUucwhMY2Fyb24ucwl1bmkwMTNCLnMGTGRvdC5zCXVuaTFFMzYucwl1bmkxRTM4LnMJdW5pMUUzQS5zCExzbGFzaC5zCXVuaTFFM0Uucwl1bmkxRTQwLnMJdW5pMUU0Mi5zCE5hY3V0ZS5zCXVuaTAxRjgucwhOY2Fyb24ucwhOdGlsZGUucwl1bmkwMTQ1LnMJdW5pMUU0NC5zCXVuaTFFNDYucwl1bmkxRTQ4LnMIT2dyYXZlLnMIT2FjdXRlLnMNT2NpcmN1bWZsZXgucwhPdGlsZGUucwtPZGllcmVzaXMucwlPbWFjcm9uLnMPT2h1bmdhcnVtbGF1dC5zCXVuaTAxRDEucwl1bmkxRUNDLnMJdW5pMUVDRS5zCXVuaTFFRDAucwl1bmkxRUQyLnMJdW5pMUVENC5zCXVuaTFFRDYucwl1bmkxRUQ4LnMIT3NsYXNoLnMET0UucwdPaG9ybi5zCXVuaTFFREEucwl1bmkxRURDLnMJdW5pMUVERS5zCXVuaTFFRTAucwl1bmkxRUUyLnMJdW5pMDFFQS5zDXVuaTAxRUEwMzAxLnMJdW5pMDE0RS5zCXVuaTFFNTIucwl1bmkxRTU2LnMIUmFjdXRlLnMJdW5pMUU1OC5zCFJjYXJvbi5zCXVuaTAxNTYucwl1bmkxRTVBLnMJdW5pMUU1Qy5zCXVuaTFFNUUucwhTYWN1dGUucw1TY2lyY3VtZmxleC5zCFNjYXJvbi5zCXVuaTAxNUUucwl1bmkwMjE4LnMJdW5pMUU2MC5zCXVuaTFFNjIucwxnZXJtYW5kYmxzLnMJdW5pMUU5RS5zCFRjYXJvbi5zCXVuaTFFNkEucwl1bmkwMTYyLnMJdW5pMDIxQS5zCXVuaTFFNkMucwl1bmkxRTZFLnMJdW5pMUU5Ny5zCXVuaTAxNjYucwhVZ3JhdmUucwhVYWN1dGUucw1VY2lyY3VtZmxleC5zCFV0aWxkZS5zC1VkaWVyZXNpcy5zCVVtYWNyb24ucwhVYnJldmUucwdVcmluZy5zD1VodW5nYXJ1bWxhdXQucwl1bmkwMUQzLnMJdW5pMDFENS5zCXVuaTAxRDcucwl1bmkwMUQ5LnMJdW5pMDFEQi5zCXVuaTFFRTQucwl1bmkxRUU2LnMHVWhvcm4ucwl1bmkxRUU4LnMJdW5pMUVFQS5zCXVuaTFFRUMucwl1bmkxRUVFLnMJdW5pMUVGMC5zCVVvZ29uZWsucw11bmkwMTcyMDMwMS5zCFdncmF2ZS5zCFdhY3V0ZS5zDVdjaXJjdW1mbGV4LnMLV2RpZXJlc2lzLnMIWWdyYXZlLnMIWWFjdXRlLnMNWWNpcmN1bWZsZXgucwtZZGllcmVzaXMucwl1bmkxRThFLnMJdW5pMUVGNC5zCXVuaTFFRjYucwl1bmkxRUY4LnMIWmFjdXRlLnMIWmNhcm9uLnMMWmRvdGFjY2VudC5zCXVuaTFFOTIucwl1bmkxRTk0LnMFRXRoLnMHVGhvcm4ucwl1bmkwMThGLnMJdW5pMDE0QS5zCXVuaTAxMzIucwp1bmkwMTRBLnNhB0FscGhhLnMGQmV0YS5zB0dhbW1hLnMJdW5pMDM5NC5zCUVwc2lsb24ucwZaZXRhLnMFRXRhLnMHVGhldGEucwZJb3RhLnMHS2FwcGEucwhMYW1iZGEucwRNdS5zBE51LnMEWGkucwlPbWljcm9uLnMEUGkucwVSaG8ucwdTaWdtYS5zBVRhdS5zCVVwc2lsb24ucwVQaGkucwVDaGkucwVQc2kucwl1bmkwM0E5LnMOSW90YWRpZXJlc2lzLnMRVXBzaWxvbmRpZXJlc2lzLnMOQWxwaGFpb3Rhc3ViLnMMRXRhaW90YXN1Yi5zDk9tZWdhaW90YXN1Yi5zCXVuaTA0MTAucwl1bmkwNDExLnMJdW5pMDQxMi5zCXVuaTA0MTMucwl1bmkwNDE0LnMJdW5pMDQxNS5zCXVuaTA0MTYucwl1bmkwNDE3LnMJdW5pMDQxOC5zCXVuaTA0MTkucwl1bmkwNDFBLnMJdW5pMDQxQi5zCXVuaTA0MUMucwl1bmkwNDFELnMJdW5pMDQxRS5zCXVuaTA0MUYucwl1bmkwNDIwLnMJdW5pMDQyMS5zCXVuaTA0MjIucwl1bmkwNDIzLnMJdW5pMDQyNC5zCXVuaTA0MjUucwl1bmkwNDI2LnMJdW5pMDQyNy5zCXVuaTA0Mjgucwl1bmkwNDI5LnMJdW5pMDQyQS5zCXVuaTA0MkIucwl1bmkwNDJDLnMJdW5pMDQyRC5zCXVuaTA0MkUucwl1bmkwNDJGLnMJdW5pMDQwMC5zCXVuaTA0MDEucwl1bmkwNDAyLnMJdW5pMDQwMy5zCXVuaTA0MDQucwl1bmkwNDA1LnMJdW5pMDQwNi5zCXVuaTA0MDcucwp1bmkwNDA3LnNhCXVuaTA0MDgucwl1bmkwNDA5LnMJdW5pMDQwQS5zCXVuaTA0MEIucwl1bmkwNDBDLnMJdW5pMDQwRC5zCXVuaTA0MEUucwl1bmkwNDBGLnMJdW5pMDQ2Mi5zCXVuaTA0NzIucwl1bmkwNDc0LnMJdW5pMDQ5MC5zCXVuaTA0OTIucwl1bmkwNDk2LnMJdW5pMDQ5OC5zCXVuaTA0OUEucwl1bmkwNEEwLnMJdW5pMDRBMi5zCXVuaTA0QUEucwl1bmkwNEFFLnMJdW5pMDRCMC5zCXVuaTA0QjIucwl1bmkwNEI2LnMJdW5pMDRCQS5zCXVuaTA0QzAucwl1bmkwNEMxLnMJdW5pMDREMC5zCXVuaTA0RDQucwl1bmkwNEQ2LnMJdW5pMDREOC5zCXVuaTA0RTIucwl1bmkwNEU2LnMJdW5pMDRFOC5zCXVuaTA0RUUucwl1bmkwNEYyLnMLYW1wZXJzYW5kLnMGemVyby5zBW9uZS5zBXR3by5zB3RocmVlLnMGZm91ci5zBmZpdmUucwVzaXgucwdzZXZlbi5zB2VpZ2h0LnMGbmluZS5zCGV4Y2xhbS5zDGV4Y2xhbWRvd24ucwpxdWVzdGlvbi5zDnF1ZXN0aW9uZG93bi5zDXF1b3Rlc2luZ2xlLnMKcXVvdGVkYmwucwtxdW90ZWxlZnQucwxxdW90ZXJpZ2h0LnMOcXVvdGVkYmxsZWZ0LnMPcXVvdGVkYmxyaWdodC5zCGh5cGhlbi5zCGVuZGFzaC5zCGVtZGFzaC5zC3BhcmVubGVmdC5zDHBhcmVucmlnaHQucw1icmFja2V0bGVmdC5zDmJyYWNrZXRyaWdodC5zC2JyYWNlbGVmdC5zDGJyYWNlcmlnaHQucwl6ZXJvLnN1cHMIb25lLnN1cHMIdHdvLnN1cHMKdGhyZWUuc3Vwcwlmb3VyLnN1cHMJZml2ZS5zdXBzCHNpeC5zdXBzCnNldmVuLnN1cHMKZWlnaHQuc3VwcwluaW5lLnN1cHMJcGx1cy5zdXBzCm1pbnVzLnN1cHMKZXF1YWwuc3Vwcw5wYXJlbmxlZnQuc3Vwcw9wYXJlbnJpZ2h0LnN1cHMLcGVyaW9kLnN1cHMKY29tbWEuc3Vwcwl6ZXJvLnN1YnMIb25lLnN1YnMIdHdvLnN1YnMKdGhyZWUuc3Vicwlmb3VyLnN1YnMJZml2ZS5zdWJzCHNpeC5zdWJzCnNldmVuLnN1YnMKZWlnaHQuc3VicwluaW5lLnN1YnMJcGx1cy5zdWJzCm1pbnVzLnN1YnMKZXF1YWwuc3Vicw5wYXJlbmxlZnQuc3Vicw9wYXJlbnJpZ2h0LnN1YnMLcGVyaW9kLnN1YnMKY29tbWEuc3Vicwl6ZXJvLmRub20Ib25lLmRub20IdHdvLmRub20KdGhyZWUuZG5vbQlmb3VyLmRub20JZml2ZS5kbm9tCHNpeC5kbm9tCnNldmVuLmRub20KZWlnaHQuZG5vbQluaW5lLmRub20OcGFyZW5sZWZ0LmRub20PcGFyZW5yaWdodC5kbm9tC3BlcmlvZC5kbm9tCmNvbW1hLmRub20JemVyby5udW1yCG9uZS5udW1yCHR3by5udW1yCnRocmVlLm51bXIJZm91ci5udW1yCWZpdmUubnVtcghzaXgubnVtcgpzZXZlbi5udW1yCmVpZ2h0Lm51bXIJbmluZS5udW1yDnBhcmVubGVmdC5udW1yD3BhcmVucmlnaHQubnVtcgtwZXJpb2QubnVtcgpjb21tYS5udW1yDW9yZGZlbWluaW5lLmEGQS5zdXBzBkIuc3VwcwZDLnN1cHMGRC5zdXBzBkUuc3VwcwZGLnN1cHMGRy5zdXBzBkguc3VwcwZJLnN1cHMGSi5zdXBzBksuc3VwcwZMLnN1cHMGTS5zdXBzBk4uc3VwcwZPLnN1cHMGUC5zdXBzBlEuc3VwcwZSLnN1cHMGUy5zdXBzBlQuc3VwcwZVLnN1cHMGVi5zdXBzBlcuc3VwcwZYLnN1cHMGWS5zdXBzBlouc3VwcwZhLnN1cHMGYi5zdXBzBmMuc3VwcwZkLnN1cHMGZS5zdXBzBmYuc3VwcwZnLnN1cHMGaC5zdXBzBmkuc3VwcwZqLnN1cHMGay5zdXBzBmwuc3VwcwZtLnN1cHMGbi5zdXBzBm8uc3VwcwZwLnN1cHMGcS5zdXBzBnIuc3VwcwZzLnN1cHMGdC5zdXBzBnUuc3VwcwZ2LnN1cHMGdy5zdXBzBnguc3VwcwZ5LnN1cHMGei5zdXBzB3VuaTAyQzEHdW5pMDJEMAd1bmkwMkQxB3VuaTAyREUHdW5pMDJFMAtlZ3JhdmUuc3VwcwtlYWN1dGUuc3Vwcwx1bmkwMjU5LnN1cHMGYS5zdXBhBmcuc3VwYQZsLnN1cGEKY29sb24uc3VwcwtoeXBoZW4uc3VwcwtlbmRhc2guc3VwcwtlbWRhc2guc3VwcwZ5ZW4uQ04ERXVybwd1bmkwMTkyDWNvbG9ubW9uZXRhcnkEbGlyYQd1bmkyMEE2BnBlc2V0YQd1bmkyMEE5BGRvbmcHdW5pMjBCMQd1bmkyMEIyB3VuaTIwQjQHdW5pMjBCNQd1bmkyMEI5B3VuaTIwQkEHdW5pMjBBRQd1bmkyMEI4B3VuaTIwQkQHdW5pMjIxNQpzbGFzaC5mcmFjCG9uZXRoaXJkCXR3b3RoaXJkcwd1bmkyMTU1B3VuaTIxNTYHdW5pMjE1Nwd1bmkyMTU4B3VuaTIxNTkHdW5pMjE1QQd1bmkyMTUwCW9uZWVpZ2h0aAx0aHJlZWVpZ2h0aHMLZml2ZWVpZ2h0aHMMc2V2ZW5laWdodGhzB3VuaTIxNTEHdW5pMjE1Mgd1bmkyMTg5B3VuaTIyMTkHdW5pMjExMwllc3RpbWF0ZWQHdW5pMjE5MAdhcnJvd3VwB3VuaTIxOTIJYXJyb3dkb3duB3VuaTI1QTAHdW5pMjVDNgd1bmkyNUM5B3VuaTI3NTIHdHJpYWd1cAd1bmkyNUIzB3VuaTI1QjYHdW5pMjVCNwd0cmlhZ2RuB3VuaTI1QkQHdW5pMjVDMAd1bmkyNUMxB3VuaTI2MTAHdW5pMjYxMQd1bmkyNzEzB3VuaTI2NkEHdW5pMjAzMgd1bmkyMDMzB3VuaTIwMzUHdW5pMDJCOQd1bmkwMkJFB3VuaTAyQkYHdW5pMDJDOAd1bmkwMkM5B3VuaTAyQ0EHdW5pMDJDQgd1bmkwMkNDB3VuaTI1Q0MHdW5pMDMwMAl1bmkwMzAwLmMJdW5pMDMwMC5nB3VuaTAzMDEJdW5pMDMwMS5jCXVuaTAzMDEuZwd1bmkwMzAyCXVuaTAzMDIuYwd1bmkwMzAzCXVuaTAzMDMuYwd1bmkwMzA0CXVuaTAzMDQuYwd1bmkwMzA1CXVuaTAzMDUuYwd1bmkwMzA2CXVuaTAzMDYuawl1bmkwMzA2LmMJdW5pMDMwNi5LB3VuaTAzMDcJdW5pMDMwNy5jB3VuaTAzMDgJdW5pMDMwOC5jB3VuaTAzMDkJdW5pMDMwOS5jB3VuaTAzMEEJdW5pMDMwQS5jB3VuaTAzMEIJdW5pMDMwQi5jB3VuaTAzMEMJdW5pMDMwQy5jB3VuaTAzMEYJdW5pMDMwRi5jB3VuaTAzMTEJdW5pMDMxMS5jB3VuaTAzMTIJdW5pMDMxMi5nB3VuaTAzMTMJdW5pMDMxMy5nB3VuaTAzMTgHdW5pMDMxOQd1bmkwMzFBB3VuaTAzMUIHdW5pMDMxQwd1bmkwMzFEB3VuaTAzMUUHdW5pMDMxRgd1bmkwMzIwB3VuaTAzMjMHdW5pMDMyNAd1bmkwMzI1B3VuaTAzMjYHdW5pMDMyNwl1bmkwMzI3LmMHdW5pMDMyOAl1bmkwMzI4LmMHdW5pMDMyOQd1bmkwMzJBB3VuaTAzMkMHdW5pMDMyRQd1bmkwMzJGB3VuaTAzMzAHdW5pMDMzMQd1bmkwMzM0B3VuaTAzMzkHdW5pMDMzQQd1bmkwMzNCB3VuaTAzM0MHdW5pMDMzRAd1bmkwMzQyCXVuaTAzNDIuYwd1bmkwMzQzB3VuaTAzNDQHdW5pMDM0NQd1bmkwMzYxCXVuaTAzNjEuYQt1bmkwMzA4MDMwMQ11bmkwMzA4MDMwMS5jC3VuaTAzMDgwMzAwDXVuaTAzMDgwMzAwLmMNdW5pMDMwODAzMDAuZwt1bmkwMzA4MDMwMwt1bmkwMzA4MDMwNA11bmkwMzA4MDMwNC5jC3VuaTAzMDgwMzBDDXVuaTAzMDgwMzBDLmMLdW5pMDMwMjAzMDENdW5pMDMwMjAzMDEuYwt1bmkwMzAyMDMwMA11bmkwMzAyMDMwMC5jC3VuaTAzMDIwMzA5DXVuaTAzMDIwMzA5LmMLdW5p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AAAHVAAAB1QAAAdUAAAHVAAAB1QAAAdUAAAHVAAAB1QAAAdUAAAHVAAAB1QAAAdUAAAHVAAAB1QAAAdUAAAHVAAAB1QAAAdUAMkJQAeQB5YKHghuCdwICAecB6IISggaCJgHqAeuCA4KZge0B7oIFAgaB8AHxgfMCe4I5gf8CFYKBgmaCIAH0gfYCdAJuAkoB94IpAfkCZoJ1gfqB/AJFgf2CD4J1gpyCUYH/AgCCXwICAgOCBQIGgggCCYILAm4CDIJ1gjUCDgIPghECEoIUAjgCSgJ1gjmCFYIXAiYCGII4AmaCGgIbgnWCHQIegiACIYKbAmaCIwJoAmgCdYIkgk6CdAI4AiYCaYIngikCKoIsAi2CLwIwgjICM4I1AjaCOAI4AjmCOwJagnWCPII+Aj+CQQJBAkKCRAJFgmaCRwJIgkoCS4JNAk6CiQJQAmaCnIJRglMCVIJWAleCWQJaglwCXwJdgl8CYIJiAnWCY4JlAmaCaAJuAmmCawKWgmyCbgJvgnECjAJygnQCdYJ3AniCkIKSAnoCk4J7gpUCloJ9ApmCfQKNgoSChgJ+goACgYKDAo8CloKEgoYCh4KJAoqCjAKNgo8CkIKSApOClQKWgpgCmYKbApyCngBKAlWCOoJegjwCVwLYAj2C6ILqAj8CQIJCAkOCwALzAkUC8wJGgkgCYAJhgkmCSwJMgu6C1QL0gn+DCAJ2gveCTgJPgn+CUQJRAlKCiIKOgpADCAKQAskCmQKfAmqCqAMGgqsCVAL/Aq+CVYJVgvACVwJXAliCWgJbgl0CXoLzAmACYYJhgmMCZIL0gvSCZgL3gveCzYJngwgCaQJsAwgCaoJsAm2CbYJvAnCCkAJyAsMCc4J/gnUCwwKxAnaCdoJ4AsMCnAJ5gpeCx4KXgnsCfILGAvYCwwLDAn4CqAJ/gn+CgQKCgoQChYKHAoiCigKLgo0CjQKOgpACkALDApGCtAMIAwOCkwKUgpeClgKXgpkCmoKcAp2CnwKggqICo4KlAqaCqAKpgwaCqwKsgq4Cr4KxArKCtAK1griCtwK4groCu4K9Ar6CvoLAAsMCwYLBgsMCxILNgsYCx4LJAsqCzALNgvSCzwLQgtIC9ILTgtUC1oLYAtmC2wLcgvMC3gLfguEC4oLkAuWC5wLoguoC64LzAu0C7oLugvAC8YLzAvSC9gL3gvkC+oL8AwgC/wL9gv8DAIMCAwODBQMIAwgDBoMGgwgDKQMbgxQDCYMsAwsDDIMgAyGDDgM5gw+DIwMkgzIDJ4MUAzmDEQMVgxcDNoMSgx6DPgMegzaDNoM/gywDLAMhgxQDJgMVgxcDFwMYgxoDNoMbgx0DHoMgAyGDOYMjAySDJgMngz4DKQMqgywDLYMvAzCDMgMzgzUDNoM4AzmDOwM8gz4DPgM/g0EDQoAAQEoAAIAAwAEAAUABgAHAAgACQAKAAsADAANAA4ADwAQABEAEgATABQAFQAWABcAGAAZABoAGwAcAB0AHgAfACAAIQAiACMAJAAlACYAJwAoACkAKgArACwALQAuAC8AMAAxADIAMwA0ADUASwBMAE4AbgBvAHsAiwC2ALcAuAC+ANcA6ADuAQMBBAEbARwBHgE+AT8BXAFpAYcBiAGJAY8BqAG5Ab8BwAHTAdQB1QHWAdgB2QHaAdsB3AHdAd4B3wHgAeEB4gHjAeQB5QHmAecB6AHpAeoB6wHsAe0B7gHvAfAB8QHzAfQB9gH3AfgB+QH6AfsB/AH9Af4B/wIAAgECAgIDAgQCBQIGAgcCCAIJAgoCCwIMAg0CDgIPAhACEQISAhMCFAIVAhYCFwIYAhkCGgIbAhwCHQIeAh8CIAIhAiICIwIkAioCNgI4AjkCTwJQAlICWwJlAmYCZwKJAo0CjwKRApcCmQKcAqADigOMA7ADswO1A7YDuAO6A74DwwPGA8cDywPNA84DzwPUA9YD4QPiA+MD7APtA/QD9gP5A/wD/wQBBAIEBAQGBAoEDwQSBBMEFwQZBBoEGwQgBC4EOAQ5BEUEzATNBM4EzwTQBNEE0gTTBNQE1QTWBNcE2ATZBNoE2wTcBN0E3gTfBOAE4QTiBOME5ATlBPsE/AT+BR4FHwU8BWYFbAWIBZkFnwW0BbUFuAW5BbwFvQW+BcAFwQXDBcQFxgXIBcsF1QXYBdoF2wXdBd8F4wXoBfAF8gXzBfQGBgYIBhEGEgYZBhsHOAABAdcCBgABASEA+AABAAAA+AABAAAB8AABAAACBgABAAAAAAABAeQCggABAiEClgABAXMB8AABAa8B+gABAbkB/AABAecCGgABAZcB8AABAAAC4gABAAACswABAAADNwABAAAC0AABAAADFAABAV4AAAABARgAAAABARQAAAABAQYAAAABAQwAAAABANoAAAABAOkAAAABAPwAAAABAQAAAAABANAAAAABAScAAAABATMAAAABAP4AAAABAPQAAAABASEAAAABAesAAAABAZYAAAABAJcAAAABAVYAAAABAUwAAAABAXcAAAABAWQAAAABAZwAAAABAIUAAAABAQMAAAABAPsAAAABAMcAAAABARYAAAABAcgAAAABAMYAAAABAZgAAAABALEAAAABAaQAAAABAVoAAAABAJEAAAABATEAAAABAS8AAAABAAD/6gABAAACogABATv/6gABAV7/6gABAVD/6gABAJj/6gABAX//6gABAVn/6gABAUf/6gABARj/6gABARP/6gABAZn/6gABARL/6gABAKT/6gABAPr/NAABASX/6gABAbP/6gABAIj/RwABAa3/RwABANr/6gABAQH/6gABAOP/QwABAW3/6gABAVb/6gABART/6gABAUz/6gABAWT/6gABAUb/6gABAZj/6gABALz/6gABARn/6gABAOn/6gABASr/6gABAQ7/6gABAJH/NgABAST/6gABAYr/6gABAPb/RwABAQX/6gABASf/6gABAar/NgABAPv/6gABAQz/6gABAQD/6gABAKX/NgABAQP/NAABASL/6gABAMf/6gABAKP/6gABAIP/RwABANb/7AABAPH/6gABAKr/RwABAYj/NgABAPD/6gABAbf/6gABAbL/6gABAbP/NgABAR7/NgABARr/6gABAND/6gABAbb/6gABAXP/6gABAXH/NgABAKb/6gABALP/NgABALT/NgABAIf/6gABAP//6gABAOb/PwABAFP/NgABAHT/NgABAOn/NgABARP/NgABAR3/6gABAYX/6gABAQP/6gABAOf/6gABAOn/SAABAQr/mgABANf/NgABASD/6gABAMP/6gABAM3/6gABAPP/6gABAOX/6gABAHz/6gABAMb/6gABAVn/RwABAR7/6gABASf/NgABALH/6gABAJT/RwABAP7/6gABAIr/6gABAXT/6gABAP3/6gABATP/6gABASj/6gABARb/6gABAJ//6gABAUL/6gABAOL/6gABAQj/6gABATH/6gABAPb/6gABAWf/6gABAQb/6gABAOb/6gABAPX/6gABAS//6gABATn/6gABAUH/6gABAPj/6gABASv/6gABAQ//6gABAPz/6gABATf/6gABAJf/6gABAT3/6gABAVf/6gABATT/6gABATb/6gABAKH/6gABAOj/6gABAQf/6gABASH/6gABASwCogABAT4CogABAW0CogABAWcCogABAT8CogABAJoCogABAX0CogABATwCogABATYCogABASMCogABARYCogABAZcCogABARwCogABAPEC0gABAQ8CBgABAIoCyAABATcC0gABAQECBgABAR0CogABASICogABAQsCogABAJcCogABAV4CogABAhECogABAVcCogABARQCogABAUwCogABAVwCogABAWsCogABAZsCBgABAKgC0gABAbICBgABAKsCkgABARkCBgABARMB9gABAS8C0gABAK0C0gABAIwCBgABATQCBgABATEC0gABARQC0gABAQQCBgABAaIC0gABAOgCBgABATICBgABAQMCBgABATkC0gABASICBgABAMcCBgABAI8CBgABANYC0gABAO0C0gABAI8C0gABALAC0gABAJECBgABAbcCBgABAbsCBgABATkCBgABANgCBgABAXMCBgABAXEC0gABAQAC0gABAQACBgABAPkCBgABAPECBgABAQoCBgABARMCBgABAOkCBgABANMC0gABAPQC0gABAKoCkgABAVIC0gABAUgCBgABAR0CBgABARsCBgABAYUCBgABAR4C0gABAOcCBgABAPUCBgABAPYCBgABAOICCwABASACBgABANcC0gABAOEC0gABAN8C0gABAOUC0gABAHwC0gABARYC0gABAMYCogABAVICogABASsCBgABAR4CBgABAIoC0gABALECBgABAP0CBgABASQCBgABAQUCBgABATACBgABAIoCBgABASwCBgABAQICBgABAXQCBgABAPsCBgABARsCogABASgCogABASECogABAbECogABAVYCqgABAVMCqgABASACogABAUcCogABATQCogABAbICogABAQcCogABAd8CogABATsCogABAVACogABAJgCogABAOICygABASoCogABAQYCogABAhwCpAABAWQCogABAVYCogABARQCBgABAPICBgABAQwCBgABAX0CBgABASgCBgABASUCBgABASMCBgABAQsCBgABAXwCBgABANMCBgABAaICBgABARwCBgABAQcCBgABARYCBgABASgCNAABAQ4CNAABAUACNAABAT0CNAABAJsCNAABAQ8CNAABAWcCNAABATMCNAABAPUCNAABAS8CNAABATwCNAABAUUCNAABASICNAABAQ0CNAABAQACNAABATcCNAABAJcCNAABAVcCNAABATgCNAABATUCNAABASwCNAABAP0CNAABARICJgABAQwCNAABAXoCNAABATcCJgABATECJgABATECNAABAP4CJgABAYUCNAABAPgCNAABAaoCNAABASsCNAABANkCVQABAQMCNAABAOcCNAABAccCNAABATsCNAABASECBgACMBAABAAAMTQzeAAwAIAAAP/s//D/8P/w/+7/+P/4//b/2P/4/+z/5//u/+f/xP/4//j/5//4//wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/7QAAAAAAAAAAAAA/+7/7v/a/+7/+P/a/+7/8f+c//j/9v/x//j/4v/6/+7/8f/uAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/+T/xP/m/7D/7v/cAAAAAP+I/9gAAP/I/9r/3P+g/9z/ywAAAAAAAP/c/+T/vP/QAAD/vAAAAAD/ewAA/+wAAP/c/9z/9v/YAAAAAP/Y/+7/7P/u/8QAFP/S/+7/5P+8/+L/9P/4/+L/5P/u//T/7P/s/+z/+P/k/+QABAAEAAoADP/s/+YAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/7gAAAAAAAAAAAAAAAAAAAAD/+P/sAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//YAAAAAAAD/9gAAAAAAAAAA//YAAAAAAAD/5P/4AAD/0QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//YAAAAAAAAAAAAAAAD/6gAAAAAAAAAA//j/+AAAAAD/7gAAAAD/6gAAAAAAAP/7AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/6gAAAAAAAAAAAAAAAP/uAAAAAAAI//b/7gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/9v/4//MAAP/tAAD/5P/2/+4AAAAAAAAAAAAAAAAAAAAK//QAAAAAAAAAAAAAAAr/9wAKAAAAAAAA//YAAAAAAAAAAAAAAAD/9v/yAAYAAAAA/+4AAAAGAAD/7gAAAAAAAP/2/+4AAP/iAAAAAP/sAAAAAAAA/+7/7AAA/+wAAAAAAAD/8v/iAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/QAAD/5gAAAAAAAAAA/+wAAP/Y//gAAP/kAAAACP/0AAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/oAAAAAAAAAAD/3f/I/7cAAP/0AAD/3QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/+wAAP+9//j/7gAAAAAAAAAAAAAAAAAAAAD/5AAAAAAAAAAAAAAAAP/sAAD/5P/4AAD/9gAAAAAAAAAAAAAAAP/2/9QACAAAAAD/7gAAAAgAAAAAAAAAAAAA/+z/+P/2/8j/7P/4/+YAAAAA/8v/5f/U/+wAAAAAAAAAAP/EAAD/xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/+P/2//b/8P/9AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/8gAAP/0ABT/3P/YAAAAAAAAAAAAAAAAAAAAAAAK//r/+P/s/+L/yv/2AAb/8f/eAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/9z/rP/FAAD/5AAAAAAAAAAA/6z/t//4//b/9v/uAAAAAAAUAAAAAAAA/7cABAAcAAAAAP/6//D/1gAU//b/7v/Y//gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/3AAAAAAAAAAAAAAAAAAAAAD/7v/s/+7/7AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/w//YAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/9gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//sAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/+4AAAAAAAj/9v/uAAAAAAAAAAAAAAAAAAAAAAAA//gAAAAA/+4AAP/2//gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/7v/sAAD/7AAAAAAAAAAA/+IAAP/2AAAAAP/2AAAACgAAAAAAAAAA/+QAAAAAAAAAAP/4AAAAAAAKAAD/7gAAAAAAAP/4//j/+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/w/+T/7AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/uAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/+wAAAAAAAAAAP/rAAAAAP/s/+r/5P/0AAAAAAAAAAAAAP/oAAAAAAAAAAD/9gAAAAAAAP/2/9oAAP/u/+oAAP/cAAD/5v/0/+7/7P/2//YAEP/m//b/7gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/sAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/+YAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//gAAP/sAAAAAP/6AAAAAAAAAAAAAAAAAAAAAP/6AAAAAP/d/+wAAP/4AAAAAAAAAAAAAAAA/+4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/7v/uAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/9wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/8P/wAAD/2AAAAAAAAAAA//b/9v/2/+7/7v/m/+QADP/xAAAAAP/s/+z/8wAAAAAAAAAA/9P/7v/x/+YAAAAAAAAAAAAA/90AAP/wAAAAAAAAAAD/+AAA//AAAAAA//oAOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/7v/s/+z/9AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/4//YAAP/nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/7cAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/m/+IAAP/2AAAAAAAAAAAAAAAA//gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/xf+1AAD/3AAAAAAAAAAAAAD/twAA//b/9v/k//YAAAAAAAAAAAAA/74AAAAAAAAAAAAA/93/vAAA/+T/3QAAAAAAAAAA/+cAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/EAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/5//w//D/3//uAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/4//gAAP/xAAD/7gAA//b/+AAA//gAAP/u//YAAAAAAAAAAP/4//gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/s//YAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//YAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//gAAAAAAAAAAP/4AAAAAAAAAAAAAAAAAAAAAAAAAAD/7AAA//gAAAAAAAAAAAAAAAAAAAAA//YAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/T/+T/5P/k/+QACgAAAAAAAP/0AAAAAAAAAAAAAAAA/9wAAAAAAAAAAAAA/+4AAAAAAAAAAP/2AAD/9P/2AAAAAAAA//b/9AAAAAAAFAAA//b/9v/LAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/7AAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/3wAA//YAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//D/2P/f//YAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/+P/2AAD/3wAAAAAAAP/w//kAAAAAAAD/8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/48AAP/sAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/8wAAP/MAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/w//AAFAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/xP/iAAAAAAAAAAD/7AAAAAAAAAAAAAAAAP/qAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/8T/6gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP9a/8D/0QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP+PAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/9j/7AAAAAAAAAAAAAD/4v/l/+X/7f/g/6wAAAAAAAAAAAAAAAAAAAAAAAD/5v/NAAAAAP/gAAAAAP/q/5X/sv/w/9b/qf/0/9j/vf/N/+4AAP+p/+MAAP/EAEwAJAAA/+AAAAAAAAD/0//m/+gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/9wAAAAAABAAAAAAAAAAAAAA//j/+P/2/+z/+wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/7gAAAAD/+AAAAAAAAAAAAAAAAP/4AAD/+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAT/3P/nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/6sAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/+AAAP/cAAD/3AAEAAAAAAAA/+wAAP/w/93/3f/d//AAAAAAAAAAAAAA/8sAAAAAAAAAAAAAAAAAAAAAAAD/7gAA//D/+AAA/9UAAP/kAAD/8AAAAAD/+AAA/+T/+AAAAAAAAAAAAAD/+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAU/+wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/5AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/+wAFAAA//AAAAAAAAAAAAAAAAAAAAAA//n/+P/wAAD/7gAA//gAAP/4AAAAAAAAAAD/8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/n//gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/2//gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/zAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/8P/Q/9AAAP/IAAAAAAAAAAD/2P/d/+b/3P/c/8v/9gAU/+4AAAAAAAD/5v/u//oAAAAAAAD/3P/u//v/5f/mAAAAAAAAAAD/5gAA//AAAAAAAAAAAP/4AAD/8P/4AAD/9gAkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAP/uAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP+sAAD/7gAQAAAAAAAAAAAAAP/m/93/3f/T//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//AAAAAA/8gAAP/4AAD/+AAAAAD/+AAA//D/9gAAAAD/9gAAAAD/+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/fAAD/9gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/8P/f/9//9gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/4//YAAP/fAAAAAAAA//D/+QAAAAAAAP/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/+wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/+oAAP/2AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/wAAAAAAAAAAAAAAAA/+4AAAAAAAAAAAAAAAAAAAAAAAD/7gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//gAAAAAAAAAAP/6AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/sAAD/8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//gAAAAAAAAAAAAA//D/4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/9gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/yAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/7P/8/+gAAAAAAAAAAAAAAAAAAP/o//gAAAAAAAAAAAAAAAAAAAAAAAD/sAAAAAAAAAAA/9MAAP/0AAAAAP/uAAAAAP/4/93/y//SAAAAAAAAAAAAAAAAAAAAAAAAAAD/8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/2v/kAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/98AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/7P/fAAAAAAAAAAD/5gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/+YAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP+eAAD/7AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/YAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/7v/0AAAAAAAAAAAAAAAA/+r/vP/c/+7/6gAA/+z/4gAA//YAAP/q//YAAP/WACgADAAAAAD/3AAAAAD/9gAAAAAAAP/0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/mgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/4AAAAAAAAAAAAAAAAAAAAAP/g/+QAAAAA/+wAAAAA/+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/4AAAAAAAAAAA//YAAAAA/+QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/3z/7AAAAAAAAP/OAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/+gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/uAAAAAAAAAAD/1gAAAAAAAAAI//IABAAAAAAAAP/kAAAAAAAAAAD/9gAAAAD/3f++/8j/zf/rAAD/5P/0AAAAAAAA/+sAAAAA/84AAAAAAAAAAP/YAAAAAAAAAAAAAAAA/9j/5gAAACoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/2AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/g//z/3AAAAAAAAAAAAAAAAP/5//H/5v/t/+3/5gAAAAAAAAAAAAAAAP/FAAAAAAAAAAD/+AAAAAAAAAAA/8j/3P/2AAAAAP/nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/3AAA//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/+wAAAAAAAD/7P/nAAAAAAAAAAAAAAAAAAAAAAAA/+4AAAAA/+oAAP/s/+0AAP/0//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/+AAAAAAAAAAA//YAAAAA/+wAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/+gAAP/uAAAAAAAAAAD/+gAAAAAAAAAA/+QABP/4AAAAAP/mAAAAAAAEAAD/7AAAAAAAAP/k/93/7AAAAAAAAAAAAAAAAAAAAAAAAAAA//YAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/w//D/8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/7AAA/9wAAAAAAAD/9v/4AAAAAAAA//YAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/7gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/o//n//AAA//QAAAAAAAAAAAAAAAD/8QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//AAAAAAAAgAwAmgCbAAAAm8CbwAFAnECcgAGAnYCdgAIAngCeAAJAnwCgQAKAoUChQAQAogCjQARAo8CjwAXApEClQAYApcClwAdApkCmgAeAp0CngAgAqACogAiAqQCqgAlAq0CrgAsArACwwAuAtoC4gBCAusDSQBLA1oDigCqA40DjQDbA5cDlwDcA7EDsgDdA7cDtwDfA8MDwwDgA98D3wDhA+ED4QDiA+cD5wDjA/oD+wDkA/4D/gDmBAMEAwDnBA8EDwDoBCsEKwDpBDMEMwDqBEYERwDrBbgFvADtBb8FvwDyBcEFwgDzBcYFxgD1BcgFyQD2BcwFzwD4BdYF1wD8BdwF3AD+BegF6AD/BgQGBAEABgYGBgEBBgwGDAECBh8GIAEDAAIAYAJoAmgACgJpAmkADQJqAmoAGgJrAmsAEwJsAmwAFgJvAm8AKwJxAnEAHgJyAnIACgJ2AnYAKwJ4AngAKAJ8AnwAJAJ9An0AEAJ+An4AJgJ/An8AIgKAAoAACgKBAoEAFgKFAoUAKwKIAogAIgKJAokACAKKAooACwKLAosAGAKMAowAEQKNAo0AFAKPAo8AFwKRApEAGwKSApIAHAKTApMAHwKUApQAGwKVApUAIAKXApcAKQKZApkAKQKaApoALgKdAp0AKQKeAp4ADgKgAqAAKQKhAqEALQKiAqIACwKkAqQAKQKlAqUACAKmAqYAFAKnAqcAFwKoAqkAGwKqAqoAKQKtAq0AKQKuAq4AGwKwArsACgK8AsMAFgLaAuEAKwLiAuIAKALrAvQAIgL1Aw8AGwMQAxwACAMdAyQAFAMlAy8AFwMwAz8AGwNAA0kAKQNaA2QAKQNlA3AACANxA3wAFwN9A4gAKQOJA4kAHAOKA4oAKQONA40ALAOXA5cAGwOxA7IABQO3A7cABQPDA8MAAgPfA98AAgPhA+EABwPnA+cABQP6A/sAAgP+A/4AAwQDBAMAAwQzBDMAAwW4BbgACQW5BbkADAW6BboAGQW7BbsAEgW8BbwAFQW/Bb8AKgXBBcEAHQXCBcIACQXGBcYAKgXIBcgAJwXJBckALwXMBcwAIwXNBc0ADwXOBc4AJQXPBc8AIQXWBdcABAXcBdwABAXoBegAAQYEBgQAAQYGBgYABgYMBgwABAYfBiAAAQACAScCaAJoAG8CawJrAGICbQJtAGQCbwJvAF0CcgJyAG8CdQJ1AHwCdgJ2AF0CeQJ5AHsCegJ6AFQCewJ7AF4CfAJ8AFoCfQJ9AFkCfgJ+AFsCfwJ/AHgCgAKAAH4ChwKHAF4CiQKJAGUCigKKAGYCiwKLAEsCjAKMAGcCjQKNAGgCjgKOAHMCjwKPAGkCkAKQAE4CkQKRAGoCkgKSAGkCkwKTAGMClAKUAHcClQKVAEwClgKWAHIClwKXAGwCmAKYAGACmQKZAGECmgKaAGwCmwKbAE0CnAKcAG0CnQKdAGwCngKeAEoCnwKfAG0CoAKhAGwCogKjAE4CpAKkAGwCpQKlAGUCpgKmAGgCpwKnAGkCqAKoAGoCqQKpAHACqgKqAGwCqwKsAG0CrQKtAGwCrgKuAHACrwKvAG0CsAK5AH4CugK7AG8C6QLqAF4C9QL1AG8C9gL9AH4DBwMHAHgDEAMcAGUDHQMkAGgDJQMvAGkDMAMxAGoDMgMyAHADMwMzAGoDNAM/AHADQANHAGwDSANJAGEDSgNZAG0DWgNkAGwDZQNwAGUDcQN8AGkDfQOIAGwDiQOJAGkDigOLAGwDjAOMAHcDjQONAHQDjgOOAGsDlwOXAGoDsAOwACcDtAO0ACsDtwO3ADwDuwO7ADADvgO+ADMDwQPBADMDwgPCAAsDwwPDADgDxAPEAC8DxQPFAAYDxwPHACoDygPKAAsDzQPNADwDzwPPADsD0gPSAAsD1APUADMD1QPVAC4D2QPZAAkD2gPaADAD3APcAAsD3wPfADgD4QPhAEcD4gPiADMD4wPjAAcD5wPnADwD6QPpAAsD6wPrADMD7APsAEID7gPuAAYD7wPvACoD8wPzACcD+AP5ADMD+gP7ADgD/AP8AAED/QP9ACgD/gP/ADQEAAQAAAIEAQQBAAoEAgQCAA4EAwQDAA0EBAQGADQEBwQHAAQECAQJADQECgQKAAoECwQLADQEDAQMADEEDQQNAAoEDgQOADYEDwQPADcEEAQQAAoEEQQRAAUEEgQSADQEEwQTACkEFAQVADQEFgQWADYEFwQYADQEGQQZAAMEGgQaADQEGwQbAAwEHAQdAAoEHgQeACwEHwQfADQEIAQgAAoEIQQhAC0EJQQlAAgEJgQmAAQEJwQnADQEKAQoACwEKQQqADQEKwQrADcELAQsADQELQQtADkELgQuAAoELwQvADIEMAQwADQEMQQxABIEMgQyAA4EMwQzAA0ENAQ0ADQENQQ1ADYENgQ2ADQENwQ3AAoEOAQ5ADIEOgQ6AAUEOwQ7ACkEPQQ9AA4EPwRAAAEEQQRBAAoEQgRC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AAAAAAAA//T/6AAAAAAAAAAAAAAACgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/3f+3AAAAAP/GAAAAAAAAAAD/7v/0/8T/2AAAAAD/3AAA/90AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/yAAAAAAAAAAAAAAAAAAA/+b/7AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/6P/Q/5z/v//k/7QAAAAA/9oAAAAAAAAAAP/4//T/5gAAAAAAAAAAAAAAAAAAAAAAAAAA/+T/sgAAAAAAAAAA/+7/8P/4AAD/8P/w/98AAP/w/+f/sP/cAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP+4/9QAAAAAAAD/5//4AAD/+P/2/+7/7v/c/9z/5//c//D/7P/YAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/2/+z/5P/k/+f/5//kAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/9gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/kAAAAAAAAAAAAAP/2/+z/7AAAAAAAAP/4//gAAP/7//gAAAAAAAAAAAAAAAD/9gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAT/+gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/k/+z/4gAA/+f/9AAO//YAAAAAAAAABAAM//b/+v/sAAAAAAAA//YAAAAAAAAAAAAA//b/zQAAAAAAAAAA//gAAAAAAAAAAAAAAAAADwAAAAD/3P/2AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/+AAAAAAAAP/2AAAAAP/uAAD/+P/dAAAAAAAAABIAAAAA/+4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/+z/7AAA//j/7P/0AAD/9P/mAAD/1v/e/+wAAP/0/+4AAP/wAAAAAAAAAAAAAAAAAAAAAAAA/+wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/+wAAAAAAAAAAAAAAAAAAP/w/+IAAAAAAAAAAAAAAAAAAAAAAAAADAAAAAwAAP/4//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//gAAP+w/+z/7P/oAAAAAAAA//QAAP/0AAAAAP/EAAAAAAAA/8gAAAAAAAAAAAAAAAD/7AAAAAD/7v/nAAAAAP/4AAD/7v/n//j/0wAAAAAAAAAA/8j/7gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//P/oAAAAAAAA//j/+AAAAAD/5AAAAAD/t//4//b/v//qAAD/2gAAAAAAAP/sAAAAAP/w//gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/gAAD/5QAA/+X/5AAA/5f/7P/sAAD/mgAAAAAAAAAA//gAAAAAAAAAAAAAAAAAAP/2AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/8P/YAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/8AAD/9gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/8gAAAAAAAAAA/9YAAP/NAAD/zQAAABL/iAAIAAAAAP98AAAAAAAAAAAAAAAA/94AAAAA/93/vf/2AAAAAAAA/8T/vf/u/+QAAAAAAAAAAAAA/+wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/sAAAAAAAA/+wAAAAA/3L/5wAA/8wAAAAAAAD/6P/sAAD/9gAAAAD/zgAA/+v/zgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/+7/9v/s/+wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/uAAAAAAAAAAD/9v/2AAAAAAAAAAAAAAAAAAAABAAA//sAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//YAAAAAAAAAAP/wAAAAAAAAAAAAAAAAAAAAAP/e/+4AAAAAAAAAAAAAAAD/5AAA//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/+QAAP/YAAAAAAAAAAD/9P/sAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/3AAAAAAAAAAAAAAAAAAD/7gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/2AAAAAAAAAAAAAAAAAAAAAAAA/9z/7P/sAAAAAAAAAAAAAAAAAAAAAP/dAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/4/9z/9P/YAAAAAAAAAAn/yAAAAAAAAAAEAAAAAP/s/9gAAAAAAAD/uAAAAAAAAAAAAAD/2P/sAAAAAAAAAAAAAP/QAAAAAAAA//j/7gAA/9v/7v/0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/7AAA//YAAAAA//YAAAAAAAD/3P/uAAD/5AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/5wAAAAAAAAAAAAAAAD/2gAAAAD/3QAA/+4AAP/uAAD/xAAA/+4AAP/2AAAAAP/2AAD/7AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAHwAA/97/9gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/l/+gAAAAAAAAAAAAAAAD/3gAA/+QAAP/uAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/wAAQAAP/EAAD/uP/T/7j/4v/7/14AAP/8AAD/jwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/iAAAAAAAAAAAAAAAAAAD/6gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUAAAAAAAAAAAAAAAAAAAAAP/iAAAAAAAAAAAAAAAAAAD/7AAA/8wAAP/MAAAAAP/wAAD/4gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/+0AAP/xAAAAAAAA/6z/5f+VAAD/lQAAAAD/TAAAAAD/7P9aAAD/2AAAAAAAAAAA/6z/0wAA/6n/of/J/8D/1P/N/5j/of/i/+b/5QAA/+D/5f/5/9EAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAAP+hAAAAAAAA/9H/3QAQ/0gAAP/Y/9gAAP/RAAD/j//AAAD/1gAAAAD/xP/A/6kAAAAAAAAAAP/T/9P/6AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/+3/5P/o/+IAAAAA/+sAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//AAAP/sAAAAAAAAAAD/9v/uAAAAIQAAAAAAAP/7AAAAAAAAAAD/9gAAAAD/9v/xAAD/8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/+b/8AAAAAAAAP/2AAAAAAAAAAAAAAAA/+wAAP/u/+QAAP/4AAAAAAAAAAD/5gAA//AAAP/wAAAAAAAAABD/7gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//gAAP/6/9wAAP/mAAAAAAAAAAD/7P/uAAAAAAAA/+wAAAAA//oAAAAAAAAAAAAAAAAAAP/2AAAAAAAAAAAAAAAAAAD/7gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/uAAAAAAAAAAAAAAAAAAAAAAAAAAD/7P/mAAAAAAAAAAD/+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/+b/7P/kAAD/8P/2AAz/yAAAAAAAAP/x//oAFP/s/9wAAAAAAAD/2AAAAAAAAAAA//b/0v/uAAAAAAAAAAAABP/TAAAAAP/2AAD/5v/x/+b/5v/sAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//D/9gAAAAAAAAAAAAAAAAAAAAD/7gAA//EAAP/w//YAAP/sAAD/3P/uAAD/7gAAAAD/+v/w//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/+b/9v/k/9z/8P/2/+gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/4AAAAAAAAAAD/9QAAAAAAAAAAAAAAAAAAAAAAAAAA//AAAP/6AAAAAP/6AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/94AAAAA//j/+AAAAAAAAAAAAAD/7AAAAAAAAAAAAAAAAAAK//EAAP/sAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//gAAAAA//YAAP/uAAAAAAAAAAD/+P/0AAAAAAAAAAAAAAAA//gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/9gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/2AAAAAAAAAAAAAAAAAAD/9gAAAAD/7P/2AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/+QAAP/yAAAAAAAAAAr/7AAAAAAAAAAAAAD/9v/0/+gAAAAAAAAAAAAAAAAAAAAAAAD/8v/2AAAAAAAA/+4AAP/cAAAAAP/TAAD/9gAAAAD/9v/8//YAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//b/8gAAAAAAAAAA/+QAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//YAAAAAAAAAAAAAAAAAAAAAAAAACv/2//QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFgAAABYAAAAbAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAY/8gAAAAAAAAAAAAAAAD/9AAUAAD/9AAAAAAAAAAOAAD/9AAAAAwAAAAWAAAAAAAOAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPAAYAAAARwAA//YABAAAAAAAAAAUABIAAAAAAAAAAAAAAAAAAP/2//QAAAAAAAD/+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACgAAAAAAAD/9AAA//QADAAs/7QAKAAhAAD/xAAsAAAADwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAkAAAAAAAAAAAAAAAAAAAALAAAAAAAAAAAAAAAAAAAAAAAAAAA/+4AAP/uAAAAKP/4AAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8AAAAKAAPAA8AOAAA/+4AAP/oAAD/6AAAAAD/sAAPAAD/9P+wAAAAAAAAAAAAAAAA//T/9gAM/+j/6P/2/+wAAAAA/9j/6P/2AA4AAAAAAAD/9gAh//QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgAHAAAAAAAAP/kAAAAFAAAAAAAAAA//5wALAAAAAAALP/sACz/6P/cAAAAAAAAACwAAAAA/+0AAAAAAAAAAP/s/+wAAAAAAAAAAAAAAAAAHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/YAAAAAAAA/9wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAE/+AABAAAAAD/5AAAAAAAAAAAAAAAAAAAAAAAAP/2AAAAAP/6AAAAAP/2AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/9gAAAAAAAAAAAAAAAP/YAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/+YAAP/cAAD/5wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//b/5gAAACEAAP/4AAD/+wAAAAAAAAAAAAD/8AAAAAD/7gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/f//D/+AAAAAD/+P/2AAAAAAAAAAAAAP/sAAD/5P/uAAAAAAAAAAAAAAAA/+YAAP/wAAD/5wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/9v/sAAD/9gAAAAD/+wAAAAD/9AAAAAT/+//0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/uAAD/7AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/iAAD/4gAAAAAAAAAA/+gAAAAAAAAAAAAAAAD/8f/oAAAAAAAA/+QAAAAAAAAAAAAA/+T/9AAUABkABAAAAA//6gAUACEAAAAA/+YAAP/2/+b/9AAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/7gAAAAAAAAAA//AAAAAAAAAAAAAAAAD/8AAA/9z/5gAAAAAAAAAEAAAAAP/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/s/+b/xf/Y/+D/3P/5AAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/2AAAAAAAAAAAAAAAA//UAAAAAAAAAAP/7AAD/5AAAAAAAAP/m//j/+AAAAAD/+AAA/+YAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//z/8f/cAAAAAP/4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/sAAAAAP/0AAAAAAAA/+7/9v/q/+r/7AAA/9z/7AAA/+wAAP/n//QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//j/3AAAAAAAAAAAAAAAAAAA//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAD/9gAA/+T/7AAAAAD/6P/6AAAAAAAAAAAAAAAD/+QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//IAAP/6//AAAP/w//T/7v/mAAAABAAAAAD/3P/uAAAAAAAAAAAAAP/sAAwAAAAAAAD/9gAAAAD/5gAA/+wAAAAAAAAAAAAA/9z/+P/4AAAAAP/uAAAAAP/KAAAAAP/L//YAAAAAAAAAAAAAAAAAAAAA//YAAAAA//QAAAAAAAAAAAAAAAAAAAAA//r/5AAAAAAAAP/2/+7/yv/sAAAAAAAAAAAAAAAA/8AAAP+4/+z/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/6AAAAAAAAP/sAAD/7AAAAAAAAP/uAAD/0gAAAAD/5gAA/+wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/9H/sAAA/7cAAP/2//gAAAAAAAAAAP/2AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/3f+0AAAAAP/GAAAAAAAAAAD/7v/u/8b/6AAAAAD/3P/0/90AAAAAAAAAAAAAAAAAAAAAAAD/7gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/tAAAAAAAAAAAAAAAAAAA/93/7gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/8v/s/5j/yP/c/9EAAAAA/+QAAAAAAAAAAAAA/+z/5P/0AAAAAAAAAAAAAAAAAAAAAAAA//b/0QAAAAgAAP/2//YAAAAAAAb/9v/2//gAAAAA//j/1P/0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/R/70AAAAAAAD/+AAAAAD/+P/kAAD/9v/0/9P/7v/k/+4AAP/TAAAAAAAA/+wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/uAAD/7AAAAAAAAP/yAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABgAFAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/+z/7gAA/9wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABP/zAAD/7AAAAAAAAAAA/+wAAAAA/+oAAP/2AAD/9gAA/9gAAP/0AAAAAAAAAAAAAAAA/+wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAsAAP/gAAAAAAAAAAAAAP/2AAAAAAAAAAAAAP/uAAD/3P/0AAAAAAAAAAAAAAAA/+7//P/uAAD/7gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/4v/s/93/3v/d/+wAAP+YAAD//AAA/6D/9gAAAAAACgAAAAoAAAAAAAAAAAAAAAD/6AAAAAAAAAAAAAAAAAAA/+oAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//j/6gAAAAAAAAAAAAAAAAAA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BhoAGAYbBhsAIwYcBhwAKQYdBh4AIwACARoAAgACAGgABAAEAC8ACAAIAC8ACwALAGoAEAAQAC8AEgASAC8AFQAVADIAFgAWADQAFwAXADcAGQAZADoAGgAaADwAGwAbAGsAIQAhAC0AJAAkAG8ALwAvADEAMQAxADUANAA0ADsANgBNAGgAVABYAC8AcwB7AC8AjgCOAGoApQC/AC8A0ADXADIA2ADvADQA9AD7ADwA/AEAAGsBQgFCAC0BUAFbAG8BoQGoADEBxgHNADsB1wHXAG8B7QHtADsCEQISADECGQIZADUCJQIpAC0CKgI3AGkCZAJkAC0CZQJlAG8DjgOOAGEDsAOwAFcDsQOzAG4DtAO0AB4DtQO1AG4DtgO2AE4DtwO3AE0DuAO6AG4DuwO7ACQDvAO9AG4DvgO+ACkDvwPAAG4DwQPBACkDwgPCAAMDwwPDAEsDxAPEACIDxQPFACYDxgPGAG4DxwPHABwDyAPJAG4DygPKAAMDywPMAG4DzQPNAE0DzgPOAG4DzwPPAEwD0APRAG4D0gPSAAMD0wPTAG4D1APUACkD1QPVAFQD1gPXAG4D2QPZAEoD2gPaACQD2wPbAG4D3APcAAMD3QPeAG4D3wPfAEsD4APgAG4D4QPhACsD4gPiACkD4wPjAAED5APkAG4D5gPmAE4D5wPnAE0D6APoAG4D6QPpAAMD6gPqAG4D6wPrACkD7APsAFAD7gPuACYD7wPvABwD8APxAG4D8gPyAE4D8wPzAFcD9AP0AG0D9QP1AG4D9wP3AG4D+AP5ACkD+gP7AEsD/AP8ABoD/QP9AEgD/gP/AF8EAAQAAB0EAQQBAFkEAgQCAEQEAwQDACwEBAQGAF8EBwQHACMECAQJAF8ECgQKAFkECwQLAF8EDAQMAF4EDQQNAFkEDgQOAAIEDwQPACoEEAQQAFkEEQQRACUEEgQSAF8EEwQTABsEFAQVAF8EFgQWAAIEFwQYAF8EGQQZACEEGgQaAF8EGwQbAEMEHAQdAFkEHgQeAEkEHwQfAF8EIAQgAFkEIQQhAB8EIgQjAGYEJQQlAEUEJgQmACMEJwQnAF8EKAQoAEkEKQQqAF8EKwQrACoELAQsAF8ELQQtAAQELgQuAFkELwQvACcEMAQwAF8EMQQxAF0EMgQyAEQEMwQzACwENAQ0AF8ENQQ1AAIENgQ2AF8ENwQ3AFkEOAQ5ACcEOgQ6ACUEOwQ7ABsEPQQ9AEQEPwRAABoEQQRBAFkEQgRCAFsEQwRDAF8ERARFAFkERgRHACoEgQSCABMEgwSEABIEhQSFABMEhgSGAGIEiASIAAUEigSLAD8EjASMAD4EjQSNAAYEjgSOAD4EjwSPAAYEkASRABMEkgSSAFIEkwSTAE8ElASUAFIElQSVAE8ElgSYAFEEmwScAFEEnQSdABUEowSjAFYEpQSlAFYEpwSnAFYEqASoAFoEqgSqAEAErASsAAcEsgSyAGIEswSzAAUEtAS0AGIEtQS2AAUEuAS4AFYEugS6AFYEvAS8AFYEwwTDAEEExATEAEIEywTLAG8EzATMAGMEzgTOAC4E0gTSAC4E1QTVAGQE2gTaAC4E3ATcAC4E3gTeADAE3wTfAGUE4ATgADME4QThADYE4gTiADgE4wTjADkE5QTlAD0E5gT9AGMFBAUIAC4FIwUrAC4FPgU+AGQFVQVvAC4FeAV/ADAFgQWIAGUFiQWgADMFoQWkADgFrQWxAD0F1QXVAAgF1gXYAGAF2QXZAAoF2gXaAGAF2wXbAFUF3AXcAEcF3QXfAGAF4AXgAAwF4QXiAGAF4wXjACgF5AXlAGAF5gXmACgF5wXnABAF6AXoAEYF6QXpAAsF6gXqAA0F6wXrAGAF7AXsAAkF7QXuAGAF7wXvABAF8AXxAGAF8gXyAEcF8wXzAGAF9AX0AFgF9QX2AGAF9wX3ABAF+AX4AGAF+QX5ACgF+gX6ACAF+wX8AGAF/gX+AA8F/wX/AAwGAAYAAGAGAQYBABAGAgYDAGAGBAYEAEYGBQYFAGAGBgYGABEGBwYHACgGCAYIAA4GCQYJAGAGCwYLAFUGDAYMAEcGDQYNAGAGDgYOABAGDwYPAGAGEAYQACgGEQYRABQGEwYTAA0GFAYUAAkGFQYWAGAGFwYXAFUGGAYYAAgGGQYZAGwGGgYaAGAGHAYcAGAGHQYeACgGHwYgAEYGLgYuABYGMAYwABkGMgYyABcGMwYzABgGNgY2AFMGOAY4AFwGOgY6AGcHJAckAAYHJQclAD4HsgezAC0AAirQAAQAACxyMGAAOQBgAAD/2P/cAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/4P/k/9j/+gAEAAQABAAEAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAD/9v/2//b/5P/s/+z/2P/d/8v/7v/w/+7/8AAE/6v/3P/n/+D/3P/s/9z/8f/sAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAUAAAAAP/u//b/9wAA//gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUAAD/7AAAAAAAAAAA/+wAAAAA//n/8P/4/+T/+P/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFgAAAAAAAAAA//r/+v/6/+4AAAAA//b/8AAAAAAAAP/L/+b/9f/m/+b/7gAA/8z/9v/4//D/0P/Y/8j/5P/7ABT/+//uAAAAAAAA//b/5f/s/+7/3v/u/+b/9v/e//r/0P/dAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/7QAAAAAAAAAAAAAAAP/2AAD/7gAAAAD/7gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACz/7gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/9gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAD/7/+w/9v/vf/Z/8QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/jwAAAAAAAAAAAAz/5gAA/9wAAP+gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/g/8sAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/QAAD/3P/u/8YAAP/4AAD/8gAAAAAAAP/l/4j/9gAA/6oAAAAA/9T/6AAA/8z/lP9U/5D/kP+AAAwAAAAAAAAAAAAA//r/3P/k/9v/y/+x/9r/xf/LAAD/lP90/7AAAAAAAAD/7gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/+QAAAAA/+YAAAAAAAAAAAAA//D/7P/oAAAAAP/sAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/2AAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/8/+j/8P/cAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/4AAD/+AAAAAAAAAAAAAgADAAAAAAAJAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGAAgABQAAAAAAAAAAAAAAAAAAAAAABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJAAkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/+AAAAAAAAAAAAAAAAAAAAAAAAAAKAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/2AAAAAAAAAAAAAAAAAAD/9QAAAAAAAP/sAAD/1P/m/8UAAP/m/8j/8wAAAAAAAAAA/+D/3P/5AAD/8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/+P/s//gAAP/4AAD//P/x/9wAAAAAAAD/+//5//z/z//LAAAAAAAAACT/+//4//j/9v/4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/6v/cAAAAAP/qAAD/9v/3/+wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/wAAD/7AAAAAAAAAAAAAAAAP/uAAAAAP/nAAAAAAAAAAAAAAAAAAAAAAAA/+0AAAAAAAAAAAAA/+wAAAAAAAAAAAAAAAAABP/0AAAAAAAA//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/5AAA/8r/+gAAAAwAAwAEAAQAAAAAAAAAAAAAAAAAAAAA/+QAAP/u/+z/8AAAAAAAAAAAAAAAAP/oAAAAAP/c//oABAAAAAAAAAAA//YAAAAAAAAAAP/2AAAAAAAA//gAAAAAAAD/9AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/+YAAAAA/+7/7AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/l/+aAAD/9v/sAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/+AAAP/k//wAAP/4AAAAAAAAAAAAAAAAAAAAAAAA/+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/iP98/3IAAAAIAAAAEgAAAAT/3v/wAAD/6wAAAAAAAAAA//IAAP/u//b/7AAA/+j/7AAAAAAAAAAAAAAAEAAA/9YAAAAAAAAAAAAA/84AAP/2AAAAAAAAAAAAAAAAAAAAAAAAAAD/zgAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/9gAA/+QAAAAA/+z/zQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABxAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP+o/7cAAAAAAAAAAAAAAAD/5P/2AAD/9gAAAAAAAAAAAAAAAAAAAAD/+AAH/+T/7AAAAAD/9wAA//QAIAAAAAAAAAAAAAAAAAAA/+4AAAAAAAAABwAAAAUAAAAHAAAAGAAAAAT/6AAAAAAAAAAAAAD/vgAHAAAAAAAAACj/+P/cAAAAAAAAAAD/9gAA/5MAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/8wAAAAD/9v/0AAAAAAAA/+8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAA//YAAP/wAAAAAAAAAAAAAAAAAAAAAAAA//YAAAAAAAAAAAAA/90AAAAAAAAAAAAAAAAAAP/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABgAA//QAAAAA//oABAAEAAz/+P/4AAD/9gAAAAAAAAAA/+4AAP/w//H/8AAA/+L/4v/uAAAAAP/2//YABwAAABAAAAAAAAAAAAAA//gAAP/yAAAAAP/zAAAAAAAAAAoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//gAAAAAAAD/9gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/9QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/9QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/QAAAAAAAAAAAAAAAAAAD/tAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/2AAAAAD/1AAAAAAAAAAAAAD/7AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/2AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/sAAD/2P/s/+QAAAAA/+wAAAAAAAoAAAAA/+f/5//kAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/2AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/3//cAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/9gAAAAD/9v/sAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAA//gAAAAAAAAAAAAA//oAAP/7AAAAAAAAAAAAAAAA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AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/4P/kAAD/9AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//YAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/6P/m/8gAAAAKAAAAAAAEAAX/+P/2AAAAAAAAAAAAAAAAAAAAAP/w/+4AAAAAAAAAAAAAAAAAAAAAAAAAAAAA//gACgAAAAAAAAAA//QAAP/2AAAAAP/4AAAAAAAAAAAAAAAAAAD/8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/+AAA//YAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/E/9gAAAAAAAAAAAAAAAD/7AAA//b/+AAAAAAAAAAA/+wAAAAA/+7/5AAA//AAAAAAAAAAAP/2AAAAG//7AAAAAAAAAAAAAAAA//MAAAAAAAAAAP/2AAAAAAAAAAAAAAAAAAD/7AAAAAAAAP/8AAD/zwAAAAAAAAAAACgAAAAAAAAAAAAAAAD/9gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/yv/EAAD/9gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//b/9gAA//YAGAAFAAAAAAAAAAAAAAAAAAAAAAAA//QAAAAAAAAAAAAAABQAAAAAAAAAAAAAAAAAAAAWAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/yv+0/8AAAAAUAAYADAAKABT/3f/sAAD/7QAAAAAAAAAAAAD/4v/tAAD/6wAA/+z/7P/lAAAABAAA//0AMwA6//gAAAAAAAAAAAAA/+7/9v/2//b/9gAK//YAAP/2AAAAAAAAAAD/5QAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/7v/4AAAAAP/4AAD/7AAAAAAAAAAAAAAAAAAA/+wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP+t/+IAAAAAAAAAAAAAAAD/9gAA//b/+AAAAAAAAAAA/+QAAAAA/+T/5gAAAAAAAAAAAAAAAP/2AAAAC//8AAAAAAAAAAAAAAAA//gAAAAAAAAAAP/2AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/zwAAAAAAAAAAAAAAAAAA/+4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/0//eAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/9wAAAAAAFgAEAAAAAAAAAAAAAAAAAAAAAAAA//wAAAAAAAAAAAAAABQAAAAAAAAAAAAAAAAAAAASAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/1v/a/9EAAAAUAAoADAAMABb/9P/8AAAAAAAAAAAAAAAAAAAAAAAAAAD/9gAA//b/9v/mAAAABAAAAAAAGQAmAAAACAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAD/+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/wAAAAAAAAAAAAAAAAAAD/9gAAAAD/5gAAAAAAAP/k/+gAAAAA/9oAAAAA/+7/5P/sAAAAAP/r/+wAC//7AAAAAAAAAAAAAAAAAAD/9v/4AAAAAP/tAAAAAP/xAAAAAAAAAAAAAAAAAAAAAP/8AAAAAP/wAAAAAAAAAAAAAAAA//YAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQ/+T/7gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/9v/sAAAAAAAA//gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/7AAAAAD/+AAA/+wAAAAA//r/7gAA/+YAAP/6AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAA//EAAP/s//r/+gAA//P/9gAAAAD/8AAAAAAAAP/m/+z/9v/2AAD/7gAA/9z/7v/uAAD/8P/2/9j/9AAUAAz/8f/xAAAAAAAA//r/5v/u//b/5gAA/+4AAP/mAAD/8P/2AAAAAAAAAAD/5gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/E/9gAAAAAAAAAAAAAAAD/7AAA//b/+AAAAAAAAAAA/+wAAP/u//D/5AAAAAD/+P/4AAAAAAAAAAAAGwAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/4AAAAAAAAAAAAAAAAAAD//AAAAAAAAP/8AAD/zwAAAAAAAAAAAAAAAAAA//gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/rP+yAAD/7v/2AAAAAAAA//YAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/7v/uAAAAAAAAAAAAAAAA//b/7AAA/+QAFgAEAAAAAAAAAAAAAAAAAAAAAAAA/+wAAAAAAAAAAAAAABgAAAAAAAAAAAAAAAAAAAASAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/nP+Q/5z/ywAK/+z/+//6ABL/tP/EAAD/yQAAAAAAAP/N/+7/2v/aAAD/yP/c/7T/t//K//D/+wAA/8gAGAAq/9z/3AAAAAAAAAAA/+7/7v/t//b/7gAA/+QAAP/u/9wAAAAAAAD/0QAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/yf/wAAAAAP/nAAD/6gAAAAAAAAAAAAAAAP/u/9gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/8gAAAAD/9gAAAAAAAAAA/+r/9gAA//EAAAAA/+YAAAAAAAAAAAAA//YABwAEAAAAAAAAAAAAAAAAAAAAAAAAAAD/+AAAAAAAAP/4AAAAAAAAAAAAAAAAAAAAAP/8AAD/8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/+wAAAAD/6gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/6P/2AAAAAAAA/+gAAAAAAAb/7AAA/+IAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/+gAAAAAAAD/9gAAAA3/9P/1AAD/8wAAAAAAAP/uAAD/8v/k/+4AAAAA/+j/6AAAAAAAAAAA/8QAFAAUABD/9AAGAAAAAAAAAAD/7P/i//b/9AAA//QAAP/0AAAAAAAAAAAAAAAAAAD/7AAAAAAAAAAAAAAAAAAAAAAAAP/4AAAAAAAAAAD/9AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/+wAAAAAAAAAAAAAAAAAAAAAAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUABQAFP/wAFD/7AAE/+wABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAA/9wAAAAAAAAAAAAAAAAAAP/kAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/2AAAAAAAAAAAAAAAAAAAAAAAYACgAKAAAAAQAAAAAAAAAAP/2ABgAIf/cAAIARQAFAAUAAAALAA0AAQAQABsABAAdAB0AEAAjACMAEQAmADUAEgBZAF0AIgCOAJkAJwClALYAMwC4AM4ARQDQAQQAXAEhASMAkQEpASkAlAFLAU8AlQFcAVwAmgFeAWMAmwFlAWgAoQFqAYcApQGJAZ8AwwGhAdIA2gHUAdUBDAHZAdsBDgHeAd4BEQHgAeEBEgHkAeQBFAHrAesBFQHtAfEBFgH0AfQBGwH4AfgBHAH7AgEBHQIDAgMBJAIFAgcBJQIJAgsBKAIOAg4BKwIRAhEBLAIVAhUBLQIZAhoBLgInAikBMAI5Ak8BMwJSAloBSgJdAl0BUwSDBIQBVASiBKIBVgSkBKQBVwSmBKYBWAS3BLcBWQS5BLkBWgS7BLsBWwTPBM8BXATVBNcBXQTaBOUBYAUJBQ0BbAU+BUIBcQVEBUkBdgVVBWQBfAVmBX8BjAWBBbIBpgW0BbUB2AaaBpoB2gadBp0B2wahBqMB3AalBqcB3waqBqoB4gauBrAB4wayBrIB5ga1BrYB5wa4BrgB6Qa8Br4B6gezB7MB7QACAKcABQAFABAACwALAAEADAAMAAQADQANAAkAEAAQABAAEQARABIAEgASABAAEwATABYAFAAUAB0AFQAVACEAFgAWACcAFwAXACoAGAAYAC0AGQAZADAAGgAaADMAGwAbADYAHQAdAA4AIwAjAAoAJgAmAAIAJwAnAAcAKAApAAoAKgArAA4ALAAsACUALQAtABQALgAuABsALwAvAB8AMAAwACUAMQAxACgAMgAyACsAMwAzAC4ANAA0ADEANQA1ADQAWQBdABAAjgCOAAEAjwCRAAQAkgCSAAkAkwCTAAYAlACZAAkApQC2ABAAuAC9AA0AvgC/ABAAwADAABIAwQDHABYAyADOAB0A0ADXACEA2ADnACcA6ADtACQA7gDvACcA8ADzAC0A9AD7ADMA/AEAADYBAQEBABABAgECAB4BAwEEABABIQEjAA4BKQEpAAUBSwFPAAoBXAFcACUBXgFhAAIBYgFiAAcBYwFjAAUBZQFoAAcBagF1AAoBdgGHAA4BiQGOAAsBjwGRAA4BkgGYABQBmQGfABsBoQGoAB8BqQG4ACUBuQG+ACIBvwHBACUBwgHFACsBxgHNADEBzgHSADQB1AHUAA4B1QHVAAoB2QHbAA4B3gHeABMB4AHgAA4B4QHhACUB5AHkAA4B6wHrACUB7QHtADEB7gHuACUB7wHwAAoB8QHxACUB9AH0AAcB+AH4ABMB+wH8ACUB/QH+AAoB/wH/ABMCAAIAACUCAQIBAA4CAwIDAA4CBQIGAA4CBwIHACUCCQIJABMCCgILABQCDgIOABsCEQIRAB8CFQIVAA4CGQIZACgCGgIaADQCJwInAAcCKAIpAB8COQJPACUCUgJaACUCXQJdAAUEgwSEADgEogSiADcEpASkADcEpgSmADcEtwS3ADcEuQS5ADcEuwS7ADcEzwTPAA8E1gTWAAME1wTXAAgE2gTaAA8E2wTbABEE3ATcAA8E3QTdABUE3gTeABwE3wTfACAE4ATgACYE4QThACkE4gTiACwE4wTjAC8E5ATkADIE5QTlADUFCQUNAA8FPwVBAAMFQgVCAAgFRAVJAAgFVQVkAA8FZgVrAAwFbAVvAA8FcAVwABEFcQV3ABUFeAV/ABwFgQWIACAFiQWYACYFmQWeACMFnwWgACYFoQWkACwFpQWsADIFrQWxADUFsgWyAA8FtAW1AA8GmgaaABkGnQadABcGoQahABkGogaiABcGowajABgGpQalABcGpganABkGqgaqABgGrgauABcGrwawABoGsgayABoGtQa2AC4GuAa4ABoGvAa8ABcGvQa9ABgGvga+ABcHswezAAcAAgDvAAIAAgAnAAQABAAoAAgACAAoAAsACwADABAAEAAoABIAEgAoABQAFAApABUAFQASABYAFgAqABcAFwAsABgAGAAuABkAGQBCABoAGgAVABsAGwBGABwAHAAKAB4AIAANACEAIQA3ACIAIgALACQAJABPACUAJQAMACgAKQBOACoAKgANACsAKwBOACwALAANAC0ALQBOAC4ALgBAAC8ALwARADAAMAATADEAMQArADIAMgAtADMAMwAUADQANAAvADUANQAWADYATQAnAE4AUABMAFQAWAAoAHMAewAoAI4AjgADAKUAvwAoAMgAzgApANAA1wASANgA7wAqAPAA8wAuAPQA+wAVAPwBAABGAQYBIAAKASEBIQBKASQBQQANAUIBQgA3AUMBSgALAU8BTwBKAVABWwBPAVwBXABOAV0BXQAMAWEBYQBOAWoBdABOAXYBkAANAZEBmABOAZkBnwBAAaEBqAARAakBwQATAcIBxQAtAcYBzQAvAc4B0gAWAdUB1QBOAdYB1gAMAdcB1wBPAdgB2AATAdkB2QBOAdwB3AANAd0B3QBDAd4B3wANAeEB4QANAeIB4gBOAeMB4wANAeYB5gBRAegB6ABRAekB6QAMAeoB7AANAe0B7QAvAe4B7gATAfEB8QBOAfQB9ABOAfUB9QBIAfoB+gBOAfsB/AATAf0B/QBOAf4B/gAMAf8CAABOAgMCBgANAgcCCQBJAgoCCgBOAgwCDQBOAg4CDgBAAg8CEAAMAhECEgARAhUCFQATAhYCFgBBAhcCFwBEAhgCGABBAhkCGQArAhoCHAAWAh4CHgA4Ah8CHwA5AiUCKQA3AioCNwBFAjkCWgANAmQCZAA3AmUCZQBPAmcCZwBIAnsCewBfAocChwBfAukC6gBfA44DjgBQA7QDtABVA7YDtgBbA7sDuwBeA8MDwwBZA9kD2QBYA9oD2gBeA98D3wBZA+YD5gBbA/ID8gBbA/oD+wBZBAAEAABTBAcEBwBdBB4EHgBcBCUEJQBXBCYEJgBdBCgEKABcBC0ELQBaBIEEggACBIMEhAAXBIUEhQACBIYEhgBSBIgEiAAbBIoEiwAyBIwEjAAxBI0EjQAcBI4EjgAxBI8EjwAcBJAEkQACBJIEkgAZBJMEkwAaBJQElAAZBJUElQAaBJYEmAAYBJsEnAAYBJ0EnQAeBKMEowA8BKUEpQA8BKcEpwA8BKgEqAA0BKoEqgAzBKwErAAdBLIEsgBSBLMEswAbBLQEtABSBLUEtgAbBLgEuAA8BLoEugA8BLwEvAA8BMMEwwAfBMQExAAgBMsEywBPBMwEzAAhBM0EzQBNBM4EzgAiBM8E0QBNBNIE0gAiBNME0wBNBNUE1QABBNYE2QBNBNoE2gAiBNsE2wBNBNwE3AAiBN0E3QBNBN4E3gAEBN8E3wAFBOAE4AAGBOEE4QAHBOIE4gAIBOME4wAjBOQE5AAJBOUE5QAwBOYE/QAhBP4FAABLBQIFAwBNBQQFCAAiBQkFDABNBQ4FIgBNBSMFKwAiBSwFLwBNBT4FPgABBT8FSABNBUoFVABNBVUFbwAiBXAFdwBNBXgFfwAE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AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/3f/2AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/4AAAAAP/2AAAAAP/2AAAAAAAAAAAAAP/0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//QAAAAAAAAAAAAA/+4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/7P/2//b/7AAAAAAAAAAA/7L/7v/uAAAAAP/2//b/9v/kABYAEgAAAAAAAAAAAAAAAAAAAAAAAP/w/+b/9v/2ABgABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/J/9r/6v/J/9wATP/Y/+7/7gAA/8n/7gAA/83/7v/u/9gAAAAA//j/6v+0AAD/+wAA/8j/0gAA/9wACgAS/9z/3/+/AAD/3P+Q/7f/yv/w/9H/3AAAAAAAAAAAAAAAFf/u/+wAAP/d/9j/2P/u/+4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/7gARAAD/8P/xAAD/8P/xAAAAAP/uAAAAAAAAAAAAAP/wAAAAAAAAAAAAAAAA//sAAAAAAAAAAAAAAAAAAAAAABgADAAAAAAABwAA//gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAAAAAAAAAAAAAAAAAAAAsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/9gAA//YAAAAAAAAAAAAAAAAAAP/uAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/2AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/2AAAAAAAA/+wAFP/4/+z/5AAA//YAAAAA/+wAAP/q//YAAAAAAAAAAP/cAAAAAAAA/9oAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/2gAR/+z/8P/TADz/5v/TAAAAAP/aAAAAAP++AAD/3P/kAAAAAP/uAAD/7AAA//sAAP/LAAAAAAAAAAAAAAAAABgADAAAAAAABQAA//gAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAAAAAAAAwAAAAAAAAAAAAAAAAAAAAAAAsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/6AAAAAD/7AAAAAD//AAAAAAAAAAAAAD/6P/2AAAAAAAGAAAAAP/iAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/z/+T/4P/0//QANf/4//T/0v/8//P/7P/0/+4AAP/g//L/7gAA//T/9P/oAAAAAAAA/8T/6gAG//QAAAANAAAAAAAA/+gAAAAA/+gAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/+YAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/xP/u/+T/5v/4/+T/1P/8/+D/8P/cAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/IAAD/9AAAAAAAAAAAAAAAAAAAAAAAAAAUABQAAAAAAAAAAAAAAAAAAAAA//H/3gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/9z/2AAAAAAAAP/KAAAAAAAAAAAAAAAAAAAAAAAKABD/4v/2//b/+v/2AAYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/6z/xf+3/+QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/cAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/+7/t//uAAD/7v+sAAAAAAAA/9gAAAAAAAAAEgAMABQABAAcAA7/9gAU//YADgAU//X/8P/4AAj/+P/6//D/2P+i/7j/+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/+4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/+8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA/+QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/uAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAI//YAAAAAAAAAAAAAAAAAAP/7AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//b/7gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/7gAA//j/+P/2//gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/+7/7AAA/+wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//b/5P/z//j/7v/iAAAAAAAAAAAACv/3AAAADAAKAAAAAAAAAAAAAAAKAAAAAAAAAAD/7v/2AAz/9v/4/+4AAAAA/+wAAP/t/+7/+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/3gAAAAAAAP/uAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/uAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/2/+z/7gAA/+QAAAAAAAD/8P/wAAAAAAAAAAAAAAAAAAAAAP/2AAAAAAAAAAAAAAAAAAAAAAAA//sAAAAAAAAABgAAAAAAAAAAAAD/9v/kAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/9wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/7AAAAAAAAAAAAAAAAP/sAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/9P/3AAAAAAAAAAAAAAAA/+4AAAAA//cAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/dAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/cAAAAAAAA/7gAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/+4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/9z/9P/4//j/8AAAAAAAAAAAAAAACQAA/+wAAAAAAAQAAAAAAAAAAAAA/9sAAAAA/+7/7v/2AAAAAP/4/+4AAP/8AA4AAP/2/+T/9v/sAAAAAP/2AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/3wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEwAAAAAAAAAAAAAAAAAAAAAAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEABMAEwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKAAD/9gAA//gAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//EAAP/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//b/5P/m//b/3P/oAAAAAP/w/88AAAAAAAAAAAAAAAAAAAAA//X/+wAAAAAAAAAAAAD/+v/6AAD/8AAA//r/3v/x/+YAAP/s/+wAAP/2AAAAAAAAAAAAAAAA//kAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/s//YAAAAAAAAAAAAA//YAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/4AAAAAAAAAAAAAAAAAAD/9gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/5AAAAAAAAAAAAAAAAAAAAAAAAAAK//b/9AAAAAAAAAAAAAAAAAAAAAAAAAAA/+4AAP/2AAAAAP/TAAD/9gAAAAAAAAAAAAAAAAAAAAD/9gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/uABgAGAAo/+wAAAAAAAAAAAAAAAAAAAAAAAAAAP/AAAAAAAAW//wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIwAAAAAAKgA+ACoALQAAAAAAAP/PADwAAAAAAAAAAAAAAAAAAAAA/+wAAAAAAAD/+AAAAAAABAAAAAD/+AAYAAAAIAAyAEgAAAAAAAAAAP/1//YAAAAAAAAAAAAA/+7/9gAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/sgAAAAAAAAAAAAAAAAAAAAAABwAHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/+7/pgAAAAD/+wAA//v/9gAAAAAAAAAAAAD/7gAAAAAAAP/6AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/7gAAAAAAAAAAAAAAAAAAAAAAAAAA/6T/7AAAAAD/0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/9gAA//r/+v/yAAAAAAAAAAAAAP/Y/5wAAAAAAAAAAAAA/+7/2gAAAAD/9v/l/+QAAP/e/+YAAP/c/+T/5gAAAAYACwAA/3r/5f/i/+T/7gAA/+0AAAAAAAD/zAAAAAD/2f/w/+wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/7n/qP+0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/mAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/+0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/+AAAAAAAAAAAAAD/5v/uAAAAAAAA/+b/3P/LAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/2AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//QAAP/uAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/uAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/88AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/5AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/SABwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAD/3AAAAAD/7v/oAAAAAAAQAAQAAAAAAAAAAAAAAAAAAAAA/+0AAAAAAAAAAAAAAAD/+P/4AAAAAAAAAAQAAAAEAAAAAAAAAAAAAAAA/+4AAAAAAAAAAAAA/+4ALgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/9v/uAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/3AAAAAP/6//gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/s/+7/+AAA/+oAAAAAAAAAAAASAAAAAAAKAAwABP/7AAAAAAAAABQAAAAAAAAAAAAAAAAACwAAAAAAAAAA//T/9QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/+4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAEAAUABgAIAAMAAAAAAAQAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/+YAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/7gAA/+4AAAAAAAD/5v/mAAAAAAAA/+cAAAAAAAAAAAAAAAAAAP/2//gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/3wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAABAAEAAUABQAFAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIASAACAAQAAAAGAAoAAwAOAA8ACAAcABwACgAeACIACwAkACUAEAA2AFgAEgBeAI0ANQCaAKQAZQC3ALcAcADPAM8AcQEFASAAcgEkASgAjgEqASwAkwEuAUoAlgFQAVsAswFdAV0AvwGIAYgAwAGgAaAAwQHWAdgAwgHcAdwAxQHfAd8AxgHiAeIAxwHmAegAyAHqAeoAywHsAewAzAIEAgQAzQIIAggAzgIMAg0AzwIPAg8A0QISAhIA0gIlAiYA0wIqAjgA1QJQAlEA5AJbAlwA5gJfAmIA6AJkAmUA7AJtAm4A7gJwAnAA8AJzAnUA8QJ3AncA9AJ5AnsA9QKCAoQA+AKGAocA+wKOAo4A/QKQApAA/gKWApYA/wKbApwBAAKfAp8BAgKjAqMBAwKrAqwBBAKvAq8BBgLEAtkBBwLjAuoBHQNKA1kBJQOLA4sBNQTLBM4BNgTQBNMBOgTYBNkBPgTmBQgBQAUOBS8BYwVKBVQBhQVlBWUBkAWABYABkQW2BbcBkgW9Bb4BlAXABcABlgXDBcUBlwXHBccBmgXKBcsBmwXQBdQBnQeyB7IBogACAHkAAgACABMAAwADABYABAAEABkABgAGAB4ABwAHACEACAAIACcACQAJACoACgAKAC0ADgAPACoAHAAcABEAHgAeABcAHwAfABoAIAAgABwAIQAhAB8AIgAiACUAJAAkACwAJQAlAC4ANgBNABMATgBQAB4AUQBTABYAVABYABkAXgBxAB4AcgByACEAcwB7ACcAfAB/ACoAgACAACgAgQCNAC0AmgCkACoAtwC3AB4AzwDPACQBBQEFAC0BBgEdABEBHgEgABwBJAEoABcBKgEsABoBLgFBABwBQgFCAB8BQwFKACUBUAFbACwBXQFdAC4BiAGIABwBoAGgACIB1gHXAC4B2AHYABwB3AHcABcB3wHfABsB4gHiABQB5gHmABcB5wHoABQB6gHqABsB7AHsABcCBAIEABcCCAIIABoCDAINABQCDwIPABsCEgISABsCJQIlAB8CJgImACwCKgI3ACsCOAI4ACoCUAJRACwCWwJcABoCXwJiABoCZAJkABoCZQJlACwCbQJtABACbgJuAAMCcAJwAAMCcwJ0AAMCdQJ1AA0CdwJ3AAMCegJ6AAYCewJ7AAoCggKEAAMChgKHAAoCjgKOAA4CkAKQAAcClgKWAAsCmwKbAAQCnAKcAAgCnwKfAAgCowKjAAcCqwKsAAgCrwKvAAgCxALZAAMC4wLqAAoDSgNZAAgDiwOLAAEEywTLACwEzATMABIEzQTNABUEzgTOABgE0ATQAB0E0QTRACAE0gTSACYE0wTTACkE2ATZACkE5gT9ABIE/gUAAB0FAQUDABUFBAUIABgFDgUhAB0FIgUiACAFIwUrACYFLAUvACkFSgVUACkFZQVlAB0FgAWAACMFtgW3ACkFvQW9AA8FvgW+AAIFwAXAAAIFwwXEAAIFxQXFAAwFxwXHAAIFygXKAAUFywXLAAkF0AXQAAIF0QXRAAkF0gXUAAIHsgeyACwAAgEbAAIAAgBxAAQABABWAAgACABWAAsACwBkABAAEABWABIAEgBWABQAFABlABUAFQBCABYAFgBZABcAFwBDABgAGABEABkAGQBeABoAGgBFABsAGwBmABwAHABTAB4AIABoACEAIQBUACIAIgBnACQAJABrACUAJQBvACgAKQBzACoAKgBoACsAKwBzACwALABoAC0ALQBzAC4ALgBXAC8ALwBBADAAMABqADEAMQBaADIAMgBbADMAMwBdADQANABfADUANQBuADYATQBxAFQAWABWAHMAewBWAI4AjgBkAKUAvwBWAMgAzgBlANAA1wBCANgA7wBZAPAA8wBEAPQA+wBFAPwBAABmAQYBIABT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AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/2/8D/sP+sAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/7X/1P/YAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/9r/8f/s/+7/5P/u/8j/t//q/+z/2v/I/7f/4v/Y/+7/5P/s/+T/yP/d//b/3P/d/+T/3P/s/8oAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/+b/9v/0AAAAAAAAAAD/6gAAAAAAAAAA/+oAAAAAAAAAAAAAAAAAAAAAAAAAAP/qAAAAAP/6/+7/9v/u/+z/+gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGAAAAAAAAP/s//YABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/+z/1ABA/70ABP+9/8D/8f/0AED/vf/x/9T/8f/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/+7/7P/s//QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/2AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/zAAYAAAAAAAA/7oAAAAAABgAAAAA/8z/5v+6AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/8f/sAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/sAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/7P/7//T/+//0/98AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/+L/2P/gAAD/2P/T/9r/0wAAAAAAAAAAAAAAAAAAAAD/vAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/1v/q/9j/6v/L/8j/0v/MAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/5P/YAAD/9gAA/+QAAAAAAAAAAAAA//b/2P/uAAAAAAAAAAD/9gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/sAAAAAAAMAAD/7gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/+T/5v/2/9f/5v/Y/+T/4v/X/+b/4gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/9AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/0AAD/9gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/uAAD/8f/xAAAAAAAAAAAAAAAAAAAAAP/mAAAAAAAAAAAAAAAAAAAAAP/0AAD/9AAAAAD/7gAAAAD/3AAA/7wAAP+8/6gAAAAAAAD/vAAA/9wAAP+o/+wAAAAAAAAAAAAAAAAAAAAAAAD/7AAA//b/7AAA/9j/7AAAAAD/5f/Y/+z/5f/k/+T/7P/c/+T/5v/0/+T/3P/c/+7/9P/I/9r/4P/k/+T/3P/gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/+4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/7v/u//YAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//b/9gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/6cAAP/d/6sAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/qAAt/6AAAP+g/4IAAAAAAC3/oP/K/6j/yv+CAAAAAAAAAAD/ywAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP+n/8QAAP+7AAAAAAAA/6f/uwAAAAAAAAAAAAAAAP+n/8T/uwAA/93/3f/L/93/q/+rAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAE/+7/7P/U/+7/7P/s/9gAAAAAAAAAAAAAAAD/1AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAA/+4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//AAAP/sAAAAAP/U/9gAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/+4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/o//T/7AAAAAAABQAEAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/6AAA//QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/+z/+gAF/9T/+gAAAAT/7P/U//r/7AAAAAAAAAAAAAAAAP/oAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/o//T/7AAKAAAAGAAWABYAAAAAAAAAAAAAAAAACgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/6AAA//QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/+wAAAAY/8AAAAAKABb/7P/AAAD/7AAAAAAAAAAAAAAAAP/oAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/e//T/7AAKAAAAFgASABIAAAAAAAAAAAAAAAAACgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/3gAA//QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/+wAAAAW/6wAAAAKABL/7P+sAAD/7AAAAAAAAAAAAAAAAP/eAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/ugAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/ugAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/vwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/9v/w//b/+wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/+wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHAAAAAAAAAAAAAAAAAAcAAAAAAAAAAAAAAAAAAAAA//v/5AAAAAD/7AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/YAAAAAAAAAAAAAAAA/9gAAAAAAAAAAAAAAAAAAP/YAAAAAAAA//D/8P/k//D/9v/2AAAAB/+wAB8AB/+w/+4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/ywAAAAAAAAAAAAAAAAAAAAAAAAAA//YAAAAA//AAAP/2AAAAAAAAAAAAAAAAAAD/5gAAAAD/7gAAAAD/5wAA//gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/7gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//gAAAAAAAAAAAAAAAAAAAAAAAD/5wAAAAAAAAAAAAD/8AAA//gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/88AEP/PAAD/vv/P/8//8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGAAAAAAAAAAAAAAAAAAAAAAAAD/3//P/8//z//wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/3wAAAAAAAP++AAAAAAAA/+H//P/LAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/3P/w/9//8P/uAAD/8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/YAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgAAAAA//AAAP/4AAD/9gAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//b/7AAA//gAAP/wAAAAAAAAAAD/7AAAAAAAAP/k//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/zAAAAAP/4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/YAAAAAAAAAAD/0AAAAAAAAP/4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/rQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//b/5AAA//gAAP/nAAAAAAAAAAD/9gAAAAAAAP/mAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/2AAD/7gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/iAAAAAAAAAAAAAAAAAAAAAP/4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//b/7AAA//gAAP/wAAAAAAAAAAD/7AAAAAAAAP/kAAD/7gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/9gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/YAAAAAAAAAAAAAAABACgB3QHzAfoCFgIXAhgCHgIfApgDlAOnA6gDqQOqA6sDrAOtA+wD8AQ4BDkESAReBHQEhwSJBJ0EqASqBhEGFQYpBisGLwYwBjIGMwY2ByoHLgACACcB3QHdAAsB+gH6AAECFgIWACUCFwIXACYCGAIYACcCHgIeAA0CHwIfAA4CmAKYABUDlAOUAB8DpwOnABADqAOoAAYDqQOpACIDqgOqABIDqwOrAAgDrAOsABEDrQOtAAcD7APsAAQD8APwAAIEOAQ4ACAEOQQ5ACEESARIAAoEXgReABwEdAR0ABsEhwSHAAwEiQSJABYEnQSdABQEqASoAB4EqgSqAAkGEQYRAAUGFQYVAAMGKQYpAB0GKwYrABMGLwYvABcGMAYwABoGMgYyABgGMwYzABkGNgY2AA8HKgcqACQHLgcuACMAAgFsAAIAAgBsAAQABAAEAAgACAAEAAsACwB7ABAAEAAEABIAEgAEABQAFABtABUAFQBBABYAFgBCABcAFwBDABgAGABEABkAGQBuABoAGgBFABsAGwBvABwAHABKAB0AHQB+AB4AIAADACEAIQABACIAIgACACMAIwB+ACQAJAB6ACUAJQBAACYAJwB+ACgAKQBLACoAKgADACsAKwBLACwALAADAC0ALQBLAC4ALgBMAC8ALwAFADAAMABNADEAMQAGADIAMgAHADMAMwBQADQANAAIADUANQBOADYATQBsAFEAUQA+AFQAWAAEAF0AXQA+AHMAewAEAIAAgAA/AI4AjgB7AKUAvwAEAMgAzgBtANAA1wBBANgA7wBCAPAA8wBEAPQA+wBFAPwBAABvAQEBAQA+AQMBAwB8AQYBIABKASEBIQB/ASIBIwB+ASQBQQADAUIBQgABAUMBSgACAUsBTgB+AU8BTwB/AVABWwB6AVwBXABLAV0BXQBAAV4BYAB+AWEBYQBLAWIBaAB+AWoBdABLAXYBkAADAZEBmABLAZkBnwBMAaABoAB+AaEBqAAFAakBwQBNAcIBxQAHAcYBzQAIAc4B0gBOAdQB1AB+AdUB1QBLAdYB1gBAAdcB1wB6AdgB2ABNAdkB2QBLAdoB2wB+AdwB3AADAd4B3wADAeEB4QADAeIB4gBLAeMB4wADAekB6QBAAeoB7AADAe0B7QAIAe4B7gBNAe8B8AB+AfEB8QBLAfQB9ABLAfgB+QB+AfoB+gBLAfsB/ABNAf0B/QBLAf4B/gBAAf8CAABLAgMCBgADAgoCCgBLAgwCDQBLAg4CDgBMAg8CEABAAhECEgAFAhUCFQBNAhkCGQAGAhoCHABOAiUCKQABAioCNwA2AjkCWgADAlsCYgB+AmQCZAABAmUCZQB6AmgCaABkAmsCawBmAm0CbQBrAm8CbwB1AnICcgBkAnUCdQBqAnYCdgB1AnkCeQBpAnoCegA8AnsCewA9An0CfQBlAn4CfgBoAoACgAB5AocChwA9AokCiQBwAosCiwBHApMCkwBnApUClQBIApcClwBxApoCmgBxApsCmwBJAp0CnQBxAp4CngBGAqACoQBxAqQCpABxAqUCpQBwAqoCqgBxAq0CrQBxArACuQB5AroCuwBkAukC6gA9AvUC9QBkAvYC/QB5AxADHABwA0ADRwBxA1oDZABxA2UDcABwA30DiABxA4oDiwBxA7ADsABdA7QDtAAeA7YDtgBiA7cDtwAuA7sDuwAjA74DvgB0A8EDwQB0A8IDwgA6A8MDwwAnA8QDxAAgA8UDxQBgA8cDxwAbA8oDygA6A80DzQAuA88DzwArA9ID0gA6A9QD1AB0A9UD1QBeA9kD2QB4A9oD2gAjA9wD3AA6A98D3wAnA+ED4QBhA+ID4gB0A+MD4wA4A+YD5gBiA+cD5wAuA+kD6QA6A+sD6wB0A+4D7gBgA+8D7wAbA/ID8gBiA/MD8wBdA/gD+QB0A/oD+wAnA/wD/AByA/0D/QAZA/4D/wAkBAAEAAAcBAEEAQBzBAIEAgAvBAMEAwAsBAQEBgAkBAcEBwAhBAgECQAkBAoECgBzBAsECwAkBA0EDQBzBA4EDgAmBA8EDwA7BBAEEABzBBEEEQBfBBIEEgAkBBMEEwAaBBQEFQAkBBYEFgAmBBcEGAAkBBkEGQAfBBoEGgAkBBsEGwApBBwEHQBzBB8EHwAkBCAEIABzBCIEIwB3BCUEJQA5BCYEJgAhBCcEJwAkBCkEKgAkBCsEKwA7BCwELAAkBC0ELQAoBC4ELgBzBC8ELwA3BDAEMAAkBDIEMgAvBDMEMwAsBDQENAAkBDUENQAmBDYENgAkBDcENwBzBDgEOQA3BDoEOgBfBDsEOwAaBD0EPQAvBD8EQAByBEEEQQBzBEMEQwAkBEQERQBzBEYERwA7BIEEggARBIMEhABRBIUEhQARBIgEiAASBIoEiwAVBIwEjAATBI0EjQAUBI4EjgATBI8EjwAUBJAEkQARBJIEkgB9BJMEkwAxBJQElAB9BJUElQAxBJYEmABPBJsEnABPBLMEswASBLUEtgASBMsEywB6BMwEzAAJBM4EzgAKBNIE0gAKBNUE1QBaBNoE2gAKBNwE3AAKBN4E3gALBN8E3wAMBOAE4AANBOEE4QAOBOIE4gAPBOME4wBbBOQE5AAQBOUE5QBcBOYE/QAJBQQFCAAKBSMFKwAKBT4FPgBaBVUFbwAKBXgFfwALBYEFiAAMBYkFoAANBaEFpAAPBaUFrAAQBa0FsQBcBbgFuABjBb0FvQBZBb8FvwB2BcIFwgBjBcYFxgB2BcoFygBXBcsFywBYBc0FzQBWBdEF0QBYBdIF0gBjBdUF1QAyBdYF2AAlBdkF2QAdBdoF2gAlBdsF2wAwBdwF3AAtBd0F3wAlBeAF4AAiBeEF4gAlBeMF4wA0BeQF5QAlBeYF5gA0BecF5wAXBegF6AA1BekF6QAzBeoF6gBTBesF6wAlBewF7AAWBe0F7gAlBe8F7wAXBfAF8QAlBfIF8gAtBfMF8wAlBfQF9AAqBfUF9gAlBfcF9wAXBfgF+AAlBfkF+QA0BfoF+gBSBfsF/AAlBf4F/gBVBf8F/wAiBgAGAAAlBgEGAQAXBgIGAwAlBgQGBAA1BgUGBQAlBgYGBgAYBgcGBwA0BggGCABUBgkGCQAlBgsGCwAwBgwGDAAtBg0GDQAlBg4GDgAXBg8GDwAlBhAGEAA0BhMGEwBTBhQGFAAWBhUGFgAlBhcGFwAwBhgGGAAyBhoGGgAlBhwGHAAlBh0GHgA0Bh8GIAA1BpsGmwCABqEGogCABqQGpwCABqsGqwCABq4GrgCABrUGtgBQBr4GvgCAByQHJAAUByUHJQATB7IHswABAAIKVAAEAAAKggr4AAkAkgAAABT/y//I/7cAKAAoACj/9v/0/8gAGAAo/8T/zP+0ACT/9v/q/8H/yf+c/+z/7P/A/9z/1P/2ABT/yP+e//b/6v/B/8n/nP+6/5AAFP/2ACT/9v/q/8H/yf+c/+z/5f/E/8z/tP/d/97/2v/s/7r/kP+D/2//gP9Y//b/7v/i/+L/3P/S/9L/9gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/9v/s//b/9v/xAAAADAAA//b/8f/wAAD/7AAAAAAAAP/q//H/yAAA/9z/2P/u/9QAAAAAAAD/2AAAAAD/6v/x/8gAAP+0AAAAAAAAAAAAAP/q//H/yAAAAAD/8AAA/+wAAAAA//YAAAAA/7QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/5v/k/+7/3P/s/+7/9v/k/93/7P/k/+7/3P/u/9z/8P/4/9z/3P/s/+z/5v/w/+7/3P/s/8//2AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/zAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/+4AAAAAAAD/9gAAAAAAAAAA//gAAP/mAAAAAAAA/+7/7v/Y//j/3P/cAAD/1AAAAAAAAP/sAAAAAP/u/+7/2P/u/8oAAP/2AAAAAAAA/+7/7v/YAAAAAP/4AAD/5gAAAAD/5v/4/+7/ygAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//j/7P/uAAAAAP/s/+wAAAAA/+wAAP/w/+z/7gAA//j/6AAAAAAAAAAAAAD/7P/uAAAAAAAA//D/9v/u//b/8P/w/+7/8P/u/+7/8P/u/8r/7v/uAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/YAAAAAP/8AAAAAAAAAAD//P/wAAD/7AAAAAAAAP/o/+D/yP/w/8sAAAAA/8QAAAAAAAAAAAAAAAD/6P/g/8j/7v+3AAAAAAAAAAAAAP/o/+D/yAAAAAD/8AAA/+wAAAAA//b/8P/u/7cAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/4v/m/+T/7v/iAAD/7v/c/+7/7P/uAAD/5v/k/+4AAAAAAAAAAP/0/+L/4gAA/+T/7v/0AAAAAP/oAAAAAAAAAAAAAAAAAAAAAP/s/+j/7AAAAAAAAP/s/+D/7P/g/+wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/3QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/8QAAAAAAAD/6P/T/8QAAP/s/+z/2P/EAAAAAAAEAAD/6P/sAAAAAAAAAAD/+//sAAD/8P/o/8T/7AAA/+j/7AAAAAAAAAAA//v/xAAAAAD/6P/sAAAAAAAAAAAAAAAAAAAABAAAAAAABAAAAAD/+wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/uAAAAAP/w/6MAAP/kAAAAAAAA//AAAP/4AAD/8P/FAAAAAAAAAAD/o//uAAAAAP/wAAAAAAAAAAAAAP/fAAAALwAvAAAALAAAAAAAAAAAAAAAAAAA//gAAP/4AAD/+P/e/8X/9gAb/8X//P/o/8T/6P/s/+z/6AAs/+z/vf/e/8X/7v/o//b/hP+9/+3/1P/u/4QAAAAAAAAAAAAAAAAAAAAA/+D/0//EABD/7P/o/9D/xAAAAAAAAAAA/+EAAAAAAAAAAAAAABQAAAAAABD/4QAA/+gAAP/hAAAAAAAAAAAAAAAAAAAAEAAA/+EAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/8P+TAAD/5AAAAAAAAAAAAAAAAAAA//D/yAAAAAAAAAAA/5MAAAAAAAD/8AAAAAAAAP/YAAAAAAAAAAAAAAAAAAAAAAAA/9gAAAAAAAAAAAAAAAAAAAAAAAD/0f+v/90ALP+vAAAAAAAAAAAAAAAAAAAAAAAA/73/0f+v//T/5f/d/2j/vf/tAAD/7gAA//z//P/qAAAAAAAAAAAAAP/YAAD/sAAAAAD/6P/I/6AAAAAAAAAAAP/xAAAAAAAAAAAAAAAAAAAAAAAA//EAAP/oAAD/8QAAAAAAAAAAAAAAAAAAAAAAAP/xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//YAAAAA//b/jwAA/+gAAAAAAAAAAAAAAAAAAP/2/7cAAAAAAAAAAP+P//YAAAAA//YAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/t//sAAD/twAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/twAAAAD/7P97AAD/4QAA/9wAAAAAAAAAAAACAAcEgQSCAAAEhQSGAAIEiASIAAQEigSYAAUEmwScABQEsgS2ABYHJAclABsAAgATBIYEhgACBIgEiAAFBIoEiwAIBIwEjAAGBI0EjQAHBI4EjgAGBI8EjwAHBJIEkgADBJMEkwAEBJQElAADBJUElQAEBJYEmAABBJsEnAABBLIEsgACBLMEtAAFBLUEtQACBLYEtgAFByQHJAAHByUHJQAGAAIBSQACAAIAhQALAAsAWQAUABQAWgAVABUALQAWABYALwAXABcAMgAYABgANQAZABkAXQAaABoAOAAbABsAXgAcABwAhAAeACAAKQAhACEAhgAiACIAhwAlACUAKAAoACkAkAAqACoAKQArACsAkAAsACwAKQAtAC0AkAAuAC4AiAAvAC8AKwAxADEAMAAyADIAMwAzADMAXAA0ADQANgA1ADUAkQA2AE0AhQBOAFAAgwCOAI4AWQDIAM4AWgDQANcALQDYAO8ALwDwAPMANQD0APsAOAD8AQAAXgEGASAAhAEhASEAJwEkAUEAKQFCAUIAhgFDAUoAhwFPAU8AJwFcAVwAkAFdAV0AKAFhAWEAkAFqAXQAkAF2AZAAKQGRAZgAkAGZAZ8AiAGhAagAKwHCAcUAMwHGAc0ANgHOAdIAkQHVAdUAkAHWAdYAKAHZAdkAkAHcAdwAKQHeAd8AKQHhAeEAKQHiAeIAkAHjAeMAKQHpAekAKAHqAewAKQHtAe0ANgHxAfEAkAH0AfQAkAH6AfoAkAH9Af0AkAH+Af4AKAH/AgAAkAIDAgYAKQIKAgoAkAIMAg0AkAIOAg4AiAIPAhAAKAIRAhIAKwIWAhYAWwIYAhgAWwIZAhkAMAIaAhwAkQIeAh4AXwIfAh8AYAIlAikAhgI5AloAKQJkAmQAhgJoAmgAeQJrAmsAVAJtAm0AWAJyAnIAeQJ1AnUAVwJ5AnkAVgJ6AnoAIwJ7AnsAJQJ8AnwAHQJ9An0AUwJ+An4AHgJ/An8AVQKAAoAAeAKBAoMAaAKFAoUAZgKGAoYAgQKHAocAJQKIAogAZQKJAokAGwKKAooAegKLAosAYgKMAowAewKNAo0AfQKOAo4AggKTApMAYwKVApUAZAKXApcAHwKYApgAbwKZApkAgAKaApoAHwKbApsAIQKdAp0AHwKeAp4AUgKgAqEAHwKkAqQAHwKlAqUAGwKmAqYAfQKqAqoAHwKtAq0AHwKwArkAeAK6ArsAeQK8Ar8AaALEAscAaALOAtEAaALaAt0AZgLiAuIAaALjAuUAgQLpAuoAJQLrAu4AZQL1AvUAeQL2Av0AeAL/AwAAaAMHAwcAVQMIAwkAZQMQAxwAGwMdAyQAfQNAA0cAHwNIA0kAgANaA2QAHwNlA3AAGwN9A4gAHwOKA4sAHwOwA7AAdgO0A7QABwO2A7YAUQO3A7cATgO7A7sADAPC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By+Id6wtBw0HBAcLBywB8OYlSCYmSiPm5iVIJiZIJeb+EMYjRigoRiPGAAEADgAAAfQB8AAZAAAzEyczFxYWFzM2Njc3MwcXIycmJicjBgYHBw6Yj54sChYKBAgSCCKYkJmeMAwXDAQJFAknAQLuUBUrFRUrFVD/8VIVLBUVKxZSAAABAAz/PgH9AfAAGwAAFyImJzcWFjMyNjc3AzMXFhYXMzY2NzczAw4CeBYhDxoHEgglKAoHv5RHCxIKBAgRCTyNrBc4T8IGBHABBSQdGgHj1SJGJSNHI9X+Cz5VKgAAAQAmAAABtAHwAAkAADM1EyM1IRUDMxUm0LkBcNDXTwEuc07+0XMA////+gAAAkMDfgImAAIAAAAHBzoBHQAA////+gAAAkMDfgImAAIAAAAHBz0BHQAA////+gAAAkMDQwImAAIAAAAHB0ABHQAA////+gAAAkMDVAImAAIAAAAHB0IBHQAA////+gAAAkMDSAImAAIAAAAHB04BHQAA////+gAAAkMDLwImAAIAAAAHB0QBHQAA////+gAAAkMDUAImAAIAAAAHB0kBHQAA////+gAAAkMDfgImAAIAAAAHB1IBHQAA////+gAAAkMDVAImAAIAAAAHB1YBHQAA////+v8eAkMCjAImAAIAAAAHB2gBHQAA////+gAAAkMDdgImAAIAAAAHB1ABHQAA////+gAAAkMDfwImAAIAAAAHB48BHQAA////+gAAAkMDfwImAAIAAAAHB5EBHQAA////+gAAAkMDlQImAAIAAAAHB5MBHQAA////+gAAAkMDwwImAAIAAAAHB5UBHQAA////+v8eAkMDQwImAAIAAAAnB0ABHQAAAAcHaAEdAAD////6AAACQwPdAiYAAgAAAAcHlwEdAAD////6AAACQwPdAiYAAgAAAAcHmQEdAAD////6AAACQwPOAiYAAgAAAAcHmwEdAAD////6AAACQwPLAiYAAgAAAAcHnQEdAAD////6/x4CQwNQAiYAAgAAACcHSQEdAAAABwdoAR0AAAAC//r/IQJZAowACQAlAAATBzMnJiYnIwYGEyImNTQ2NjcjJyMHIxMzEwYGFRQWMzI2NxcGBuYQiw8NGw0EDBn8MEIbJhAoKMcolsyxzCkxFxALFQciEzwBSjw8MW4zNG39pjEtHzMmCZubAoz9dAQ4HhMT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AVAAAP//AE3/RAJVAowCJgAJAAAABwd2AVAAAAACABkAAAKvAowAEwAXAAAzESM1NzUzFTM1MxUzFSMRIxEjEREzNSNhSEiT4ZRGRpTh4eEB21sGUFBQUGH+JQEQ/vABkUr////rAAAA5AN+AiYACgAAAAcHOgCYAAD//wBMAAABRQN+AiYACgAAAAcHPQCYAAD////uAAABQgNDAiYACgAAAAcHQACYAAD////SAAABXgNUAiYACgAAAAcHQgCYAAD////jAAABTQNIAiYACgAAAAcHTgCYAAD//wABAAABLwMvAiYACgAAAAcHRACYAAD//wBDAAAA7QNXAiYACgAAAAcHTACYAAD////uAAABQgNUAiYACgAAAAcHVgCYAAD//wA+AAAA+AN2AiYACgAAAAcHUACYAAD//wBF/x4A6wKMAiYACgAAAAcHaACYAAAAAQAq/yEBBQKMABYAABciJjU0NjcjETMRBgYVFBYzMjY3FwYGnTBDNBkqkygiGg8LEwchEzvfMS0sRBECjP10EDAaExMJBUoPFP//ACr/IQFFA34CJgCLAAAABwc9AJgAAP////UAAAE7A1ACJgAKAAAABwdJAJgAAP//ABD/9AIRA0MCJgALAAAABwdAAWcAAP//AE3/EQJsAowCJgAMAAAABwdrAUwAAP//AE3/HgJsAowCJgAMAAAABwdoAUwAAP//AE3/RAJsAowCJgAMAAAABwd2AUwAAP//AE0AAAHiA34CJgANAAAABwc9AJoAAAACAE0AAAHiAtwABQAKAAAzETMRIRUDJzMHB02TAQKBBl8CGAKM/fB8Af7eRZn//wBN/xEB4gKMAiYADQAAAAcHawEiAAD//wBNAAAB8wKMAiYADQAAAAcEgQEEAPj//wBN/x4B4gKMAiYADQAAAAcHaAEiAAD//wAD/x4B4gMvAiYADQAAACcHRACaAAAABwdoASIAAP//AE3/RAHiAowCJgANAAAABwd2ASIAAAAB/+kAAAHpAowADQAAMzUHJzcRMxE3FwcVIRVUOTJrk54y0AEC0iJYPAFI/vxXWHGafAD//wBNAAACrQN+AiYADgAAAAcHPQF9AAD//wBNAAACrQNXAiYADgAAAAcHTAF9AAD//wBN/x4CrQKMAiYADgAAAAcHaAF/AAD//wBNAAACTAN+AiYADwAAAAcHPQFS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MhczFSMWFhUUBgYjIicGFRQWMzMyFhUUBgYDMjY1NCYjIgYVFBYTMjY1NCYjIyImJwYVFBYTJiY1NDY3FwYGFRQWF/I6XjhHExsgGBopOl41LCG1TwcJNFg3HR8SIilQXGFEfEodJycdHScnKTJAJyUzGSEMGz1lUD1nXgs6LR4i0xo4LDwoBA0oHxsyEAQSRCs8TygMawsiFDlKJAoPFhMSO0MzUS4BySopJykoKCkq/pMkGRcQAwMYGRwdAq8HKCUzMQM7AxISDhID//8AIv8tAgcC+AImACIAAAAHB1UBDwAA//8AIv8tAgcCrQImACIAAAAHB0MBDwAA//8AIv8tAgcC4wImACIAAAAHB0EBDwAA//8AQQAAAgADcwImACMAAAAHB0ABOQAw//8AQf8eAgACvQImACMAAAAHB2gBKAAA//8AQf9EAgACvQImACMAAAAHB3YBKAAA//8AQf8XAgACvQImACMAAAAHB3MBKAAAAAH//QAAAgACvQAcAAAzESM1NzUzFTMVIxUHNjYzMhYVESM1NCYjIgYHEUFERJOpqQccSzJRSZMdIBwoGAISWwVLSmExWhora13+/PE1KBkX/uIA////ywAAANQDOgImAVwAAAAHBzkAigAA//8AQQAAAUkDOgImAVwAAAAHBzwAigAA////0wAAAUEC6AImAVwAAAAHBz8AigAA////zAAAAUgC4wImAVwAAAAHB0EAigAA////1QAAAT8CyAImAVwAAAAHB00AigAA////9gAAAR4CrQImAVwAAAAHB0MAigAA////0wAAAUEC+AImAVwAAAAHB1UAigAA//8AMAAAAOsDGQImAVwAAAAHB08AigAA//8AN/8eAN0C0wImACQAAAAHB2gAigAAAAIAKf8uAPgC0gAXACMAABciJjU0NjY3IxEzEQYGFRQWMzI2NxcGBgMiJjU0NjMyFhUUBpMsPhYfDCmTKCAaEQkRCR4TOyAlMDAlJTAw0i4tHS4iCgHw/hAPLxcTEwgEQg8SAwsrIiIqKiIiKwD//wAp/y4BSQM6AiYCZQAAAAcHPACKAAD////hAAABMwLnAiYBXAAAAAcHRwCKAAAAAQBBAAAA1AHwAAMAADMRMxFBkwHw/hD////N/zwBQwLoAiYB1gAAAAcHPwCMAAD//wBB/xECHgK9AiYAJgAAAAcHawEl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ASUDGQImApEAAAAHBz4AigAA////1f/0AT8CyAImApEAAAAHB00AigAA//8AJP/0AgUDGQImApcAAAAHBz4BGAAA//8AK//0AekDGQImApwAAAAHBz4BBwAA//8AK//0AekCyAImApwAAAAHB00BBwAA//8AKP/0AsIDGQImAqAAAAAHBz4BdQAA////zf/0AUcDIQImApEAAAAHB4AAigAA//8AK//0AekDIQImApwAAAAHB4ABBwAA////+QAAApUCkQAmAmhSAAAGA6cCAP////QAAAKFApEAJgJoQgAABgOoAAD////xAAACdAKeACYCaDEAAAYDqQcA////+wAAAnQCngIGAoAAAP////cAAAM8Ap4AJwJoAPkAAAAGA6oAAP////QAAAM7Ap4AJwJoAPgAAAAGA6sAAP////cAAAMyAp4AJwJoAO8AAAAGA6wAAP////QAAAMxAp4AJwJoAO4AAAAGA60AAP///+gAAAKtAp0AJgJoagAABgOuAAD////oAAACrQKdACYCaGoAAAYDrwAA////+gAAAkMDUAIGADwAAP////oAAAJDAy8CBgA7AAD////3AAACkgKRACcCbACjAAAABgOnAAD////0AAACkgKRACcCbACjAAAABgOoAAD////qAAACZgKeACYCbHcAAAYDqQAA////9AAAAmYCngIGAoEAAP////cAAAM1Ap4AJwJsAUYAAAAGA6oAAP////QAAAM0Ap4AJwJsAUUAAAAGA6sAAP////cAAAMrAp4AJwJsATwAAAAGA6wAAP////QAAAMqAp4AJwJsATsAAAAGA60AAP////cAAAL4ApEAJwJuAKMAAAAGA6cAAP////QAAAL4ApEAJwJuAKMAAAAGA6gAAP///+oAAALMAp4AJgJudwAABgOpAAD////0AAACzAKeAgYCggAA////9wAAA5sCngAnAm4BRgAAAAYDqgAA////9AAAA5oCngAnAm4BRQAAAAYDqwAA////9wAAA5ECngAnAm4BPAAAAAYDrAAA////9AAAA5ACngAnAm4BOwAAAAYDrQAA////6AAAAzQCnQAnAm4A3wAAAAYDrgAA////6AAAAzQCnQAnAm4A3wAAAAYDrwAA////9wAAAYMCkQAnAnAAowAAAAYDpwAA////9AAAAYMCkQAnAnAAowAAAAYDqAAA////6gAAAVcCngAmAnB3AAAGA6kAAP////QAAAFXAp4CBgKDAAD////3AAACJgKeACcCcAFGAAAABgOqAAD////0AAACJQKeACcCcAFFAAAABgOrAAD////3AAACHAKeACcCcAE8AAAABgOsAAD////0AAACGwKeACcCcAE7AAAABgOtAAD////oAAABvwKdACcCcADfAAAABgOuAAD////oAAABvwKdACcCcADfAAAABgOvAAD////1AAABOwNQAgYAjQAA//8AAQAAAS8DLwIGAIYAAP////f/9AMMApgAJwJ2AI4AAAAGA6cAAP////T/9AL6ApgAJgJ2fAAABgOoAAD////q//QC6AKeACYCdmoAAAYDqQAA////9P/0AtoCngIGAoUAAP////f/9AO3Ap4AJwJ2ATkAAAAGA6oAAP////T/9AO2Ap4AJwJ2ATgAAAAGA6sAAP////f/9AOfAp4AJwJ2ASEAAAAGA6wAAP////T/9AOeAp4AJwJ2ASAAAAAGA60AAP////QAAALTApEAJwJ4AKMAAAAGA6gAAP////QAAALjApEAJwJ7AM4AAAAGA6gAAP///+oAAALIAp4AJwJ7ALMAAAAGA6kAAP////QAAALIAp4CBgKGAAD////0AAADlgKeACcCewGBAAAABgOrAAD////0AAADjAKeACcCewF3AAAABgOtAAD////oAAADIgKdACcCewENAAAABgOvAAD////4AAACFQNQAiYCewAAAAcHSQEGAAD////4AAACFQMvAiYCewAAAAcHRAEGAAAAAv/3AAADKQKYACUANAAAMzUzNS4CNTQ2NjMyFhYVFAYGBxUzFSE1NjY1NCYjIgYVFBYXFQEnNjY1NCYnNxYWFRQGBrpuFSwdSoVZWYVKHisWbv71MjNNRERNMjL+YAsRGyQrEV1LJj93BBZFWjZbiU5OiVs2WkUWBHdqL3JMVW1tVUxyL2oBrjoGFhYSGANKAjksKTQbAAAC//QAAAMXApgAJQA0AAAzNTM1LgI1NDY2MzIWFhUUBgYHFTMVITU2NjU0JiMiBhUUFhcVAS4CNTQ2NxcGBhUUFheobhUsHUqFWVmFSh4rFm7+9TIzTURETTIy/swmPyZLXRErJRwRdwQWRVo2W4lOTolbNlpFFgR3ai9yTFVtbVVMci9qAa4EGzQpLDkCSgMY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//8ANv9PAfYDUAImAo8AAAAHB6QBMgAA//8ANv9PAfYDUAImAo8AAAAHB6EBMgAA//8ANv9PAfYC4wImAo8AAAAHB0EBMgAA//8AMP/0ASUDIwImApEAAAAHB14AigAK//8AKf/0ASUDEQImApEAAAAHB1wAigAA////y//0ASUDOgImApEAAAAHBzkAigAA//8AQf/0AUkDOgImApEAAAAHBzwAigAA////yP/0ASUDGQImApEAAAAHB6MAigAA////x//0ASUDGQImApEAAAAHB6AAigAA////yP/0ASsDGQImApEAAAAHB6IAigAA////0f/0ASoDGQImApEAAAAHB58AigAA////7v/0ASYDUAImApEAAAAHB6QAigAA////7v/0ASYDUAImApEAAAAHB6EAigAA////4f/0ATMC5wImApEAAAAHB0cAigAA////9v/0ASUCrQImApEAAAAHB0MAigAA////zP/0AUgC4wImApEAAAAHB0EAigAA////zf/0AUcDIQImApEAAAAHB4gAigAA////zf/0AUcDIQImApEAAAAHB4AAigAA////3//0ATUDRwImApEAAAAHB4kAigAA//8AJP/0AgUDIwImApcAAAAHB14BGAAK//8AJP/0AgUDEQImApcAAAAHB1wBGAAA//8AJP/0AgUDOgImApcAAAAHBzkBGAAA//8AJP/0AgUDOgImApcAAAAHBzwBGAAA//8AJP/0AgUDGQImApcAAAAHB6MBGAAA//8AJP/0AgUDGQImApcAAAAHB6ABGAAA//8AJP/0AgUDGQImApcAAAAHB6IBGAAA//8AJP/0AgUDGQImApcAAAAHB58BGAAA//8APf9PAhEDIwImApkAAAAHB14BKwAK//8APf9PAhEDEQImApkAAAAHB1wBKwAA//8AK//0AekDIwImApwAAAAHB14BBwAK//8AK//0AekDEQImApwAAAAHB1wBBwAA//8AK//0AekDOgImApwAAAAHBzkBBwAA//8AK//0AekDOgImApwAAAAHBzwBBwAA//8AK//0AekDGQImApwAAAAHB6MBBwAA//8AK//0AekDGQImApwAAAAHB6ABBwAA//8AK//0AekDGQImApwAAAAHB6IBBwAA//8AK//0AekDGQImApwAAAAHB58BBwAA//8AK//0AekDUAIm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ChYKBAsXCiqYp7UBW2sfNyAgNx9r/qW1AAEAJAAAAb8CEAAJAAAzNRMjNSEVAzMVJOfQAYHn6lcBQXhX/r94AP////oAAAH+AxACJgTMAAAABwc6AP3/kv////oAAAH+AxACJgTMAAAABwc9AP3/kv////oAAAH+AtUCJgTMAAAABwdAAP3/kv////oAAAH+AuYCJgTMAAAABwdCAP3/kv////oAAAH+AtoCJgTMAAAABwdOAP3/kv////oAAAH+AsECJgTMAAAABwdEAP3/kv////oAAAH+AuICJgTMAAAABwdJAP3/kv////oAAAH+AxACJgTMAAAABwdSAP3/kv////oAAAH+AuYCJgTMAAAABwdWAP3/kv////r/HgH+AhACJgTMAAAABwdoAP0AAP////oAAAH+AwgCJgTMAAAABwdQAP3/kv////oAAAH+AxECJgTMAAAABwePAP3/kv////oAAAH+AxECJgTMAAAABweRAP3/kv////oAAAH+AycCJgTMAAAABweTAP3/kv////oAAAH+A1UCJgTMAAAABweVAP3/kv////r/HgH+AtUCJgTMAAAAJwdAAP3/kgAHB2gA/QAA////+gAAAf4DbwImBMwAAAAHB5cA/f+S////+gAAAf4DbwImBMwAAAAHB5kA/f+S////+gAAAf4DYAImBMwAAAAHB5sA/f+S////+gAAAf4DXQImBMwAAAAHB50A/f+S////+v8eAf4C4gImBMwAAAAnB0kA/f+SAAcHaAD9AAAAAv/6/yECEwIQAAkAJQAANwczJyYmJyMGBhMiJjU0NjY3IycjByMTMxMGBhUUFjMyNjcXBgbQCmcLChMLBAkT0TBDGycQJhydHJWqr6spMRYQDBUHIRM7/ykpJlknKFj9/DEtHzMmCWxsAhD98AQ4HhMTCQVKDxQAA//6/yEB/gIQABIAHAAkAAAFIiY1NDY3FwYVFBYzMjY3FwYGAwczJyYmJyMGBgMTMxMjJyMHAQswQzYoNigaEAoTByETO1UKZwsKEwsECRPgqq+rmhydHN8xLS5MHS0hIhMTCQVKDxQB3ikpJlknKFj+2wIQ/fBsbP////r/IQH+AxACJgT8AAAABwc9AP3/kgAC//IAAAKwAhAABgAWAAABBzM1IwYGARMhFSMVMxUjFTMVITUjBwELIGAEEB3+2P8B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 diff --git a/d2renderers/d2fonts/encoded/SourceSansPro-Italic.txt b/d2renderers/d2fonts/encoded/SourceSansPro-Italic.txt new file mode 100644 index 000000000..2fb182eb8 --- /dev/null +++ b/d2renderers/d2fonts/encoded/SourceSansPro-Italic.txt @@ -0,0 +1 @@ +data:application/font-woff;base64,AAEAAAANAIAAAwBQR0RFRsNzw0sAAAG4AAACAEdQT1OyJiN5AACTOAAANQJHU1VCN4vuiAAAJVAAACAoT1MvMltUlXgAAAFYAAAAYGNtYXCYfdQGAABqtAAAKIJnbHlm5ISrmgAAyDwAAOPmaGVhZBu1K9oAAAEgAAAANmhoZWELeAzfAAAA/AAAACRobXR4PnF0cgAAFGQAABDsbG9jYcIK+oUAAAvsAAAIeG1heHAEUwD2AAAA3AAAACBuYW1lCe1XMwAAA7gAAAgycG9zdChM14sAAEV4AAAlOgABAAAEOwCMAAwAZgAHAAEAAAAAAAAAAAAAAAAABAADAAEAAAPY/u8AAAhA/r39vAgdA+gAwv/RAAAAAAAAAAAAAAQ7AAEAAAABGFEIQjlUXw889QABA+gAAAAA2F2gzAAAAADdZi83/r3+3QgdA8kAAgADAAIAAAAAAAAAAwHhAZAABQAAAooCWP/xAEsCigJYAEQBXgAyASMAAAILBQMDBAMJAgQgAAB3AAAAAwAAAAAAAAAAQURCTwABACD//wLu/wYAAAPYAREgAAGTAAAAAAHmApQAAAAgAAMAAQAAAGoAAAAAAAwAAgAPA80D7AABBAoEDgABBBIEEgABBBQEFAABBBYEFwABBBkEGQABBBsEGwABBB0EHQABBB8EHwABBCEEIQABBCMEIwABBCUEJQABBCcEJwABBCkEKQABBCsEKwABAAIAQwACADUAAQBLAEwAAQBNAE0AAgBOAE4AAQBuAG8AAQBwAHAAAgB6AHoAAgB7AHsAAQCLAIsAAQCMAIwAAgC2ALgAAQC+AL4AAQC/AL8AAgDXANcAAQDoAOgAAQDuAO4AAQDvAO8AAgEDAQQAAQEbARwAAQEdAR0AAgEeAR4AAQEpASkAAgE+AT8AAQFAAUAAAgFHAUcAAgFKAUoAAgFZAVoAAgFcAVwAAQFjAWMAAgFpAWkAAQGHAYkAAQGPAY8AAQGQAZAAAgGhAaEAAgGoAagAAQG5AbkAAQG/AcAAAQHBAcEAAgHTAdYAAQHYAiQAAQIlAiUAAgIoAikAAgIqAioAAQI2AjYAAQI4AjkAAQJPAlAAAQJSAlIAAQJXAlcAAgJbAlsAAQJlAmcAAQNAA0AAAQNHA0cABAPMA8wAAQPNBA8AAwQSBBIAAwQUBBQAAwQWBBcAAwQZBBkAAwQbBBsAAwQdBB0AAwQfBB8AAwQhBCEAAwQjBCMAAwQlBCUAAwQnBCcAAwQpBCkAAwQrBCsAAwAAABQA9gADAAEECQAAAMYGdgADAAEECQABAB4GWAADAAEECQACAAwGTAADAAEECQADAEIGCgADAAEECQAEACwF3gADAAEECQAFAGQFegADAAEECQAGACgFUgADAAEECQAHAMAEkgADAAEECQAIADQEXgADAAEECQAJABgERgADAAEECQALADIEFAADAAEECQANAyAA9AADAAEECQAOADQAwAADAAEECQEAADgAiAADAAEECQEBABgAcAADAAEECQECABQAXAADAAEECQEDABYARgADAAEECQEEABYAMAADAAEECQEFABIAHgADAAEECQEGAB4AAABUAGkAdABsAGkAbgBnACAAZgBpAGcAdQByAGUAcwBTAGUAcgBpAGYAZQBkACAASQBBAGwAdABlAHIAbgBhAHQAZQAgAGcAQQBsAHQAZQByAG4AYQB0AGUAIABhAFMAdAByAGEAaQBnAGgAdAAgAGwAUwBsAGEAcwBoAGUAZAAgAHoAZQByAG8AUAByAGUAZgBlAHIAcgBlAGQAIABBAHQAaABhAGIAYQBzAGsAYQBuACAAbwBnAG8AbgBlAGsAcwBoAHQAdABwADoALwAvAHMAYwByAGkAcAB0AHMALgBzAGkAbAAuAG8AcgBnAC8ATwBGAEwAVABoAGkAcwAgAEYAbwBuAHQAIABTAG8AZgB0AHcAYQByAGUAIABpAHMAIABsAGkAYwBlAG4AcwBlAGQAIAB1AG4AZABlAHIAIAB0AGgAZQAgAFMASQBMACAATwBwAGUAbgAgAEYAbwBuAHQAIABMAGkAYwBlAG4AcwBlACwAIABWAGUAcgBzAGkAbwBuACAAMQAuADEALgAgAFQAaABpAHMAIABsAGkAYwBlAG4AcwBlACAAaQBzACAAYQB2AGEAaQBsAGEAYgBsAGUAIAB3AGkAdABoACAAYQAgAEYAQQBRACAAYQB0ADoAIABoAHQAdABwADoALwAvAHMAYwByAGkAcAB0AHMALgBzAGkAbAAuAG8AcgBnAC8ATwBGAEwALgAgAFQAaABpAHMAIABGAG8AbgB0ACAAUwBvAGYAdAB3AGEAcgBlACAAaQBzACAAZABpAHMAdAByAGkAYgB1AHQAZQBkACAAbwBuACAAYQBuACAgGABBAFMAIABJAFMgGQAgAEIAQQBTAEkAUwAsACAAVwBJAFQASABPAFUAVAAgAFcAQQBSAFIAQQBOAFQASQBFAFMAIABPAFIAIABDAE8ATgBEAEkAVABJAE8ATgBTACAATwBGACAAQQBOAFkAIABLAEkATgBEACwAIABlAGkAdABoAGUAcgAgAGUAeABwAHIAZQBzAHMAIABvAHIAIABpAG0AcABsAGkAZQBkAC4AIABTAGUAZQAgAHQAaABlACAAUwBJAEwAIABPAHAAZQBuACAARgBvAG4AdAAgAEwAaQBjAGUAbgBzAGUAIABmAG8AcgAgAHQAaABlACAAcwBwAGUAYwBpAGYAaQBjACAAbABhAG4AZwB1AGEAZwBlACwAIABwAGUAcgBtAGkAcwBzAGkAbwBuAHMAIABhAG4AZAAgAGwAaQBtAGkAdABhAHQAaQBvAG4AcwAgAGcAbwB2AGUAcgBuAGkAbgBnACAAeQBvAHUAcgAgAHUAcwBlACAAbwBmACAAdABoAGkAcwAgAEYAbwBuAHQAIABTAG8AZgB0AHcAYQByAGUALgBoAHQAdABwADoALwAvAHcAdwB3AC4AYQBkAG8AYgBlAC4AYwBvAG0ALwB0AHkAcABlAFAAYQB1AGwAIABEAC4AIABIAHUAbgB0AEEAZABvAGIAZQAgAFMAeQBzAHQAZQBtAHMAIABJAG4AYwBvAHIAcABvAHIAYQB0AGUAZABTAG8AdQByAGMAZQAgAGkAcwAgAGEAIAB0AHIAYQBkAGUAbQBhAHIAawAgAG8AZgAgAEEAZABvAGIAZQAgAFMAeQBzAHQAZQBtAHMAIABJAG4AYwBvAHIAcABvAHIAYQB0AGUAZAAgAGkAbgAgAHQAaABlACAAVQBuAGkAdABlAGQAIABTAHQAYQB0AGUAcwAgAGEAbgBkAC8AbwByACAAbwB0AGgAZQByACAAYwBvAHUAbgB0AHIAaQBlAHMALgBTAG8AdQByAGMAZQBTAGEAbgBzAFAAcgBvAC0ASQB0AGEAbABpAGMAVgBlAHIAcwBpAG8AbgAgADEALgAwADkANQA7AGgAbwB0AGMAbwBuAHYAIAAxAC4AMAAuADEAMAA5ADsAbQBhAGsAZQBvAHQAZgBlAHgAZQAgADIALgA1AC4ANgA1ADUAOQA2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AVYAHwGS//wBRQA8AhAAOAHAADsCwwBGAa3/1AHA/8IBmv/2Af7/ywH+/8sB/v/LAf7/ywH+/8sB/v/LAf7/ywH+/8sB/v/LAf7/ywH+/8sB/v/LAf7/ywH+/8sB/v/LAf7/ywH+/8sB/v/LAf7/ywH+/8sB/v/LAf7/ywH+/8sB/v/LAyP/3wMj/98DI//fAl0ACgJHACMCRwAjAiYAOQImADkCJgA5AiYAOQImADkCUAAjAlAAIwJQACMCUAAjAmIALwH3ACMB9wAjAfcAIwH3ACMB9wAjAfcAIwH3ACMB9wAjAfcAIwH3ACMB9wAjAfcAIwH3ACMB9wAjAfcAIwH3ACMB9wAjAfcAIwH3ACMB9wAjAdkAIwJMADkCTAA5AkwAOQJMADkCTAA5AkwAOQJMADkCTAA5AkwAOQJuACMCbgAjAm4AIwJuACMCjgAyAPwAIwD8ACMA/AAjAPwAIwD8ACMA/AAjAPwAIwD8ACMA/AAjAPz//QD8/9kA/P/ZAPwAIwHI//4CLwAjAi8AIwIvACMBzgAjAc4AIwHOACMBzgAjAc4AIwHOACMBzgAjAc7/9wLBACMCwQAjAsEAIwJrACMCawAjAmsAIwJrACMCawAjAmsAIwJrACMCawAjAnkAPAJ5ADwCeQA8AnkAPAJ5ADwCeQA8AnkAPAJ5ADwCeQA8AnkAPAJ5ADwCeQA8AnkAPAJ5ADwCeQA8AnkAPAJ5ADwCef/9AzAAPAJ5ADwCeQA8AnkAPAJ5ADwCeQA8AnkAPAJ5ADwCeQA8AiYAIwIrACMCKwAjAisAIwIrACMCKwAjAisAIwIrACMB+gAMAfoADAH6AAwB+gAMAfoADAH6AAwB+gAMAnkAIwH+AF0B/gBdAf4ASAH+AFAB/gBdAf4ANAH+AF0B/gBdAmgATwJoAE8CaABPAmgATwJoAE8CaABPAmgATwJoAE8CaABPAmgATwJoAE8CaABPAmgATwJoAE8CaABPAmgATwJ1AE8CdQBPAnUATwJ1AE8CdQBPAnUATwJoAE8CaABPAvQAXwL0AF8C9ABfAvQAXwHNAFMBzQBTAc0AUwHNAFMBzQBTAc0AUwHNAFMBzQBTAgD//wIA//8CAP//AgD//wIA//8CYgAvAjIAIwJ8AD8CZAAjAfIAIwIZACcCGQAnAhkAJwIZACcCGQAnAhkAJwIZACcCGQAnAhkAJwIZACcCGQAnAhkAJwIZACcCGQAnAhkAJwIZACcCGQAnAhkAJwIZACcCGQAnAhkAJwIZACcCGQAnAhkAJwL5ACAC+QAgAvkAIAIHAB8CGAAfAhgAHwGzACUBswAlAbMAJQGzACUBswAlAh4AJwIXACcCFwAnAhcAJwIXACcB4QAlAeEAJQHhACUB4QAlAeEAJQHhACUB4QAlAeEAJQHhACUB4QAlAeEAJQHhACUB4QAlAeEAJQHhACUB4QAlAeEAJQHhACUB4QAlAeEAJQEaACsCEwABAhMAAQITAAECEwABAhMAAQITAAECEwABAhMAAQILAB8CCwAfAgsAHwILAB8CCwAfAO0AHwDtAB8A7QAfAO0AFgDtAB8A7QAfAO0AHwDtAB8A7f/2AO3/1gDt/9YA7QAfAO0AHwDu/4QB3AAfAdwAHwHcAB8B3AAfAPgALADzACwBSwAsAPj/1QD4AAQA+AAEAPj/uwETAB0DHwAfAx8AHwMfAB8CDQAfAg0AHwINAB8CDQAfAg0AHwINAB8CDQAfAg0AHwLmAG8CAwAnAgMAJwIDACcCAwAnAgMAJwIDACcCAwAnAgMAJwIDACcCAwAnAgMAJwIDACcCAwAnAgMAJwIDACcCAwAnAgMAJwIDAAADLAAnAgUAJwIFACcCBQAnAgUAJwIFACcCBQAnAgMAJwIDACcCF//2AVYAHwFW/8YBVgAfAVYAHwFW//UBVv/1AVb/rAGS//wBkv/8AZL//AGS//wBkv/8AZL//AGS//wCKwAfAUUAPAFFADwBRQApAUUAIAFFADwBRQAGAUUAPAFFABQCEAA4AhAAOAIQADgCEAA4AhAAOAIQADgCEAA4AhAAOAIQADgCEAA4AhAAOAIQADgCEAA4AhAAOAIQADgCEAA4Ah8AOAIfADgCHwA4Ah8AOAIfADgCHwA4AhAAOAIQADgCEAA4AsMARgLDAEYCwwBGAsMARgHA/8IBwP/CAcD/wgHA/8IBwP/CAcD/wgHA/8IBwP/CAZr/9gGa//YBmv/2AZr/9gGa//YCDAArAhf/9gINAB8A7v+EAdoAHwHpAEACGwAjAhgAHwIcABMBwQABAb//zgIZACcCGQAnAeEAEwIbACcB4AAfAzEAJwHhAB4ChAAPAaEAFQGh//8B8AAnAQn/jwIYAAECEwABAesAJwHAACYCEgA4AgcAHwIHAB8CFgAfAQ7//gFK//8A+AAsARf/hAF2ABMBQgASAPIACwI6AB8BkAAfAx0ANAMdADQDHwAfAg3/iwINAB8CDAAfAbf/7wH2AEQCAwAnAqYAJwKrACICiAAnAVb/2AFW/9gBVv/YAVYACwFPAB8B1wAfAdcAHwGS/9sA7v+EAQn/jwFFABoCIQA8AhoADQIDACYCDQA9AcD/5QLD//0BwP/lAZgALwGi//YBuP/2AaL/vQH2/+wBmgBKAZoARgGnAAkBpwA2ASj/7QD2AB8B4QApAiUAKwMTACsDHgArAjEAKwM9ACsBRP/5AUT/+QFE//kBRP/5AUT/+QFE//kBRP/5AUT/+QFE//kBRP/5AUT/+QFE//kBRP/5AUT/+QJrACMB7AAgAewAIAHsACAB7AAgAewAIAHsACAB7AAgAewAIAHsACAB7AAgAewAIAHsACAB7AAgAewAIAHsACAB7AAgAewAIAHsACAB7AAgAewAIAHsACAB7AAgAewAIAHsACAB7AAgAd3/8QHd//EB3f/xAd3/8QHd//EB3f/xAd3/8QHd//EB3f/xAO4AHwDuAB8A8wAfAUsAHwDu/8cA7v/2AO7/9wDu/6sBDAAdAggAKwDt/9YBDv/+ARf/hAJGAA8B4AAqAeAAGgHg//YB4P/3AeAADwHgAAAB4AAzAeAAaQHgACEB4AAQAeAAKgHgACoB+AAqAVQAXwHT//YBzf/vAeUAGgHN//oB4AAzAcgAYQHgACEB4AAQAfgAKgH4ACoB4AAmAeAAGgHg//YB4P/qAeD/9wHg/+wB4AAzAeAAXQHgACEB4AADAeAAJgFWAEwBzv/2AeD/6gHg//cB4P/sAeAAMwHIAFAB4AAhAeAAAwHgACoB4AAaAeD/9gHg//cB4AAUAeD//gHgADMB4ABtAeAAHgHgAAkA8gAXAPL/4QDyABcA8v/hA78AUwEaACsBGgAVAZkAXgGZ//wA8gCAAZcAgADyAG4A8gBvAZcAbgGXAG8A8v/3AZf/9wD8ACgA/AAXAZwAKAGcABcBKwAjAc8AIwMBACMFoAAjCEAAIwHgACMDAQAjAPIATwEnACkB4//cAeMASwIc/+QBIwBBASX/1AEkAAgBJP/PASIAIAEl/8wBVP+4AOcAXwFUAFgA5wBfAZMAfQGzAGUBswASAd0ADwIXAEkBfQBfAhoAKwMfAF4CkwArAqAAXgGeAF4BJAAmASQAXQEkABwBJP/kAWsACAFr/88BJABeASQAcgEkAAgBJP/PApkAJAKZACQBlgBJAmMATAJZACsCcQAyAn8AMgMuAC0DIgBiAd8AGAFlAFwBZACpAWEATgFfAE0BYgBWAV8ATQFhAGUBYQCPAWEAWgFhAFMBYQBVAWEAVQFhAFUA4wB0AOIANQCqAEoAqgAqAWX/6gFkADcBYf/cAV//2wFi/+QBX//bAWH/8wFhAB0BYf/oAWH/4QFh/+MBYf/jAWH/4wDjAAIA4v/DAKr/2ACq/7gBZQAPAWQAXAFhAAEBXwAAAWIACQFfAAABYQAYAWEAQgFhAA0BYQAGAOMAJwDi/+gAqv/9AKr/3QFlAEEBZACOAWEAMwFfADIBYgA7AV8AMgFhAEoBYQB0AWEAPwFhADgA4wBZAOIAGgCqAC8AqgAPAWIAVQFNAFYBXABWAWMAVQFoAFMBJABWAW0AVwFDAFYAwwBaAWIAPQFhAFMAowBTAKT/6QFFAFMApQBdAhgAUwFjAFMBXABWAWcAOAFjAFUA4ABTAQ8ANwDeAGMBYwBiATMAZQHfAGwBMgAhATMAFAEXADMBKQBqALz/6gC8AEgAuf+1ATMAXAFDAFYBQwBWAUEAUQFNAFYBRAAxAKQAUwCuAE4A6QBpAVcAaQIpAGkBOQBlAeAACwHgABEB4AAEAeAAHAHgADEB4AAUAeAATgHg/9AB4AA+AeAABAHgAAkB4AAeAd3/+wHgACAB4AAeAeAAMAHeABIB4AA+AeAARgHgACAB5wArAecASgHn//QAVP8tAFT/LQBU/y0DFwA9BHgAPQLsAHcDBABjAvwALgMKAGMDGwAzAwoAbQMbADMDGwAyAzcALgMFAGUDEwAuAwoAbQMFAGUDEwArAxMALgMCAF8DBQBlBHgAhwMXAD0B4AAwAeAAMAHgAEEB4AAwAPQATwHgADAB4AAuAeAAMAHgAC4B4AAwAeAAMAHfAFMB4AAwAeAALQHgAC0B4AAwAi4ANwLwACACDv/2AgcAFwFB/+YCGQA9AjX/7QKS//kB5QAgAoYAYQGKAAcDIABCAlEAFAJRAB4CUQAUAlEAHgN/AD8DfwArA38AMwN/AD8DfwBFA38ARQN/AD8DfwA/A38ARQN/AEUDfwArA38AKwL9AEYC/gBG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AWMAyQFqAWsAywFtAXAAzQFyAXIA0QF2AX0A0gF/AYMA2gGFAYYA3wGKAY0A4QGQAZIA5QGUAZUA6AGZAZsA6gGeAZ4A7QGhAaIA7gGpAbYA8AG4AbgA/gG6Ab0A/wHBAcoBAwHMAdABDQACAAAAAQAIAAEC3gFsDLIMrAymDKAMmgyUDI4MiAyCDHwMdgxuDGYMXgxWDE4MRgw+DDYMLgwmDCAMGgwUDA4MCAwCC/wL9gvwC+oL5AveC9gL0gvMC8YLwAu6C7QLrguoC6ILnAuWC5ALiAuAC3gLcAtoC2ILWgtUC04LSAtCCzwLNgswCyoLJAseCxgLEgsMCwYLAAr6CvQK7groCuIK3ArWCtAKygrECr4KuAqyCqwKpgqgCpoKkgqMCoYKgAp6CnQKbgpoCmIKXApWClAKSgpECj4KOAoyCiwKJgogChoKFAoOCgYJ/gn2Ce4J5gngCdgJ0gnMCcYJwAm6CbQJrgmoCaIJnAmWCZAJiAmCCXwJdglwCWoJZAleCVgJUglMCUYJQAk6CTQJLgkoCSIJHAkWCRAJCgkECP4I+AjyCOoI4gjaCNIIzAjGCMAIugi0CK4IqAiiCJwIlgiQCIoIhAh+CHgIcghsCGYIYAhaCFQITghICEIIPAg2CDAIKggkCB4IGAgSCAwIBggAB/oH8gfqB+IH2gfSB8oHwge6B7IHqgekB54HmAeSB4wHhgeAB3oHdAduB2gHYgdcB1YHUAdKB0QHPgc4BzIHLAcmByAHGgcUBwwHBAb8BvQG7AbmBt4G2AbSBswGxgbABroGtAauBqgGogacBpYGkAaKBoQGfgZ4BnIGbAZmBmAGWgZUBk4GSAZCBjwGNgYwBioGJAYeBhYGEAYKBgQF/gX4BfIF7AXmBeAF2gXUBc4FyAXCBbwFtgWwBaoFpAWeBZgFkgWKBYIFegVyBWoFZAVcBVYFUAVKBUQFPgU4BTIFLAUmBSAFGgUUBQwFBgUABPoE9ATuBOgE4gTcBNYE0ATKBMQEvgS4BLIErASmBKAEmgSUBI4EiASCBHwEdgRuBGYEXgRWBFAESgREBD4EOAQyBCwEJgQgBBoEFAQOBAgEAgP8A/YD8APqA+QD3gPYA9IDzAPGA8AAAgAlADYASgAAAE0ATQAVAE8AUAAWAFIAXAAYAF4AbQAjAHAAegAzAHwAfwA+AIEAhgBC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AnsChwKbAAcDHgMQAu4C/wJ6AoYCmgAHAx0DDwLtAv4CeQKFApkABwMcAw4C7AL9AngChAKYAAcDGwMNAusC/AJ3AoMClwAHAxoDDALqAvsCdgKCApYACQMZAwsC6QL6AnUCgQJ0AnMClQACARwCTwACAzUCWwACAzACUgACAjkDKgABAAAAAQAIAAIBEgCGAioDKwMsAy0DLgMvAzEDMgMzAzQDNgM3AzgDOQM6AzsDPAM9Az4DPwNAA0EDQgNDAEwAbwIrAiwCLQIuAi8CMAIxAjICMwI0AjYCNwI1AjgCOgI7AjwCPQI+Aj8CQAJBAkICQwJEAkUCRgJHAkgCSQJKAksCTAJNAk4CUAJRA0kDSgE/AlMCVAJVAlYCVwJYAlkCWgB/AlwCXQJeAl8CYAJhAmICYwDWAcADSwKMAo0CjgKPApACkQKSApMClAKLAowCjQKOAo8CkAKRApICkwKUA08DUANRA1IC5wMoA0wDTQNOA1gDzgPQA9ID1APWA9gD2gPcA94D4APiA+QD5gPoA+oD+wP9BAwCZAABAIYACgAdAB4AHwAgACEAIwAkACUAJgAoACkAKgArACwALQAuAC8AMAAxADIAMwA0ADUASwBuAIEAggCDAIQAhQCGAIcAiACJAIoAiwCMAI0BBAEGAQcBCAEJAQoBCwEMAQ0BDgEPARABEQESARMBFAEVARYBFwEYARkBGgEcAR0BLgEvAT4BQwFEAUUBRgFHAUgBSQFKAU0BYgFjAWQBZQFmAWcBaAFpAacBvwHkAnYCdwJ4AnkCegJ7AnwCfQJ+AoECggKDAoQChQKGAocCiAKJAooCoQK0ArUCtgLmAycDKgMwAzUDVwPNA88D0QPTA9UD1wPZA9sD3QPfA+ED4wPlA+cD6QP6A/wECwQ6AAIAAP/1AAD/zgAyAAAAAAAAAAAAAAAAAAAAAAAAAAAEOwAAAAMAJAAlACYAJwAoACkAKgArACwALQAuAC8AMAAxADIAMwA0ADUANgA3ADgAOQA6ADsAPAA9AEQARQBGAEcASABJAEoASwBMAE0ATgBPAFAAUQBSAFMAVABVAFYAVwBYAFkAWgBbAFwAXQCtAMkAxwCuAGIBAgEDAGMBBAEFAQYBBwEIAQkBCgELAQwBDQEOAQ8BEAERARIBEwCQARQBFQEWARcBGABkAP0BGQD/ARoBGwEcAR0BHgEfAMsAZQDIASAAygEhASIBIwEkASUBJgEnASgBKQEqASsBLAEtAS4BLwEwATEBMgD4ATMBNAE1ATYBNwE4ATkBOgE7ATwBPQDPAMwAzQE+AM4BPwD6AUABQQFCAUMBRAFFAUYBRwFIAUkBSgFLAUwBTQFOAU8BUADiAVEBUgFTAVQBVQFWAGYBVwFYAVkBWgDTANAA0QCvAGcBWwFcAV0BXgFfAWABYQFiAWMBZAFlAWYAkQCwAWcBaAFpAWoBawFsAW0BbgFvAXABcQFyAXMBdAF1AXYBdwF4AOQBeQF6AXsBfAF9AX4BfwGAAYEBggGDAYQBhQDWANQA1QGGAGgBhwGIAYkBigGLAYwBjQGOAY8BkAGRAZIBkwGUAZUBlgGXAZgBmQGaAZsBnAGdAZ4A6wGfALsBoAGhAaIBowGkAOYBpQGmAacA6QDtAagBqQGqAGoAaQBrAG0AbAGrAawAbgGtAa4BrwGwAbEBsgGzAbQBtQG2AbcBuAG5AboBuwG8AKABvQG+Ab8BwAHBAG8A/gHCAQABwwHEAcUBxgHHAQEAcQBwAHIByABzAckBygHLAcwBzQHOAc8B0AHRAdIB0wHUAdUB1gHXAdgB2QHaAPkB2wHcAd0B3gHfAeAB4QHiAeMB5AB1AHQAdgHlAHcB5gHnAegB6QHqAesB7ADXAe0B7gHvAfAB8QHyAfMB9AH1AfYB9wH4AOMB+QH6AfsB/AH9Af4AeAH/AgACAQICAgMAegB5AHsAfQB8AgQCBQIGAgcCCAIJAgoCCwIMAg0CDgIPAKEAsQIQAhECEgITAhQCFQIWAhcCGAIZAhoCGwIcAh0CHgIfAiACIQDlAiICIwIkAiUAiQImAicCKAIpAioCKwIsAi0AfwB+AIACLgCBAi8CMAIxAjICMwI0AjUCNgI3AjgCOQI6AjsCPAI9Aj4CPwJAAkECQgJDAkQCRQJGAkcA7AJIALoCSQJKAksCTAJNAOcCTgJPAlAA6gDuAlECUgJTAlQCVQJWAlcCWAJZAloCWwJcAl0CXgJfAmACYQJiAmMCZAJlAmYCZwJoAmkCagJrAmwCbQJuAm8CcAJxAnICcwJ0AnUCdgJ3AngCeQJ6AnsCfAJ9An4CfwKAAoECggKDAoQChQKGAocCiAKJAooCiwKMAo0CjgKPApACkQKSApMClAKVApYClwKYApkCmgKbApwCnQKeAp8CoAKhAqICowKkAqUCpgKnAqgCqQKqAqsCrAKtAq4CrwKwArECsgKzArQCtQK2ArcCuAK5AroCuwK8Ar0CvgK/AsACwQLCAsMCxALFAsYCxwLIAskCygLLAswCzQLOAs8C0ALRAtIC0wLUAtUC1gLXAtgC2QLaAtsC3ALdAt4C3wLgAuEC4gLjAAkAEwAUABUAFgAXABgAGQAaABsAHALkAuUC5gLnAugC6QLqAusC7ALtAu4C7wLwAvEC8gLzAvQC9QL2AvcC+AL5AvoC+wL8Av0C/gL/AwADAQMCAwMDBAMFAwYDBwMIAwkDCgMLAwwDDQMOAw8AEQAPAB0AHgCrAAQAowAiAKIACgAFALYAtwC0ALUAxADFAL4AvwCpAKoAEACyALMDEAMRAxIDEwDDAIcAQgMUAxUACwAMAD4AQABeAGAAEgBfAD8A6AANAIIAwgCGAIgDFgMXAxgDGQMaAxsDHAMdAx4DHwMgAyEDIgMjAyQDJQCLAyYAigCMAycDKAMpACMDKgAGAysDLAMtAy4DLwMwAzEDMgMzAzQDNQM2AzcDOAM5AzoDOwM8Az0DPgM/A0ADQQNCA0MDRANFA0YDRwNIA0kDSgNLA0wDTQNOA08DUANRA1IDUwNUA1UDVgNXA1gDWQNaA1sDXANdA14DXwNgA2EDYgNjA2QDZQNmA2cDaACdA2kAngNqA2sDbANtA24DbwNwA3EDcgNzA3QDdQN2A3cDeAN5A3oDewN8A30DfgN/A4ADgQOCA4MDhAOFA4YDhwOIA4kDigOLA4wDjQOOA48DkAORA5IAgwC9AAcAhQCWA5MDlACEA5UDlgOXA5gDmQOaA5sDnAOdA54DnwOgA6EDogOjA6QAvAOlA6YACADGAPUA9AD2A6cDqAOpA6oDqwOsA60DrgOvA7ADsQOyA7MDtAO1A7YADgDvAPAAuAO3ACAAHwAhAJQAlQCTAEEAjwBhAKcApACbAJIAlwCYAJwApQCoAJ8AmQCaA7gDuQO6A7sDvAO9A74DvwPAA8EDwgPDA8QDxQPGA8cDyAPJA8oDywPMA80AuQPOA88D0APRA9ID0wBDAI0A2ADhA9QD1QPWA9cD2ADZAI4A2gDbAN0A3wDcAN4A4APZA9oD2wPcA90D3gPfA+AD4QPiA+MD5APlA+YD5wPoA+kD6gPrA+wD7QPuA+8D8APxA/ID8wP0A/UD9gP3A/gD+QP6A/sD/AP9A/4D/wQABAEEAgQDBAQEBQQGBAcECAQJBAoECwQMBA0EDgQPBBAEEQQSBBMEFAQVBBYEFwQYBBkEGgQbBBwEHQQeBB8EIAQhBCIEIwQkBCUEJgQnBCgEKQQqBCsELAQtBC4ELwQwBDEEMgQzBDQENQQ2BDcEOAQ5BDoEOwQ8BD0EPgQ/BEAEQQRCBEMERARFAMAAwQdBbWFjcm9uBkFicmV2ZQd1bmkwMUNEB3VuaTFFQTAHdW5pMUVBMgd1bmkxRUE0B3VuaTFFQTYHdW5pMUVBOAd1bmkxRUFBB3VuaTFFQUMHdW5pMUVBRQd1bmkxRUIwB3VuaTFFQjIHdW5pMUVCNAd1bmkxRUI2B0FvZ29uZWsJQW9nb25lay5kC3VuaTAxMDQwMzAxB3VuaTAxRkMHdW5pMDFFMgd1bmkwMjQzB3VuaTFFMDIHdW5pMUUwNgtDY2lyY3VtZmxleApDZG90YWNjZW50BkRjYXJvbgd1bmkxRTBBB3VuaTFFMEMHdW5pMUUwRQZEY3JvYXQGRWNhcm9uB0VtYWNyb24GRWJyZXZlCkVkb3RhY2NlbnQHdW5pMUVCOAd1bmkxRUJBB3VuaTFFQkMHdW5pMUVCRQd1bmkxRUMwB3VuaTFFQzIHdW5pMUVDNAd1bmkxRUM2B0VvZ29uZWsJRW9nb25lay5kC3VuaTAxMTgwMzAxB3VuaTFFMTYHdW5pMUUxRQd1bmkwMUY0C0djaXJjdW1mbGV4Ckdkb3RhY2NlbnQHdW5pMDEyMgZHY2Fyb24HdW5pMUUyMAt1bmkwMDQ3MDMwMwd1bmkwMTkzC0hjaXJjdW1mbGV4B3VuaTFFMjQHdW5pMUUyQQl1bmkxRTk2LmMESGJhcgZJdGlsZGUHSW1hY3Jvbgd1bmkwMUNGB3VuaTFFQzgHdW5pMUVDQQdJb2dvbmVrC3VuaTAxMkUwMzAxB3VuaTAxMkMLSmNpcmN1bWZsZXgHdW5pMDEzNgd1bmkxRTMyB3VuaTFFMzQGTGFjdXRlBkxjYXJvbgd1bmkwMTNCBExkb3QHdW5pMUUzNgd1bmkxRTM4B3VuaTFFM0EHdW5pMUUzRQd1bmkxRTQwB3VuaTFFNDIGTmFjdXRlB3VuaTAxRjgGTmNhcm9uB3VuaTAxNDUHdW5pMUU0NAd1bmkxRTQ2B3VuaTFFNDgHT21hY3Jvbg1PaHVuZ2FydW1sYXV0B3VuaTAxRDEHdW5pMUVDQwd1bmkxRUNFB3VuaTFFRDAHdW5pMUVEMgd1bmkxRUQ0B3VuaTFFRDYHdW5pMUVEOAd1bmkwMTRFB3VuaTFFNTIFT2hvcm4HdW5pMUVEQQd1bmkxRURDB3VuaTFFREUHdW5pMUVFMAd1bmkxRUUyB3VuaTAxRUELdW5pMDFFQTAzMDEHdW5pMUU1NgZSYWN1dGUGUmNhcm9uB3VuaTFFNTgHdW5pMDE1Ngd1bmkxRTVBB3VuaTFFNUMHdW5pMUU1RQZTYWN1dGULU2NpcmN1bWZsZXgHdW5pMDE1RQd1bmkwMjE4B3VuaTFFNjAHdW5pMUU2Mgd1bmkxRTlFBlRjYXJvbgd1bmkxRTZBB3VuaTAxNjIHdW5pMDIxQQd1bmkxRTZDB3VuaTFFNkUJdW5pMUU5Ny5jB3VuaTAxNjYGVXRpbGRlB1VtYWNyb24GVWJyZXZlBVVyaW5nDVVodW5nYXJ1bWxhdXQHdW5pMDFEMwd1bmkwMUQ1B3VuaTAxRDcHdW5pMDFEOQd1bmkwMURCB3VuaTFFRTQHdW5pMUVFNgVVaG9ybgd1bmkxRUU4B3VuaTFFRUEHdW5pMUVFQwd1bmkxRUVFB3VuaTFFRjAHVW9nb25lawt1bmkwMTcyMDMwMQZXZ3JhdmUGV2FjdXRlC1djaXJjdW1mbGV4CVdkaWVyZXNpcwZZZ3JhdmULWWNpcmN1bWZsZXgHdW5pMUU4RQd1bmkxRUY0B3VuaTFFRjYHdW5pMUVGOAZaYWN1dGUKWmRvdGFjY2VudAd1bmkxRTkyB3VuaTFFOTQHdW5pMDE4Rgd1bmkwMTRBB3VuaTAxMzIHYW1hY3JvbgZhYnJldmUHdW5pMDFDRQd1bmkxRUExB3VuaTFFQTMHdW5pMUVBNQd1bmkxRUE3B3VuaTFFQTkHdW5pMUVBQgd1bmkxRUFEB3VuaTFFQUYHdW5pMUVCMQd1bmkxRUIzB3VuaTFFQjUHdW5pMUVCNwdhb2dvbmVrCWFvZ29uZWsuZAt1bmkwMTA1MDMwMQd1bmkwMUZEB3VuaTAxRTMHdW5pMDE4MAd1bmkxRTAzB3VuaTFFMDcLY2NpcmN1bWZsZXgKY2RvdGFjY2VudAZkY2Fyb24HdW5pMUUwQgd1bmkxRTBEB3VuaTFFMEYGZWNhcm9uB2VtYWNyb24GZWJyZXZlCmVkb3RhY2NlbnQHdW5pMUVCOQd1bmkxRUJCB3VuaTFFQkQHdW5pMUVCRgd1bmkxRUMxB3VuaTFFQzMHdW5pMUVDNQd1bmkxRUM3B2VvZ29uZWsJZW9nb25lay5kC3VuaTAxMTkwMzAxB3VuaTFFMTcHdW5pMUUxRgd1bmkwMUY1C2djaXJjdW1mbGV4Cmdkb3RhY2NlbnQHdW5pMDEyMwZnY2Fyb24HdW5pMUUyMQt1bmkwMDY3MDMwMwtoY2lyY3VtZmxleAd1bmkxRTI1B3VuaTFFOTYHdW5pMUUyQgRoYmFyBml0aWxkZQdpbWFjcm9uB3VuaTAxRDAHdW5pMUVDOQd1bmkxRUNCB2lvZ29uZWsLdW5pMDEyRjAzMDEHdW5pMDEyRAtqY2lyY3VtZmxleAd1bmkwMTM3B3VuaTFFMzMHdW5pMUUzNQxrZ3JlZW5sYW5kaWMGbGFjdXRlBmxjYXJvbgRsZG90B3VuaTAxM0MHdW5pMUUzNwd1bmkxRTM5B3VuaTFFM0IHdW5pMUUzRgd1bmkxRTQxB3VuaTFFNDMGbmFjdXRlB3VuaTAxRjkGbmNhcm9uB3VuaTAxNDYHdW5pMUU0NQd1bmkxRTQ3B3VuaTFFNDkLbmFwb3N0cm9waGUHb21hY3Jvbg1vaHVuZ2FydW1sYXV0B3VuaTAxRDIHdW5pMUVDRAd1bmkxRUNGB3VuaTFFRDEHdW5pMUVEMwd1bmkxRUQ1B3VuaTFFRDcHdW5pMUVEOQd1bmkwMTRGB3VuaTFFNTMFb2hvcm4HdW5pMUVEQgd1bmkxRUREB3VuaTFFREYHdW5pMUVFMQd1bmkxRUUzB3VuaTAxRUILdW5pMDFFQjAzMDEHdW5pMUU1NwZyYWN1dGUHdW5pMDE1NwZyY2Fyb24HdW5pMUU1OQd1bmkxRTVCB3VuaTFFNUQHdW5pMUU1RgZzYWN1dGULc2NpcmN1bWZsZXgHdW5pMDE1Rgd1bmkwMjE5B3VuaTFFNjEHdW5pMUU2MwZ0Y2Fyb24HdW5pMUU2Qgd1bmkwMTYzB3VuaTAyMUIHdW5pMUU2RAd1bmkxRTZGB3VuaTFFOTcHdW5pMDE2NwZ1dGlsZGUHdW1hY3JvbgZ1YnJldmUFdXJpbmcNdWh1bmdhcnVtbGF1dAd1bmkwMUQ0B3VuaTAxRDYHdW5pMDFEOAd1bmkwMURBB3VuaTAxREMHdW5pMUVFNQd1bmkxRUU3BXVob3JuB3VuaTFFRTkHdW5pMUVFQgd1bmkxRUVEB3VuaTFFRUYHdW5pMUVGMQd1b2dvbmVrCXVvZ29uZWsuZAt1bmkwMTczMDMwMQZ3Z3JhdmUGd2FjdXRlC3djaXJjdW1mbGV4CXdkaWVyZXNpcwZ5Z3JhdmULeWNpcmN1bWZsZXgHdW5pMUU4Rgd1bmkxRUY1B3VuaTFFRjcHdW5pMUVGOQZ6YWN1dGUKemRvdGFjY2VudAd1bmkxRTkzB3VuaTFFOTUHdW5pMDE0Qgd1bmkwMjM3B3VuaTAxMzMHdW5pMDI1MAd1bmkwMjUyB3VuaTAyNTMHdW5pQTdCNQd1bmkwMjU1B3VuaUFCNTMHdW5pMDI1Ngd1bmkwMjU3B3VuaTAyNTgHdW5pMDI1MQd1bmkwMjk5B3VuaTAyQTQHdW5pMDI1OQd1bmkwMjVBB3VuaTAyNUIHdW5pMDI1Qwd1bmkwMjVFB3VuaTAyNUYHdW5pMDI2MAd1bmkwMjYxB3VuaTAyNjIHdW5pMDI2Mwd1bmkwMjY1B3VuaTAyNjYHdW5pMDI2Nwd1bmkwMjlDB3VuaTAyNjgHdW5pMDI2QQd1bmkwMjY5B3VuaTAyOUQHdW5pMDI2Qgd1bmkwMjZDB3VuaTAyNkQHdW5pMDI2RQd1bmkwMjlGB3VuaTAyNkYHdW5pMDI3MAd1bmkwMjcxB3VuaTAyNzIHdW5pMDI3Mwd1bmkwMjc0B3VuaTAyNTQHdW5pMDI2NAd1bmkwMjc1B3VuaTAyNzYHdW5pMDI3Nwd1bmkwMjc4B3VuaTAyNzkHdW5pMDI3QQd1bmkwMjdCB3VuaTAyN0QHdW5pMDI3RQd1bmkwMjgwB3VuaTAyODEHdW5pMDI4Mgd1bmkwMjgzB3VuaTAyODQHdW5pMDI4OAd1bmkwMkE3B3VuaTAyODkHdW5pMDI4QQd1bmkwMjhCB3VuaTAyOEMHdW5pMDI4RAd1bmkwMjhFB3VuaTAyOEYHdW5pMDI5MAd1bmkwMjkxB3VuaTAyOTIHdW5pMUQyNQd1bmkwMjk0B3VuaTAyOTUHdW5pMDJBMQd1bmkwMkEyB3VuaTAxQzIHdW5pMDFDMwd1bmkwMjk4A2ZfZgVmX2ZfaQVmX2ZfbANmX3QFZl9mX3QDSS5hCElncmF2ZS5hCElhY3V0ZS5hDUljaXJjdW1mbGV4LmEISXRpbGRlLmELSWRpZXJlc2lzLmEJSW1hY3Jvbi5hDElkb3RhY2NlbnQuYQl1bmkwMUNGLmEJdW5pMUVDOC5hCXVuaTFFQ0EuYQl1bmkwMTJDLmEJSW9nb25lay5hDXVuaTAxMkUwMzAxLmEJdW5pMDE0QS5hA2EuYQhhZ3JhdmUuYQhhYWN1dGUuYQ1hY2lyY3VtZmxleC5hCGF0aWxkZS5hC2FkaWVyZXNpcy5hCWFtYWNyb24uYQhhYnJldmUuYQdhcmluZy5hCXVuaTAxQ0UuYQl1bmkxRUExLmEJdW5pMUVBMy5hCXVuaTFFQTUuYQl1bmkxRUE3LmEJdW5pMUVBOS5hCXVuaTFFQUIuYQl1bmkxRUFELmEJdW5pMUVBRi5hCXVuaTFFQjEuYQl1bmkxRUIzLmEJdW5pMUVCNS5hCXVuaTFFQjcuYQlhb2dvbmVrLmEJYW9nb25lay5iDXVuaTAxMDUwMzAxLmEDZy5hCXVuaTAxRjUuYQ1nY2lyY3VtZmxleC5hCGdicmV2ZS5hDGdkb3RhY2NlbnQuYQl1bmkwMTIzLmEIZ2Nhcm9uLmEJdW5pMUUyMS5hDXVuaTAwNjcwMzAzLmEDbC5hCGxhY3V0ZS5hCGxjYXJvbi5hBmxkb3QuYQl1bmkwMTNDLmEJdW5pMUUzNy5hCXVuaTFFMzkuYQl1bmkxRTNCLmEIbHNsYXNoLmEEZmwuYQlpb2dvbmVrLngJdW5pMDI2OC54CXVuaTAyOUQueAZ6ZXJvLjAHemVyby4wcwl6ZXJvLnBudW0Ib25lLnBudW0IdHdvLnBudW0KdGhyZWUucG51bQlmb3VyLnBudW0JZml2ZS5wbnVtCHNpeC5wbnVtCnNldmVuLnBudW0KZWlnaHQucG51bQluaW5lLnBudW0HemVyby4wcAh6ZXJvLjBwcwl6ZXJvLnRudW0Ib25lLnRudW0IdHdvLnRudW0KdGhyZWUudG51bQlmb3VyLnRudW0JZml2ZS50bnVtCHNpeC50bnVtCnNldmVuLnRudW0KZWlnaHQudG51bQluaW5lLnRudW0JemVyby5vbnVtCG9uZS5vbnVtCHR3by5vbnVtCnRocmVlLm9udW0JZm91ci5vbnVtCWZpdmUub251bQhzaXgub251bQpzZXZlbi5vbnVtCmVpZ2h0Lm9udW0JbmluZS5vbnVtBnplcm8uYwVvbmUuYwV0d28uYwd0aHJlZS5jBmZvdXIuYwZmaXZlLmMFc2l4LmMHc2V2ZW4uYwdlaWdodC5jBm5pbmUuYwd1bmkyRTNBB3VuaTJFM0IKZmlndXJlZGFzaAd1bmkyMDE1B3VuaTIwM0UHdW5pMjAzRgd1bmkyMDE2B3VuaTIwM0MHdW5pMjA0Nwd1bmkyMDQ5B3VuaTIwNDgHdW5pMjAzRAd1bmkyMzFDB3VuaTIzMUQHdW5pMjMxRQd1bmkyMzFGB3VuaTI3RTYHdW5pMjdFNwd1bmkyRTIyB3VuaTJFMjMHdW5pMkUyNAd1bmkyRTI1B3VuaTIxMTcHdW5pMjEyMAZ1MUYxNkEGdTFGMTZCB2F0LmNhc2UJemVyby5zdXBzCG9uZS5zdXBzCHR3by5zdXBzCnRocmVlLnN1cHMJZm91ci5zdXBzCWZpdmUuc3VwcwhzaXguc3VwcwpzZXZlbi5zdXBzCmVpZ2h0LnN1cHMJbmluZS5zdXBzCXBsdXMuc3VwcwptaW51cy5zdXBzCmVxdWFsLnN1cHMOcGFyZW5sZWZ0LnN1cHMPcGFyZW5yaWdodC5zdXBzC3BlcmlvZC5zdXBzCmNvbW1hLnN1cHMJemVyby5zdWJzCG9uZS5zdWJzCHR3by5zdWJzCnRocmVlLnN1YnMJZm91ci5zdWJzCWZpdmUuc3VicwhzaXguc3VicwpzZXZlbi5zdWJzCmVpZ2h0LnN1YnMJbmluZS5zdWJzCXBsdXMuc3VicwptaW51cy5zdWJzCmVxdWFsLnN1YnMOcGFyZW5sZWZ0LnN1YnMPcGFyZW5yaWdodC5zdWJzC3BlcmlvZC5zdWJzCmNvbW1hLnN1YnMJemVyby5kbm9tCG9uZS5kbm9tCHR3by5kbm9tCnRocmVlLmRub20JZm91ci5kbm9tCWZpdmUuZG5vbQhzaXguZG5vbQpzZXZlbi5kbm9tCmVpZ2h0LmRub20JbmluZS5kbm9tDnBhcmVubGVmdC5kbm9tD3BhcmVucmlnaHQuZG5vbQtwZXJpb2QuZG5vbQpjb21tYS5kbm9tCXplcm8ubnVtcghvbmUubnVtcgh0d28ubnVtcgp0aHJlZS5udW1yCWZvdXIubnVtcglmaXZlLm51bXIIc2l4Lm51bXIKc2V2ZW4ubnVtcgplaWdodC5udW1yCW5pbmUubnVtcg5wYXJlbmxlZnQubnVtcg9wYXJlbnJpZ2h0Lm51bXILcGVyaW9kLm51bXIKY29tbWEubnVtcg1vcmRmZW1pbmluZS5hBmEuc3VwcwZiLnN1cHMGYy5zdXBzBmQuc3VwcwZlLnN1cHMGZi5zdXBzBmcuc3VwcwZoLnN1cHMGaS5zdXBzBmouc3VwcwZrLnN1cHMGbC5zdXBzBm0uc3VwcwZuLnN1cHMGby5zdXBzBnAuc3VwcwZxLnN1cHMGci5zdXBzBnMuc3VwcwZ0LnN1cHMGdS5zdXBzBnYuc3VwcwZ3LnN1cHMGeC5zdXBzBnkuc3VwcwZ6LnN1cHMHdW5pMDJDMQd1bmkwMkQwB3VuaTAyRDEHdW5pMDJERQd1bmkwMkUwC2VncmF2ZS5zdXBzC2VhY3V0ZS5zdXBzDHVuaTAyNTkuc3VwcwZhLnN1cGEGZy5zdXBhBmwuc3VwYQpjb2xvbi5zdXBzC2h5cGhlbi5zdXBzC2VuZGFzaC5zdXBzC2VtZGFzaC5zdXBzBnllbi5DTgRFdXJvB3VuaTAxOTINY29sb25tb25ldGFyeQRsaXJhB3VuaTIwQTYGcGVzZXRhB3VuaTIwQTkEZG9uZwd1bmkyMEIxB3VuaTIwQjIHdW5pMjBCNAd1bmkyMEI1B3VuaTIwQjkHdW5pMjBCQQd1bmkyMEFFB3VuaTIwQjgHdW5pMjBCRAd1bmkyMjE1CnNsYXNoLmZyYWMIb25ldGhpcmQJdHdvdGhpcmRzB3VuaTIxNTUHdW5pMjE1Ngd1bmkyMTU3B3VuaTIxNTgHdW5pMjE1OQd1bmkyMTVBB3VuaTIxNTAJb25lZWlnaHRoDHRocmVlZWlnaHRocwtmaXZlZWlnaHRocwxzZXZlbmVpZ2h0aHMHdW5pMjE1MQd1bmkyMTUyB3VuaTIxODkHdW5pMjIxOQd1bmkyMTEzCWVzdGltYXRlZAd1bmkyMTkwB2Fycm93dXAHdW5pMjE5MglhcnJvd2Rvd24HdW5pMjVBMAd1bmkyNUM2B3VuaTI1QzkHdW5pMjc1Mgd0cmlhZ3VwB3VuaTI1QjMHdW5pMjVCNgd1bmkyNUI3B3RyaWFnZG4HdW5pMjVCRAd1bmkyNUMwB3VuaTI1QzEHdW5pMjYxMAd1bmkyNjExB3VuaTI3MTMHdW5pMjY2QQd1bmkyMDMyB3VuaTIwMzMHdW5pMjAzNQd1bmkwMkI5B3VuaTAyQkUHdW5pMDJCRgd1bmkwMkM4B3VuaTAyQzkHdW5pMDJDQQd1bmkwMkNCB3VuaTAyQ0MHdW5pMjVDQwd1bmkwMzAwCXVuaTAzMDAuYwd1bmkwMzAxCXVuaTAzMDEuYwd1bmkwMzAyCXVuaTAzMDIuYwd1bmkwMzAzCXVuaTAzMDMuYwd1bmkwMzA0CXVuaTAzMDQuYwd1bmkwMzA1CXVuaTAzMDUuYwd1bmkwMzA2CXVuaTAzMDYuYwd1bmkwMzA3CXVuaTAzMDcuYwd1bmkwMzA4CXVuaTAzMDguYwd1bmkwMzA5CXVuaTAzMDkuYwd1bmkwMzBBCXVuaTAzMEEuYwd1bmkwMzBCCXVuaTAzMEIuYwd1bmkwMzBDCXVuaTAzMEMuYwd1bmkwMzBGCXVuaTAzMEYuYwd1bmkwMzExCXVuaTAzMTEuYwd1bmkwMzEyB3VuaTAzMTMHdW5pMDMxOAd1bmkwMzE5B3VuaTAzMUEHdW5pMDMxQgd1bmkwMzFDB3VuaTAzMUQHdW5pMDMxRQd1bmkwMzFGB3VuaTAzMjAHdW5pMDMyMwd1bmkwMzI0B3VuaTAzMjUHdW5pMDMyNgd1bmkwMzI3CXVuaTAzMjcuYwd1bmkwMzI4CXVuaTAzMjguYwd1bmkwMzI5B3VuaTAzMkEHdW5pMDMyQwd1bmkwMzJFB3VuaTAzMkYHdW5pMDMzMAd1bmkwMzMxB3VuaTAzMzQHdW5pMDMzOQd1bmkwMzNBB3VuaTAzM0IHdW5pMDMzQwd1bmkwMzNEB3VuaTAzNDIJdW5pMDM0Mi5jB3VuaTAzNDMHdW5pMDM0NAd1bmkwMzQ1B3VuaTAzNjEJdW5pMDM2MS5hC3VuaTAzMDgwMzAxDXVuaTAzMDgwMzAxLmMLdW5pMDMwODAzMDANdW5pMDMwODAzMDAuYwt1bmkwMzA4MDMwMwt1bmkwMzA4MDMwNA11bmkwMzA4MDMwNC5jC3VuaTAzMDgwMzBDDXVuaTAzMDgwMzBDLmMLdW5pMDMwMjAzMDENdW5pMDMwMjAzMDEuYwt1bmkwMzAyMDMwMA11bmkwMzAyMDMwMC5jC3VuaTAzMDIwMzA5DXVuaTAzMDIwMzA5LmMLdW5pMDMwMjAzMDMNdW5pMDMwMjAzMDMuYwt1bmkwMzA2MDMwMQ11bmkwMzA2MDMwMS5jC3VuaTAzMDYwMzAwDXVuaTAzMDYwMzAwLmMLdW5pMDMwNjAzMDkNdW5pMDMwNjAzMDkuYwt1bmkwMzA2MDMwMw11bmkwMzA2MDMwMy5jC3VuaTAzMDIwMzA2B3VuaTAzNEYHdW5pMjMxOAd1bmkyMzI1B3VuaTIzMkIHdW5pMjFFNwd1bmkyMzAzB3VuaTIwMDcHdW5pMjAwOQd1bmkyMDBBB3VuaTIwMEIKc3BhY2UuZnJhYwd1bmkyMDJGB3VuaUZFRkYAAAAAAAQAAAADAAAd7AAAAAQAAAAkAAMAAQAAHewAAwAKAAAAJAAMAAAAAB3IAAAAAAAAAnoAAAAgAAAAIAAAAAEAAAAhAAAAIQAAAqQAAAAiAAAAIgAAAqkAAAAjAAAAIwAAAugAAAAkAAAAJAAAA1UAAAAlAAAAJQAAA24AAAAmAAAAJgAAAmgAAAAnAAAAJwAAAqgAAAAoAAAAKQAAAsAAAAAqAAAAKgAAAsoAAAArAAAAKwAAA4MAAAAsAAAALAAAAqAAAAAtAAAALQAAArQAAAAuAAAALgAAAp8AAAAvAAAALwAAAsYAAAAwAAAAOQAAAmkAAAA6AAAAOwAAAqEAAAA8AAAAPAAAA4kAAAA9AAAAPQAAA4gAAAA+AAAAPgAAA4oAAAA/AAAAPwAAAqYAAABAAAAAQAAAAuYAAABBAAAAWgAAAAIAAABbAAAAWwAAAsIAAABcAAAAXAAAAsgAAABdAAAAXQAAAsMAAABeAAAAXgAAA44AAABfAAAAXwAAAr0AAABgAAAAYAAAA7oAAABhAAAAegAAABwAAAB7AAAAewAAAsQAAAB8AAAAfAAAAscAAAB9AAAAfQAAAsUAAAB+AAAAfgAAA5AAAACgAAAAoAAAAAEAAAChAAAAoQAAAqUAAACiAAAAogAAA1oAAACjAAAAowAAA1YAAACkAAAApAAAA1QAAAClAAAApQAAA1cAAACmAAAApgAAAskAAACnAAAApwAAAs0AAACoAAAAqAAAA8QAAACpAAAAqQAAAt8AAACqAAAAqgAAAycAAACrAAAAqwAAArIAAACsAAAArAAAA5IAAACtAAAArQAAArQAAACuAAAArgAAAuEAAACvAAAArwAAA8UAAACwAAAAsAAAA1MAAACxAAAAsQAAA40AAACyAAAAswAAAusAAAC0AAAAtAAAA7sAAAC1AAAAtQAAA5UAAAC2AAAAtgAAAs4AAAC3AAAAtwAAArsAAAC4AAAAuAAAA8oAAAC5AAAAuQAAAuoAAAC6AAAAugAAAykAAAC7AAAAuwAAArMAAAC8AAAAvgAAA3AAAAC/AAAAvwAAAqcAAADAAAAAxAAAADYAAADFAAAAxQAAAD0AAADGAAAAxgAAAE4AAADHAAAAxwAAAFQAAADIAAAAygAAAF4AAADLAAAAywAAAGIAAADMAAAAzgAAAIEAAADPAAAAzwAAAIUAAADQAAAA0AAAAQEAAADRAAAA0QAAAKAAAADSAAAA1gAAAKUAAADXAAAA1wAAA4UAAADYAAAA2AAAALYAAADZAAAA2wAAANgAAADcAAAA3AAAANwAAADdAAAA3QAAAPUAAADeAAAA3gAAAQIAAADfAAAA3wAAAaAAAADgAAAA5AAAAQYAAADlAAAA5QAAAQ0AAADmAAAA5gAAAR4AAADnAAAA5wAAASQAAADoAAAA6gAAAS4AAADrAAAA6wAAATIAAADsAAAA7gAAAVAAAADvAAAA7wAAAVQAAADwAAAA8AAAAdMAAADxAAAA8QAAAXAAAADyAAAA9gAAAXYAAAD3AAAA9wAAA4YAAAD4AAAA+AAAAYcAAAD5AAAA+wAAAakAAAD8AAAA/AAAAa0AAAD9AAAA/QAAAccAAAD+AAAA/gAAAdQAAAD/AAAA/wAAAckAAAEAAAABAAAAADsAAAEBAAABAQAAAQsAAAECAAABAgAAADwAAAEDAAABAwAAAQwAAAEEAAABBAAAAEsAAAEFAAABBQAAARsAAAEGAAABBgAAAFUAAAEHAAABBwAAASUAAAEIAAABCAAAAFYAAAEJAAABCQAAASYAAAEKAAABCgAAAFgAAAELAAABCwAAASgAAAEMAAABDAAAAFcAAAENAAABDQAAAScAAAEOAAABDgAAAFkAAAEPAAABDwAAASkAAAEQAAABEAAAAF0AAAERAAABEQAAAS0AAAESAAABEgAAAGMAAAETAAABEwAAATMAAAEUAAABFAAAAGQAAAEVAAABFQAAATQAAAEWAAABFgAAAGUAAAEXAAABFwAAATUAAAEYAAABGAAAAG4AAAEZAAABGQAAAT4AAAEaAAABGgAAAGEAAAEbAAABGwAAATEAAAEcAAABHAAAAHQAAAEdAAABHQAAAUQAAAEeAAABHgAAAHUAAAEfAAABHwAAAUUAAAEgAAABIAAAAHYAAAEhAAABIQAAAUYAAAEiAAABIgAAAHcAAAEjAAABIwAAAUcAAAEkAAABJAAAAHwAAAElAAABJQAAAUsAAAEmAAABJgAAAIAAAAEnAAABJwAAAU8AAAEoAAABKAAAAIQAAAEpAAABKQAAAVMAAAEqAAABKgAAAIYAAAErAAABKwAAAVUAAAEsAAABLAAAAI0AAAEtAAABLQAAAVsAAAEuAAABLgAAAIsAAAEvAAABLwAAAVkAAAEwAAABMAAAAIcAAAExAAABMQAAAVwAAAEyAAABMgAAAQUAAAEzAAABMwAAAdcAAAE0AAABNAAAAI4AAAE1AAABNQAAAV0AAAE2AAABNgAAAI8AAAE3AAABNwAAAV4AAAE4AAABOAAAAWEAAAE5AAABOQAAAJIAAAE6AAABOgAAAWIAAAE7AAABOwAAAJQAAAE8AAABPAAAAWUAAAE9AAABPQAAAJMAAAE+AAABPgAAAWMAAAE/AAABPwAAAJUAAAFAAAABQAAAAWQAAAFBAAABQQAAAJkAAAFCAAABQgAAAWkAAAFDAAABQwAAAJ0AAAFEAAABRAAAAW0AAAFFAAABRQAAAKEAAAFGAAABRgAAAXEAAAFHAAABRwAAAJ8AAAFIAAABSAAAAW8AAAFJAAABSQAAAXUAAAFKAAABSgAAAQQAAAFLAAABSwAAAdUAAAFMAAABTAAAAKoAAAFNAAABTQAAAXsAAAFOAAABTgAAALQAAAFPAAABTwAAAYUAAAFQAAABUAAAAKsAAAFRAAABUQAAAXwAAAFSAAABUgAAALcAAAFTAAABUwAAAYgAAAFUAAABVAAAAMEAAAFVAAABVQAAAZIAAAFWAAABVgAAAMQAAAFXAAABVwAAAZMAAAFYAAABWAAAAMIAAAFZAAABWQAAAZQAAAFaAAABWgAAAMgAAAFbAAABWwAAAZkAAAFcAAABXAAAAMkAAAFdAAABXQAAAZoAAAFeAAABXgAAAMsAAAFfAAABXwAAAZwAAAFgAAABYAAAAMoAAAFhAAABYQAAAZsAAAFiAAABYgAAANIAAAFjAAABYwAAAaMAAAFkAAABZAAAANAAAAFlAAABZQAAAaEAAAFmAAABZgAAANcAAAFnAAABZwAAAagAAAFoAAABaAAAANsAAAFpAAABaQAAAawAAAFqAAABagAAAN0AAAFrAAABawAAAa4AAAFsAAABbAAAAN4AAAFtAAABbQAAAa8AAAFuAAABbgAAAN8AAAFvAAABbwAAAbAAAAFwAAABcAAAAOAAAAFxAAABcQAAAbEAAAFyAAABcgAAAO4AAAFzAAABcwAAAb8AAAF0AAABdAAAAPIAAAF1AAABdQAAAcQAAAF2AAABdgAAAPYAAAF3AAABdwAAAcgAAAF4AAABeAAAAPcAAAF5AAABeQAAAPwAAAF6AAABegAAAc4AAAF7AAABewAAAP4AAAF8AAABfAAAAdAAAAF9AAABfQAAAP0AAAF+AAABfgAAAc8AAAGAAAABgAAAASEAAAGPAAABjwAAAQMAAAGSAAABkgAAA1sAAAGTAAABkwAAAHsAAAGgAAABoAAAALgAAAGhAAABoQAAAYkAAAGvAAABrwAAAOgAAAGwAAABsAAAAbkAAAHCAAABwwAAAiIAAAHNAAABzQAAAD4AAAHOAAABzgAAAQ4AAAHPAAABzwAAAIgAAAHQAAAB0AAAAVYAAAHRAAAB0QAAAKwAAAHSAAAB0gAAAX0AAAHTAAAB0wAAAOEAAAHUAAAB1AAAAbIAAAHVAAAB1QAAAOIAAAHWAAAB1gAAAbMAAAHXAAAB1wAAAOMAAAHYAAAB2AAAAbQAAAHZAAAB2QAAAOQAAAHaAAAB2gAAAbUAAAHbAAAB2wAAAOUAAAHcAAAB3AAAAbYAAAHiAAAB4gAAAFAAAAHjAAAB4wAAASAAAAHmAAAB5gAAAHgAAAHnAAAB5wAAAUgAAAHqAAAB6gAAAL4AAAHrAAAB6wAAAY8AAAH0AAAB9AAAAHMAAAH1AAAB9QAAAUMAAAH4AAAB+AAAAJ4AAAH5AAAB+QAAAW4AAAH8AAAB/AAAAE8AAAH9AAAB/QAAAR8AAAIYAAACGAAAAMwAAAIZAAACGQAAAZ0AAAIaAAACGgAAANMAAAIbAAACGwAAAaQAAAI3AAACNwAAAdYAAAJDAAACQwAAAFEAAAJQAAACUAAAAdgAAAJRAAACUQAAAeEAAAJSAAACUwAAAdkAAAJUAAACVAAAAgEAAAJVAAACVQAAAdwAAAJWAAACWAAAAd4AAAJZAAACXAAAAeQAAAJeAAACYwAAAegAAAJkAAACZAAAAgIAAAJlAAACZwAAAe4AAAJoAAACaAAAAfIAAAJpAAACaQAAAfQAAAJqAAACagAAAfMAAAJrAAACbgAAAfYAAAJvAAACdAAAAfsAAAJ1AAACewAAAgMAAAJ9AAACfgAAAgoAAAKAAAAChAAAAgwAAAKIAAACiAAAAhEAAAKJAAACkgAAAhMAAAKUAAAClQAAAh4AAAKYAAACmAAAAiQAAAKZAAACmQAAAeIAAAKcAAACnAAAAfEAAAKdAAACnQAAAfUAAAKfAAACnwAAAfoAAAKhAAACogAAAiAAAAKkAAACpAAAAeMAAAKnAAACpwAAAhIAAAKwAAACsAAAAzEAAAKyAAACsgAAAzMAAAKzAAACswAAAzsAAAK3AAACtwAAA0AAAAK4AAACuAAAA0IAAAK5AAACuQAAA7cAAAK7AAACvAAAAqoAAAK+AAACvwAAA7gAAALBAAACwQAAA0QAAALGAAACzAAAA7wAAALQAAAC0QAAA0UAAALYAAAC2AAAA8YAAALZAAAC2QAAA8kAAALaAAAC2gAAA8cAAALbAAAC2wAAA8sAAALcAAAC3AAAA8MAAALdAAAC3QAAA8gAAALeAAAC3gAAA0cAAALgAAAC4AAAA0gAAALhAAAC4QAAAzUAAALiAAAC4gAAAzwAAALjAAAC4wAAA0EAAAMAAAADAAAAA80AAAMBAAADAQAAA88AAAMCAAADAgAAA9EAAAMDAAADAwAAA9MAAAMEAAADBAAAA9UAAAMFAAADBQAAA9cAAAMGAAADBgAAA9kAAAMHAAADBwAAA9sAAAMIAAADCAAAA90AAAMJAAADCQAAA98AAAMKAAADCgAAA+EAAAMLAAADCwAAA+MAAAMMAAADDAAAA+UAAAMPAAADDwAAA+cAAAMRAAADEQAAA+kAAAMSAAADEwAAA+sAAAMYAAADIAAAA+0AAAMjAAADJwAAA/YAAAMoAAADKAAAA/wAAAMpAAADKgAAA/4AAAMsAAADLAAABAAAAAMuAAADMQAABAEAAAM0AAADNAAABAUAAAM5AAADPQAABAYAAANCAAADQgAABAsAAANDAAADRQAABA0AAANPAAADTwAABCwAAANhAAADYQAABBAAAAOUAAADlAAAA5kAAAOpAAADqQAAA5oAAAO8AAADvAAAA5UAAAPAAAADwAAAA5MAAB0lAAAdJQAAAh0AAB1DAAAdQwAAAyoAAB1HAAAdRwAAAysAAB1IAAAdSQAAAy0AAB1NAAAdTQAAAzAAAB1PAAAdTwAAAzQAAB1QAAAdUAAAAzYAAB1SAAAdUgAAAzgAAB1WAAAdVgAAAzkAAB1XAAAdWAAAAz0AAB1bAAAdWwAAAz8AAB2cAAAdnAAAAywAAB2gAAAdoAAAAy8AAB27AAAduwAAA0MAAB4CAAAeAgAAAFIAAB4DAAAeAwAAASIAAB4GAAAeBgAAAFMAAB4HAAAeBwAAASMAAB4KAAAeCgAAAFoAAB4LAAAeCwAAASoAAB4MAAAeDAAAAFsAAB4NAAAeDQAAASsAAB4OAAAeDgAAAFwAAB4PAAAeDwAAASwAAB4WAAAeFgAAAHEAAB4XAAAeFwAAAUEAAB4eAAAeHgAAAHIAAB4fAAAeHwAAAUIAAB4gAAAeIAAAAHkAAB4hAAAeIQAAAUkAAB4kAAAeJAAAAH0AAB4lAAAeJQAAAUwAAB4qAAAeKgAAAH4AAB4rAAAeKwAAAU4AAB4yAAAeMgAAAJAAAB4zAAAeMwAAAV8AAB40AAAeNAAAAJEAAB41AAAeNQAAAWAAAB42AAAeNgAAAJYAAB43AAAeNwAAAWYAAB44AAAeOAAAAJcAAB45AAAeOQAAAWcAAB46AAAeOgAAAJgAAB47AAAeOwAAAWgAAB4+AAAePgAAAJoAAB4/AAAePwAAAWoAAB5AAAAeQAAAAJsAAB5BAAAeQQAAAWsAAB5CAAAeQgAAAJwAAB5DAAAeQwAAAWwAAB5EAAAeRAAAAKIAAB5FAAAeRQAAAXIAAB5GAAAeRgAAAKMAAB5HAAAeRwAAAXMAAB5IAAAeSAAAAKQAAB5JAAAeSQAAAXQAAB5SAAAeUgAAALUAAB5TAAAeUwAAAYYAAB5WAAAeVgAAAMAAAB5XAAAeVwAAAZEAAB5YAAAeWAAAAMMAAB5ZAAAeWQAAAZUAAB5aAAAeWgAAAMUAAB5bAAAeWwAAAZYAAB5cAAAeXAAAAMYAAB5dAAAeXQAAAZcAAB5eAAAeXgAAAMcAAB5fAAAeXwAAAZgAAB5gAAAeYAAAAM0AAB5hAAAeYQAAAZ4AAB5iAAAeYgAAAM4AAB5jAAAeYwAAAZ8AAB5qAAAeagAAANEAAB5rAAAeawAAAaIAAB5sAAAebAAAANQAAB5tAAAebQAAAaUAAB5uAAAebgAAANUAAB5vAAAebwAAAaYAAB6AAAAegAAAAPAAAB6BAAAegQAAAcIAAB6CAAAeggAAAPEAAB6DAAAegwAAAcMAAB6EAAAehAAAAPMAAB6FAAAehQAAAcUAAB6OAAAejgAAAPgAAB6PAAAejwAAAcoAAB6SAAAekgAAAP8AAB6TAAAekwAAAdEAAB6UAAAelAAAAQAAAB6VAAAelQAAAdIAAB6WAAAelgAAAU0AAB6XAAAelwAAAacAAB6eAAAengAAAM8AAB6gAAAeoAAAAD8AAB6hAAAeoQAAAQ8AAB6iAAAeogAAAEAAAB6jAAAeowAAARAAAB6kAAAepAAAAEEAAB6lAAAepQAAAREAAB6mAAAepgAAAEIAAB6nAAAepwAAARIAAB6oAAAeqAAAAEMAAB6pAAAeqQAAARMAAB6qAAAeqgAAAEQAAB6rAAAeqwAAARQAAB6sAAAerAAAAEUAAB6tAAAerQAAARUAAB6uAAAergAAAEYAAB6vAAAerwAAARYAAB6wAAAesAAAAEcAAB6xAAAesQAAARcAAB6yAAAesgAAAEgAAB6zAAAeswAAARgAAB60AAAetAAAAEkAAB61AAAetQAAARkAAB62AAAetgAAAEoAAB63AAAetwAAARoAAB64AAAeuAAAAGYAAB65AAAeuQAAATYAAB66AAAeugAAAGcAAB67AAAeuwAAATcAAB68AAAevAAAAGgAAB69AAAevQAAATgAAB6+AAAevgAAAGkAAB6/AAAevwAAATkAAB7AAAAewAAAAGoAAB7BAAAewQAAAToAAB7CAAAewgAAAGsAAB7DAAAewwAAATsAAB7EAAAexAAAAGwAAB7FAAAexQAAATwAAB7GAAAexgAAAG0AAB7HAAAexwAAAT0AAB7IAAAeyAAAAIkAAB7JAAAeyQAAAVcAAB7KAAAeygAAAIoAAB7LAAAeywAAAVgAAB7MAAAezAAAAK0AAB7NAAAezQAAAX4AAB7OAAAezgAAAK4AAB7PAAAezwAAAX8AAB7QAAAe0AAAAK8AAB7RAAAe0QAAAYAAAB7SAAAe0gAAALAAAB7TAAAe0wAAAYEAAB7UAAAe1AAAALEAAB7VAAAe1QAAAYIAAB7WAAAe1gAAALIAAB7XAAAe1wAAAYMAAB7YAAAe2AAAALMAAB7ZAAAe2QAAAYQAAB7aAAAe2gAAALkAAB7bAAAe2wAAAYoAAB7cAAAe3AAAALoAAB7dAAAe3QAAAYsAAB7eAAAe3gAAALsAAB7fAAAe3wAAAYwAAB7gAAAe4AAAALwAAB7hAAAe4QAAAY0AAB7iAAAe4gAAAL0AAB7jAAAe4wAAAY4AAB7kAAAe5AAAAOYAAB7lAAAe5QAAAbcAAB7mAAAe5gAAAOcAAB7nAAAe5wAAAbgAAB7oAAAe6AAAAOkAAB7pAAAe6QAAAboAAB7qAAAe6gAAAOoAAB7rAAAe6wAAAbsAAB7sAAAe7AAAAOsAAB7tAAAe7QAAAbwAAB7uAAAe7gAAAOwAAB7vAAAe7wAAAb0AAB7wAAAe8AAAAO0AAB7xAAAe8QAAAb4AAB7yAAAe8gAAAPQAAB7zAAAe8wAAAcYAAB70AAAe9AAAAPkAAB71AAAe9QAAAcsAAB72AAAe9gAAAPoAAB73AAAe9wAAAcwAAB74AAAe+AAAAPsAAB75AAAe+QAAAc0AACAHAAAgBwAABDIAACAJAAAgCwAABDMAACAQAAAgEAAAArQAACARAAAgEQAAArQAACASAAAgEgAAArkAACATAAAgFAAAArUAACAVAAAgFQAAAroAACAWAAAgFgAAAs8AACAYAAAgGQAAAqoAACAaAAAgGgAAAq4AACAcAAAgHQAAAqwAACAeAAAgHgAAAq8AACAgAAAgIQAAAssAACAiAAAgIgAAArwAACAmAAAgJgAAAqMAACAvAAAgLwAABDcAACAwAAAgMAAAA28AACAyAAAgMwAAA7QAACA1AAAgNQAAA7YAACA5AAAgOgAAArAAACA8AAAgPAAAAtAAACA9AAAgPQAAAtQAACA+AAAgPwAAAr4AACBEAAAgRAAAA2sAACBHAAAgRwAAAtEAACBIAAAgSAAAAtMAACBJAAAgSQAAAtIAACBwAAAgcAAAAukAACBxAAAgcQAAAzIAACB0AAAgfgAAAu0AACB/AAAgfwAAAzcAACCAAAAgjgAAAvoAACCUAAAglAAAA0sAACChAAAgoQAAA1wAACCkAAAgpAAAA10AACCmAAAgpwAAA14AACCpAAAgqQAAA2AAACCrAAAgqwAAA2EAACCsAAAgrAAAA1kAACCuAAAgrgAAA2gAACCxAAAgsgAAA2IAACC0AAAgtQAAA2QAACC4AAAguAAAA2kAACC5AAAgugAAA2YAACC9AAAgvQAAA2oAACETAAAhEwAAA50AACEXAAAhFwAAAuAAACEgAAAhIAAAAuMAACEiAAAhIgAAAuIAACEmAAAhJgAAA5oAACEuAAAhLgAAA54AACFQAAAhUAAAA3sAACFRAAAhUgAAA4AAACFTAAAhWgAAA3MAACFbAAAhXgAAA3wAACGJAAAhiQAAA4IAACGQAAAhkwAAA58AACHnAAAh5wAABDAAACICAAAiAgAAA5YAACIGAAAiBgAAA5kAACIPAAAiDwAAA5wAACIRAAAiEQAAA5sAACISAAAiEgAAA4QAACIVAAAiFQAAA2wAACIZAAAiGQAAA4cAACIaAAAiGgAAA5gAACIeAAAiHgAAA5QAACIrAAAiKwAAA5cAACJIAAAiSAAAA5EAACJgAAAiYAAAA48AACJkAAAiZQAAA4sAACMDAAAjAwAABDEAACMYAAAjGAAABC0AACMcAAAjHwAAAtUAACMlAAAjJQAABC4AACMrAAAjKwAABC8AACWgAAAloAAAA6MAACWyAAAlswAAA6cAACW2AAAltwAAA6kAACW8AAAlvQAAA6sAACXAAAAlwQAAA60AACXGAAAlxgAAA6QAACXJAAAlyQAAA6UAACXKAAAlygAAA7MAACXMAAAlzAAAA8wAACYQAAAmEQAAA68AACZqAAAmagAAA7IAACcTAAAnEwAAA7EAACdSAAAnUgAAA6YAACfmAAAn5wAAAtkAAC4iAAAuJQAAAtsAAC46AAAuOwAAArcAAKe1AACntQAAAdsAAKtTAACrUwAAAd0AAPsAAAD7AAAAAiUAAPsBAAD7AgAABDkAAPsDAAD7BAAAAiYAAP7/AAD+/wAABDgAAfFqAAHxawAAAuQABAqWAAABOgEAAAcAOgB+AX4BgAGPAZMBoQGwAcMB3AHjAecB6wH1AfkB/QIbAjcCQwJcAnsCfgKEApIClQKZAp0CnwKiAqQCpwKwArMCuQK8Ar8CwQLMAtEC3gLjAwwDDwMTAyADKgMsAzEDNAM9A0UDTwNhA5QDqQO8A8AdJR1DHUkdTR1QHVIdWB1bHZwdoB27HgMeBx4PHhceIR4lHiseOx5JHlMeYx5vHoUejx6XHp4e+SAHIAsgFiAaIB4gIiAmIDAgMyA1IDogPyBEIEkgcSCOIJQgoSCkIKcgqSCsIK4gsiC1ILogvSETIRchICEiISYhLiFeIYkhkyHnIgIiBiIPIhIiFSIaIh4iKyJIImAiZSMDIxgjHyMlIysloCWzJbclvSXBJcYlyiXMJhEmaicTJ1In5y4lLjuntatT+wT+////AAAAIACgAYABjwGSAaABrwHCAc0B4gHmAeoB9AH4AfwCGAI3AkMCUAJeAn0CgAKIApQCmAKcAp8CoQKkAqcCsAKyArcCuwK+AsECxgLQAtgC4AMAAw8DEQMYAyMDLAMuAzQDOQNCA08DYQOUA6kDvAPAHSUdQx1HHU0dTx1SHVYdWx2cHaAdux4CHgYeCh4WHh4eJB4qHjIePh5SHlYeah6AHo4ekh6eHqAgByAJIBAgGCAcICAgJiAvIDIgNSA5IDwgRCBHIHAgdCCUIKEgpCCmIKkgqyCuILEgtCC4IL0hEyEXISAhIiEmIS4hUCGJIZAh5yICIgYiDyIRIhUiGSIeIisiSCJgImQjAyMYIxwjJSMrJaAlsiW2JbwlwCXGJcklzCYQJmonEydSJ+YuIi46p7WrU/sA/v///wAAAAD/of90AAAAAAAAAGAAAAAAAAAAAAAAAAAAAAAA/5/+DgAAAAD/jf+MAAD/igAAAAD/W/9//z//awCBAAAAAP/vAPoAgwD2AHUAAAAAAAAA2AAAANUAAADUANMA0QDNAAAA3QCvAAX/8f/Z/9Pk+OXnAADl4wAA5eYAAOXk5ZDlj+WIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4jEAAOQr5CoAAAAAAAAAAOJ9AADjguOB4ncAAOMnAAAAAAAA4rfiu+K54rjitwAA4rriseKwAADireKK4cnhw+HA4nTicAAA4fniD+JJ4ZThk+GNAADhVwAA4XbhbOFJ4S/hJ+Eu4RXfueEJ4QTeA9313fPd793t3d4AAN4A3Z/dSNye3FTa89S51H1aJlaKAAAFOQABAToB9gAAAAADrgOwA7IAAAOyA9AD0gPUA9YD2APaA9wAAAAAA94D9gAAAAAELAAABD4EQAAAAAAAAAAAAAAEOAQ6AAAAAAAAAAAAAAQ0BEAERgAABFwAAAReAAAAAAAAAAAEZAAAAAAAAAAAAAAAAAAAAAAEWgAABFwAAARcAAAAAAAAAAAEWARaBFwEZgRoBG4EcARyBIQEmgScBLYEwATKBMwAAATUAAAAAAWCBY4FkgWWAAAFmAAAAAAAAAWUAAAFmAWcBZ4AAAAAAAAAAAAABcgAAAAAAAAFxAAAAAAAAAAAAAAAAAAABboAAAAAAAAAAAAAAAAFygAABcoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWsAAAAAAAAAAAAAAAAAAAAAAAAAAAFmgAAAAAAAQKkAqkC6ANVA24CaAKoAsACwQLKA4MCoAK0Ap8CxgJpAmoCawJsAm0CbgJvAnACcQJyAqECogOJA4gDigKmAuYAAgADAAQABQAGAAcACAAJAAoACwAMAA0ADgAPABAAEQASABMAFAAVABYAFwAYABkAGgAbAsICyALDA44CvQO6ABwAHQAeAB8AIAAhACIAIwAkACUAJgAnACgAKQAqACsALAAtAC4ALwAwADEAMgAzADQANQLEAscCxQOQAAECpQNaA1YDVANXAskCzQPEAt8DJwKyA5ICtALhA8UDUwONAusC7AO7A5UCzgK7A8oC6gMpArMDcANxA3ICpwA2ADcAOAA5ADoAPQBOAFQAXgBfAGAAYgCBAIIAgwCFAQEAoAClAKYApwCoAKkDhQC2ANgA2QDaANwA9QECAaABBgEHAQgBCQEKAQ0BHgEkAS4BLwEwATIBUAFRAVIBVAHTAXABdgF3AXgBeQF6A4YBhwGpAaoBqwGtAccB1AHJADsBCwA8AQwASwEbAFUBJQBWASYAWAEoAFcBJwBZASkAXQEtAGMBMwBkATQAZQE1AG4BPgBhATEAdAFEAHUBRQB2AUYAdwFHAHwBSwCAAU8AhAFTAIYBVQCNAVsAiwFZAIcBXAEFAdcAjgFdAI8BXgFhAJIBYgCUAWUAkwFjAJUBZACZAWkAnQFtAKEBcQCfAW8BdQEEAdUAqgF7ALQBhQCrAXwAtwGIAMEBkgDEAZMAwgGUAMgBmQDJAZoAywGcAMoBmwDSAaMA0AGhANcBqADbAawA3QGuAN4BrwDfAbAA4AGxAO4BvwDyAcQA9gHIAPcA/AHOAP4B0AD9Ac8DWwB7ALgBiQDoAbkAPgEOAIgBVgCsAX0A4QGyAOIBswDjAbQA5AG1AOUBtgBQASAAeAFIAL4BjwBzAUMAngFuAE8BHwDMAZ0A0wGkAdgB4QHZAdoCAQHcAd4B3wHgAeQB5QHmAecB6AHpAeoB6wHsAe0CAgHuAe8B8AHyAfQB8wH2AfcB+AH5AfsB/AH9Af4B/wIAAgMCBAIFAgYCBwIIAgkCEQITAhQCFQIWAhcCGAIZAhoCGwIcAiQB4gHxAfUDMwM7A0ADQgO3A8YDyQPHA8sDwwPIA0cDSAM1AzwDQQPNA88D0QPTA9UD1wPZA9sD3QPfA+ED4wPlA+kD6wPsA/YD9wP4A/kD+gP8A/4D/wQLBA0EDgQPAysDLQMuAzQDNgM5Az0DPgBSASIAUwEjAFoBKgBbASsAXAEsAHEBQQByAUIAeQFJAH0BTAB+AU4AkAFfAJEBYACWAWYAlwFnAJgBaACaAWoAmwFrAJwBbACiAXIAowFzAKQBdAC1AYYAwAGRAMMBlQDFAZYAxgGXAMcBmADNAZ4AzgGfANEBogDUAaUA1QGmAPABwgDxAcMA8wHFAPgBygD/AdEBAAHSAU0BpwA/AQ8AQAEQAEEBEQBCARIAQwETAEQBFABFARUARgEWAEcBFwBIARgASQEZAEoBGgBmATYAZwE3AGgBOABpATkAagE6AGsBOwBsATwAbQE9AIkBVwCKAVgArQF+AK4BfwCvAYAAsAGBALEBggCyAYMAswGEALkBigC6AYsAuwGMALwBjQC9AY4A5gG3AOcBuADpAboA6gG7AOsBvADsAb0A7QG+APQBxgD5AcsA+gHMAPsBzQK0ArQCuQK1ArYCugLPAqoCqwKuAqwCrQKvAssCzAK8BDcDbwLQAtQCvgK/AtEC0wLSAukDMgLtAu4C7wLwAvEC8gLzAvQC9QL2AvcDNwL6AvsC/AL9Av4C/wMAAwEDAgMDAwQDBQMGAwcDCANhA1kDaQNmA2cDewOAA4EDcwN0A3UDdgN3A3gDeQN6A3wDfQN+A38DmwOEA4cDmAOlA7MCJQQ5BDoCJgInAAAAAQAAAAoAPACaAAJERkxUACBsYXRuAA4ABAAAAAD//wAEAAEAAwAFAAcABAAAAAD//wAEAAAAAgAEAAYACGtlcm4AWGtlcm4AWG1hcmsARm1hcmsARm1rbWsAQG1rbWsAQHNpemUAMnNpemUAMgAE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ABYAFgAMABcAFwACABgAGAAPABkAGQAQABoAGgADABsAGwASABwAHAAdAB4AIAAdACEAIQAGACIAIgAdACUAJQAHACgAKQAhACoAKgAdACsAKwAhACwALAAdAC0ALQAhAC4ALgAnAC8ALwAKADAAMAALADEAMQANADIAMgAOADMAMwAbADQANAARADUANQAoADYATQAmAFQAWAAIAHMAewAIAI4AjgAaAKUAvwAIAMgAzgAJANAA1wABANgA7wAMAPAA8wAPAPQA+wADAPwBAAASAQYBHQAdAR4BIAAcASQBQQAdAUIBQgAGAUMBSgAdAVwBXAAhAV0BXQAHAWEBYQAhAWoBdAAhAXYBkAAdAZEBmAAhAZkBnwAnAaEBqAAKAakBwQALAcIBxQAOAcYBzQARAc4B0gAoAdUB1QAhAdYB1gAHAdgB2AALAdwB3AAdAd4B3wAdAeEB4QAdAeIB4gAhAeMB4wAdAegB6AAdAeoB7AAdAe0B7QANAe4B7gALAfEB8QAhAfoB+gAhAfsB/AALAf0B/QAhAf4B/gAHAf8CAAAhAgMCBgAdAgoCCgAhAgwCDAAhAg4CDgAnAg8CDwAHAhECEgAKAhQCFAAdAhUCFQALAhYCGAApAhkCGQANAhoCHAAoAiUCKQAGAjkCUQAcAlICWgAeAmQCZAAGAmUCZQAhAp8CoAAiAqECogAqAqMCowAiAqQCpAAjAqUCpQAtAqYCpgATAqcCpwAuAqgCqQAVAqoCqgAUAqsCqwAEAqwCrAAUAq0CrQAEAq4CrwAiArACsAAgArECsQArArICsgAgArMCswArArQCtgAfArkCugAfArsCuwAXAsECwQAkAsMCwwAkAsUCxQAkAsYCxgAlAsgCyAAWAsoCygAFAtAC0AAjAtEC0QATAtIC0gAjAtMC1AATAtoC2gAkAtwC3AAkAt4C3gAkAuEC4QAYAuIC4gAZAysDKwAsAzEDMgAsAzQDNwAsAzsDOwAsAz4DPgAsA0UDRgAbA04DTgAsBDkEOgAGAAIAowACAAIAAgADAAMAAwAEAAQABQAFAAUAGgAHAAcACQAIAAgADgALAAsAEQAMAAwAEwANAA0AFgAQABAAGgARABEAGwASABIAGgATABMAHgAUABQAIQAVABUAJAAWABYAJwAXABcAKgAYABgALAAZABkALgAaABoAMAAbABsAMgAcABwAAQAdAB0AGQAeAB4ABAAgACAABwAhACEACAAiACIADQAjACMAEAAmACYAEgAoACkAEAAqACsAGQAsACwAHAAtAC0AHQAuAC4AIAAvAC8AIwAwADAAAQAxADEAKQAyADIAKwAzADMALQA0ADQALwA1ADUAMQA2AE0AAgBRAFMAAwBUAFgABQBZAF0AGgByAHIACQBzAHsADgCAAIAADwCOAI4AEQCPAJEAEwCSAJIAFgCTAJMAFQCUAJkAFgClALYAGgC4ALoAGAC7ALsAGgC8AL0AGAC+AL8AGgDAAMAAGwDBAMcAHgDIAM4AIQDPAM8ACwDQANcAJADYAOcAJwDoAO0AJgDuAO8AJwDwAPMALAD0APsAMAD8AQAAMgEBAQEAGgECAQIAIgEDAQQAGgEGAR0AAQEeASAABwEhASMAGQEkASgABAEpASkAFAEuAUEABwFCAUIACAFDAUoADQFLAU8AEAFcAVwAAQFeAWEAEgFjAWMAFAFqAXUAEAF2AYcAGQGIAYgABwGJAY4AFwGPAZEAGQGSAZgAHQGZAZ8AIAGgAaAACgGhAagAIwGpAbgAAQG5Ab4AJQG/AcEAAQHCAcUAKwHGAc0ALwHOAdIAMQHUAdQAGQHYAdgABwHZAdoAGQHcAdwABAHgAeAAGQHkAeQAGQHmAeYABgHrAesADQHtAe0AKQHuAe4AHAHvAe8AEAHxAfEAAQH7AfsAAQH8AfwAHAH+Af4AEAIAAgAAAQIBAgEAGQIDAgMAGQIEAgQABgIFAgYAGQIHAgcAAQIKAgsAHQIMAgwAEgINAg0AAQIOAg4AIAIUAhUAGQIWAhgAKAIZAhkAKQIaAhsAMQIlAiUACAIoAikAIwJSAloADAJdAl0AFAKfAqAANQKhAqIANAKjAqMANQKkAqQANwKmAqYAOgKoAqkAPQKqAqoAOwKrAqsAPAKsAqwAOwKtAq0APAKuAq8ANQKwArAAOAKxArEAOQKyArIAOAKzArMAOQK0ArYANgK5AroANgLAAsAAMwLCAsIAMwLEAsQAMwLQAtAANwLRAtIAOgLTAtMANwLUAtQAOgLZAtkAMwLbAtsAMwLdAt0AMwMqAyoAHwMxAzEAHwM2AzcAHwNFA0YALQABAAIAAAAIAAIBSAAEAAADMAFYAAYAGgAA/+IAKP/sAGT/nP/Y/+z/xP/2/9gAFP+wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAyAAAAAAAA/+UAAP/yAAD/1wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP+9AAAAAP/sAAAAAAAA/83/5f/s/+z/5f/YAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEb/qf/IAAD/0QAA/94AAP+9/8j/3QAA/+UAAP/v/+//2P/lAAAAAAAAAAAAAAAA//YAAAA8AAAAAAAAAAAAAAAAAAAAAP/YAAAAAAAAAAD/7P/sAAAAAP+w//YAFP/sAAAAAAAAAAAAVwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAYCpQKnArsCxgLIA8IAAgBOAAIAAgANAAQABAAVAAgACAAVAAsACwAWABAAEAAVABIAEgAVABQAFAAOABUAFQAFABYAFgAGABcAFwAIABgAGAAKABkAGQAQABoAGgAMABsAGwARABwAHAATAB4AIAATACEAIQAUACIAIgATACUAJQAEACoAKgATACwALAATAC8ALwAYADAAMAAZADEAMQAHADIAMgAJADMAMwAPADQANAALADYATQANAFEAUQABAFQAWAAVAF0AXQABAHMAewAVAIAAgAADAI4AjgAWAKUAvwAVAMgAzgAOANAA1wAFANgA7wAGAPAA8wAKAPQA+wAMAPwBAAARAQEBAQABAQMBAwAXAQYBHQATAR4BIAASASQBQQATAUIBQgAUAUMBSgATAV0BXQAEAXYBkAATAaEBqAAYAakBwQAZAcIBxQAJAcYBzQALAdYB1gAEAdgB2AAZAdwB3AATAd4B3wATAeEB4QATAeMB4wATAegB6AATAeoB7AATAe0B7QAHAe4B7gAZAfsB/AAZAf4B/gAEAgMCBgATAg8CDwAEAhECEgAYAhQCFAATAhUCFQAZAhkCGQAHAiUCKQAUAjkCUQASAlICWgACAmQCZAAUA0UDRgAPBDkEOgAUAAIABQKlAqUAAQKnAqcAAwK7ArsAAgLGAsYABAPCA8IABQABAAIAAAAIAAEAQAAEAAAAGwLqAuQC0gK8AqICiAJ2AlwCNgIgAgoB+AHyAeQB1gHEAaoBjAFmAVABOgEkAQ4A7ADCAKwAbgACAAcCXQJdAAACdQJ+AAECiwKUAAsCnwKfABUCogKiABYDVQNXABcDWQNZABoADwJ1//wCdgAOAncAKAJ4ABQCef/yAnoAFAJ7//wCff/8Aov//AKNABQCjgAOAo8AFAKQAA4Ckf/8ApP//AAFAnYAFAJ3AAoCeQAKAo7/9gKS/+wACgJ1//YCd//6Anj/7QJ5/9wCev/6Anv/7AJ9//ACi//yApH/7AKS/+kACAJ7//YCfP/rAn7/8gKM/+wCjv/2ApD/9gKS/+UClP/vAAUAJQAfAV0AHwHWAB8B/gAfAg8AHwAFACUAFAFdABQB1gAUAf4AFAIPABQABQKM//wCjf/2Ao7/9gKQ//YCkv/oAAUCjv/2ApD/9gKS/+wClP/2A1r//AAJAov/9gKN/+wCjv/sAo//4gKQ/+wCkf/2ApL/9gKT/+wDWv/wAAcCjP/yAo3/9gKO//YCkP/2ApL/3gKU//IDWv/5AAYCi//2Ao7/9gKQ//YCkv/mApT/9gNa/+wABAKM//YCkv/mApT/9gNa//IAAwKO//YCkP/2ApL/7AADApL/7AKT/+wDWv/8AAECkv/pAAQCjP/2Ao7/9gKQ//YCkv/sAAUCdv/8Anf/9gJ4//YCev/2Anz/4gAFAngACgJ6AAoCfP/iAn7/9gNa//wACQJ1/+ICdv/9Anf/9gJ4/+wCef/eAnr/7AJ7//wCff/yA1r/6AAGAnb/9gJ4//YCev/2Anz/8gJ+//IDWv/oAAQCdv/wAnz/3gJ+//IDWv/yAAYCdv/2Anj/8AJ6//ACfP/yAn7/8gNa//IABgJ2//wCeAAKAnoACgJ8/+gCfv/8A1r/9gAFAnn/9gJ8/+gCff/2An7/9gNa//sABAJ4//wCef/8Anr//AJ8//AAAQJ8/+IAPQAw/+wBHv/yAR//8gEg//IBqf/sAar/7AGr/+wBrP/sAa3/7AGu/+wBr//sAbD/7AGx/+wBsv/sAbP/7AG0/+wBtf/sAbb/7AG3/+wBuP/sAbn/7AG6/+wBu//sAbz/7AG9/+wBvv/sAb//7AHA/+wBwf/sAdj/7AHu/+wB+//sAfz/7AIV/+wCOf/yAjr/8gI7//ICPP/yAj3/8gI+//ICP//yAkD/8gJB//ICQv/yAkP/8gJE//ICRf/yAkb/8gJH//ICSP/yAkn/8gJK//ICS//yAkz/8gJN//ICTv/yAk//8gJQ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KAD//wAjAAACEAMzAiYABwAAAAcD3ADmAAD//wA5//QCOwNfAiYACAAAAAcD0AESAAD//wA5//QCOwNFAiYACAAAAAcD0gES/////wA5//QCRQNKAiYACAAAAAcD2gESAAD//wA5//QCOwMzAiYACAAAAAcD3AESAAD//wA5/yMCOwKcAiYACAAAAAcD+QEoAAX//wA5//QCSANNAiYACAAAAAcD5gESAAD//wA5//QCOwMPAiYACAAAAAcD1gESAAD//wA5//QCYQNJAiYACAAAAAcD1AESAAAAAQA5//QCoAMmADUAAAUiJjU0PgIzMhYXJiY3NjYXFhYXByYmJyYGBwYWFwcmJiMiDgIVFBYWMzI2NzcjNzMDBgYBLHZ9MFuBURgrEgECAQVIMhMbChkHDgsaIgIBCQo3EzcoPmJFJCNMPyQ5EyWIDc45JF4MkXhOlHdGCAgLFgszOwUBDAY3BAcBAiEcFywaKRkePWR4PDpeNhgQtUD+5B4lAP//ACMAAAJpA0UCJgAJAAAABwPSAQb/////ACP/LAJpApACJgAJAAAABwP2ARcABf//ACP/HwJpApACJgAJAAAABwQBARcABf//ACP/YAJpApACJgAJAAAABwQEARcABQACADIAAAKrApAAEwAXAAAzEyM/AjMHITczBzMHIwMjEyEDEyE3ITJiSQpJF04XASgXTRdKC0liTj/+2D5LASgW/tgB6TADdHR0dDP+FwE4/sgBe24A//8AIwAAARoDZgImAAoAAAAGA85SAP//ACMAAAFpA18CJgAKAAAABgPQUgD//wAjAAABcANFAiYACgAAAAYD0lL///8AIwAAAaEDSQImAAoAAAAGA9RSAP//ACMAAAFwAyoCJgAKAAAABgPeUgD//wAjAAABawMPAiYACgAAAAYD1lIA//8AIwAAAR0DMwImAAoAAAAGA9xSAP//ACMAAAGIA00CJgAKAAAABgPmUgD//wAjAAABLANoAiYACgAAAAYD4FIA/////f8nAPQCkAImAAoAAAAGA/ZTAAAB/9n/LQD0ApAAFQAAFyImNTQ2NjcjEzMDBgYVFBYzMjcXBiUhKx4qEQ+DToMmMRUPExASJtMjIh03LQ0CkP1wF0MdEhQLKhcA////2f8tAWgDXwImAIsAAAAGA9BRAP//ACMAAAGFA0oCJgAKAAAABgPaUgD////+//QCRQNFAiYACwAAAAcD0gEn/////wAj/yMCVwKQAiYADAAAAAcD+QEZAAX//wAj/ywCVwKQAiYADAAAAAcD9gEYAAX//wAj/2ACVwKQAiYADAAAAAcEBAEYAAX//wAjAAABkgNfAiYADQAAAAYD0FoAAAIAIwAAAdAC1AAFAAoAADMTMwMhBwM3MwcHI4NOdgEUDRMoNgssApD9skICANQ5mwD//wAj/yMBkgKQAiYADQAAAAcD+QDgAAX//wAjAAABsAKQAiYADQAAAAcCnwEoARj//wAj/ywBkgKQAiYADQAAAAcD9gDfAAX//wAj/ywBkgMPAiYADQAAACYD1loAAAcD9gDfAAX//wAj/2ABkgKQAiYADQAAAAcEBADfAAUAAf/3AAABkgKQAA0AADM3Byc3EzMDNxcHByEHIy9HFGlGTj60FdcqARQN7SM1MgFf/shZNWfTQv//ACMAAAK8A18CJgAOAAAABwPQASkAAP//ACMAAAK8AzMCJgAOAAAABwPcASkAAP//ACP/JAK8ApACJgAOAAAABwP2ATb//f//ACMAAAJmA18CJgAPAAAABwPQAQsAAP//ACMAAAJmA2YCJgAPAAAABwPOAQsAAP//ACMAAAJmA00CJgAPAAAABwPmAQsAAP//ACMAAAJmA0kCJgAPAAAABwPUAQsAAP//ACP/GwJmApACJgAPAAAABwP5AQ7//f//ACMAAAJmAzMCJgAPAAAABwPcAQsAAP//ACP/JAJmApACJgAPAAAABwP2AQ3//f//ACP/WAJmApACJgAPAAAABwQEAQ3//f//ADz/9AJeA2YCJgAQAAAABwPOARIAAP//ADz/9AJeA18CJgAQAAAABwPQARIAAP//ADz/9AJeA0UCJgAQAAAABwPSARL/////ADz/9AJhA0kCJgAQAAAABwPUARIAAP//ADz/9AJeAyoCJgAQAAAABwPeARIAAP//ADz/9AJeAw8CJgAQAAAABwPWARIAAP//ADz/9AJ5A2kCJgAQAAAABwPkARIAAP//ADz/9AJeA00CJgAQAAAABwPmARIAAP//ADz/LAJeApwCJgAQAAAABwP2ARkABf//ADz/9AJeA2gCJgAQAAAABwPgARIAAP//ADz/9AKIA3QCJgAQAAAABwQcARIAAP//ADz/9AJeA3oCJgAQAAAABwQe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A0oCJgAwAAAABwQSANIAAP//ADj/9AH0A0oCJgAwAAAABwQZANIAAP//ADj/9AHvA00CJgAwAAAABwQUANIAAP//ADj/KQHvAeYCJgAwAAAABwP2APUAAv//ADj/9AHvAvgCJgAwAAAABwPfANIAAAABADj/9AJbAo4AJQAAFyImNTQ2NxMzAwYGFRQzMjY3EzM2Njc2JzcWFRQGBgcDIzcjBgarPTYEBD5NPQQESB1HLEUbJDcBAgk9CyI1HFo/CAQoVAxCNxEfEwE2/tQTGQ1LKi4BWAQ0LRUYFh8eKDojCP48SiMzAP//ADj/9AJbAwkCJgG5AAAABwPPANIAAP//ADj/9AJbAw8CJgG5AAAABwPNANIAAP//ADj/9AJbAvgCJgG5AAAABwPfANIAAP//ADj/9AJbAtECJgG5AAAABwPTAMsAAP//ADj/KQJbAo4CJgG5AAAABwP2APUAAgABADj/MgHvAeYAKwAABSImNTQ2Njc3IwYGIyImNTQ2NxMzAwYGFRQzMjY3EzMDBgYVFBYzMjcXBgYBLiArITMaBgQoVCw9NgQEPk09BARIHUcsRUxhMjwVEBMSEBArziIhHjcuDkQjM0I3ER8TATb+1BMZDUsqLgFY/hoXPiERFAwmCg8AAAEAOP8yAe8B5gAuAAAXIiY1NDY3IiIjIiY1NDY3EzMDBgYVFDMyNjcTMwMjNyMGBgcGBhUUFjMyNxcGBrEgKi4bAQICPTYEBD5NPQQESB1HLEVMYT8IBBoxHR8oFQ8TExARKs4iISVDF0I3ER8TATb+1BMZDUsqLgFY/hpKFicUFjwdERQMJgoP//8AOP8yAe8DCQImAcAAAAAHA88A0AAA//8ARgAAAscDDwImADIAAAAHA80BKAAA//8ARgAAAscDCQImADIAAAAHA88BKAAA//8ARgAAAscC5AImADIAAAAHA9EBKAAA//8ARgAAAscCrAImADIAAAAHA90BKAAA////wv8vAeMDDwImADQAAAAHA80AqAAA////wv8vAeMDCQImADQAAAAHA88AqAAA////wv8vAeMC5AImADQAAAAHA9EAqAAA////wv8vAeMCrAImADQAAAAHA90AqAAA////wv8vAeMCsgImADQAAAAHA9sAqAAA////wv8nAeMB5gImADQAAAAHA/YBPgAA////wv8vAeMC+AIm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 diff --git a/d2renderers/d2fonts/encoded/SourceSansPro-Regular.txt b/d2renderers/d2fonts/encoded/SourceSansPro-Regular.txt new file mode 100644 index 000000000..a40bb1e1d --- /dev/null +++ b/d2renderers/d2fonts/encoded/SourceSansPro-Regular.txt @@ -0,0 +1 @@ +data:application/font-woff;base64,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AHQAZQAgAGcAQQBsAHQAZQByAG4AYQB0AGUAIABhAFMAdAByAGEAaQBnAGgAdAAgAGwAUwBsAGEAcwBoAGUAZAAgAHoAZQByAG8AUAByAGUAZgBlAHIAcgBlAGQAIABBAHQAaABhAGIAYQBzAGsAYQBuACAAbwBnAG8AbgBlAGsAcwBoAHQAdABwADoALwAvAHMAYwByAGkAcAB0AHMALgBzAGkAbAAuAG8AcgBnAC8ATwBGAEwAVABoAGkAcwAgAEYAbwBuAHQAIABTAG8AZgB0AHcAYQByAGUAIABpAHMAIABsAGkAYwBlAG4AcwBlAGQAIAB1AG4AZABlAHIAIAB0AGgAZQAgAFMASQBMACAATwBwAGUAbgAgAEYAbwBuAHQAIABMAGkAYwBlAG4AcwBlACwAIABWAGUAcgBzAGkAbwBuACAAMQAuADEALgAgAFQAaABpAHMAIABsAGkAYwBlAG4AcwBlACAAaQBzACAAYQB2AGEAaQBsAGEAYgBsAGUAIAB3AGkAdABoACAAYQAgAEYAQQBRACAAYQB0ADoAIABoAHQAdABwADoALwAvAHMAYwByAGkAcAB0AHMALgBzAGkAbAAuAG8AcgBnAC8ATwBGAEwALgAgAFQAaABpAHMAIABGAG8AbgB0ACAAUwBvAGYAdAB3AGEAcgBlACAAaQBzACAAZABpAHMAdAByAGkAYgB1AHQAZQBkACAAbwBuACAAYQBuACAgGABBAFMAIABJAFMgGQAgAEIAQQBTAEkAUwAsACAAVwBJAFQASABPAFUAVAAgAFcAQQBSAFIAQQBOAFQASQBFAFMAIABPAFIAIABDAE8ATgBEAEkAVABJAE8ATgBTACAATwBGACAAQQBOAFkAIABLAEkATgBEACwAIABlAGkAdABoAGUAcgAgAGUAeABwAHIAZQBzAHMAIABvAHIAIABpAG0AcABsAGkAZQBkAC4AIABTAGUAZQAgAHQAaABlACAAUwBJAEwAIABPAHAAZQBuACAARgBvAG4AdAAgAEwAaQBjAGUAbgBzAGUAIABmAG8AcgAgAHQAaABlACAAcwBwAGUAYwBpAGYAaQBjACAAbABhAG4AZwB1AGEAZwBlACwAIABwAGUAcgBtAGkAcwBzAGkAbwBuAHMAIABhAG4AZAAgAGwAaQBtAGkAdABhAHQAaQBvAG4AcwAgAGcAbwB2AGUAcgBuAGkAbgBnACAAeQBvAHUAcgAgAHUAcwBlACAAbwBmACAAdABoAGkAcwAgAEYAbwBuAHQAIABTAG8AZgB0AHcAYQByAGUALgBoAHQAdABwADoALwAvAHcAdwB3AC4AYQBkAG8AYgBlAC4AYwBvAG0ALwB0AHkAcABlAFAAYQB1AGwAIABEAC4AIABIAHUAbgB0AEEAZABvAGIAZQAgAFMAeQBzAHQAZQBtAHMAIABJAG4AYwBvAHIAcABvAHIAYQB0AGUAZABTAG8AdQByAGMAZQAgAGkAcwAgAGEAIAB0AHIAYQBkAGUAbQBhAHIAawAgAG8AZgAgAEEAZABvAGIAZQAgAFMAeQBzAHQAZQBtAHMAIABJAG4AYwBvAHIAcABvAHIAYQB0AGUAZAAgAGkAbgAgAHQAaABlACAAVQBuAGkAdABlAGQAIABTAHQAYQB0AGUAcwAgAGEAbgBkAC8AbwByACAAbwB0AGgAZQByACAAYwBvAHUAbgB0AHIAaQBlAHMALgBTAG8AdQByAGMAZQBTAGEAbgBzAFAAcgBvAC0AUgBlAGcAdQBsAGEAcgBWAGUAcgBzAGkAbwBuACAAMgAuADAANAA1ADsAaABvAHQAYwBvAG4AdgAgADEALgAwAC4AMQAwADkAOwBtAGEAawBlAG8AdABmAGUAeABlACAAMgAuADUALgA2ADUANQA5ADYAMgAuADAANAA1ADsAQQBEAEIATwA7AFMAbwB1AHIAYwBlAFMAYQBuAHMAUAByAG8ALQBSAGUAZwB1AGwAYQByADsAQQBEAE8AQgBFAFIAZQBnAHUAbABhAHIAUwBvAHUAcgBjAGUAIABTAGEAbgBzACAAUAByAG8AqQAgADIAMAAxADAAIAAtACAAMgAwADEAOAAgAEEAZABvAGIAZQAgAFMAeQBzAHQAZQBtAHMAIABJAG4AYwBvAHIAcABvAHIAYQB0AGUAZAAgACgAaAB0AHQAcAA6AC8ALwB3AHcAdwAuAGEAZABvAGIAZQAuAGMAbwBtAC8AKQAsACAAdwBpAHQAaAAgAFIAZQBzAGUAcgB2AGUAZAAgAEYAbwBuAHQAIABOAGEAbQBlACAgGABTAG8AdQByAGMAZSAZAC4AAAAsACwATwCEALMA0ADlAPgBKgFBAU0BaQGDAZIBwwHlAhQCNQJ2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UBlQIlArUDRQPVBGUE9QWFBhUGpQc1B8UIVQjlCXUKBQvFDYUOZRBlEmUUZRZlGfUdhR4FIEUgxSFFJGUk5SllLVUvdTA1MtU1dTX1NnU29Td1N/U4dTj1O4U+5T9lQPVDFUR1RjVIdUsFTRVQJVOVVhVWlVcVWoVbRV5VXtVfVV/VYpVjFWcFadVr9Wy1bXVuNW+lcjV1ZXgVeTV6tX+Vg8WGxYmVi2WOlY8VkWWUlZcFmRWZlZpVmxWblZxVnNWdlZ5VntWflaBVoNWlBaglqRWrpawlr+Wz1bZFtwW5ZbvVv0XAhcEFwiXCpcMlxDXEtcpVytXMVc5Fz6XRZdNl1bXXldqV3cXgNeC14TXlBeXF6MXpRenF6kXtBe2F8TXzlfQV9NX1lfZV98X6Jfql/VX+Zf/GA+YIBgq2DTYO1hHGE7YWFhkmG3Yb9hy2HTYd9h52HzYftiB2ITYhtiJ2IzYoFi62NPY3Rji2O1Y/NkF2RKZIlkomT3ZTZla2WgZcZl2WYDZgtmE2YbZiNmPGZEZkxmgWazZthm72cZZ1dneWesZ7RnzmfWaBJoGmgtaFdoX2hnaG9od2iRaJlooWjGaN1pBWlDaWdpmmnZafJqRWqEappquWrFatFq4WsBayJrWmuSa6JrrmvNa+tr92wDbAxsGGwpbDpsRmxSbF5samx2bIJsj2ybbKNsrGzCbM5s12zybQxtJm03bUhthG3Abc9t3G3rbf9uHW42blxuvW7abuZu8m7+bwpvFm9Qb15vbG97b4pvoW+4b8dv1m/lb/RwT3CecOtxF3FscbJx6XJXcsNy8nL6cx1zUXN9c5pzrnPAc+50AnQOdCp0QnRQdHp0m3THdOh1InVGdYN1lHW4ddR2DnY6dld2bXZ5doV2kXaddql2tXbBds122XbldvF2/XcJdxV3IXcxdz13SXdVd2F3cXerd+Z38ngYeCR4MHhreHd4g3iPeJt4p3izeL94y3jXeON473j3eQN5D3kbeSd5M3k/eUt5V3ljeW95e3mHeZN5n3mrebt56Xn1egF6I3ovejt6R3pTel96a3p3eoN6j3rRet166Xr1ewF7I3svezt7R3tTe197a3t3e4N7j3ube6d7y3vXe+N773v7fAd8E3wqfDZ8QnxOfF58anyDfI98m3ynfLN8v3zLfNd843zvfPt9B30TfR99K303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AeYAWgHmAFoB5gBaAeb//wHmAFoB6f/6AtcAWgLXAFoC1wBaAocAWgKHAFoChwBaAocAWgKHAFoChwBaAocAWgKHAFoCmAA0ApgANAKYADQCmAA0ApgANAKYADQCmAA0ApgANAKYADQCmAA0ApgANAKYADQCmAA0ApgANAKYADQCmAA0ApgANAKYADIDTwA0ApgANwKYADcCmAA3ApgANwKYADcCmAA3ApgANAKYADQCNgBaAjkAWgI5AFoCOQBaAjkAWgI5AFoCOQBaAjkAWgIWACoCFgAqAhYAKgIWACoCFgAqAhYAKgIWACoCmwBbAhgAHAIYABwCGAAcAhgAHAIYABwCGAAcAhgAHAIYABwChQBXAoUAVwKFAFcChQBXAoUAVwKFAFcChQBXAoUAVwKFAFcChQBXAoUAVwKFAFcChQBXAoUAVwKFAFcChQBXApMAVwKTAFcCkwBXApMAVwKTAFcCkwBXAoUAVwKFAFcDEgAXAxIAFwMSABcDEgAXAdz//wHc//8B3P//Adz//wHc//8B3P//Adz//wHc//8CGwAtAhsALQIbAC0CGwAtAhsALQJ+ACECRwBaApIAOgJ7AFoCDgBaAfgANAH4ADQB+AA0AfgANAH4ADQB+AA0AfgANAH4ADQB+AA0AfgANAH4ADQB+AA0AfgAFAH4ADQB+AA0AfgANAH4ADQB+AA0AfgANAH4ADQB+AA0AfgANAH4ADQB+AA0AxEAOgMRADoDEQA6AiAACAIpAFICKQBSAcgALgHIAC4ByAAuAcgALgHIAC4CPQAvAisALwIrAC8CKwAvAisALwHwAC4B8AAuAfAALgHwAC4B8AAuAfAALgHwAC4B8AAuAfAALgHwAC4B8AAuAfAALgHwABEB8AAuAfAALgHwAC4B8AAuAfAALgHwAC4B8AAuASQAHgH4AC0B+AAtAfgALQH4AC0B+AAtAfgALQH4AC0B+AAtAiAAUgIgAFICIABSAiAAUgIgAAgA9v/tAPYARAD2/+EA9v/PAPb/6gD2//cA9v/hAPYAOAD2AEQA9gAmAPYAJgD2/+AA9gBSAPf/2AHvAFIB7wBSAe8AUgHvAFIA/wBHAQkAUgFqAFIA/wAyAP8AUgD///cA/wAMARf/9wM9AFIDPQBSAz0AUgIjAFICIwBSAiMAUgIjAFICIwBSAiMAUgIjAFICIwBSAwEAPwIeAC4CHgAuAh4ALgIeAC4CHgAuAh4ALgIeAC4CHgAuAh4ALgIeAC4CHgAuAh4AGAIeAC4CHgAuAh4ALgIeAC4CHgAuAh4ALgNHAC4CHgAuAh4ALgIeAC4CHgAuAh4ALgIeAC4CHgAuAh4ALgIrAFIBWwBSAVsAGgFbAEMBWwBSAVsAQgFbAEIBW//0AaMAHAGjABwBowAcAaMAHAGjABwBowAcAaMAHAJAAFIBUgAYAVIAGAFSABgBUgAYAVIAGAFSABgBUgACAVIAGAIgAEsCIABLAiAASwIgAEsCIABLAiAASwIgAEsCIABLAiAASwIgAEsCIABLAiAASwIgAEsCIABLAiAASwIgAEsCIABLAiAASwIgAEsCIABLAiAASwIgAEsCIABLAiAASwIgAEsCzgAYAs4AGALOABgCzgAYAdMADAHTAAwB0wAMAdMADAHTAAwB0wAMAdMADAHTAAwBqQAfAakAHwGpAB8BqQAfAakAHwIhADUCKwBSAiMAUgD3/9gB7QBFAgAASwIwACcCKwBSAjUAUgHLAC4B0gAJAisALwIrAC8B8AAlAjAALwH8AFIDTQAvAfAAJQKcACUBuAAyAcgAJQIiAC4BHf/rAisALwIrAC8B8QAuAdMADAIjAEsCIABSAiAAUgIyAFIBHQAJAVUALgD/AFIBVv/mAWD/8wFP//0A/wBSAjkAUgGbAFIDPQBNAz0ATQM9AFICI//sAiMAUgIfAFIByAAZAf8AEAIeAC4CuwAuAsEAMwKoAC4BW//9AVv//QFb//0BWwBSAUwAUQHvAFIB7wBSAaMAHAD3/9gBHf/rAVIAGAIoABgCTQAJAiIAKAISAEsB0wAMAs4AGAHTAAwBn///AakAHwHJAB8BqQADAf8AEAGh//4BoQAUAasACAGrABQBgQAdAPgAQAINADsCQQAeAzcAHgNAAB4CUgAeA28AHgFXAC4BVwAlAVcALgFXABgBV//7AVcAFAFXACYBVwAuAVcAGAFXAC4BVwAuAVcAGgFXAC4BVwAuAocAWgIrAC8CKwAvAisALwIrAC8CKwAvAisALwIrAC8CKwAvAisALwIrAC8CKwAvAisALwIrAC8CKwAeAisALwIrAC8CKwAvAisALwIrAC8CKwAvAisALwIrAC8CKwAvAisALwIrAC8CKwAvAisALwIrAC8CKwAvAisALwIrAC8CKwAvAisALwIrAC8A9gBSAPYAQwEJAFIBagBSAPYAHAD2AEQA9v/2APb/9gEOAAACLAAeAPYAJgEdAAkBVv/mAiAAAwJMAFoB8gBaAkwAHgIPAFoCGwAtAowAWgKYADQBBwBaAkMAWgIDAAAC1wBaAocAWgIVADECmAA0AoUAWgI2AFoCGgAsAhgAHAHc//8CzwAwAgEADwK7AD8CpgAtAjYABgJP/+0CzP/tAUf/7QEH/+wCx//tAlj/7QHc//8C0//pAjAALgI1AE8B5AAGAhMANAHAAC4BqAAwAh0ASwIKADsBBgBSAe4ASQHuABACMgBSAdoABgGvABwCFwAuAkoAFgIlAE4CIgAuAcwAGgH+ADwCqAAuAeEACQKxAD0CvQAzAbAALgIwAE4CCgBCAqgALgIwAC4BwAAuAh0ASwEGAFIBBv/qAhcALgH+ADwB/gA8Ar0AMwEG/+EB/gA8AkT/+gI9//MCNgADAjYABgLK//QCxv/zAsX/9ALB//MCZf/oAmX/6AIgAAMCIAADAoX/9AKF//MCT//qAk//7QL8//QC+f/zAvj/9AL0//MDAv/0AwL/8wLM/+oCzP/tA3n/9AN1//MDdf/0A3H/8wNI/+gDSP/oAX3/9AF9//MBR//qAUf/7QH0//QB8f/zAfD/9AHs//MBw//oAcP/6AEH//IBB//+Avn/9ALr//MCzf/qAsf/7QN0//QDdv/zA3D/9ANs//MCrP/zAoX/8wJY/+oCWP/tAwH/8wL9//MCzv/oAdz//wHc//8DBf/0Avf/8wLW/+sC0//pA4T/9AOA//MDf//0A3v/8wMx/+gDMf/oAyIAAwNH//oDQP/zA8z/9API//MDyP/0A8T/8wNo/+gDaP/oA44AWgQE//QEBP/zBHz/9AR4//MEd//0BHT/8wRK/+gESv/oA6cALQQH//QD+v/zBIb/9ASD//MEgv/0BH7/8wQ2/+gENv/oAjAALgIwAC4CMAAuAjAALgIwAC4CMAAuAjAALgIwAC4CMAAuAjAALgIwAC4CMAAuAjAALgHAAC4BwAAuAcAALgHAAC4BwAAuAcAALgHAAC4BwAAuAh0ASwIdAEsCHQBLAh0ASwIdAEsCHQBLAh0ASwIdAEsCHQBLAh0ASwIdAEsBBgA4AQYALAEG/+0BBgBEAQb/4AEG/9oBBv/gAQb/5AEG/+8BBv/vAQb/4AEG//cBBv/PAQb/4QEG/+EBBv/jAhcALgIXAC4CFwAuAhcALgIXAC4CFwAuAhcALgIXAC4CJQBOAiUATgH+ADwB/gA8Af4APAH+ADwB/gA8Af4APAH+ADwB/gA8Af4APAH+ADwB/gA8Af4APAH+ADwB/gA8Af4APAH+ADwCvQAzAr0AMwK9ADMCvQAzAr0AMwK9ADMCvQAzAr0AMwK9ADMCvQAzAr0AMwIwAC4CMAAuAjAALgIwAC4CMAAuAjAALgIwAC4CMAAuAjAALgIwAC4CMAAuAjAALgIdAEsCHQBLAh0ASwIdAEsCHQBLAh0ASwIdAEsCHQBLAh0ASwIdAEsCHQBLAh0ASwK9ADMCvQAzAr0AMwK9ADMCvQAzAr0AMwK9ADMCvQAzAr0AMwK9ADMCvQAzAr0AMwHuAEkCFwAuAdIALgGdAFIB8gARAPkALwD5AEEA+QBBAPkAUgD5AEACHgDuAED/7QIeAHoCHgD0AQYAUgIeAMsCHgDLAh4AvwIeALQCHgDuAh4AcwIeAG0CHgBzAh4AdwIeAIICHgCCAh4AYgIeAHQCHgB0Ah4AdgB3//QAdf/zAED/6gDt//QA6v/zAO3/9ADm//MAvP/oALz/6AIgAAMCRABaAkwAWgHyAFoCfgAaAg8AWgMlAAYCKgAqApAAWgKQAFoCRABaAnYAAALXAFoCjABaApgANAKFAFoCNgBaAjsANAIYABwCAgAFAtwALwIBAA8CggBaAlYAQwNhAFoDagBaAtAAHAMeAFoCRABaAjsAIAOMAFoCRgAWAg8AWgIPAFoCrwAcAfIAWgI7ADQCFgAqAQcAWgEH/+wBBwASAeAAHwOHAAYDoQBaArgAHAJEAFoCkABaAgIABQKFAFoCZgAcApgANAIRAAAB8gBaAgkAIQNPAAYCKgAqAnQAWgLMABwClQBaAjsANAHc//8B3P//AicADwJfAEMCVgBaAQcAWgMlAAYCIAADAzYACAIPAFoCkgA6ApAAWgKYADQCmAA0AgIABQICAAUB+AA0AiAANQH8AFIBmwBSAhQAEwHwAC4CqQANAcgAJQI1AFICNQBSAfIAUgITAAoCeQBSAjIAUgIeAC4CKQBSAisAUgHIAC4BzAAaAdMADALeAC8BvgAOAioAUgIAADsC7QBSAvUAUgJUABoCogBSAesAUgHIABgC4gBSAgIAIAHwAC4B8AAuAiQACAGbAFIByAAuAaMAHAD2AEUA9v/qAQEAEQD3/9gC3wAMAvYAUgIgAAgB8gBSAjUAUgHTAAwCLgBSAkAAGgIeAC4B3QAMAaAAUgGuABwCzgANAcgAJQIYAFICZgAaAjoAUwHIAC4B0wAMAdMADAHiAA4CCAA7AiAAUgKpAA0A/wBSAfgANAMRADoB8AAuAfAAJQI1AFICHgAuAh4ALgHTAAwB0wAMAg4ALwN9ADsCYQAgAfEALAHxAE8B8QAkAfEAGgHxABEB8QAZAfEAMAHxACwB8QApAfEAKAHxACwB8QAsAhoANwFxADIB9QAlAfEAGgIHACIB8QAZAg0APQHrACwCDQA3Ag0ANAIaADcCGgA3AfEALAHxAE8B8QAkAfEAGgHxABEB8QAZAfEAMQHxACwB8QApAfEAHgIGADQBcQAyAfEAKQHxABoCBgAZAfEAGQIGADkB6QAsAgcAMQIGACYB8QAsAfEATwHxACQB8QAaAfEAEQHxABkB8QAxAfEALAHxACkB8QAoAPkAQQD5AC8A+QBBAPkALwO0AF4BIQBVASEAVQGpACYBqQAwAPkAUAGqAFAA+QA5APkAPwGqADkBqgA/APkAPwGqAD8BDwAtAQ8ANgGtAC0BrQA2ATcAKQHgACkDIAApBdwAKQiYACkB8QApAyAAKQD5AEEBMAAoAfQADAH0AAwCMwAAAS8AUgEvACYBLwBeAS8AHwEvACIBLwAfAV4ACgDxAFwBXgAOAPEAXAGiADoBxgA2AcYANgHxAC0CMAApAYcAXAIlAFUDLwAmAqcAVQKnACYBsAAbAS8AXgEvAB8BLwBeAS8AHwF6AF4BegAfAS8AXgEvAB8BLwBeAS8AHwLoADEC5wAxAacAFwJ9AAMCfQAbAn0AHAKNABwDTwAzAw4AMwHxACMA9gBFAdYAAwIOAFoB9wA0AisAWgHbAFoBuwBaAiUANAJSAFoBBwBaAbYAHwICAFoBtQBaAocAWgJJAFoCTQA0AgYAWgJNADMCCwBaAdoAKgHTABwCRwBXAb8AAAKsABcBxQAPAZ///wHbAC0B1gADAdYAAwHWAAMB1gADAdYAAwHWAAMB1gADAdYAAwHWAAMB1gADAdYAAwHWAAMB1gADAdYAAwHWAAMB1gADAdYAAwHWAAMB1gADAdYAAwHWAAMB1gADAdYAAwHWAAMCyAAIAsgACALIAAgCIQAhAg4AWgIOAFoB9wA0AfcANAH3ADQB9wA0AfcANAIrAFoCKwBaAisAWgIrAFoCPgAhAdsAWgHbAFoB2wBaAdsAWgHbAFoB2wBaAdsAWgHbAFoB2wBaAdsAWgHbAFcB2wBaAdsANQHbAFoB2wBaAdsAWgHbAFoB2wBaAdsAWgHbAFoBuwBaAiUANAIlADQCJQA0AiUANAIlADQCJQA0AiUANAIlADQCJQA0AlIAWgJSAFoCUgBaAlIAWgJ2ACABB//8AQcATQEH/+8BB//SAQf/6wEH//0BBwBKAQf/7wEHAD8BBwBMAQcAKwEHACsBB//xAbYAHwICAFoCAgBaAgIAWgG1AFMBtQBaAbUAWgG1AFoBtQBaAbUAAwG1AFoBtf/6AocAWgKHAFoChwBaAkkAWgJJAFoCSQBaAkkAWgJJAFoCSQBaAkkAWgJJAFoCTQA0Ak0ANAJNADQCTQA0Ak0ANAJNADQCTQA0Ak0ANAJNADQCTQA0Ak0ANAJNADQCTQA0Ak0ANAJNADQCTQAvAt8ANAJNADQCTQA0Ak0ANAJNADQCTQA0Ak0ANAJNADQCTQA0Ak0ANAJNADQCBgBaAgsAWgILAFoCCwBaAgsAWgILAFoCCwBaAgsAWgHaACoB2gAqAdoAKgHaACoB2gAqAdoAKgHaACoDqgAqAlIAWwHTABwB0wAcAdMAHAHTABwB0wAcAdMAHAHTABwB0wAcAkcAVwJHAFcCRwBXAkcAVwJHAFcCRwBXAkcAVwJHAFcCRwBXAkcAVwJHAFcCRwBXAkcAVwJHAFcCRwBXAkcAVwJVAFcCVQBXAlUAVwJVAFcCVQBXAlUAVwJHAFcCRwBXAqwAFwKsABcCrAAXAqwAFwGf//8Bn///AZ///wGf//8Bn///AZ///wGf//8Bn///AdsALQHbAC0B2wAtAdsALQHbAC0CPgAhAg0AWgJGADoCOABaAg4AWgJJAFoB1gADAg4AWgHAAFoCAgAeAdsAWgHbAC0CUgBaAk0ANAEHAFoCAgBaAb0AAAKHAFoCSQBaAdcAMQJNADQCTABaAgYAWgHXACwB0wAcAZ///wKPADABxQAPAnEAPwJQACwBB//rAZ///wLdAAMDWQBaA1cALAHWAAMCBwBaAg4AWgHAAFoCMgAaAdsAWgK5AAYB5gArAkkAWgJJAFoCBwBaAi4AAAKHAFoCUgBaAk0ANAJMAFoCBgBaAfcANAHTABwBvQAFAoAALwHFAA8CQwBaAh0AQwMEAFoDCwBaAm4AHALQAFoCCABaAfYAIAMhAFoCCgAWAdsAWgHbAFoCVQAcAcAAWgH1ADQB2gAqAQcAWgEH/+sBBwASAbYAHwL9AAADKABaAmMAHAIHAFoCSQBaAb0ABQJFAFoCHgAcAk0ANAHIAAABwABaAdYAIQLnAAYB5gArAjcAWgJ9ABwCWQBaAfcANAGf//8Bn///AesADwIjAEMCHQBaAQcAWgK5AAYB1gADAsgACAHbAFoCRgA6AkkAWgJNADQCTQA0Ab0ABQG9AAUCFgAgAfkANwFmADIBxQAiAcsAFwHhACQB0QAfAegAPgGvACEB6QA2AeMAMQEhAFUBIQBVAakAMAGpADoA+QBQAaoAUAD5ADkA+QA/AYwAOQGMAD8BNwApAZ4AKQKvACkBLwBSAS8AJgEvAF4BLwAfAS8AIgEvAB8BbwAjAW8AVwFvACgBbwAjAW8AKgFvACMBbwAtAW8AMgFvAC0BbwAnAW8AHgFvAB4BbwAeAO0AQQDtACcAsQArALEAIQFvACMBbwBXAW8AKAFvACMBbwAqAW8AIwFvAC0BbwAyAW8ALQFvACcBbwAeAW8AHgFvAB4A7QBBAO0AJwCxACsAsQAhAW8AIwFvAFcBbwAoAW8AIwFvACoBbwAjAW8ALQFvADIBbwAtAW8AJwDtAEEA7QAnALEAKwCxACEBbwAjAW8AVwFvACgBbwAjAW8AKgFvACMBbwAtAW8AMgFvAC0BbwAnAO0AQQDtACcAsQArALEAIQFZACUBdgAhAW0AHgFr//8BiAA5AXsAIAGbADkBXwA5AUoAOQGbACABsgA5ALAAOQFBABIBgwA5AUUAOQHmADkBrwA5AbsAIAGBADkBuwAfAYUAOQFkABoBZAARAa8AOAFa//4CDgANAVoACAFA//0BZgAbAVkAJQF2ADQBMgAeAXYAIQFQABwAyQATAVcAHgFuADQApgAqAKn/5gFRADQArgA0Ai8ANAFxADQBbQAeAXYANAF2ACEA8AA0ARsAEwDoABABcgAyAUEACAHnABABMwAIAT8ACAEiABUBLgAWAMcAGQDHABkArP+cAT4ACAFQABwBUAAc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AAACeQAAA6oAAAOqAAAChAAAA6sAAAOrAAAChwAAA6wAAAOvAAACpQAAA7AAAAOwAAACrwAAA7EAAAPBAAACiQAAA8IAAAPCAAACoQAAA8MAAAPJAAACmgAAA8oAAAPKAAACqQAAA8sAAAPLAAACrAAAA8wAAAPNAAACqgAAA84AAAPOAAACrQAAA9AAAAPRAAACogAAA9UAAAPVAAACnQAAA9cAAAPXAAADiQAAA9kAAAPZAAADigAAA9sAAAPbAAADiwAAA90AAAPdAAADjAAAA+EAAAPhAAADjQAABAAAAAQHAAAD0AAABAgAAAQPAAAD2QAABBAAAAQvAAADsAAABDAAAARXAAAD/AAABFgAAARfAAAEJQAABGIAAARiAAAD4QAABGMAAARjAAAELQAABHIAAARyAAAD4gAABHMAAARzAAAELgAABHQAAAR0AAAD4wAABHUAAAR1AAAELwAABJAAAASQAAAD5AAABJEAAASRAAAEMAAABJIAAASSAAAD5QAABJMAAASTAAAEMQAABJYAAASWAAAD5gAABJcAAASXAAAEMgAABJgAAASYAAAD5wAABJkAAASZAAAEMwAABJoAAASaAAAD6AAABJsAAASbAAAENAAABKAAAASgAAAD6QAABKEAAAShAAAENQAABKIAAASiAAAD6gAABKMAAASjAAAENgAABKoAAASqAAAD6wAABKsAAASrAAAENwAABK4AAASuAAAD7AAABK8AAASvAAAEOAAABLAAAASwAAAD7QAABLEAAASxAAAEOQAABLIAAASyAAAD7gAABLMAAASzAAAEOgAABLYAAAS2AAAD7wAABLcAAAS3AAAEOwAABLoAAAS6AAAD8AAABLsAAAS7AAAEPAAABMAAAATBAAAD8QAABMIAAATCAAAEPQAABM8AAATPAAAEPgAABNAAAATQAAAD8wAABNEAAATRAAAEPwAABNQAAATUAAAD9AAABNUAAATVAAAEQAAABNYAAATWAAAD9QAABNcAAATXAAAEQQAABNgAAATYAAAD9gAABNkAAATZAAAEQgAABOIAAATiAAAD9wAABOMAAATjAAAEQwAABOYAAATmAAAD+AAABOcAAATnAAAERAAABOgAAAToAAAD+QAABOkAAATpAAAERQAABO4AAATuAAAD+gAABO8AAATvAAAERgAABPIAAATy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AAsADAANAA4ADwAQABEAEgATABQAFQAWABcAGAAZABoAGwSkBKoEpQb+BJ8HJgAcAB0AHgAfACAAIQAiACMAJAAlACYAJwAoACkAKgArACwALQAuAC8AMAAxADIAMwA0ADUEpgSpBKcHAAABBIcGygbGBsQGxwSrBK8HMATBBn0ElAcCBJYEwwcxBsMG/QZBBkIHJwKUBLAEnQc2BkAGfwSVBuAG4QbiBIkANgA3ADgAOQA6AD0ATgBUAF4AXwBgAGIAgQCCAIMAhQEBAKAApQCmAKcAqACpBvUAtgDYANkA2gDcAPUBAgGgAQYBBwEIAQkBCgENAR4BJAEuAS8BMAEyAVABUQFSAVQB0wFwAXYBdwF4AXkBegb2AYcBqQGqAasBrQHHAdQByQA7AQsAPAEMAEsBGwBVASUAVgEmAFgBKABXAScAWQEpAF0BLQBjATMAZAE0AGUBNQBuAT4AYQExAHQBRAB1AUUAdgFGAHcBRwB8AUsAgAFPAIQBUwCGAVUAjQFbAIsBWQCHAVwBBQHXAI4BXQCPAV4BYQCSAWIAlAFlAJMBYwCVAWQAmQFpAJ0BbQChAXEAnwFvAXUBBAHVAKoBewC0AYUAqwF8ALcBiADBAZIAxAGTAMIBlADIAZkAyQGaAMsBnADKAZsA0gGjANABoQDXAagA2wGsAN0BrgDeAa8A3wGwAOABsQDuAb8A8gHEAPYByAD3APwBzgD+AdAA/QHPBssAewC4AYkA6AG5AD4BDgCIAVYArAF9AOEBsgDiAbMA4wG0AOQBtQDlAbYAUAEgAHgBSAC+AY8AcwFDAJ4BbgBPAR8AzAGdANMBpAHYAeEB2QHaAgEB3AHeAd8B4AHkAeUB5gHnAegB6QHqAesB7AHtAgIB7gHvAfAB8gH0AfMB9gH3AfgB+QH7AfwB/QH+Af8CAAIDAgQCBQIGAgcCCAIJAhECEwIUAhUCFgIXAhgCGQIaAhsCHAIkAeIB8QH1BqMGqwawBrIHIwcyBzUHMwc3By8HNAa3BrgGpQasBrEHOQc8Bz8HQQdDB0UHRwdLB00HTwdRB1MHVQdZB1sHXQdoB2kHagdrB2wHbgdwB3EHfQd/B4AHgQOTA5UCgAOPAoECggKDAoYCiAKuAmgCaQJqAmsCbAJtAm4CbwJwAnECcgJzAnQCdQJ2AncCeAJ5AnoCewJ8An0CfgJ/AoQChwKlAqYCpwKoAq8CiQKKAosCjAKNAo4CjwKQApECkgKTApQClQKWApcCmAKZAqECmgKbApwCnQKeAp8CoAKpAqwCqgKrAq0D0APRA9ID0wPUA9UD1gPXA9kD2gPbA9wD3QPeA98D4AOwA7EDsgOzA7QDtQO2A7cDuAO5A7oDuwO8A70DvgO/A8ADwQPCA8MDxAPFA8YDxwPIA8kDygPLA8wDzQPOA88D/AP9A/4D/wQABAEEAgQDBAQEBQQGBAcECAQJBAoECwQMBA0EDgQPBBAEEQQSBBMEFAQVBBYEFwQYBBkEGgQbBBwEHQQeBB8EIAQhBCIEIwQlBCYEJwQoBCkEKgQrBCwD4QQtA+IELgPjBC8D5AQwA+UEMQPmBDID5wQzA+gENAPpBDUD6gQ2A+sENwPsBDgD7QQ5A+4EOgPvBDsD8AQ8A/ED8gQ9BD4D8wQ/A/QEQAP1BEED9gRCA/cEQwP4BEQD+QRFA/oERgP7BEcGmwadBp4GpAamBqkGrQauAFIBIgBTASMAWgEqAFsBKwBcASwAcQFBAHIBQgB5AUkAfQFMAH4BTgCQAV8AkQFgAJYBZgCXAWcAmAFoAJoBagCbAWsAnAFsAKIBcgCjAXMApAF0ALUBhgDAAZEAwwGVAMUBlgDGAZcAxwGYAM0BngDOAZ8A0QGiANQBpQDVAaYA8AHCAPEBwwDzAcUA+AHKAP8B0QEAAdIBTQGnAD8BDwBAARAAQQERAEIBEgBDARMARAEUAEUBFQBGARYARwEXAEgBGABJARkASgEaAGYBNgBnATcAaAE4AGkBOQBqAToAawE7AGwBPABtAT0AiQFXAIoBWACtAX4ArgF/AK8BgACwAYEAsQGCALIBgwCzAYQAuQGKALoBiwC7AYwAvAGNAL0BjgDmAbcA5wG4AOkBugDqAbsA6wG8AOwBvQDtAb4A9AHGAPkBywD6AcwA+wHNAxADEQMUAxUDFgMXAxgDGQKwArECtAK1ArYCtwK4ArkDHQMeAyEDIgMjAyQCvAK9AsACwQLCAsMDJQMmAykDKgMrAywDLQMuAsQCxQLIAskCygLLAswCzQMwAzEDNAM1AzYDNwM4AzkCzgLPAtIC0wLUAtUC1gLXA0ADQQNEA0UDRgNHAtoC2wLeAt8C4ALhA0oDSwNOA08DUANRA1IDUwLoA1oDWwNeA18DYANhA2IDYwLrAuwC7wLwAvEC8gLzAvQDEgMTAx8DIAMnAygDMgMzA0IDQwNMA00DXANdA2YDZwNqA2sDbANtA24DbwL2AvcC+AL5AvoC+wL8Av0DcgNzA3YDdwN4A3kDegN7Av8DAAMBAwIDAwMEAwUDBgN+A38DggODA4QDhQOGA4cDCAMJAwoDCwMMAw0DDgMPAxoDGwNoA2UDaQMcA3ACugK7ArICswL1A5gDlwOZA6MDpgN0A3EDdQMvA3wCvgK/AsYCxwL+A50DnwOhAzoDOwM9Az4DPAM/AtgC2QLQAtEDngOgA6IDVQNWA1cDWANIA0kDVANZAukC6gLkAuUC4gOkA6UDmwOAA30DgQNkA4gC3ALdAu0C7gMHA5wDmgSWBJYEmwSXBJgEnASxBIwEjQSQBI4EjwSRBK0ErgSeB7AG3wSyBLYEoAShBLMEtQS0Bj8GogZDBkQGRQZGBkcGSAZJBkoGSwZMBk0GpwZQBlEGUgZTBlQGVQZWBlcGWAZZBloGWwZcBl0GXgbRBskG2QbWBtcESQTCBusG8AbxBuMG5AblBuYG5wboBukG6gbsBu0G7gbvBwcG9Ab3BwYHEQcfAiUHsgezAiYCJwABAAAACgMCCyoABERGTFQCvmN5cmwCRGdyZWsCCGxhdG4AGgG2AAdBVEggAX5BWkUgAUZDUlQgAQ5OQVYgANZOU00gAJ5TS1MgAGZUUksgAC4AAP//ABkACwAXACMALwA7AEcAUwBeAGoAdgCCAI4AmgCmALIAvgDKANYA4gDuAPoBBgESAR4BKgAA//8AGQAKABYAIgAuADoARgBSAF0AaQB1AIEAjQCZAKUAsQC9AMkA1QDhAO0A+QEFAREBHQEpAAD//wAZAAkAFQAhAC0AOQBFAFEAXABoAHQAgACMAJgApACwALwAyADUAOAA7AD4AQQBEAEcASgAAP//ABkACAAUACAALAA4AEQAUABbAGcAcwB/AIsAlwCjAK8AuwDHANMA3wDrAPcBAwEPARsBJwAA//8AGQAHABMAHwArADcAQwBPAFoAZgByAH4AigCWAKIArgC6AMYA0gDeAOoA9gECAQ4BGgEmAAD//wAZAAYAEgAeACoANgBCAE4AWQBlAHEAfQCJAJUAoQCtALkAxQDRAN0A6QD1AQEBDQEZASUAAP//ABkABQARAB0AKQA1AEEATQBYAGQAcAB8AIgAlACgAKwAuADEANAA3ADoAPQBAAEMARgBJAAA//8AGQAEABAAHAAoADQAQABMAFcAYwBvAHsAhwCTAJ8AqwC3AMMAzwDbAOcA8wD/AQsBFwEjAAQAAAAA//8AGQADAA8AGwAnADMAPwBLAFYAYgBuAHoAhgCSAJ4AqgC2AMIAzgDaAOYA8gD+AQoBFgEiAEIAAVNSQiAACgAA//8AGQACAA4AGgAmADIAPgBKAFUAYQBtAHkAhQCRAJ0AqQC1AMEAzQDZAOUA8QD9AQkBFQEhAAD//wAZAAEADQAZACUAMQA9AEkAVABgAGwAeACEAJAAnACoALQAwADMANgA5ADwAPwBCAEUASAABAAAAAD//wAYAAAADAAYACQAMAA8AEgAXwBrAHcAgwCPAJsApwCzAL8AywDXAOMA7wD7AQcBEwEfASthYWx0CCBhYWx0CCBhYWx0CCBhYWx0CCBhYWx0CCBhYWx0CCBhYWx0CCBhYWx0CCBhYWx0CCBhYWx0CCBhYWx0CCBhYWx0CCBjMnNjCBZjMnNjCBZjMnNjCBZjMnNjCBZjMnNjCBZjMnNjCBZjMnNjCBZjMnNjCBZjMnNjCBZjMnNjCBZjMnNjCBZjMnNjCBZjYXNlCApjYXNlCApjYXNlCApjYXNlCApjYXNlCApjYXNlCApjYXNlCApjYXNlCApjYXNlCApjYXNlCApjYXNlCApjYXNlCApjY21wB/hjY21wB/hjY21wB/hjY21wB/hjY21wB/hjY21wB/hjY21wB/hjY21wB/hjY21wB/hjY21wB/hjY21wB/hjY21wB/hkbm9tB/Jkbm9tB/Jkbm9tB/Jkbm9tB/Jkbm9tB/Jkbm9tB/Jkbm9tB/Jkbm9tB/Jkbm9tB/Jkbm9tB/Jkbm9tB/Jkbm9tB/JmcmFjB+hmcmFjB+hmcmFjB+hmcmFjB+hmcmFjB+hmcmFjB+hmcmFjB+hmcmFjB+hmcmFjB+hmcmFjB+hmcmFjB+hmcmFjB+hsaWdhB+JsaWdhB+JsaWdhB+JsaWdhB+JsaWdhB+JsaWdhB+JsaWdhB+JsaWdhB+JsaWdhB+JsaWdhB+JsaWdhB+JsaWdhB+Jsb2NsB9xsb2NsB9Rsb2NsB85sb2NsB8hsb2NsB8Bsb2NsB7hsb2NsB7hsb2NsB8Bsb2NsB7Bsb2NsB7Bsb2NsB7hudW1yB6pudW1yB6pudW1yB6pudW1yB6pudW1yB6pudW1yB6pudW1yB6pudW1yB6pudW1yB6pudW1yB6pudW1yB6pudW1yB6pvbnVtB6RvbnVtB6RvbnVtB6RvbnVtB6RvbnVtB6RvbnVtB6RvbnVtB6RvbnVtB6RvbnVtB6RvbnVtB6RvbnVtB6RvbnVtB6RvcmRuB55vcmRuB55vcmRuB55vcmRuB55vcmRuB55vcmRuB55vcmRuB55vcmRuB55vcmRuB55vcmRuB55vcmRuB55vcmRuB55wbnVtB5hwbnVtB5hwbnVtB5hwbnVtB5hwbnVtB5hwbnVtB5hwbnVtB5hwbnVtB5hwbnVtB5hwbnVtB5hwbnVtB5hwbnVtB5hzYWx0B3xzYWx0B3xzYWx0B3xzYWx0B3xzYWx0B3xzYWx0B3xzYWx0B3xzYWx0B3xzYWx0B3xzYWx0B3xzYWx0B3xzYWx0B3xzaW5mB3ZzaW5mB3ZzaW5mB3ZzaW5mB3ZzaW5mB3ZzaW5mB3ZzaW5mB3ZzaW5mB3ZzaW5mB3ZzaW5mB3ZzaW5mB3ZzaW5mB3ZzbWNwB2hzbWNwB2hzbWNwB2hzbWNwB2hzbWNwB2hzbWNwB2hzbWNwB2hzbWNwB2hzbWNwB2hzbWNwB2hzbWNwB2hzbWNwB2hzczAxB1pzczAxB1pzczAxB1pzczAxB1pzczAxB1pzczAxB1pzczAxB1pzczAxB1pzczAxB1pzczAxB1pzczAxB1pzczAxB1pzczAyB05zczAyB05zczAyB05zczAyB05zczAyB05zczAyB05zczAyB05zczAyB05zczAyB05zczAyB05zczAyB05zczAyB05zczAzB0JzczAzB0JzczAzB0JzczAzB0JzczAzB0JzczAzB0JzczAzB0JzczAzB0JzczAzB0JzczAzB0JzczAzB0JzczAzB0JzczA0BzRzczA0BzRzczA0BzRzczA0BzRzczA0BzRzczA0BzRzczA0BzRzczA0BzRzczA0BzRzczA0BzRzczA0BzRzczA0BzRzczA1BypzczA1BypzczA1BypzczA1BypzczA1BypzczA1BypzczA1BypzczA1BypzczA1BypzczA1BypzczA1BypzczA1BypzczE4ByBzczE4ByBzczE4ByBzczE4ByBzczE4ByBzczE4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BOgE6QTqBOsE7ATtBO4E7wTwBPEE8gTzBPQE9QT2BPcE+AT5BPoE+wT8BP0E/gT/BQAFAQUCBQMFBAUFBQYFBwUIBQkFCgULBQwFDQUOBQ8FEAURBRIFEwUUBRUFFgUXBRgFGQUaBRsFHAUdBR4FHwUgBSEFIgUjBSQFJQUmBScFKAUpBSoFLAUtBS8FLgUwBTEFMgUzBTQFNQU2BTgFOQU6BTwFOwU9BT4FPwVABUEFQgVDBUUFRAVGBUcFSAVJBUoFSwVMBU0FTgVPBVAFUQVSBVMFVAVVBVYFVwVYBVkFWgVbBVwFXQVeBV8FYAVhBWIFYwVuBW8FZAVlBWYFZwVoBWkFagVrBWwFbQVwBXEFdAVzBXIFdQV2BXcFeAV5BXoFewV8BX0FfgV/BYEFggWDBYQFhQWGBYcFiAWJBYoFiwWMBY0FjgWPBZAFkQWSBZMFlAWVBZYFlwWYBZkFmgWbBZwFnQWeBZ8FnwWgBaEFogWjBaQFpQWmBacFqAWpBaoFqwWsBa0FrgWvBbAFsQWyBbMFtQW2BbQFKwU8BTcAAgAKABwANQAAAQYBWwAaAV0BYABwAWIBdAB0AXYB1QCHAdcB1wDnAeQB5ADoAeoB6gDpAmUCZQDqBMsEywDrAAEAAAABAAgAAgAuABQGIQYsBi0GLgYvBjAGMQYyBjMGNAY1BjYGNwY4BjkGOgY7BjwGPQY+AAIABARKBEoAAASGBI8AAQSWBJgACwSiBKcADgABAAAAAQAIAAEFQgHXAAEAAAABAAgAAgN0AbcEzATNBM4EzwTQBNEE0gTTBNQE1QTWBNcE2ATZBNoE2wTcBN0E3gTfBOAE4QTiBOME5ATlBOYE5wToBOkE6gTrBOwE7QTuBO8E8ATxBPIE8wT0BPUE9gT3BPgE+QT6BPsE/AT9BP4E/wUABQEFAgUDBQQFBQUGBQcFCAUJBQoFCwUMBQ0FDgUPBRAFEQUSBRMFFAUVBRYFFwUYBRkFGgUbBRwFHQUeBR8FIAUhBSIFIwUkBSUFJgUnBSgFKQUqBSsFLAUtBS4FLwUwBTEFMgUzBTQFNQU2BTcFOAU5BToFPAU7BT0FPgU/BUAFQQVCBUMFRAVFBUYFRwVIBUkFSgVLBUwFTQVOBU8FUAVRBVIFUwVUBVUFVgVXBVgFWQVaBVsFXAVdBV4FXwVgBWEFYgVjBW4FbwVkBWUFZgVnBWgFaQVqBWsFbAVtBXAFcQVzBXIFdAV1BXYFdwV4BXkFegV7BXwFfQV+BYAFgQWCBYMFhAWFBYYFhwWIBYkFigWLBYwFjQWOBY8FkAWRBZIFkwWUBZUFlgWXBZgFmQWaBZsFnAWdBZ4FnwWgBaEFogWjBaQFpQWmBacFqAWpBaoFqwWsBa0FrgWvBbAFsQWyBbMFtAW1BbYFtwW4BbkFugW7BbwFvQW+Bb8FwAXBBcIFwwXEBcUFxgXHBcgFyQXKBcsFzAXNBc4FzwW4BbwFvgXABdAFxgXLBdEFzwW4BbgFuAW4BbgFuAW4BbgFuAW4BbgFuAW8BbwFvAW8BbwFvAW8BbwFvgW+Bb4FvgW+Bb4FvgW+Bb4FvgXABcAFwAXABcAFwAXABcAFwAXABcAFwAXGBcYFxgXGBcYFxgXGBcYFyAXLBcsFywXLBcsFywXLBcsFzwXPBc8FzwXPBc8FzwXPBc8FzwXSBdIF0gXSBdIF0gXSBdIF0gXTBdMF0wXTBdMF0wXTBdMF0wXUBdQF1AXUBdQF1AXUBdQF1AXVBdYF1wXYBdkF2gXbBdwF3QXeBd8F4AXhBeIF4wXkBeUF5gXnBegF6QXqBesF7AXtBe4F7wXwBfEF8gXzBfQF9QX2BfcF+AX5BfoF+wX8Bf4F/wYABgEGAgYDBgQGBQYGBgcGCAYJBgoGCwYMBg0GDgYPBhAGEQYSBhMGFAYVBhYGFwYYBhkGGgYbBhwGHQYeBh8GIAACAAcAAgAbAAAANgEFABoCOAI4AOoCaAKIAOsCsAMPAQwDsAPXAWwD2QP7AZQAAQAAAAEACAACAPgAeQW4BbgFuAW4BbgFuAW4BbgFuAW4BbgFuAW4BbwFvAW8BbwFvAW8BbwFvAW+Bb4FvgW+Bb4FvgW+Bb4FvgW+Bb4FwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXQBdAF0AXGBcYFxgXGBcYFxgXGBcYFyAXIBcsFywXLBcsFywXLBcsFywXLBcsFywXLBcsF0QXRBdEFzwXPBc8FzwXPBc8FzwXPBc8FzwXPBdIF0gXSBdIF0gXSBdIF0gXSBdIF0gXSBdMF0wXTBdMF0wXTBdMF0wXTBdMF0wXTBdQF1AXUBdQF1AXUBdQF1AXUBdQF1AXUAAIAAQMQA4gAAAABAAAAAQAIAAIATgAkBbgFuQW6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AFoAVABOAEgAQgA8ADYAMAMtAAIHpAMpAAIHowMrAAIHogMuAAIHoQMqAAIHoAMsAAIHnwNxAAIHgQMvAAIHfQMlAAIHXgMmAAIHXAMoAAIHPAMnAAIHOQN6AAMHgQekA3YAAweBB6MDeAADB4EHogN7AAMHgQehA3cAAweBB6ADeQADB4EHnwN8AAMHgQd9A3IAAweBB14DcwADB4EHXAN1AAMHgQc8A3QAAweBBzkACAA8ADYAMAAqACQAHgAYABIDIQACB6MDIwACB6IDIgACB6ADJAACB58DHQACB14DHgACB1wDIAACBzwDHwACBzkAGQDYANAAyADAALgAsACoAKAAmACQAIgAggB8AHYAcABqAGQAXgBYAFIATABGAEAAOgA0AxgAAgekAxQAAgejAxYAAgeiAxkAAgehAxUAAgegAxcAAgefA2UAAgeBAxwAAgd9AxAAAgdeAxEAAgdcAxoAAgdHAxsAAgdDAxMAAgc8AxIAAgc5A24AAweBB6QDagADB4EHowNsAAMHgQeiA28AAweBB6EDawADB4EHoANtAAMHgQefA3AAAweBB30DZgADB4EHXgNnAAMHgQdcA2kAAweBBzwDaAADB4EHOQAcAPoA8gDqAOIA2gDSAMoAwgC6ALIAqgCiAJoAkgCKAIIAfAB2AHAAagBkAF4AWABSAEwARgBAADoC8wACB6QC7wACB6MC9AACB6EC8AACB6AC8gACB58DBwACB4EC7AACB1wC7gACBzwC7QACBzkC8QACA58C6wACA5kDBwACA5cDDgADB4EHpAMKAAMHgQejAwwAAweBB6IDDwADB4EHoQMLAAMHgQegAw0AAweBB58DCAADB4EHXgMJAAMHgQdcAw4AAwOXB6QDCgADA5cHowMMAAMDlweiAw8AAwOXB6EDCwADA5cHoAMNAAMDlwefAwgAAwOXB14DCQADA5cHXAAJAEQAPgA4ADIALAAmACAAGgAUAugAAgehAuYAAgegAucAAgefAuMAAgdcAocAAgdNAukAAgdHAuoAAgdDAuUAAgc8AuQAAgc5AAEABALiAAIHXAAIADwANgAwACoAJAAeABgAEgLeAAIHowLgAAIHogLfAAIHoALhAAIHnwLaAAIHXgLbAAIHXALdAAIHPALcAAIHOQANAGQAXgBYAFIATABGAEAAOgA0AC4AKAAiABwC1gACB6QC0gACB6MC1AACB6IC0wACB6AC1QACB58CzgACB14CzwACB1wChAACB00C2AACB0cC2QACB0MC0QACBzwC0AACBzkC1wACA6IAHAD6APIA6gDiANoA0gDKAMIAugCyAKoAogCaAJIAigCCAHwAdgBwAGoAZABeAFgAUgBMAEYAQAA6AswAAgekAsgAAgejAsoAAgeiAs0AAgehAskAAgegAssAAgefAv4AAgeBAsQAAgdeAsUAAgdcAscAAgc8AsYAAgc5Av4AAgOXAwUAAweBB6QDAQADB4EHowMDAAMHgQeiAwYAAweBB6EDAgADB4EHoAMEAAMHgQefAv8AAweBB14DAAADB4EHXAMFAAMDlwekAwEAAwOXB6MDAwADA5cHogMGAAMDlwehAwIAAwOXB6ADBAADA5cHnwL/AAMDlwdeAwAAAwOXB1wACAA8ADYAMAAqACQAHgAYABICwAACB6MCwgACB6ICwQACB6ACwwACB58CvAACB14CvQACB1wCvwACBzwCvgACBzkAHgEKAQIA+gDyAOoA4gDaANIAygDCALoAsgCqAKIAmgCSAIwAhgCAAHoAdABuAGgAYgBcAFYAUABKAEQAPgK4AAIHpAK0AAIHowK2AAIHogK5AAIHoQK1AAIHoAK3AAIHnwL1AAIHgQKwAAIHXgKxAAIHXAK6AAIHRwK7AAIHQwKzAAIHPAKyAAIHOQL1AAIDlwL8AAMHgQekAvgAAweBB6MC+gADB4EHogL9AAMHgQehAvkAAweBB6AC+wADB4EHnwL2AAMHgQdeAvcAAweBB1wC/AADA5cHpAL4AAMDlwejAvoAAwOXB6IC/QADA5cHoQL5AAMDlwegAvsAAwOXB58C9gADA5cHXgL3AAMDlwdcAAEAFgJoAmwCbgJwAnYCeAJ7An8CiQKNAo8CkQKXApkCnAKgAvUC/gMHA2UDcQN9AAQAAAABAAgAAQIaABsB/AHeAdQBtgGYAXoBXAFSATQBIgEEAPoA3ADSALQAqgCgAJYAjACCAHgAbgBkAFoAUABGADwAAQAEAlcAAgdsAAEABAHlAAIGtwABAAQBwQACBzwAAQAEAZAAAgc8AAEABAFaAAIHPAABAAQBQAACBzwAAQAEAR0AAgc8AAEABADvAAIHPAABAAQAvwACBzwAAQAEAIwAAgc8AAEABABwAAIHPAABAAQATQACBzwAAwAWAA4ACAG/AAIHbgHBAAMHbgc8AcEAAwc8B24AAQAEAaEAAgdVAAMAFgAOAAgBjwACB24BkAADB24HPAGQAAMHPAduAAEABAFjAAIHVQADABYADgAIAVkAAgduAVoAAwduBzwBWgADBzwHbgACAAwABgFHAAIHbAFKAAIHQQADABYADgAIAT4AAgduAUAAAwduBzwBQAADBzwHbgABAAQBKQACB1UAAwAWAA4ACAEbAAIHbgEdAAMHbgc8AR0AAwc8B24AAwAWAA4ACADuAAIHbgDvAAMHbgc8AO8AAwc8B24AAwAWAA4ACAC+AAIHbgC/AAMHbgc8AL8AAwc8B24AAwAWAA4ACACLAAIHbgCMAAMHbgc8AIwAAwc8B24AAQAEAHoAAgdBAAMAFgAOAAgAbgACB24AcAADB24HPABwAAMHPAduAAMAFgAOAAgASwACB24ATQADB24HPABNAAMHPAduAAEAGwACAAYACAAKABAAFgAcAB8AIAAiACQAJwAqAC8AMABLAG4AiwC+AO4BGwE+AVkBjwG/AeQCUgAEAAAAAQAIAAEBCgAFAOAAtgB0AEIAEAAGACwAJgAgABoAFAAOB6QAAgd9B6QAAgdBB6IAAgc+B6IAAgc8B6MAAgc7B6MAAgc5AAYALAAmACAAGgAUAA4HoQACB30HoQACB0EHnwACBz4HnwACBzwHoAACBzsHoAACBzkACAA8ADYAMAAqACQAHgAYABIHiQACB30HjAACB1UHigACB0MHiQACB0EHgAACBz4HhAACBzwHiAACBzsHhgACBzkABQAkAB4AGAASAAwHnAACB30HmgACB08HnAACB0EHlgACBzwHmAACBzkABQAkAB4AGAASAAwHkgACB08HngACB0cHlAACB0EHjgACBzwHkAACBzkAAQAFBz8HRwdNB1wHXgAGAAAAAwBAAB4ADAADAAAAAQAmAAEA2AABAAAANgADAAAAAQAUAAIBugDGAAEAAAA2AAEABQAkACUBWQHyAfUAAwAAAAIAGgAUAAEApAABAAAANQABAAEHbgABAAEAJAAGAAAABQFmAHIATgAqABAAAwAAAAEAEgABACwAAQAAAAIAAQACA9cEIwADAAAAAQAYAAEAEgABAAAAAgABAAEHPAABAAQAYwCqATMBewADAAAAAQAYAAEAEgABAAAAAgABAAEHRwABAAQAYACnATABeAADAAAAAQBUAAEAEgABAAAAAgABAB8HOQc7BzwHPgc/B0EHQwdFB0cHSAdLB00HTwdRB1MHVQdXB1kHWwdcB10HXgdhB2IHbAduB3cHfAd9B38HgAABAE4APwBTAFQAWwBcAGYAdwB9AH4AfwCKAI8AkACRAJQAlgCYAJwAoQCjAKQArQC9AMQAxQDHAMsAzADOANIA0wDUANUA1gDmAO0A+QD/AQABDwEjASQBKwEsATYBRwFMAU0BTgFYAV4BXwFgAWUBZgFoAWwBcQFzAXQBfgGOAZMBlgGYAZwBnQGfAaMBpAGlAaYBpwG3Ab4BywHRAdIAAwAAAAEANAABABIAAQAAAAIAAgAFB18HYAAAB2MHawACB3AHdgALB3gHewASB4EHgQAWAAIAQAA2AD4AAABAAEQACQBGAEkADgBNAE0AEgBPAFAAEwBSAFIAFQBVAFoAFgBeAGUAHABnAGwAJABwAHYAKgB4AHoAMQB8AHwANACBAIYANQCIAIkAOwCMAI4APQCSAJMAQACaAJsAQgCdAKAARACiAKIASAClAKwASQCuALIAUQC0ALUAVgC5ALwAWAC/AMMAXADIAMoAYQDNAM0AZADQANEAZQDYAOUAZwDnAOcAdQDpAOwAdgDvAPgAegD6AP4AhAEGAQ4AiQEQARQAkgEWARkAlwEdAR0AmwEfASAAnAEiASIAngElASoAnwEuATUApQE3ATwArQFAAUYAswFIAUsAugFQAVcAvgFaAVsAxgFdAV0AyAFiAWMAyQFqAWsAywFtAXAAzQFyAXIA0QF2AX0A0gF/AYMA2gGFAYYA3wGKAY0A4QGQAZIA5QGUAZUA6AGZAZsA6gGeAZ4A7QGhAaIA7gGpAbYA8AG4AbgA/gG6Ab0A/wHBAcoBAwHMAdABDQACAAAAAQAIAAEC4gFuDMIMvAy2DLAMqgykDJ4MmAySDIwMhgx+DHYMbgxmDF4MVgxODEYMPgw2DDAMKgwkDB4MGAwSDAwMBgwAC/oL9AvuC+gL4gvcC9YL0AvKC8QLvgu4C7ILrAumC6ALmAuQC4gLgAt4C3ILagtkC14LWAtSC0wLRgtACzoLNAsuCygLIgscCxYLEAsKCwQK/gr4CvIK7ArmCuAK2grUCs4KyArCCrwKtgqwCqoKogqcCpYKkAqKCoQKfgp4CnIKbApmCmAKWgpUCk4KSApCCjwKNgowCioKJAoeChYKDgoGCf4J9gnwCegJ4gncCdYJ0AnKCcQJvgm4CbIJrAmmCaAJmAmSCYwJhgmACXoJdAluCWgJYglcCVYJUAlKCUQJPgk4CTIJLAkmCSAJGgkUCQ4JCAkCCPoI8gjqCOII3AjWCNAIygjECL4IuAiyCKwIpgigCJoIlAiOCIgIggh8CHYIcAhqCGQIXghYCFIITAhGCEAIOgg0CC4IKAgiCBwIFggQCAoIAgf6B/IH6gfiB9oH0gfKB8IHuge0B64HqAeiB5wHlgeQB4oHhAd+B3gHcgdsB2YHYAdaB1QHTgdIB0IHPAc2BzAHKgckBxwHFAcMBwQG/Ab2Bu4G6AbiBtwG1gbQBsoGxAa+BrgGsgasBqYGoAaaBpQGjgaIBoIGfAZ2BnAGagZkBl4GWAZSBkwGRgZABjoGNAYuBiYGIAYaBhQGDgYIBgIF/AX2BfAF6gXkBd4F2AXSBcwFxgXABboFtAWuBagFogWaBZIFigWCBXoFdAVsBWYFYAVaBVQFTgVIBUIFPAU2BTAFKgUkBRwFFgUQBQoFBAT+BPgE8gTsBOYE4ATaBNQEzgTIBMIEvAS2BLAEqgSkBJ4EmASSBIwEhgR+BHYEbgRmBGAEWgRUBE4ESARCBDwENgQwBCoEJAQeBBgEEgQMBAYEAAP6A/QD7gPoA+ID3APWA9AK/gaCAAIAJwA2AEoAAABNAE0AFQBPAFAAFgBSAFwAGABeAG0AIwBwAHoAMwB8AH8APgCBAIYAQgCIAIoASACMAJQASwCWAJgAVACaALUAVwC5AL0AcwC/AM4AeADQANYAiADYAOcAjwDpAO0AnwDvAQAApAEGARoAtgEdAR0AywEfASAAzAEiASwAzgEuAT0A2QFAAU4A6QFQAVgA+AFaAVsBAQFdAWABAwFiAWMBBwFlAWgBCQFqAXQBDQF2AYYBGAGKAY4BKQGQAZ8BLgGhAacBPgGpAbgBRQG6Ab4BVQHBAdIBWgPXA9cBbAQjBCMBbQACADUHdgACADUHaAACADUHSwACADUHVQACADUHPAACADQHQQACADQHTwACADQHaAACADQHSwACADQHTQACADQHPwACADQHPAACADQHOQACADIHTQACADIHPwACADIHPAACADIHOQACAb8HPAACAbkHaAACAbkHQQACAbkHTwACAbkHOQACAbkHPAACADAHTwACADAHaAADADAHTQc5AAMAMAdNB1UAAwAwB00HPAADADAHTQdDAAIAMAdVAAIAMAdTAAIAMAdRAAIAMAdHAAIAMAdDAAIAMAdNAAIAMAdBAAIAMAc/AAIAMAc8AAIAMAc5AAIALwdNAAIALwd2AAIALwdoAAIALwdrAAIALwdsAAIALwdLAAIALwdVAAIALgdoAAIALgdLAAIALgdrAAIALgdsAAIALgdVAAIALgc/AAIALgc8AAIALQd2AAMALQdoB0MAAgAtB2gAAgAtB0sAAgAtB1UAAgAtB2sAAgAtBzwAAgArB0sAAgGPBzwAAgGJB2gAAgGJB0EAAgGJB08AAgGJBzkAAgGJBzwAAwAqB0MHPAACACoHRwADACoHPwdoAAMAKgc/B0EAAwAqBz8HTwADACoHPwc5AAMAKgc/BzwAAgAqB08AAgAqB2gAAgAqB1UAAgAqB1MAAgAqB0MAAgAqB00AAgAqB0EAAgAqBz8AAgAqBzwAAgAqBzkAAgApB3YAAgApB2gAAgApB0sAAgApB2sAAgApB0EAAgApB1UAAgApBzkAAgApBzwAAgAoB2gAAgAoB0sAAgAoBzwAAgAnB3YAAwAnB2gHRAACACcHaAACACcHawACACcHVQACACcHPQACACYHdgACACYHaAACACYHawACAdYHPwACAVwHRwACAmUHPAACACQHaAACAVwHTwACAVwHVQACAVwHQwACAVwHTQACAVwHQQACAVwHPwACAVwHPAACAVwHOQACACMHcwACACMHdgACACMHaAACACMHQAACACIHQQACACIHQwACACIHVQACACIHawACACIHSwACACIHRwACACIHPwACACIHPAACACEHSwADACAHQwc8AAIBPgc8AAMAIAc/B2gAAwAgBz8HQQADACAHPwdPAAMAIAc/BzkAAwAgBz8HPAACACAHQQACACAHTwACACAHaAACACAHSwACACAHRwACACAHQwACACAHTQACACAHVQACACAHPwACACAHPAACACAHOQACAB8HdgACAB8HaAACAB8HTAACAB8HVQACAB4HSwACAB4HVQACAB4HPwACAB4HPAACAB4HbAACAB0HdgACAB0HTAACAR4HQwACAR4HPAACARsHPAADABwHRwdoAAMAHAdHB0EAAwAcB0cHTwADABwHRwc5AAMAHAdHBzwAAwAcBz8HaAADABwHPwdBAAMAHAc/B08AAwAcBz8HOQADABwHPwc8AAIAHAdPAAIAHAdoAAIAHAdVAAIAHAdRAAIAHAdHAAIAHAdDAAIAHAdNAAIAHAdBAAIAHAc/AAIAHAc8AAIAHAc5AAIAGwd2AAIAGwdoAAIAGwdMAAIAGwdWAAIAGwc9AAIAGgdCAAIAGgdQAAIAGgdoAAIAGgdMAAIAGgdOAAIAGgdAAAIAGgc9AAIAGgc6AAIAGAdOAAIAGAdAAAIAGAc9AAIAGAc6AAIA7gc9AAIA6AdoAAIA6AdCAAIA6AdQAAIA6Ac6AAIA6Ac9AAIAFgdQAAIAFgdoAAMAFgdOBzoAAwAWB04HVgADABYHTgc9AAMAFgdOB0QAAgAWB1YAAgAWB1QAAgAWB1IAAgAWB0kAAgAWB0QAAgAWB04AAgAWB0IAAgAWB0AAAgAWBz0AAgAWBzoAAgAVB04AAgAVB3YAAgAVB2gAAgAVB2sAAgAVB20AAgAVB0wAAgAVB1YAAgAUB2gAAgAUB0wAAgAUB2sAAgAUB20AAgAUB1YAAgAUB0AAAgAUBz0AAgATB3YAAwATB2gHRAACABMHaAACABMHawACABMHTAACABMHVgACABMHPQACABEHTAACAL4HPQACALgHaAACALgHQgACALgHUAACALgHOgACALgHPQADABAHRAc9AAIAEAdJAAMAEAdAB2gAAwAQB0AHQgADABAHQAdQAAMAEAdABzoAAwAQB0AHPQACABAHUAACABAHaAACABAHVgACABAHVAACABAHRAACABAHTgACABAHQgACABAHQAACABAHPQACABAHOgACAA8HdgACAA8HaAACAA8HTAACAA8HawACAA8HQgACAA8HVgACAA8HOgACAA8HPQACAA4HaAACAA4HTAACAA4HPQACAA0HdgADAA0HaAdEAAIADQdoAAIADQdrAAIADQdWAAIADQc9AAIADAd2AAIADAdoAAIADAdrAAIACwdAAAIACgdJAAIAiwc9AAIACgdoAAIACgdQAAIACgdWAAIACgdEAAIACgdOAAIACgdCAAIACgdAAAIACgc9AAIACgc6AAIACQd2AAIACQdzAAIACQdoAAIACQdAAAIACAdCAAIACAdE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AAIE3gaSAAIE3QaRAAIE3AaQAAIE2waPAAIE2gaOAAIE2QaNAAIE2AaMAAIE1waLAAIE1gaKAAIE1QaJAAME1AaIAioAAgTTBocAAgTSBoYAAgTRBoUAAgTQBoQAAgTPBoMAAgTOBoIAAgTNBoEAAgTMBoAAAQAAAAEACAACBXwCuwTmBOcE6ATpBOoE6wTsBO0E7gTvBPAE8QTyBPME9AT1BPYE9wT4BPkE+gT8BP0E/gT/BQAFAQUCBQMFBAUFBQYFBwUIBQkFCgULBQwFDQUOBQ8FEAURBRIFEwUUBRUFFgUXBRgFGQUaBRsFHAUdBR8FIAUhBSIFIwUkBSUFJgUnBSgFKQUqBSsFLAUtBS4FLwUwBT4FPwVABUEFQgVDBUQFRQVGBUcFSAVJBUoFSwVMBU0FTgVPBVAFUQVSBVMFVAVVBVYFVwVYBVkFWgVbBVwFXQVeBV8FYAVhBWIFYwVuBW8FZAVlBWYFZwVoBWkFagVrBWwFbQVwBXEFcwVyBXQFdQV2BXcFeAV5BXoFewV8BX0FfgWABYEFggWDBYQFhQWGBYcFiAWJBYoFiwWMBY0FjgWPBZAFkQWSBZMFlAWVBZYFlwWYBZkFmgWbBZwFnQWeBZ8FoAWhBaIFowWkBaUFpgWnBagFqQWqBasFrAWtBa4FrwWwBbEFsgWzBbQFtgT+BP8FAAUBBQIFAwUEBQUFBgUHBQgFCQUKBQsFDAUNBRAFEQUSBRMFFAUVBRYFFwUYBRkFGgUbBRwFHQUfBSAFIQUiBSwFLQUuBTAFMQUyBTMFNAU1BTYFOAU5BToFPAU7BT0FPgU/BUAFQQVKBUsFTAVNBU4FTwVQBVEFUgVTBVQFVQVWBVcFWAVZBVoFWwVcBV0FXgVfBWAFYQViBWMFbgVvBWQFZQVmBWcFaAVpBWoFawVsBW0FcAVxBXQFcwVyBXUFdgV3BXgFeQV6BXsFfAV9BX4FfwWBBYIFgwWEBYUFhgWIBYkFigWLBYwFjQWOBY8FkAWRBZIFkwWUBZUFlgWXBZgFmQWaBZsFnAWdBZ4FnwWgBaEFogWjBaQFpQWmBacFqAWpBaoFqwWsBa0FrgWvBbAFsQWyBbMFtQW2BSsFtwU8BbgFuQW6BbsFvAW9Bb4FvwXBBcIFwwXEBcUFxgXHBcgFyQXKBcsFzAXNBc4FzwW4BbwFvgXABdAFxgXLBdEFzwHhAe0CowH0AhQB3QW4BbgFuAW4BbgFuAW4BbgFuAW4BbgFuAW8BbwFvAW8BbwFvAW8BbwFvgW+Bb4FvgW+Bb4FvgW+Bb4FvgXABcAFwAXABcAFwAXABcAFwAXABcYFxgXGBcYFxgXGBcYFxgXIBcsFywXLBcsFywXLBcsFywXPBc8FzwXPBc8FzwXPBc8FzwXPBdIF0gXSBdIF0gXSBdIF0gXSBdMF0wXTBdMF0wXTBdMF0wXTBdQF1AXUBdQF1AXUBdQF1AXUA5AF1QXWBdcF2AXZBdoF2wXcBd0F3gXfBeAF4QXiBeMF5AXlBeYF5wXoBekF6gXrBewF7QXuBe8F8AXxBfIF8wX0BfUF9gX3BfgF+QX6BfsF/AX+Bf8GAAYBBgIGAwYEBgUGBgYHBggGCQYKBgsGDAYNBg4GDwYQBhEGEgYTBhQGFQYWBhcGGAYZBhoGGwYcBh0GHgYfBiAF1QXXBdgF2QXaBdsF3AXdBd4F3wXgBeEF4gXjBeQF5QXmBecF6AXpBeoF6wXsBe0F7gXvBfAF8QXyBfMF9AX1BfYF9wX4BfkF+gX7BfwF/gX/BgAGAQYCBgMGBAYFBgYGBwYIBgkGCgYLBgwGDQYOBg8GEAYRBhIGEwYUBhUGFwYYBhkGGgYbBhwGHQYeBh8GIAXWBiEEbgRvBHAEcQRyBHMEdAR1BHYEbQRuBG8EcARxBHIEcwR0BHUEdga/BiwGLQYuBi8GMAYxBjIGMwY0BjUGOwY8Bj0GPgTJBTcGfga8Br0GvgbIB0AHQgdEB0YHSgdKB0wHTgdQB1IHVAdWB1gHWgdcB14HbQdvB34CZAACAEAANgBKAAAATABtABUAbwCAADcAjgEDAEkBBQEFAL8BHgEtAMABMAE9ANABPwFCAN4BSwFMAOIBTgFbAOQBXQFgAPIBagF0APYBdgGmAQEBqAG+ATIBwAHVAUkB1wHXAV8B6gHqAWACOAI4AWECZQJlAWICaAJvAWMCcQKJAWsCiwKLAYQCkAKRAYUCnAKcAYcCngKeAYgCsALXAYkC2gMPAbEDjwOPAecDsAPXAegD2QP8AhAD/gQjAjQEJQQ9AloEPwRIAnMESgRKAn0EWARgAn4EYwRsAocEgwSDApEEhgSPApIEpASnApwEyATIAqAEywTLAqEGfQZ9AqIGmgaaAqMGoAagAqQGpQalAqUGxwbHAqYHPwc/AqcHQQdBAqgHQwdDAqkHRQdFAqoHSQdLAqsHTQdNAq4HTwdPAq8HUQdRArAHUwdTArEHVQdVArIHVwdXArMHWQdZArQHWwdbArUHXQddArYHbAdsArcHbgduArgHfQd9ArkHswezAroAAgAAAAAAAP/OADIAAAAAAAAAAAAAAAAAAAAAAAAAAAe0AAAAAwAkACUAJgAnACgAKQAqACsALAAtAC4ALwAwADEAMgAzADQANQA2ADcAOAA5ADoAOwA8AD0ARABFAEYARwBIAEkASgBLAEwATQBOAE8AUABRAFIAUwBUAFUAVgBXAFgAWQBaAFsAXABdAK0AyQDHAK4AYgECAQMAYwEEAQUBBgEHAQgBCQEKAQsBDAENAQ4BDwEQAREBEgETAJABFAEVARYBFwEYAGQA/QEZAP8BGgEbARwBHQEeAR8AywBlAMgBIADKASEBIgEjASQBJQEmAScBKAEpASoBKwEsAS0BLgEvATABMQEyAPgBMwE0ATUBNgE3ATgBOQE6ATsBPAE9AM8AzADNAT4AzgE/APoBQAFBAUIBQwFEAUUBRgFHAUgBSQFKAUsBTAFNAU4BTwFQAOIBUQFSAVMBVAFVAVYAZgFXAVgBWQFaANMA0ADRAK8AZwFbAVwBXQFeAV8BYAFhAWIBYwFkAWUBZgCRALABZwFoAWkBagFrAWwBbQFuAW8BcAFxAXIBcwF0AXUBdgF3AXgA5AF5AXoBewF8AX0BfgF/AYABgQGCAYMBhAGFANYA1ADVAYYAaAGHAYgBiQGKAYsBjAGNAY4BjwGQAZEBkgGTAZQBlQGWAZcBmAGZAZoBmwGcAZ0BngDrAZ8AuwGgAaEBogGjAaQA5gGlAaYBpwDpAO0BqAGpAaoAagBpAGsAbQBsAasBrABuAa0BrgGvAbABsQGyAbMBtAG1AbYBtwG4AbkBugG7AbwAoAG9Ab4BvwHAAcEAbwD+AcIBAAHDAcQBxQHGAccBAQBxAHAAcgHIAHMByQHKAcsBzAHNAc4BzwHQAdEB0gHTAdQB1QHWAdcB2AHZAdoA+QHbAdwB3QHeAd8B4AHhAeIB4wHkAHUAdAB2AeUAdwHmAecB6AHpAeoB6wHsANcB7QHuAe8B8AHxAfIB8wH0AfUB9gH3AfgA4wH5AfoB+wH8Af0B/gB4Af8CAAIBAgICAwB6AHkAewB9AHwCBAIFAgYCBwIIAgkCCgILAgwCDQIOAg8AoQCxAhACEQISAhMCFAIVAhYCFwIYAhkCGgIbAhwCHQIeAh8CIAIhAOUCIgIjAiQCJQCJAiYCJwIoAikCKgIrAiwCLQB/AH4AgAIuAIECLwIwAjECMgIzAjQCNQI2AjcCOAI5AjoCOwI8Aj0CPgI/AkACQQJCAkMCRAJFAkYCRwDsAkgAugJJAkoCSwJMAk0A5wJOAk8CUADqAO4CUQJSAlMCVAJVAlYCVwJYAlkCWgJbAlwCXQJeAl8CYAJhAmICYwJkAmUCZgJnAmgCaQJqAmsCbAJtAm4CbwJwAnECcgJzAnQCdQJ2AncCeAJ5AnoCewJ8An0CfgJ/AoACgQKCAoMChAKFAoYChwKIAokCigKLAowCjQKOAo8CkAKRApICkwKUApUClgKXApgCmQKaApsCnAKdAp4CnwKgAqECogKjAqQCpQKmAqcCqAKpAqoCqwKsAq0CrgKvArACsQKyArMCtAK1ArYCtwK4ArkCugK7ArwCvQK+Ar8CwALBAsICwwLEAsUCxgLHAsgCyQLKAssCzALNAs4CzwLQAtEC0gLTAtQC1QLWAtcC2ALZAtoC2wLcAt0C3gLfAuAC4QLiAuMC5ALlAuYAqALnAugC6QLqAusC7ALtAu4C7wLwAvEC8gLzAvQC9QL2AvcC+AL5AJ8C+gL7AvwC/QL+Av8DAAMBAwIDAwMEAwUDBgMHAwgDCQMKAwsDDAMNAJcDDgMPAxAAmwMRAxIDEwMUAxUDFgMXAxgDGQMaAxsDHAMdAx4DHwMgAyEDIgMjAyQDJQMmAycDKAMpAyoDKwMsAy0DLgMvAzADMQMyAzMDNAM1AzYDNwM4AzkDOgM7AzwDPQM+Az8DQANBA0IDQwNEA0UDRgNHA0gDSQNKA0sDTANNA04DTwNQA1EDUgNTA1QDVQNWA1cDWANZA1oDWwNcA10DXgNfA2ADYQNiA2MDZANlA2YDZwNoA2kDagNrA2wDbQNuA28DcANxA3IDcwN0A3UDdgN3A3gDeQN6A3sDfAN9A34DfwOAA4EDggODA4QDhQOGA4cDiAOJA4oDiwOMA40DjgOPA5ADkQOSA5MDlAOVA5YDlwOYA5kDmgObA5wDnQOeA58DoAOhA6IDowOkA6UDpgOnA6gDqQOqA6sDrAOtA64DrwOwA7EDsgOzA7QDtQO2A7cDuAO5A7oDuwO8A70DvgO/A8ADwQPCA8MDxAPFA8YDxwPIA8kDygPLA8wDzQPOA88D0APRA9ID0wPUA9UD1gPXA9gD2QPaA9sD3APdA94D3wPgA+ED4gPjA+QD5QPmA+cD6APpA+oD6wPsA+0D7gPvA/AD8QPyA/MD9AP1A/YD9wP4A/kD+gP7A/wD/QP+A/8EAAQBBAIEAwQEBAUEBgQHBAgECQQKBAsEDAQNBA4EDwQQBBEEEgQTBBQEFQQWBBcEGAQZBBoEGwQcBB0EHgQfBCAEIQQiBCMEJAQlBCYEJwQoBCkEKgQrBCwELQQuBC8EMAQxBDIEMwQ0BDUENgQ3BDgEOQQ6BDsEPAQ9BD4EPwRABEEEQgRDBEQERQRGBEcESARJBEoESwRMBE0ETgRPBFAEUQRSBFMEVARVBFYEVwRYBFkEWgRbBFwEXQReBF8EYARhBGIEYwRkBGUEZgRnBGgEaQRqBGsEbARtBG4EbwRwBHEEcgRzBHQEdQR2BHcEeAR5BHoEewR8BH0EfgR/BIAEgQSCBIMEhASFBIYEhwSIBIkEigSLBIwEjQSOBI8EkASRBJIEkwSUBJUElgSXBJgEmQSaBJsEnASdBJ4EnwSgBKEEogSjBKQEpQSmBKcEqASpBKoEqwSsBK0ErgSvBLAEsQSyBLMEtAS1BLYEtwS4BLkEugS7BLwEvQS+BL8EwATBAAkAEwAUABUAFgAXABgAGQAaABsAHATCBMMExATFBMYExwTIBMkEygTLBMwEzQTOBM8E0ATRBNIE0wTUBNUE1gTXBNgE2QTaBNsE3ATdBN4E3wTgBOEE4gTjBOQE5QTmBOcE6ATpBOoE6wTsBO0AEQAPAB0AHgCrAAQAowAiAKIACgAFALYAtwC0ALUAxADFAL4AvwCpAKoAEACyALME7gTvBPAE8QDDAIcAQgTyBPMACwAMAD4AQABeAGAAEgBfAD8A6AANAIIAwgCGAIgE9AT1BPYE9wT4BPkE+gT7BPwE/QT+BP8FAAUBBQIFAwCLBQQAigCMBQUFBgUHACMFCAAGBQkFCgULBQwFDQUOBQ8FEAURBRIFEwUUBRUFFgUXBRgFGQUaBRsFHAUdBR4FHwUgBSEFIgUjBSQFJQUmBScFKAUpBSoFKwUsBS0FLgUvBTAFMQUyBTMFNAU1BTYFNwU4BTkFOgU7BTwFPQU+BT8FQAVBBUIFQwVEBUUFRgVHBUgFSQVKBUsFTAVNBU4FTwVQBVEFUgVTBVQFVQVWBVcFWAVZBVoFWwVcBV0FXgVfBWAFYQViBWMFZAVlBWYFZwVoBWkFagVrBWwFbQVuBW8FcAVxBXIFcwV0BXUFdgV3BXgFeQV6BXsFfAV9BX4FfwWABYEFggWDBYQFhQWGBYcFiAWJBYoFiwWMBY0FjgWPBZAFkQWSBZMFlAWVBZYFlwWYBZkFmgWbBZwFnQWeBZ8FoAWhBaIFowWkBaUFpgWnBagFqQWqBasFrAWtBa4FrwWwBbEFsgWzBbQFtQW2BbcFuAW5BboFuwW8Bb0FvgW/BcAFwQXCBcMFxAXFBcYFxwXIBckFygXLBcwFzQXOBc8F0AXRBdIF0wXUBdUF1gXXBdgF2QXaBdsF3AXdBd4F3wXgBeEF4gXjBeQF5QXmBecF6AXpBeoF6wXsBe0F7gXvBfAF8QXyBfMF9AX1BfYF9wX4BfkF+gX7BfwF/QX+Bf8GAAYBBgIGAwYEBgUGBgYHBggGCQYKBgsGDAYNBg4GDwYQBhEGEgYTBhQGFQYWBhcGGAYZBhoGGwYcBh0GHgYfBiAGIQYiBiMGJAYlBiYGJwYoBikGKgYrBiwGLQYuBi8GMAYxBjIGMwY0BjUGNgY3BjgGOQY6BjsGPAY9Bj4GPwZABkEGQgZDBkQGRQZGBkcGSAZJBkoGSwZMBk0GTgZPBlAGUQZSBlMGVAZVBlYGVwZYBlkGWgZbBlwGXQZeBl8GYAZhBmIGYwZkBmUGZgZnBmgGaQZqBmsGbAZtBm4GbwZwBnEGcgZzBnQGdQZ2BncGeAZ5BnoGewZ8Bn0GfgZ/BoAGgQaCBoMGhAaFBoYGhwaIBokGigaLBowGjQaOBo8GkAaRBpIGkwaUBpUGlgaXBpgGmQaaBpsGnAadBp4GnwagBqEGogajBqQGpQamBqcGqAapBqoGqwasBq0GrgavBrAGsQayBrMGtAa1BrYGtwa4BrkGugCdBrsAnga8Br0Gvga/BsAGwQbCBsMGxAbFBsYGxwbIBskGygbLBswGzQbOBs8G0AbRBtIG0wbUBtUG1gbXBtgG2QbaBtsG3AbdBt4G3wbgBuEG4gbjBuQG5QbmBucG6AbpBuoG6wbsBu0G7gbvBvAG8QbyBvMG9Ab1BvYG9wb4BvkG+gb7BvwG/Qb+AIMAvQAHAIUAlgb/BwAAhAcBBwIHAwcEBwUHBgcHBwgHCQcKBwsHDAcNBw4HDwcQALwHEQcSAAgAxgD1APQA9gcTBxQHFQcWBxcHGAcZBxoHGwccBx0HHgcfByAHIQciAA4A7wDwALgHIwAgAB8AIQCUAJUAkwBBAI8AYQCnAKQAkgCYAJwApQCZAJoHJAclByYHJwcoBykHKgcrBywHLQcuBy8HMAcxBzIHMwc0BzUHNgc3BzgHOQC5BzoHOwc8Bz0HPgc/AEMAjQDYAOEHQAdBB0IHQwdEANkAjgDaANsA3QDfANwA3gDgB0UHRgdHB0gHSQdKB0sHTAdNB04HTwdQB1EHUgdTB1QHVQdWB1cHWAdZB1oHWwdcB10HXgdfB2AHYQdiB2MHZAdlB2YHZwdoB2kHagdrB2wHbQduB28HcAdxB3IHcwd0B3UHdgd3B3gHeQd6B3sHfAd9B34HfweAB4EHggeDB4QHhQeGB4cHiAeJB4oHiweMB40HjgePB5AHkQeSB5MHlAeVB5YHlweYB5kHmgebB5wHnQeeB58HoAehB6IHowekB6UHpgenB6gHqQeqB6sHrAetB64HrwewB7EHsgezB7QHtQe2B7cHuAe5B7oHuwe8B70HvgDAAMEHQW1hY3JvbgZBYnJldmUHdW5pMDFDRAd1bmkxRUEwB3VuaTFFQTIHdW5pMUVBNAd1bmkxRUE2B3VuaTFFQTgHdW5pMUVBQQd1bmkxRUFDB3VuaTFFQUUHdW5pMUVCMAd1bmkxRUIyB3VuaTFFQjQHdW5pMUVCNgdBb2dvbmVrCUFvZ29uZWsuZAt1bmkwMTA0MDMwMQd1bmkwMUZDB3VuaTAxRTIHdW5pMDI0Mwd1bmkxRTAyB3VuaTFFMDYLQ2NpcmN1bWZsZXgKQ2RvdGFjY2VudAZEY2Fyb24HdW5pMUUwQQd1bmkxRTBDB3VuaTFFMEUGRGNyb2F0BkVjYXJvbgdFbWFjcm9uBkVicmV2ZQpFZG90YWNjZW50B3VuaTFFQjgHdW5pMUVCQQd1bmkxRUJDB3VuaTFFQkUHdW5pMUVDMAd1bmkxRUMyB3VuaTFFQzQHdW5pMUVDNgdFb2dvbmVrCUVvZ29uZWsuZAt1bmkwMTE4MDMwMQd1bmkxRTE2B3VuaTFFMUUHdW5pMDFGNAtHY2lyY3VtZmxleApHZG90YWNjZW50B3VuaTAxMjIGR2Nhcm9uB3VuaTFFMjALdW5pMDA0NzAzMDMHdW5pMDE5MwtIY2lyY3VtZmxleAd1bmkxRTI0B3VuaTFFMkEJdW5pMUU5Ni5jBEhiYXIGSXRpbGRlB0ltYWNyb24HdW5pMDFDRgd1bmkxRUM4B3VuaTFFQ0EHSW9nb25lawt1bmkwMTJFMDMwMQd1bmkwMTJDC0pjaXJjdW1mbGV4B3VuaTAxMzYHdW5pMUUzMgd1bmkxRTM0BkxhY3V0ZQZMY2Fyb24HdW5pMDEzQgRMZG90B3VuaTFFMzYHdW5pMUUzOAd1bmkxRTNBB3VuaTFFM0UHdW5pMUU0MAd1bmkxRTQyBk5hY3V0ZQd1bmkwMUY4Bk5jYXJvbgd1bmkwMTQ1B3VuaTFFNDQHdW5pMUU0Ngd1bmkxRTQ4B09tYWNyb24NT2h1bmdhcnVtbGF1dAd1bmkwMUQxB3VuaTFFQ0MHdW5pMUVDRQd1bmkxRUQwB3VuaTFFRDIHdW5pMUVENAd1bmkxRUQ2B3VuaTFFRDgHdW5pMDE0RQd1bmkxRTUyBU9ob3JuB3VuaTFFREEHdW5pMUVEQwd1bmkxRURFB3VuaTFFRTAHdW5pMUVFMgd1bmkwMUVBC3VuaTAxRUEwMzAxB3VuaTFFNTYGUmFjdXRlBlJjYXJvbgd1bmkxRTU4B3VuaTAxNTYHdW5pMUU1QQd1bmkxRTVDB3VuaTFFNUUGU2FjdXRlC1NjaXJjdW1mbGV4B3VuaTAxNUUHdW5pMDIxOAd1bmkxRTYwB3VuaTFFNjIHdW5pMUU5RQZUY2Fyb24HdW5pMUU2QQd1bmkwMTYyB3VuaTAyMUEHdW5pMUU2Qwd1bmkxRTZFCXVuaTFFOTcuYwd1bmkwMTY2BlV0aWxkZQdVbWFjcm9uBlVicmV2ZQVVcmluZw1VaHVuZ2FydW1sYXV0B3VuaTAxRDMHdW5pMDFENQd1bmkwMUQ3B3VuaTAxRDkHdW5pMDFEQgd1bmkxRUU0B3VuaTFFRTYFVWhvcm4HdW5pMUVFOAd1bmkxRUVBB3VuaTFFRUMHdW5pMUVFRQd1bmkxRUYwB1VvZ29uZWsLdW5pMDE3MjAzMDEGV2dyYXZlBldhY3V0ZQtXY2lyY3VtZmxleAlXZGllcmVzaXMGWWdyYXZlC1ljaXJjdW1mbGV4B3VuaTFFOEUHdW5pMUVGNAd1bmkxRUY2B3VuaTFFRjgGWmFjdXRlClpkb3RhY2NlbnQHdW5pMUU5Mgd1bmkxRTk0B3VuaTAxOEYHdW5pMDE0QQd1bmkwMTMyB2FtYWNyb24GYWJyZXZlB3VuaTAxQ0UHdW5pMUVBMQd1bmkxRUEzB3VuaTFFQTUHdW5pMUVBNwd1bmkxRUE5B3VuaTFFQUIHdW5pMUVBRAd1bmkxRUFGB3VuaTFFQjEHdW5pMUVCMwd1bmkxRUI1B3VuaTFFQjcHYW9nb25lawlhb2dvbmVrLmQLdW5pMDEwNTAzMDEHdW5pMDFGRAd1bmkwMUUzB3VuaTAxODAHdW5pMUUwMwd1bmkxRTA3C2NjaXJjdW1mbGV4CmNkb3RhY2NlbnQGZGNhcm9uB3VuaTFFMEIHdW5pMUUwRAd1bmkxRTBGBmVjYXJvbgdlbWFjcm9uBmVicmV2ZQplZG90YWNjZW50B3VuaTFFQjkHdW5pMUVCQgd1bmkxRUJEB3VuaTFFQkYHdW5pMUVDMQd1bmkxRUMzB3VuaTFFQzUHdW5pMUVDNwdlb2dvbmVrCWVvZ29uZWsuZAt1bmkwMTE5MDMwMQd1bmkxRTE3B3VuaTFFMUYHdW5pMDFGNQtnY2lyY3VtZmxleApnZG90YWNjZW50B3VuaTAxMjMGZ2Nhcm9uB3VuaTFFMjELdW5pMDA2NzAzMDMLaGNpcmN1bWZsZXgHdW5pMUUyNQd1bmkxRTk2B3VuaTFFMkIEaGJhcgZpdGlsZGUHaW1hY3Jvbgd1bmkwMUQwB3VuaTFFQzkHdW5pMUVDQgdpb2dvbmVrC3VuaTAxMkYwMzAxB3VuaTAxMkQLamNpcmN1bWZsZXgHdW5pMDEzNwd1bmkxRTMzB3VuaTFFMzUMa2dyZWVubGFuZGljBmxhY3V0ZQZsY2Fyb24EbGRvdAd1bmkwMTNDB3VuaTFFMzcHdW5pMUUzOQd1bmkxRTNCB3VuaTFFM0YHdW5pMUU0MQd1bmkxRTQzBm5hY3V0ZQd1bmkwMUY5Bm5jYXJvbgd1bmkwMTQ2B3VuaTFFNDUHdW5pMUU0Nwd1bmkxRTQ5C25hcG9zdHJvcGhlB29tYWNyb24Nb2h1bmdhcnVtbGF1dAd1bmkwMUQyB3VuaTFFQ0QHdW5pMUVDRgd1bmkxRUQxB3VuaTFFRDMHdW5pMUVENQd1bmkxRUQ3B3VuaTFFRDkHdW5pMDE0Rgd1bmkxRTUzBW9ob3JuB3VuaTFFREIHdW5pMUVERAd1bmkxRURGB3VuaTFFRTEHdW5pMUVFMwd1bmkwMUVCC3VuaTAxRUIwMzAxB3VuaTFFNTcGcmFjdXRlB3VuaTAxNTcGcmNhcm9uB3VuaTFFNTkHdW5pMUU1Qgd1bmkxRTVEB3VuaTFFNUYGc2FjdXRlC3NjaXJjdW1mbGV4B3VuaTAxNUYHdW5pMDIxOQd1bmkxRTYxB3VuaTFFNjMGdGNhcm9uB3VuaTFFNkIHdW5pMDE2Mwd1bmkwMjFCB3VuaTFFNkQHdW5pMUU2Rgd1bmkxRTk3B3VuaTAxNjcGdXRpbGRlB3VtYWNyb24GdWJyZXZlBXVyaW5nDXVodW5nYXJ1bWxhdXQHdW5pMDFENAd1bmkwMUQ2B3VuaTAxRDgHdW5pMDFEQQd1bmkwMURDB3VuaTFFRTUHdW5pMUVFNwV1aG9ybgd1bmkxRUU5B3VuaTFFRUIHdW5pMUVFRAd1bmkxRUVGB3VuaTFFRjEHdW9nb25lawl1b2dvbmVrLmQLdW5pMDE3MzAzMDEGd2dyYXZlBndhY3V0ZQt3Y2lyY3VtZmxleAl3ZGllcmVzaXMGeWdyYXZlC3ljaXJjdW1mbGV4B3VuaTFFOEYHdW5pMUVGNQd1bmkxRUY3B3VuaTFFRjkGemFjdXRlCnpkb3RhY2NlbnQHdW5pMUU5Mwd1bmkxRTk1B3VuaTAxNEIHdW5pMDIzNwd1bmkwMTMzB3VuaTAyNTAHdW5pMDI1Mgd1bmkwMjUzB3VuaUE3QjUHdW5pMDI1NQd1bmlBQjUzB3VuaTAyNTYHdW5pMDI1Nwd1bmkwMjU4B3VuaTAyNTEHdW5pMDI5OQd1bmkwMkE0B3VuaTAyNTkHdW5pMDI1QQd1bmkwMjVCB3VuaTAyNUMHdW5pMDI1RQd1bmkwMjVGB3VuaTAyNjAHdW5pMDI2MQd1bmkwMjYyB3VuaTAyNjMHdW5pMDI2NQd1bmkwMjY2B3VuaTAyNjcHdW5pMDI5Qwd1bmkwMjY4B3VuaTAyNkEHdW5pMDI2OQd1bmkwMjlEB3VuaTAyNkIHdW5pMDI2Qwd1bmkwMjZEB3VuaTAyNkUHdW5pMDI5Rgd1bmkwMjZGB3VuaTAyNzAHdW5pMDI3MQd1bmkwMjcyB3VuaTAyNzMHdW5pMDI3NAd1bmkwMjU0B3VuaTAyNjQHdW5pMDI3NQd1bmkwMjc2B3VuaTAyNzcHdW5pMDI3OAd1bmkwMjc5B3VuaTAyN0EHdW5pMDI3Qgd1bmkwMjdEB3VuaTAyN0UHdW5pMDI4MAd1bmkwMjgxB3VuaTAyODIHdW5pMDI4Mwd1bmkwMjg0B3VuaTAyODgHdW5pMDJBNwd1bmkwMjg5B3VuaTAyOEEHdW5pMDI4Qgd1bmkwMjhDB3VuaTAyOEQHdW5pMDI4RQd1bmkwMjhGB3VuaTAyOTAHdW5pMDI5MQd1bmkwMjkyB3VuaTFEMjUHdW5pMDI5NAd1bmkwMjk1B3VuaTAyQTEHdW5pMDJBMgd1bmkwMUMyB3VuaTAxQzMHdW5pMDI5OANmX2YFZl9mX2kFZl9mX2wDZl90BWZfZl90A0kuYQhJZ3JhdmUuYQhJYWN1dGUuYQ1JY2lyY3VtZmxleC5hCEl0aWxkZS5hC0lkaWVyZXNpcy5hCUltYWNyb24uYQxJZG90YWNjZW50LmEJdW5pMDFDRi5hCXVuaTFFQzguYQl1bmkxRUNBLmEJdW5pMDEyQy5hCUlvZ29uZWsuYQ11bmkwMTJFMDMwMS5hCXVuaTAxNEEuYQNhLmEIYWdyYXZlLmEIYWFjdXRlLmENYWNpcmN1bWZsZXguYQhhdGlsZGUuYQthZGllcmVzaXMuYQlhbWFjcm9uLmEIYWJyZXZlLmEHYXJpbmcuYQl1bmkwMUNFLmEJdW5pMUVBMS5hCXVuaTFFQTMuYQl1bmkxRUE1LmEJdW5pMUVBNy5hCXVuaTFFQTkuYQl1bmkxRUFCLmEJdW5pMUVBRC5hCXVuaTFFQUYuYQl1bmkxRUIxLmEJdW5pMUVCMy5hCXVuaTFFQjUuYQl1bmkxRUI3LmEJYW9nb25lay5hCWFvZ29uZWsuYg11bmkwMTA1MDMwMS5hA2cuYQl1bmkwMUY1LmENZ2NpcmN1bWZsZXguYQhnYnJldmUuYQxnZG90YWNjZW50LmEJdW5pMDEyMy5hCGdjYXJvbi5hCXVuaTFFMjEuYQ11bmkwMDY3MDMwMy5hA2wuYQhsYWN1dGUuYQhsY2Fyb24uYQZsZG90LmEJdW5pMDEzQy5hCXVuaTFFMzcuYQl1bmkxRTM5LmEJdW5pMUUzQi5hCGxzbGFzaC5hBGZsLmEJaW9nb25lay54CXVuaTAyNjgueAl1bmkwMjlELngFQWxwaGEEQmV0YQVHYW1tYQdFcHNpbG9uBFpldGEDRXRhBVRoZXRhBElvdGEFS2FwcGEGTGFtYmRhAk11Ak51AlhpB09taWNyb24CUGkDUmhvBVNpZ21hA1RhdQdVcHNpbG9uA1BoaQNDaGkDUHNpCkFscGhhdG9ub3MMRXBzaWxvbnRvbm9zCEV0YXRvbm9zCUlvdGF0b25vcwxJb3RhZGllcmVzaXMMT21pY3JvbnRvbm9zDFVwc2lsb250b25vcw9VcHNpbG9uZGllcmVzaXMKT21lZ2F0b25vcwVhbHBoYQRiZXRhBWdhbW1hBWRlbHRhB2Vwc2lsb24EemV0YQNldGEFdGhldGEEaW90YQVrYXBwYQZsYW1iZGECbnUCeGkHb21pY3JvbgNyaG8Fc2lnbWEDdGF1B3Vwc2lsb24DcGhpA2NoaQNwc2kFb21lZ2EHdW5pMDNDMgd1bmkwM0QwB3VuaTAzRDEFcGhpLmEKYWxwaGF0b25vcwxlcHNpbG9udG9ub3MIZXRhdG9ub3MJaW90YXRvbm9zDGlvdGFkaWVyZXNpcwxvbWljcm9udG9ub3MMdXBzaWxvbnRvbm9zD3Vwc2lsb25kaWVyZXNpcwpvbWVnYXRvbm9zEWlvdGFkaWVyZXNpc3Rvbm9zFHVwc2lsb25kaWVyZXNpc3Rvbm9zB3VuaTFGMDgHdW5pMUYwOQd1bmkxRkJBB3VuaTFGQkIHdW5pMUYwQQd1bmkxRjBCB3VuaTFGMEMHdW5pMUYwRAd1bmkxRjBFB3VuaTFGMEYHdW5pMUZCOAd1bmkxRkI5B3VuaTFGMTgHdW5pMUYxOQd1bmkxRkM4B3VuaTFGQzkHdW5pMUYxQQd1bmkxRjFCB3VuaTFGMUMHdW5pMUYxRAd1bmkxRjI4B3VuaTFGMjkHdW5pMUZDQQd1bmkxRkNCB3VuaTFGMkEHdW5pMUYyQgd1bmkxRjJDB3VuaTFGMkQHdW5pMUYyRQd1bmkxRjJGB3VuaTFGMzgHdW5pMUYzOQd1bmkxRkRBB3VuaTFGREIHdW5pMUYzQQd1bmkxRjNCB3VuaTFGM0MHdW5pMUYzRAd1bmkxRjNFB3VuaTFGM0YHdW5pMUZEOAd1bmkxRkQ5B3VuaTFGNDgHdW5pMUY0OQd1bmkxRkY4B3VuaTFGRjkHdW5pMUY0QQd1bmkxRjRCB3VuaTFGNEMHdW5pMUY0RAd1bmkxRkVDB3VuaTFGNTkHdW5pMUZFQQd1bmkxRkVCB3VuaTFGNUIHdW5pMUY1RAd1bmkxRjVGB3VuaTFGRTgHdW5pMUZFOQd1bmkxRjY4B3VuaTFGNjkHdW5pMUZGQQd1bmkxRkZCB3VuaTFGNkEHdW5pMUY2Qgd1bmkxRjZDB3VuaTFGNkQHdW5pMUY2RQd1bmkxRjZGB3VuaTFGQkMHdW5pMUY4OAd1bmkxRjg5B3VuaTFGOEEHdW5pMUY4Qgd1bmkxRjhDB3VuaTFGOEQHdW5pMUY4RQd1bmkxRjhGB3VuaTFGQ0MHdW5pMUY5OAd1bmkxRjk5B3VuaTFGOUEHdW5pMUY5Qgd1bmkxRjlDB3VuaTFGOUQHdW5pMUY5RQd1bmkxRjlGB3VuaTFGRkMHdW5pMUZBOAd1bmkxRkE5B3VuaTFGQUEHdW5pMUZBQgd1bmkxRkFDB3VuaTFGQUQHdW5pMUZBRQd1bmkxRkFGB3VuaTFGMDAHdW5pMUYwMQd1bmkxRjcwB3VuaTFGNzEHdW5pMUYwMgd1bmkxRjAzB3VuaTFGMDQHdW5pMUYwNQd1bmkxRjA2B3VuaTFGMDcHdW5pMUZCMAd1bmkxRkIxB3VuaTFGQjYHdW5pMUYxMAd1bmkxRjExB3VuaTFGNzIHdW5pMUY3Mwd1bmkxRjEyB3VuaTFGMTMHdW5pMUYxNAd1bmkxRjE1B3VuaTFGMjAHdW5pMUYyMQd1bmkxRjc0B3VuaTFGNzUHdW5pMUYyMgd1bmkxRjIzB3VuaTFGMjQHdW5pMUYyNQd1bmkxRjI2B3VuaTFGMjcHdW5pMUZDNgd1bmkxRjMwB3VuaTFGMzEHdW5pMUY3Ngd1bmkxRjc3B3VuaTFGMzIHdW5pMUYzMwd1bmkxRjM0B3VuaTFGMzUHdW5pMUYzNgd1bmkxRjM3B3VuaTFGRDAHdW5pMUZEMQd1bmkxRkQ2B3VuaTFGRDIHdW5pMUZEMwd1bmkxRkQ3B3VuaTFGNDAHdW5pMUY0MQd1bmkxRjc4B3VuaTFGNzkHdW5pMUY0Mgd1bmkxRjQzB3VuaTFGNDQHdW5pMUY0NQd1bmkxRkU0B3VuaTFGRTUHdW5pMUY1MAd1bmkxRjUxB3VuaTFGN0EHdW5pMUY3Qgd1bmkxRjUyB3VuaTFGNTMHdW5pMUY1NAd1bmkxRjU1B3VuaTFGNTYHdW5pMUY1Nwd1bmkxRkU2B3VuaTFGRTAHdW5pMUZFMQd1bmkxRkUyB3VuaTFGRTMHdW5pMUZFNwd1bmkxRjYwB3VuaTFGNjEHdW5pMUY3Qwd1bmkxRjdEB3VuaTFGNjIHdW5pMUY2Mwd1bmkxRjY0B3VuaTFGNjUHdW5pMUY2Ngd1bmkxRjY3B3VuaTFGRjYHdW5pMUZCMwd1bmkxRjgwB3VuaTFGODEHdW5pMUZCMgd1bmkxRkI0B3VuaTFGODIHdW5pMUY4Mwd1bmkxRjg0B3VuaTFGODUHdW5pMUY4Ngd1bmkxRjg3B3VuaTFGQjcHdW5pMUZDMwd1bmkxRjkwB3VuaTFGOTEHdW5pMUZDMgd1bmkxRkM0B3VuaTFGOTIHdW5pMUY5Mwd1bmkxRjk0B3VuaTFGOTUHdW5pMUY5Ngd1bmkxRjk3B3VuaTFGQzcHdW5pMUZGMwd1bmkxRkEwB3VuaTFGQTEHdW5pMUZGMgd1bmkxRkY0B3VuaTFGQTIHdW5pMUZBMwd1bmkxRkE0B3VuaTFGQTUHdW5pMUZBNgd1bmkxRkE3B3VuaTFGRjcHdW5pMDNENwd1bmkwM0Q5B3VuaTAzREIHdW5pMDNERAd1bmkwM0UxB3VuaTAzN0UJYW5vdGVsZWlhDWFub3RlbGVpYS5jYXAHdW5pMDM3NAd1bmkwMzc1BXRvbm9zCXRvbm9zLmNhcA1kaWVyZXNpc3Rvbm9zB3VuaTAzN0EHdW5pMUZCRQd1bmkxRkJEB3VuaTFGQkYHdW5pMUZGRQd1bmkxRkVGB3VuaTFGRkQHdW5pMUZDRAd1bmkxRkREB3VuaTFGQ0UHdW5pMUZERQd1bmkxRkNGB3VuaTFGREYHdW5pMUZDMAd1bmkxRkVEB3VuaTFGRUUHdW5pMUZDMQt1bmkxRkJELmNhcAt1bmkxRkZFLmNhcAt1bmkxRkVGLmNhcAt1bmkxRkNELmNhcAt1bmkxRkRELmNhcAt1bmkxRkNFLmNhcAt1bmkxRkRFLmNhcAt1bmkxRkNGLmNhcAt1bmkxRkRGLmNhcAd1bmkwNDEwB3VuaTA0MTEHdW5pMDQxMgd1bmkwNDEzB3VuaTA0MTQHdW5pMDQxNQd1bmkwNDE2B3VuaTA0MTcHdW5pMDQxOAd1bmkwNDE5B3VuaTA0MUEHdW5pMDQxQgd1bmkwNDFDB3VuaTA0MUQHdW5pMDQxRQd1bmkwNDFGB3VuaTA0MjAHdW5pMDQyMQd1bmkwNDIyB3VuaTA0MjMHdW5pMDQyNAd1bmkwNDI1B3VuaTA0MjYHdW5pMDQyNwd1bmkwNDI4B3VuaTA0MjkHdW5pMDQyQQd1bmkwNDJCB3VuaTA0MkMHdW5pMDQyRAd1bmkwNDJFB3VuaTA0MkYHdW5pMDQwMAd1bmkwNDAxB3VuaTA0MDIHdW5pMDQwMwd1bmkwNDA0B3VuaTA0MDUHdW5pMDQwNgd1bmkwNDA3CXVuaTA0MDcuYQd1bmkwNDA4B3VuaTA0MDkHdW5pMDQwQQd1bmkwNDBCB3VuaTA0MEMHdW5pMDQwRAd1bmkwNDBFB3VuaTA0MEYHdW5pMDQ2Mgd1bmkwNDcyB3VuaTA0NzQHdW5pMDQ5MAd1bmkwNDkyB3VuaTA0OTYHdW5pMDQ5OAd1bmkwNDlBB3VuaTA0QTAHdW5pMDRBMgd1bmkwNEFBB3VuaTA0QUUHdW5pMDRCMAd1bmkwNEIyB3VuaTA0QjYHdW5pMDRCQQd1bmkwNEMwB3VuaTA0QzEHdW5pMDREMAd1bmkwNEQ0B3VuaTA0RDYHdW5pMDREOAd1bmkwNEUyB3VuaTA0RTYHdW5pMDRFOAd1bmkwNEVFB3VuaTA0RjIHdW5pMDQzMAd1bmkwNDMxB3VuaTA0MzIHdW5pMDQzMwd1bmkwNDM0B3VuaTA0MzUHdW5pMDQzNgd1bmkwNDM3B3VuaTA0MzgHdW5pMDQzOQd1bmkwNDNBB3VuaTA0M0IHdW5pMDQzQwd1bmkwNDNEB3VuaTA0M0UHdW5pMDQzRgd1bmkwNDQwB3VuaTA0NDEHdW5pMDQ0Mgd1bmkwNDQzB3VuaTA0NDQHdW5pMDQ0NQd1bmkwNDQ2B3VuaTA0NDcHdW5pMDQ0OAd1bmkwNDQ5B3VuaTA0NEEHdW5pMDQ0Qgd1bmkwNDRDB3VuaTA0NEQHdW5pMDQ0RQd1bmkwNDRGB3VuaTA0NTAHdW5pMDQ1MQd1bmkwNDUyB3VuaTA0NTMHdW5pMDQ1NAd1bmkwNDU1B3VuaTA0NTYHdW5pMDQ1Nwl1bmkwNDU3LmEHdW5pMDQ1OAd1bmkwNDU5B3VuaTA0NUEHdW5pMDQ1Qgd1bmkwNDVDB3VuaTA0NUQHdW5pMDQ1RQd1bmkwNDVGB3VuaTA0NjMHdW5pMDQ3Mwd1bmkwNDc1B3VuaTA0OTEHdW5pMDQ5Mwd1bmkwNDk3B3VuaTA0OTkHdW5pMDQ5Qgd1bmkwNEExB3VuaTA0QTMHdW5pMDRBQgd1bmkwNEFGB3VuaTA0QjEHdW5pMDRCMwd1bmkwNEI3B3VuaTA0QkIHdW5pMDRDMgd1bmkwNENGB3VuaTA0RDEHdW5pMDRENQd1bmkwNEQ3B3VuaTA0RDkHdW5pMDRFMwd1bmkwNEU3B3VuaTA0RTkHdW5pMDRFRgd1bmkwNEYzC3VuaTA0MzEuc3JiB3VuaTIxMTYGemVyby4wB3plcm8uMHMJemVyby5wbnVtCG9uZS5wbnVtCHR3by5wbnVtCnRocmVlLnBudW0JZm91ci5wbnVtCWZpdmUucG51bQhzaXgucG51bQpzZXZlbi5wbnVtCmVpZ2h0LnBudW0JbmluZS5wbnVtB3plcm8uMHAIemVyby4wcHMJemVyby50bnVtCG9uZS50bnVtCHR3by50bnVtCnRocmVlLnRudW0JZm91ci50bnVtCWZpdmUudG51bQhzaXgudG51bQpzZXZlbi50bnVtCmVpZ2h0LnRudW0JbmluZS50bnVtCXplcm8ub251bQhvbmUub251bQh0d28ub251bQp0aHJlZS5vbnVtCWZvdXIub251bQlmaXZlLm9udW0Ic2l4Lm9udW0Kc2V2ZW4ub251bQplaWdodC5vbnVtCW5pbmUub251bQZ6ZXJvLmMFb25lLmMFdHdvLmMHdGhyZWUuYwZmb3VyLmMGZml2ZS5jBXNpeC5jB3NldmVuLmMHZWlnaHQuYwZuaW5lLmMHdW5pMkUzQQd1bmkyRTNCCmZpZ3VyZWRhc2gHdW5pMjAxNQd1bmkyMDNFB3VuaTIwM0YHdW5pMjAxNgd1bmkyMDNDB3VuaTIwNDcHdW5pMjA0OQd1bmkyMDQ4B3VuaTIwM0QHdW5pMjMxQwd1bmkyMzFEB3VuaTIzMUUHdW5pMjMxRgd1bmkyN0U2B3VuaTI3RTcHdW5pMkUyMgd1bmkyRTIzB3VuaTJFMjQHdW5pMkUyNQd1bmkyMTE3B3VuaTIxMjAGdTFGMTZBBnUxRjE2QgdhdC5jYXNlA2kudANBLnMDQi5zA0MucwNELnMDRS5zA0YucwNHLnMDSC5zA0kucwNKLnMDSy5zA0wucwNNLnMDTi5zA08ucwNQLnMDUS5zA1IucwNTLnMDVC5zA1UucwNWLnMDVy5zA1gucwNZLnMDWi5zCEFncmF2ZS5zCEFhY3V0ZS5zDUFjaXJjdW1mbGV4LnMIQXRpbGRlLnMLQWRpZXJlc2lzLnMJQW1hY3Jvbi5zCEFicmV2ZS5zB0FyaW5nLnMJdW5pMDFDRC5zCXVuaTFFQTAucwl1bmkxRUEyLnMJdW5pMUVBNC5zCXVuaTFFQTYucwl1bmkxRUE4LnMJdW5pMUVBQS5zCXVuaTFFQUMucwl1bmkxRUFFLnMJdW5pMUVCMC5zCXVuaTFFQjIucwl1bmkxRUI0LnMJdW5pMUVCNi5zCUFvZ29uZWsucwpBb2dvbmVrLnNhDXVuaTAxMDQwMzAxLnMEQUUucwl1bmkwMUZDLnMJdW5pMDFFMi5zCXVuaTAyNDMucwl1bmkxRTAyLnMJdW5pMUUwNi5zCkNjZWRpbGxhLnMIQ2FjdXRlLnMNQ2NpcmN1bWZsZXgucwhDY2Fyb24ucwxDZG90YWNjZW50LnMIRGNhcm9uLnMJdW5pMUUwQS5zCXVuaTFFMEMucwl1bmkxRTBFLnMIRGNyb2F0LnMIRWdyYXZlLnMIRWFjdXRlLnMNRWNpcmN1bWZsZXgucwhFY2Fyb24ucwtFZGllcmVzaXMucwlFbWFjcm9uLnMIRWJyZXZlLnMMRWRvdGFjY2VudC5zCXVuaTFFQjgucwl1bmkxRUJBLnMJdW5pMUVCQy5zCXVuaTFFQkUucwl1bmkxRUMwLnMJdW5pMUVDMi5zCXVuaTFFQzQucwl1bmkxRUM2LnMJRW9nb25lay5zCkVvZ29uZWsuc2ENdW5pMDExODAzMDEucwl1bmkxRTE2LnMJdW5pMUUxRS5zCXVuaTAxRjQucw1HY2lyY3VtZmxleC5zCEdicmV2ZS5zDEdkb3RhY2NlbnQucwl1bmkwMTIyLnMIR2Nhcm9uLnMJdW5pMUUyMC5zDXVuaTAwNDcwMzAzLnMJdW5pMDE5My5zDUhjaXJjdW1mbGV4LnMJdW5pMUUyNC5zCXVuaTFFMkEucwl1bmkxRTk2LnMGSGJhci5zCElncmF2ZS5zCElhY3V0ZS5zDUljaXJjdW1mbGV4LnMISXRpbGRlLnMLSWRpZXJlc2lzLnMJSW1hY3Jvbi5zDElkb3RhY2NlbnQucwl1bmkwMUNGLnMJdW5pMUVDOC5zCXVuaTFFQ0Eucw11bmkwMTJFMDMwMS5zCUlvZ29uZWsucwl1bmkwMTJDLnMNSmNpcmN1bWZsZXgucwl1bmkwMTM2LnMJdW5pMUUzMi5zCXVuaTFFMzQucwhMYWN1dGUucwhMY2Fyb24ucwl1bmkwMTNCLnMGTGRvdC5zCXVuaTFFMzYucwl1bmkxRTM4LnMJdW5pMUUzQS5zCExzbGFzaC5zCXVuaTFFM0Uucwl1bmkxRTQwLnMJdW5pMUU0Mi5zCE5hY3V0ZS5zCXVuaTAxRjgucwhOY2Fyb24ucwhOdGlsZGUucwl1bmkwMTQ1LnMJdW5pMUU0NC5zCXVuaTFFNDYucwl1bmkxRTQ4LnMIT2dyYXZlLnMIT2FjdXRlLnMNT2NpcmN1bWZsZXgucwhPdGlsZGUucwtPZGllcmVzaXMucwlPbWFjcm9uLnMPT2h1bmdhcnVtbGF1dC5zCXVuaTAxRDEucwl1bmkxRUNDLnMJdW5pMUVDRS5zCXVuaTFFRDAucwl1bmkxRUQyLnMJdW5pMUVENC5zCXVuaTFFRDYucwl1bmkxRUQ4LnMIT3NsYXNoLnMET0UucwdPaG9ybi5zCXVuaTFFREEucwl1bmkxRURDLnMJdW5pMUVERS5zCXVuaTFFRTAucwl1bmkxRUUyLnMJdW5pMDFFQS5zDXVuaTAxRUEwMzAxLnMJdW5pMDE0RS5zCXVuaTFFNTIucwl1bmkxRTU2LnMIUmFjdXRlLnMJdW5pMUU1OC5zCFJjYXJvbi5zCXVuaTAxNTYucwl1bmkxRTVBLnMJdW5pMUU1Qy5zCXVuaTFFNUUucwhTYWN1dGUucw1TY2lyY3VtZmxleC5zCFNjYXJvbi5zCXVuaTAxNUUucwl1bmkwMjE4LnMJdW5pMUU2MC5zCXVuaTFFNjIucwxnZXJtYW5kYmxzLnMJdW5pMUU5RS5zCFRjYXJvbi5zCXVuaTFFNkEucwl1bmkwMTYyLnMJdW5pMDIxQS5zCXVuaTFFNkMucwl1bmkxRTZFLnMJdW5pMUU5Ny5zCXVuaTAxNjYucwhVZ3JhdmUucwhVYWN1dGUucw1VY2lyY3VtZmxleC5zCFV0aWxkZS5zC1VkaWVyZXNpcy5zCVVtYWNyb24ucwhVYnJldmUucwdVcmluZy5zD1VodW5nYXJ1bWxhdXQucwl1bmkwMUQzLnMJdW5pMDFENS5zCXVuaTAxRDcucwl1bmkwMUQ5LnMJdW5pMDFEQi5zCXVuaTFFRTQucwl1bmkxRUU2LnMHVWhvcm4ucwl1bmkxRUU4LnMJdW5pMUVFQS5zCXVuaTFFRUMucwl1bmkxRUVFLnMJdW5pMUVGMC5zCVVvZ29uZWsucw11bmkwMTcyMDMwMS5zCFdncmF2ZS5zCFdhY3V0ZS5zDVdjaXJjdW1mbGV4LnMLV2RpZXJlc2lzLnMIWWdyYXZlLnMIWWFjdXRlLnMNWWNpcmN1bWZsZXgucwtZZGllcmVzaXMucwl1bmkxRThFLnMJdW5pMUVGNC5zCXVuaTFFRjYucwl1bmkxRUY4LnMIWmFjdXRlLnMIWmNhcm9uLnMMWmRvdGFjY2VudC5zCXVuaTFFOTIucwl1bmkxRTk0LnMFRXRoLnMHVGhvcm4ucwl1bmkwMThGLnMJdW5pMDE0QS5zCXVuaTAxMzIucwp1bmkwMTRBLnNhB0FscGhhLnMGQmV0YS5zB0dhbW1hLnMJdW5pMDM5NC5zCUVwc2lsb24ucwZaZXRhLnMFRXRhLnMHVGhldGEucwZJb3RhLnMHS2FwcGEucwhMYW1iZGEucwRNdS5zBE51LnMEWGkucwlPbWljcm9uLnMEUGkucwVSaG8ucwdTaWdtYS5zBVRhdS5zCVVwc2lsb24ucwVQaGkucwVDaGkucwVQc2kucwl1bmkwM0E5LnMOSW90YWRpZXJlc2lzLnMRVXBzaWxvbmRpZXJlc2lzLnMOQWxwaGFpb3Rhc3ViLnMMRXRhaW90YXN1Yi5zDk9tZWdhaW90YXN1Yi5zCXVuaTA0MTAucwl1bmkwNDExLnMJdW5pMDQxMi5zCXVuaTA0MTMucwl1bmkwNDE0LnMJdW5pMDQxNS5zCXVuaTA0MTYucwl1bmkwNDE3LnMJdW5pMDQxOC5zCXVuaTA0MTkucwl1bmkwNDFBLnMJdW5pMDQxQi5zCXVuaTA0MUMucwl1bmkwNDFELnMJdW5pMDQxRS5zCXVuaTA0MUYucwl1bmkwNDIwLnMJdW5pMDQyMS5zCXVuaTA0MjIucwl1bmkwNDIzLnMJdW5pMDQyNC5zCXVuaTA0MjUucwl1bmkwNDI2LnMJdW5pMDQyNy5zCXVuaTA0Mjgucwl1bmkwNDI5LnMJdW5pMDQyQS5zCXVuaTA0MkIucwl1bmkwNDJDLnMJdW5pMDQyRC5zCXVuaTA0MkUucwl1bmkwNDJGLnMJdW5pMDQwMC5zCXVuaTA0MDEucwl1bmkwNDAyLnMJdW5pMDQwMy5zCXVuaTA0MDQucwl1bmkwNDA1LnMJdW5pMDQwNi5zCXVuaTA0MDcucwp1bmkwNDA3LnNhCXVuaTA0MDgucwl1bmkwNDA5LnMJdW5pMDQwQS5zCXVuaTA0MEIucwl1bmkwNDBDLnMJdW5pMDQwRC5zCXVuaTA0MEUucwl1bmkwNDBGLnMJdW5pMDQ2Mi5zCXVuaTA0NzIucwl1bmkwNDc0LnMJdW5pMDQ5MC5zCXVuaTA0OTIucwl1bmkwNDk2LnMJdW5pMDQ5OC5zCXVuaTA0OUEucwl1bmkwNEEwLnMJdW5pMDRBMi5zCXVuaTA0QUEucwl1bmkwNEFFLnMJdW5pMDRCMC5zCXVuaTA0QjIucwl1bmkwNEI2LnMJdW5pMDRCQS5zCXVuaTA0QzAucwl1bmkwNEMxLnMJdW5pMDREMC5zCXVuaTA0RDQucwl1bmkwNEQ2LnMJdW5pMDREOC5zCXVuaTA0RTIucwl1bmkwNEU2LnMJdW5pMDRFOC5zCXVuaTA0RUUucwl1bmkwNEYyLnMLYW1wZXJzYW5kLnMGemVyby5zBW9uZS5zBXR3by5zB3RocmVlLnMGZm91ci5zBmZpdmUucwVzaXgucwdzZXZlbi5zB2VpZ2h0LnMGbmluZS5zCGV4Y2xhbS5zDGV4Y2xhbWRvd24ucwpxdWVzdGlvbi5zDnF1ZXN0aW9uZG93bi5zDXF1b3Rlc2luZ2xlLnMKcXVvdGVkYmwucwtxdW90ZWxlZnQucwxxdW90ZXJpZ2h0LnMOcXVvdGVkYmxsZWZ0LnMPcXVvdGVkYmxyaWdodC5zCGh5cGhlbi5zCGVuZGFzaC5zCGVtZGFzaC5zC3BhcmVubGVmdC5zDHBhcmVucmlnaHQucw1icmFja2V0bGVmdC5zDmJyYWNrZXRyaWdodC5zC2JyYWNlbGVmdC5zDGJyYWNlcmlnaHQucwl6ZXJvLnN1cHMIb25lLnN1cHMIdHdvLnN1cHMKdGhyZWUuc3Vwcwlmb3VyLnN1cHMJZml2ZS5zdXBzCHNpeC5zdXBzCnNldmVuLnN1cHMKZWlnaHQuc3VwcwluaW5lLnN1cHMJcGx1cy5zdXBzCm1pbnVzLnN1cHMKZXF1YWwuc3Vwcw5wYXJlbmxlZnQuc3Vwcw9wYXJlbnJpZ2h0LnN1cHMLcGVyaW9kLnN1cHMKY29tbWEuc3Vwcwl6ZXJvLnN1YnMIb25lLnN1YnMIdHdvLnN1YnMKdGhyZWUuc3Vicwlmb3VyLnN1YnMJZml2ZS5zdWJzCHNpeC5zdWJzCnNldmVuLnN1YnMKZWlnaHQuc3VicwluaW5lLnN1YnMJcGx1cy5zdWJzCm1pbnVzLnN1YnMKZXF1YWwuc3Vicw5wYXJlbmxlZnQuc3Vicw9wYXJlbnJpZ2h0LnN1YnMLcGVyaW9kLnN1YnMKY29tbWEuc3Vicwl6ZXJvLmRub20Ib25lLmRub20IdHdvLmRub20KdGhyZWUuZG5vbQlmb3VyLmRub20JZml2ZS5kbm9tCHNpeC5kbm9tCnNldmVuLmRub20KZWlnaHQuZG5vbQluaW5lLmRub20OcGFyZW5sZWZ0LmRub20PcGFyZW5yaWdodC5kbm9tC3BlcmlvZC5kbm9tCmNvbW1hLmRub20JemVyby5udW1yCG9uZS5udW1yCHR3by5udW1yCnRocmVlLm51bXIJZm91ci5udW1yCWZpdmUubnVtcghzaXgubnVtcgpzZXZlbi5udW1yCmVpZ2h0Lm51bXIJbmluZS5udW1yDnBhcmVubGVmdC5udW1yD3BhcmVucmlnaHQubnVtcgtwZXJpb2QubnVtcgpjb21tYS5udW1yDW9yZGZlbWluaW5lLmEGQS5zdXBzBkIuc3VwcwZDLnN1cHMGRC5zdXBzBkUuc3VwcwZGLnN1cHMGRy5zdXBzBkguc3VwcwZJLnN1cHMGSi5zdXBzBksuc3VwcwZMLnN1cHMGTS5zdXBzBk4uc3VwcwZPLnN1cHMGUC5zdXBzBlEuc3VwcwZSLnN1cHMGUy5zdXBzBlQuc3VwcwZVLnN1cHMGVi5zdXBzBlcuc3VwcwZYLnN1cHMGWS5zdXBzBlouc3VwcwZhLnN1cHMGYi5zdXBzBmMuc3VwcwZkLnN1cHMGZS5zdXBzBmYuc3VwcwZnLnN1cHMGaC5zdXBzBmkuc3VwcwZqLnN1cHMGay5zdXBzBmwuc3VwcwZtLnN1cHMGbi5zdXBzBm8uc3VwcwZwLnN1cHMGcS5zdXBzBnIuc3VwcwZzLnN1cHMGdC5zdXBzBnUuc3VwcwZ2LnN1cHMGdy5zdXBzBnguc3VwcwZ5LnN1cHMGei5zdXBzB3VuaTAyQzEHdW5pMDJEMAd1bmkwMkQxB3VuaTAyREUHdW5pMDJFMAtlZ3JhdmUuc3VwcwtlYWN1dGUuc3Vwcwx1bmkwMjU5LnN1cHMGYS5zdXBhBmcuc3VwYQZsLnN1cGEKY29sb24uc3VwcwtoeXBoZW4uc3VwcwtlbmRhc2guc3VwcwtlbWRhc2guc3VwcwZ5ZW4uQ04ERXVybwd1bmkwMTkyDWNvbG9ubW9uZXRhcnkEbGlyYQd1bmkyMEE2BnBlc2V0YQd1bmkyMEE5BGRvbmcHdW5pMjBCMQd1bmkyMEIyB3VuaTIwQjQHdW5pMjBCNQd1bmkyMEI5B3VuaTIwQkEHdW5pMjBBRQd1bmkyMEI4B3VuaTIwQkQHdW5pMjIxNQpzbGFzaC5mcmFjCG9uZXRoaXJkCXR3b3RoaXJkcwd1bmkyMTU1B3VuaTIxNTYHdW5pMjE1Nwd1bmkyMTU4B3VuaTIxNTkHdW5pMjE1QQd1bmkyMTUwCW9uZWVpZ2h0aAx0aHJlZWVpZ2h0aHMLZml2ZWVpZ2h0aHMMc2V2ZW5laWdodGhzB3VuaTIxNTEHdW5pMjE1Mgd1bmkyMTg5B3VuaTIyMTkHdW5pMjExMwllc3RpbWF0ZWQHdW5pMjE5MAdhcnJvd3VwB3VuaTIxOTIJYXJyb3dkb3duB3VuaTI1QTAHdW5pMjVDNgd1bmkyNUM5B3VuaTI3NTIHdHJpYWd1cAd1bmkyNUIzB3VuaTI1QjYHdW5pMjVCNwd0cmlhZ2RuB3VuaTI1QkQHdW5pMjVDMAd1bmkyNUMxB3VuaTI2MTAHdW5pMjYxMQd1bmkyNzEzB3VuaTI2NkEHdW5pMjAzMgd1bmkyMDMzB3VuaTIwMzUHdW5pMDJCOQd1bmkwMkJFB3VuaTAyQkYHdW5pMDJDOAd1bmkwMkM5B3VuaTAyQ0EHdW5pMDJDQgd1bmkwMkNDB3VuaTI1Q0MHdW5pMDMwMAl1bmkwMzAwLmMJdW5pMDMwMC5nB3VuaTAzMDEJdW5pMDMwMS5jCXVuaTAzMDEuZwd1bmkwMzAyCXVuaTAzMDIuYwd1bmkwMzAzCXVuaTAzMDMuYwd1bmkwMzA0CXVuaTAzMDQuYwd1bmkwMzA1CXVuaTAzMDUuYwd1bmkwMzA2CXVuaTAzMDYuawl1bmkwMzA2LmMJdW5pMDMwNi5LB3VuaTAzMDcJdW5pMDMwNy5jB3VuaTAzMDgJdW5pMDMwOC5jB3VuaTAzMDkJdW5pMDMwOS5jB3VuaTAzMEEJdW5pMDMwQS5jB3VuaTAzMEIJdW5pMDMwQi5jB3VuaTAzMEMJdW5pMDMwQy5jB3VuaTAzMEYJdW5pMDMwRi5jB3VuaTAzMTEJdW5pMDMxMS5jB3VuaTAzMTIJdW5pMDMxMi5nB3VuaTAzMTMJdW5pMDMxMy5nB3VuaTAzMTgHdW5pMDMxOQd1bmkwMzFBB3VuaTAzMUIHdW5pMDMxQwd1bmkwMzFEB3VuaTAzMUUHdW5pMDMxRgd1bmkwMzIwB3VuaTAzMjMHdW5pMDMyNAd1bmkwMzI1B3VuaTAzMjYHdW5pMDMyNwl1bmkwMzI3LmMHdW5pMDMyOAl1bmkwMzI4LmMHdW5pMDMyOQd1bmkwMzJBB3VuaTAzMkMHdW5pMDMyRQd1bmkwMzJGB3VuaTAzMzAHdW5pMDMzMQd1bmkwMzM0B3VuaTAzMzkHdW5pMDMzQQd1bmkwMzNCB3VuaTAzM0MHdW5pMDMzRAd1bmkwMzQyCXVuaTAzNDIuYwd1bmkwMzQzB3VuaTAzNDQHdW5pMDM0NQd1bmkwMzYxCXVuaTAzNjEuYQt1bmkwMzA4MDMwMQ11bmkwMzA4MDMwMS5jC3VuaTAzMDgwMzAwDXVuaTAzMDgwMzAwLmMNdW5pMDMwODAzMDAuZwt1bmkwMzA4MDMwMwt1bmkwMzA4MDMwNA11bmkwMzA4MDMwNC5jC3VuaTAzMDgwMzBDDXVuaTAzMDgwMzBDLmMLdW5pMDMwMjAzMDENdW5pMDMwMjAzMDEuYwt1bmkwMzAyMDMwMA11bmkwMzAyMDMwMC5jC3VuaTAzMDIwMzA5DXVuaTAzMDIwMzA5LmMLdW5pMDMwMjAzMDMNdW5pMDMwMjAzMDMuYwt1bmkwMzA2MDMwMQ11bmkwMzA2MDMwMS5jC3VuaTAzMDYwMzAwDXVuaTAzMDYwMzAwLmMLdW5pMDMwNjAzMDkNdW5pMDMwNjAzMDkuYwt1bmkwMzA2MDMwMw11bmkwMzA2MDMwMy5jC3VuaTAzMDIwMzA2C3VuaTAzMTIwMzAxC3VuaTAzMTIwMzAwC3VuaTAzMTIwMzAzC3VuaTAzMTMwMzAxC3VuaTAzMTMwMzAwC3VuaTAzMTMwMzAzB3VuaTAzNEYHdW5pMjMxOAd1bmkyMzI1B3VuaTIzMkIHdW5pMjFFNwd1bmkyMzAzB3VuaTIwMDcHdW5pMjAwOQd1bmkyMDBBB3VuaTIwMEIKc3BhY2UuZnJhYwd1bmkyMDJGB3VuaUZFRkYAAAAAAQAAAB4AOAAKAAkAkACYAKAAqACwALgAwADIAOAABERGTFQAvGN5cmwAwGdyZWsAxGxhdG4AyAAQa2VybgDKa2VybgDKa2VybgDKa2VybgDKbWFyawDWbWFyawDWbWFyawDWbWFyawDWbWttawDQbWttawDQbWttawDQbWttawDQc2l6ZQDGc2l6ZQDGc2l6ZQDGc2l6ZQDGAAQAAAABAIYABAAAAAEAigAEAAAAAQCOAAQAAAABAJIABAAAAAEAlgAEAAAAAQCaAAQAAAABAJ4ABgEAAAEAogCmAAAAsAAAALoAAADEAAAACQAAAAcAzgDWAN4A5gDuAPYA/gDyAAAAAAABAAgAAAABAAcAAAAHAAAAAQACAAMABAAFAAYAAQKiCNYAAQPuBoQAAQDWAO4AAQDcAM4AAQD0AXYAAQEEAVYAAQGMAtwAAQIgBMwAAQC+AMoAAQDEAK4AAQDEAPoAAQDKAOoAAQDMAcIAAQDUAYoAAQJOAQYAAQOaAPQAAP//AAQAAAAEAAgADAAA//8ABAABAAUACQANAAD//wAEAAIABgAKAA4AAP//AAQAAwAHAAsADwABAAIAATh4AAEAAgAA8i4AAQACAABNZAABAAIAABL2AAEAAgAAvDoAAQACAACFvAABAAIAASWWAGQAAAAAAAAAAAABClAAAQpSAAEAAQdhAAEAAApaAAEAAQd3AAEAAApCAAEAAQc4AAEAAQdiAAEAAAo2AAEAAgdsB20AAQACB24HbwACAAAKLAAACiwABwooCi4KNAo6CkAKRgpMAAEABwAQABYAKgAwBNoE4Ac4AAgKMAo2CjwKNgo8CkIKQgpIAAEACAc/B0MHRAdFB0YHSwdNB08ADwooCi4KNAo6CkAKRgpMClIKWApeCmQKdgpqCnAKfAABAA8ABAAUABUAHgAgAC4ALwAwAeYCAQITBM4E3gTfBzgAAgAFB18HYAAAB2MHawACB3AHdgALB3gHewASB4EHgQAWABsKHgokCioKMAo2CjwKQgpOCmwKSApOClQKWgpgCoQKZgpsCnIKeAp+CoQKigqQCpYKEgqcChgAAQAbAAIABgAKABAAFgAcACAAJAAqADABXAHYAeAB5AHyAfMCAwITAioCOQJmBMwE0ATUBNoE4Ac4ABcAAAowAAAKMAAACjAAAAowAAAKMAAACjAAAAowAAAKMAAACjAAAAowAAAKMAAACjAAAAowAAAKMAAACjAAAAowAAAKMAAACjAAAAowAAAKMAAACjAAAAowAAAKMAACAA8HOQdeAAAHfAeAACYHhAeEACsHhgeGACwHiAeKAC0HjAeMADAHjgeOADEHkAeQADIHkgeSADMHlAeUADQHlgeWADUHmAeYADYHmgeaADcHnAecADgHngekADkAAgAnAAIAEQAAABMANQAQAHsAewAzALgAuAA0ANcA1wA1AOgA6AA2AQMBBAA3AR4BHgA5AVwBXAA6AWkBaQA7AYcBiQA8AagBqAA/AbkBuQBAAdMB1gBBAdgCJABFAioCKgCSAjgCOQCTAlICUgCVAlsCWwCWAmYCZwCXAokCiQCZAo0CjQCaAo8CjwCbAqACoACcBMwE2wCdBN0E5QCtBWYFZgC2BYgFiAC3BZkFmQC4BbQFtQC5BbgFuQC7BbwFvgC9BcAFwQDABcMFxADCBcYFxgDEBcgFyADFBcsFywDGBrAGsADHBzgHOADIAEAAAAdUAAAIjAAAB1QAAAdUAAAIjAAAB1QAAAdUAAAIjAAAB1QAAAiMAAAHVAAACIwAAAdUAAAIjAAAB1QAAAdUAAAIjAAACIwAAAdUAAAIjAAAB1QAAAiMAAAHVAAACIwAAAdUAAAIjAAAB1QAAAiMAAAHVAAACIwAAAdUAAAIjAAAB1QAAAiMAAAHVAAAB1QAAAdUAAAHVAAAB1QAAAdUAAAIjAAAB1QAAAdUAAAHVAAAB1QAAAdUAAAHVAAAB1QAAAdUAAAHVAAAB1QAAAdUAAAHVAAAB1QAAAdUAAAHVAAAB1QAAAdUAAAHVAAAB1QAAAdUAAAHVAAAB1QAAAdUAMkJBAeQB5YJ9Ao2Ce4IDgecB6IKTgeoB64HtAgUB7oKcgfACEQKSAgaB8YHzAfSCNoH2AfeCGIH5AmsCIYKcgfqCKQIMglACPgItgfwCawJBAf2B/wJLggCCEoJ6AncCV4IkggIChgIDggUCkgIGgggCCYILAgyCDgJBAg+CEQISghQCFYIXAjyCUAJ6ApCCGIIaAhuCHQI8gmsCHoJ4gnoCIAKPAiGCIwIkgmsCJgJsgmyCegInglSCKQI8giqCbgIsAi2CLwIwgjICM4I1AjaCOAI5gjsCPII8gj4CP4JggkECQoJEAkWCRwJHAkiCSgJLgmsCTQJOglACUYJTAlSCjYJ6AlYCdwJXglkCWoJcAl2CXwJggmIChgJjgoYCZQJ0AmaCaAJpgmsCbIJ0Am4Cb4JxAnKCdAJ1gncCkIKBgniCegJ7gn0ClQKWgn6CmYKAApgCmYKBgpyCgwKEgo8CjAKGAoeCiQKKgpOCmwKPAowCmwKNgo8CkIKSApOClQKWgpmCmAKZgpsCnIKeAp+CoQBKAl0CPYI/AkCC1QJCAkOCRQLnAkaCSAJJgksCwwLwAkyC8ALkAk4CZIJnglECT4JRAuuCUoLxgoQCrIJ+AwICVAJVgoQCVwJXAliCjQKTApSDBoKUgloCnwKjgnIDBoMFAq+CW4L5ArQCXQJdAu0C1QLVAtaCXoJhgmACYYJjAmSCZgJngmkCaoLxgvGCbAMCAwICzwJtgwaCbwJwgwaCcgJzgnUCdQJ2gngClIKIgsSCeYKEAnsCxIJ8gn4CfgL5AsSCoIJ/gswDBQLMAoECgoLHgvMCxILEgrWDBoKEAoQChYKHAoiCigKLgo0CjoKQApGCkYKTApSClILEgpYCuIMGgpeCmQKagp2CnAKdgp8CyQKggqICo4KlAqaCqAKpgqsCrIKuAwUCr4KxArKCtAK1grcCuIK6Ar0Cu4K9Ar6CxgLAAsGCwYLDAsSCyoLKgsSCxgLPAseCyQLKgswCzYLPAvGDRwL8AtCC8YLSAtOC1QLWgtgC2YLbAvAC4QLcgt4C34LhAuKC5ALlgucC6ILwAuoC64Lrgu0C7oLwAvGC8wMCAvSC9gL3gwaC+QL6gvwC/YL/AwCDAgMDgwaDBQMFAwaDCAMgAyqDCYMwgwsDDIMkgyYDDgMngw+DKQNFgzaDLAM2gxEDEoMegxoDFAMVgxcDQoMjAxiDGINEAzCDMIMmAzaDKoMegxoDGgMbgx0DHoMgAyGDIwMkgyYDJ4MpA0WDKoMsA0KDLYMvAzCDMgMzgzUDNoM4AzmDOwM8gz4DP4NBA0KDQoNEA0WDRwAAQEoAAIAAwAEAAUABgAHAAgACQAKAAsADAANAA4ADwAQABEAEgATABQAFQAWABcAGAAZABoAGwAcAB0AHgAfACAAIQAiACMAJAAlACYAJwAoACkAKgArACwALQAuAC8AMAAxADIAMwA0ADUASwBMAE4AbgBvAHsAiwC2ALcAuAC+ANcA6ADuAQMBBAEbARwBHgE+AT8BXAFpAYcBiAGJAY8BqAG5Ab8BwAHTAdQB1QHWAdgB2QHaAdsB3AHdAd4B3wHgAeEB4gHjAeQB5QHmAecB6AHpAeoB6wHsAe0B7gHvAfAB8QHzAfQB9gH3AfgB+QH6AfsB/AH9Af4B/wIAAgECAgIDAgQCBQIGAgcCCAIJAgoCCwIMAg0CDgIPAhACEQISAhMCFAIVAhYCFwIYAhkCGgIbAhwCHQIeAh8CIAIhAiICIwIkAioCNgI4AjkCTwJQAlICWwJlAmYCZwKJAo0CjwKRApcCmQKcAqADigOMA7ADswO1A7YDuAO6A74DwwPGA8cDywPNA84DzwPUA9YD4QPiA+MD7APtA/QD9gP5A/wD/wQBBAIEBAQGBAoEDwQSBBMEFwQZBBoEGwQgBC4EOAQ5BEUEzATNBM4EzwTQBNEE0gTTBNQE1QTWBNcE2ATZBNoE2wTcBN0E3gTfBOAE4QTiBOME5ATlBPsE/AT+BR4FHwU8BWYFbAWIBZkFnwW0BbUFuAW5BbwFvQW+BcAFwQXDBcQFxgXIBcsF1QXYBdoF2wXdBd8F4wXoBfAF8gXzBfQGBgYIBhEGEgYZBhsHOAABAdkB/QABASUA9AABAAAA9AABAAAB5gABAAAB/QABAAAAAAABAdUChgABAg0CmgABAWwB5gABAZsB8AABAacB8wABAc8CEQABAZkB5gABAAAC3AABAAACmAABAAADIAABAAACtwABAAAC7wABAVcAAAABAREAAAABAQsAAAABAQoAAAABAQgAAAABANYAAAABANcAAAABAQAAAAABAPcAAAABAMwAAAABARkAAAABAPQAAAABAOMAAAABASYAAAABASUAAAABAeMAAAABAZUAAAABAIAAAAABAUwAAAABAUIAAAABAWwAAAABAVsAAAABAYgAAAABAHMAAAABARIAAAABAPMAAAABAOoAAAABAKwAAAABAQ8AAAABAaMAAAABAKgAAAABAYkAAAABAI8AAAABAZkAAAABAVkAAAABAH0AAAABASQAAAABAAD/6gABAAACpgABAS7/6gABAVf/6gABAUX/6gABAIT/6gABAUj/6gABASH/6gABAW3/6gABAUz/6gABATb/6gABAQL/6gABAYz/6gABAPz/6gABARr/6gABAPn/6gABAQr/6gABAPr/JgABAaX/6gABAH//NQABAan/NQABANb/6gABAMj/JgABAV//6gABAUv/6gABAUL/6gABAVn/6gABAT3/6gABAaP/6gABAHv/6gABAJz/6gABAbv/6gABARH/6gABANf/6gABARv/6gABAQ7/6gABAIP/LQABASj/6gABAWH/6gABASL/6gABAO3/NQABAPT/6gABAaH/LQABAQj/6gABAPf/6gABAN//6gABAGb/LQABAOj/JgABAR//6gABARf/6gABAKz/6gABAJH/6gABAGz/NQABAK3/7AABAL7/6gABAKr/NQABAVv/LQABAPD/6gABAan/6gABAZr/6gABAaX/LQABARX/LQABARP/6gABAMz/6gABAQ//6gABAbL/6gABAVz/6gABAVb/LQABAIH/6gABAJj/LQABALT/LQABAHn/6gABAPH/6gABAOb/MQABAEH/LQABAE//LQABANf/LQABAQX/LQABARj/6gABAWj/6gABAOj/6gABAND/6gABANX/awABAOX/kQABAMn/LQABAQD/6gABALX/6gABAL//6gABAMT/6gABAQf/6gABAK3/6gABAUv/NQABARX/6gABARn/LQABAI//6gABAHT/NQABASP/6gABAPr/6gABAHz/6gABAVv/6gABAOv/6gABARn/6gABARL/6gABAIf/6gABATH/6gABANH/6gABAQT/6gABASb/6gABAR3/6gABAQP/6gABAOH/6gABAVb/6gABAO3/6gABAM7/6gABAST/6gABASr/6gABAOr/6gABAR7/6gABAQv/6gABAP3/6gABASn/6gABAIP/6gABAUP/6gABASv/6gABASf/6gABAIn/6gABAM//6gABAPX/6gABASX/6gABAR8CpgABAUkCpgABATQCpgABAR4CpgABAV8CpgABAUUCpgABAVwCpgABATcCpgABAIUCpgABAWsCpgABAS8CpgABARYCpgABAYkCpgABAQECpgABARgCpgABANoC1gABAQIB/QABAHsCsgABASAC1gABARYB/QABAN8B/QABAQ8CpgABAIMCpgABAhQCpgABAU8CpgABAUsCpgABAQsCpgABAUMCpgABAUICpgABAVYCpgABAVkCpgABAZ0B/QABAIgC1gABAbsB/QABAREB/QABAJQCgwABAQ4B/QABAQsB9gABAR0C1gABAOgC1gABATAB/QABASMC1gABAO0B/QABAQsC1gABAZ4C1gABAN0B/QABASkB/QABAScC1gABARcB/QABAKwB/QABAH0B/QABAK0C1gABALIC1gABAH0C1gABAPUC1gABAIMB/QABAaMB/QABAakB/QABAScB/QABAM8B/QABAZ4B/QABAVwB/QABAVYC1gABANsC1gABANsB/QABAN4B/QABAQEB/QABAQUB/QABANcB/QABALwC1gABAMsC1gABAJECgwABATIC1gABASgB/QABARIB/QABAQ0B/QABAWgB/QABAPkC1gABANAB/QABAOcB/QABAOgB/QABANkB/wABAQAB/QABAMkC1gABANMC1gABAM0C1gABAMQC1gABAQcC1gABAKsCpgABAU4CpgABARUB/QABAHwC1gABAI8B/QABANoB/QABARoB/QABAPcB/QABASIB/QABAHwB/QABAVsB/QABAPkB/QABAQ4CpgABASICpgABAR0CpgABAY8CpgABAUwCqgABAUICqgABAUACpgABASUCpgABAZoCpgABAQUCpgABAb0CpgABAScCpgABAUcCpgABAIQCpgABANkCzgABAQoCpgABAO4CpgABAjUCrgABAVoCpgABAUwCpgABAQsB/QABAPYB/QABAVUB/QABAR0B/QABARMB/QABAPMB/QABARgB/QABAPQB/QABAV0B/QABAMwB/QABAYoB/QABAQgB/QABARAB/QABAOsB/QABAQ8B/QABAOsCMwABARsCMwABAQoCMwABATQCMwABAS8CMwABAIkCMwABARoCMwABAP4CMwABAOICMwABAVYCMwABAOUCMwABAOkCMwABASQCMwABATMCMwABATcCMwABAOoCMwABARQCMwABAQkCMwABAPoCMwABASkCMwABAIMCMwABASACMwABAUMCMwABAScCMwABAR4CMwABAOwCMwABAQ4CHAABAQgCMwABAVoCMwABASoCHAABASACHAABASYCMwABAOYCHAABAWoCMwABAPQCMwABAaECMwABARACMwABAOsCQQABAOgCMwABANACMwABAdICMwABAS0CMwABASUB/QACMBAABAAAMTQzeAAwAIAAAP/s//n/+f/5//L//P/8//b/2P/8/+z/9f/y//X/3f/8//z/9f/8//IAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/70AAAAAAAAAAAAA//L/8v/e//L//P/e//L/nP/8//b//P/iAAP/8v/yAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/+j/xP/v/7D/8v/lAAAAAP+I/9gAAP/R/97/5f+p/+X/3QAAAAAAAP/l/+j/wP/UAAD/wAAA/40AAP/s/+X/5f/2/9gAAP/Y//L/7P/y/8QAFP/b//L/6P/A/+L/8P/8/+L/6P/y//D/7P/s/+z//P/o/+gADQANAAoAEP/s/+8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/8gAAAAAAAAAAAAAAAAAAAAD//P/sAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//YAAAAAAAD/9gAAAAAAAAAA//YAAAAAAAD/6P/8AAD/2QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//YAAAAAAAAAAAAAAAD/5gAAAAAAAAAA//wAAAAA//IAAP/mAAAAAAAJAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/5gAAAAAAAAAAAAAAAP/yAAAAAP/8AAT/+v/2//IAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/9v/8//oAAP/wAAD/6P/2//IAAAAAAAAAAAAAAAAAAAAK//AAAAAEAAAAAAAA//oACgAAAAD/9gAAAAAAAAAAAAD/9v/p//0AAAAA//IAAP/9AAD/8gAAAAAAAP/2//IAAP/iAAAAAP/sAAAAAAAA//L/7P/6/+wACgAAAAAAAAAA/+n/4gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/UAAD/7wAAAAAAAP/sAAD/2AAA/+gAAAAEAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/fAAAAAAAAAAD/6//R/8kAAP/wAAAAAP/w/+sAAAAAAAD//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/+wAAP+r//z/8gAAAAAAAAAAAAAAAAAAAAD/6AAAAAAAAAAAAAD/7AAA/+gAAP/2AAAAAAAAAAAAAP/2/8sABAAAAAD/8gAAAAQAAAAAAAAAAAAA/+z//P/2/9H/7P/8/+8AAAAA/93/0//L/+wAAAAAAAAAAAAAAAD/xAAA//z/xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//P/1AAb/9f/5AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/9EAAP/wAAAAFAAA/+X/2AAAAAAAAAAAAAAAAAAAAAAAAAAKAAP//P/s/+L/wf/2//3/4//VAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/+b/vf/IAAD/6AAAAAAAAAAAAAAAAP+iAAD/yf/8//YAAP/2//IAAAAUAAAAAAAA/8kADQAYAAAAAP/6AAQABv/5/9IAFP/2//L/+P/Y//wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/5QAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/8v/sAAD/8v/sAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/5//YAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/9gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//IAAAAAAAAABAAA//b/8gAAAAAAAAAAAAAAAAAAAAAAAAAA//wAAAAA//IAAP/2//wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/8v/sAAD/7AAAAAAAAAAAAAAAAP/iAAAAAP/2AAAAAAAA//YACgAAAAAAAAAA/+gABgAAAAAAAAAA//wAAAAA//oACgAA//L//AAAAAAAAP/8//z/+v/6AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/5/+j/7AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//IAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/+wAAAAAAAAAAAAAAAD/6QAAAAAAAP/s//b/5v/oAAAAAAAAAAAAAP/fAAAAAAAAAAAAAP/2AAAAAAAAAAD/9v/eAAAAAP/y/+YAAP/lAAAAAP/v//D/8v/s//YAB//v//D/9v/yAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/sAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/+8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//wAAP/sAAAAAAAAAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAADAAAAAP/r/+wAAP/8AAAABgAAAAAAAAAAAAAAAP/yAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/8v/yAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/5QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/+f/5AAD/2AAAAAAAAAAAAAAAAP/2AAD/9v/2//L//P/y//AAEAAAAAAAAP/s/+wABQAGAAAAAAADAAAAAP/h//IAAP/vAAAAAAAAAAAAAAAA/+sAAAAA//kAAAAAAAAAAAAA//n/6AAAAAAALwAGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/8v/sAAD/7P/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/8//YAAP/1AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/8kAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/v/+IAAP/2AAAAAAAAAAAAAAAAAAAAAP/8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/+QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/yP/AAAD/5QAAAAAAAAAAAAAAAAAAAAD/yQAA//YAAP/2/+gAAAAAAAAAAAAA/8cAAAAAAAAAAAAAAAAAAP/r/8AAAP/o/+sAAAAAAAAAAAAA//UAAAAAAAAAAAAAAAAAAAAAAAD/9gAAAAAAAAAA/8MAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/9f/5//z/+f/xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/8//wAAAAAAAAAAP/yAAD/9v/8AAAAAP/y//L/9gAAAAAAAAAA//z//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/s//YAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//YAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//wAAAAAAAAAAAAAAAD//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/7AAA//wAAAAAAAAAAAAAAAAAAAAAAAAAAP/2AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/h/+gAAP/o/+gACgAAAAAAAP/wAAAAAAAAAAAAAAAAAAAAAP/lAAAAAAAAAAAAAAAA//IAAAAAAAAAAAAA//YAAP/w//YAAAAA//b/6P/wAAAAFAAAAAD/9v/2/90AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/7AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/8QAA//YAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//n/2AAA//H/9gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//P/2AAD/8QAAAAAAAAAA//n//QAAAAD/+QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/6EAAP/sAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/yP/IAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/5//kAFAANAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/xP/iAAAAAAAAAAD/7AAAAAAAAAAAAAAAAAAAAAD/5gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/xP/mAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP9//7f/vwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/6EAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/9gAAP/sAAAAAAAAAAAAAAAAAAD/4v/T/8H/0//W/6MAAAAAAAAAAAAAAAAAAAAAAAD/xP/v/+//sgAAAAD/3AAA/9IAAP/K/4P/tv/5AAAAAP+X//D/2P+r/7IAAP+X/9z/zAAAAEP/3wAbAAD/3AAAAAAAAP/FAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/+UAAAAAAAAABwAAAAAAAAAAAAAAAAAA//z//P/8//b/7AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/8gAAAAD//AAAAAD/+gAAAAAAAAAAAAD/9wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA3/5v/1AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/1AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//QAAP/mAAD/5gAAAA0AAAAAAAAAAP/rAAAAAP/5/+v//P/r/+sAAAAAAAAAAAAA/90AAAAAAAAAAAAAAAAAAAAAAAAAAAAA//UAAAAA//n//AAA/+cAAAAA/+4AAP/5AAAAAAAA/+7/+f/8AAAAAAAAAAAAAP/8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAU/+wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/6AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/+wAAAAUAAAAAP/5AAAAAAAAAAAAAAAAAAAAAAAAAAD//P/5AAD/8gAA//wAAP/8AAAAAAAAAAAAAAAA//kAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//X//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/2//wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/iAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/+f/u/+4AAP/SAAAAAAAAAAAAAAAA/9gAAP/r//D/5f/8/+X/3wAU//IAAAAAAAD/7//yAAMAAAAA//YAAAAA/+X/8gAJ/+z/8AAAAAAAAAAAAAD/7wAAAAD/+QAAAAAAAAAAAAD/+f/2//wAAAAbAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcAAP/yAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP+jAAD/8gAAAAcAAAAAAAAAAAAAAAAAAP/v/+v//P/r/+EAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//kAAAAA/9EAAAAA//wAAP/8AAAAAAAA//n/+f/2AAD/9gAAAAAAAP/8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/xAAD/9gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/+f/xAAD/8f/2AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/8//YAAP/xAAAAAAAAAAD/+f/9AAAAAP/5AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/+wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/+YAAP/2AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/5AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//kAAAAAAAAAAAAA//IAAAAAAAAAAAAGAAAAAAAAAAAAAAAA//IAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//wAAAAAAAAAAAAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/sAAD/+QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//wAAAAAAAAAAAAA//n/3AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//YAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/0QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/7P/z/98AAAAAAAAAAAAAAAAAAAAAAAAAAP/f//wAAAAAAAAAAAAAAAAAAAAAAAD/sAAAAAAAAAAA//n/4QAAAAD/8AAAAAD/8v/bAAAAAP/8/+v/3f/e/+gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//EAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/7P/xAAAAAAAAAAD/7wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/7wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP+iAAD/7AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/9gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//YAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/0v/yAAD/8AAAAAAAAAAA//IAAAAA/+b/wP/l//AAAP/mAAD/7P/i//oAAP/mAAD/9gAAACgAAAAQAAAAAP/lAAAAAP/2AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/lgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//MAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//AAAAAAAAAAAAAAAAAAAAAAAAP/c/+gAAAAA/+wAAAAA/9wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/cAAAAAP/2/+gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/5D/7AAAAAAAAP+1AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/3wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/+AAAAAAAAAAAAAAAAAAAAAAAAP/yAAYAAAAGAAD/0gAAAAAAAAAE/+gADQAAAAAAAP/O/+gAAAAAAAAAAAAA//b/sgAAAAD/z//H/9H/2P/v/+gAAP/o//AAAAAA/+gAAAAAAAAAAAAAAAAAAAAA/9gAAAAAAAAAAAAAAC4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/2AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/0//L/5gAAAAAAAAAAAAAAAAAAAAD/5wAA/+P/7//vAAD/7//vAAAAAAAAAAAAAP/HAAAAAAAAAAAAAP/8AAAAAAAAAAAAAP/SAAD/5v/2AAAAAP/1AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/5QAA//kAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/+wAAAAAAAAAAAAA/+z/9QAAAAAAAAAAAAAAAAAAAAAAAAAA//IAAAAA/+YAAP/s/+8AAP/wAAD/+QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/8AAAAAP/2/+wAAAANAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/uAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/eAAAAAP/yAAAAAAAAAAAAAwAGAAAAAAAG/+gADf/8AAAAAP/2/+8AAAAAAAAADwAA/+z/7AAAAAAAAP/o/+v/3AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/5//kAAP/5AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/7AAA/+UAAAAAAAAAAP/2//wAAAAA//YAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/8gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//oAAP/f/+f/8wAA//AAAAAAAAAAAAAAAAAAAAAA/+MAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//oAAAAAAAD/8wAAAAAAAgAwAmgCbAAAAm8CbwAFAnECcgAGAnYCdgAIAngCeAAJAnwCgQAKAoUChQAQAogCjQARAo8CjwAXApEClQAYApcClwAdApkCmgAeAp0CngAgAqACogAiAqQCqgAlAq0CrgAsArACwwAuAtoC4gBCAusDSQBLA1oDigCqA40DjQDbA5cDlwDcA7EDsgDdA7cDtwDfA8MDwwDgA98D3wDhA+ED4QDiA+cD5wDjA/oD+wDkA/4D/gDmBAMEAwDnBA8EDwDoBCsEKwDpBDMEMwDqBEYERwDrBbgFvADtBb8FvwDyBcEFwgDzBcYFxgD1BcgFyQD2BcwFzwD4BdYF1wD8BdwF3AD+BegF6AD/BgQGBAEABgYGBgEBBgwGDAECBh8GIAEDAAIAYAJoAmgACgJpAmkADQJqAmoAGgJrAmsAEwJsAmwAFgJvAm8AKwJxAnEAHgJyAnIACgJ2AnYAKwJ4AngAKAJ8AnwAJAJ9An0AEAJ+An4AJgJ/An8AIgKAAoAACgKBAoEAFgKFAoUAKwKIAogAIgKJAokACAKKAooACwKLAosAGAKMAowAEQKNAo0AFAKPAo8AFwKRApEAGwKSApIAHAKTApMAHwKUApQAGwKVApUAIAKXApcAKQKZApkAKQKaApoALgKdAp0AKQKeAp4ADgKgAqAAKQKhAqEALQKiAqIACwKkAqQAKQKlAqUACAKmAqYAFAKnAqcAFwKoAqkAGwKqAqoAKQKtAq0AKQKuAq4AGwKwArsACgK8AsMAFgLaAuEAKwLiAuIAKALrAvQAIgL1Aw8AGwMQAxwACAMdAyQAFAMlAy8AFwMwAz8AGwNAA0kAKQNaA2QAKQNlA3AACANxA3wAFwN9A4gAKQOJA4kAHAOKA4oAKQONA40ALAOXA5cAGwOxA7IABQO3A7cABQPDA8MAAgPfA98AAgPhA+EABwPnA+cABQP6A/sAAgP+A/4AAwQDBAMAAwQzBDMAAwW4BbgACQW5BbkADAW6BboAGQW7BbsAEgW8BbwAFQW/Bb8AKgXBBcEAHQXCBcIACQXGBcYAKgXIBcgAJwXJBckALwXMBcwAIwXNBc0ADwXOBc4AJQXPBc8AIQXWBdcABAXcBdwABAXoBegAAQYEBgQAAQYGBgYABgYMBgwABAYfBiAAAQACAScCaAJoAFkCawJrAGUCbQJtAGECbwJvAF8CcgJyAFkCdQJ1AGgCdgJ2AF8CeQJ5AGcCegJ6AFQCewJ7AGACfAJ8AFwCfQJ9AFoCfgJ+AF0CfwJ/AFsCgAKAAH4ChwKHAGACiQKJAGkCigKKAGoCiwKLAEsCjAKMAGsCjQKNAGwCjgKOAHcCjwKPAG0CkAKQAHACkQKRAEwCkgKSAG0CkwKTAGYClAKUAHsClQKVAE0ClgKWAHYClwKXAG8CmAKYAGMCmQKZAGQCmgKaAG8CmwKbAE4CnAKcAHECnQKdAG8CngKeAEoCnwKfAHECoAKhAG8CogKjAHACpAKkAG8CpQKlAGkCpgKmAGwCpwKnAG0CqAKoAEwCqQKpAHMCqgKqAG8CqwKsAHECrQKtAG8CrgKuAHMCrwKvAHECsAK5AH4CugK7AFkC6QLqAGAC9QL1AFkC9gL9AH4DBwMHAFsDEAMcAGkDHQMkAGwDJQMvAG0DMAMxAEwDMgMyAHMDMwMzAEwDNAM/AHMDQANHAG8DSANJAGQDSgNZAHEDWgNkAG8DZQNwAGkDcQN8AG0DfQOIAG8DiQOJAG0DigOLAG8DjAOMAHsDjQONAHgDjgOOAG4DlwOXAEwDsAOwACQDtAO0ACgDtwO3ADkDuwO7AC0DvgO+ADADwQPBADADwgPCAAsDwwPDADUDxAPEACwDxQPFAAYDxwPHACcDygPKAAsDzQPNADkDzwPPADgD0gPSAAsD1APUADAD1QPVACsD2QPZAAkD2gPaAC0D3APcAAsD3wPfADUD4QPhAEYD4gPiADAD4wPjAAcD5wPnADkD6QPpAAsD6wPrADAD7APsAD8D7gPuAAYD7wPvACcD8wPzACQD+AP5ADAD+gP7ADUD/AP8AAED/QP9ACUD/gP/ADEEAAQAAAIEAQQBAAoEAgQCAA4EAwQDAA0EBAQGADEEBwQHAAQECAQJADEECgQKAAoECwQLADEEDAQMAC4EDQQNAAoEDgQOADMEDwQPADQEEAQQAAoEEQQRAAUEEgQSADEEEwQTACYEFAQVADEEFgQWADMEFwQYADEEGQQZAAMEGgQaADEEGwQbAAwEHAQdAAoEHgQeACkEHwQfADEEIAQgAAoEIQQhACoEJQQlAAgEJgQmAAQEJwQnADEEKAQoACkEKQQqADEEKwQrADQELAQsADEELQQtADYELgQuAAoELwQvAC8EMAQwADEEMQQxABIEMgQyAA4EMwQzAA0ENAQ0ADEENQQ1ADMENgQ2ADEENwQ3AAoEOAQ5AC8EOgQ6AAUEOwQ7ACYEPQQ9AA4EPwRAAAEEQQRBAAoEQgRCABMEQwRD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AAD/8P/fAAAAAAAAAAAAAP/6AAoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/6//JAAAAAP/KAAAAAAAAAAAAAP/y//D/xP/YAAAAAP/lAAD/6wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/RAAAAAAAAAAAAAAAAAAAAAP/v/+wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/3//U/5z/zf/o/70AAAAA/94AAAAAAAAAAAAA//z/8P/vAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/o/7YAAAAAAAD/8v/5//wAAP/5//n/8QAA//n/9f+w/+UAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/7T/ywAAAAAAAP/1//z/8gAA//z/9v/y/+X/5f/1/+X/+f/s/9gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/2/+z/6P/o//X/9f/PAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//YAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/oAAD/9gAAAAAAAAAA//b/7P/sAAAAAAAA//z//AAAAAn//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADQADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/o/+z/4gAA//X/8AAX//YAAAAAAAAAAAANABD/9gAD/+wAAAAAAAD/9QAAAAAAAAAAAAAAAP/2/+QAAAAAAAD//AAAAAAAAAAAAAAAAAAdAAAAAP/l//YAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/8AAAAAAAAAAD/9gAA//IAAP/8/+sAAAAAAAAADgAAAAD/8gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/+z/7AAA//z/7P/w/+wAAP/w/+8AAP/S/9X/7AAA//D/8gAG//kAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/7AAAAAAAAAAAAAAAAAAAAAD/+f/iAAAAAAAAAAAAAAAAAAAAAAAQAAAAEAAA//z/+QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//wAAP+w/+z/7P/fAAAAAAAA//AAAAAA//AAAAAA/8QAAAAAAAD/0QAAAAAAAAAAAAAAAP/s//kAAAAA//L/2QAA//wAAP/y/9n//P/hAAAAAAAAAAD/0f/yAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/z/98AAAAAAAD//P/8AAAAAAAA/+gAAP/J//z/9v/N/+YAAP/eAAYAAAAA/+wAAAAA//wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/cAAD/0//3AAD/0//oAAD/if/s/+wAAP+WAAAAAAAAAAD//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//n/2AAAAAAAAAAAAAAAAAAAAAAAAAAA//MAAP/2AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/6AAAAAAAAAAA/9IAAP+yAAAAAP+yAAAADv+IAAQAAAAA/5AAAP/4AAAAAAAAAAD/1f/OAAAAAP/P/6v/9gAAAAD/xP+r//L/6AAAAAAAAAAAAAD/7AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/+wAAAAAAAAAAP/sAAD/bv/1AAD/yAAAAAAAAP/f/+wAAP/2AAAAAAAA/+j/tQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//L/9v/s/+wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//IAAAAAAAAAAP/2AAD/9gAAAAAAAAAAAAAAAAANAAAACAAAAAYAAAAAAAYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/9gAAAAAAAAAAAAD/+QAAAAAAAAAAAAAAAAAA/+z/8gAAAAAAAAAAAAD/6wAA//kAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/+gAAP/4/9gAAAAJAAD//P/w/+wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/yAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/9gAAAAAAAAAAAAAAAAAAAAD/5f/s/+wAAAAAAAAAAAAAAAAAAP/rAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/8/+X/7v/YAAAAAAAAAAf/0QAAAAAAAAAAAA8AAAAA/+z/2AAAAAAAAP/MAAAAAAAAAAAAAAAA/9j/7AAAAAAAAAAA/9QAAAAAAAD//P/yAAD/4//y//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/+z/9gAAAAD/9gAAAAAAAP/m//IAAP/oAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/nAAAAAAAAAAAAAAAAP/eAAAAAAAA/88AAP/y//IAAP/EAAD/8gAA//YAAAAA//YAAP/sAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHAAAAAAA6AAD/1f/2AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/9P/3wAAAAAAAAAAAAD/1QAA/+gAAP/yAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/5AA0AAP/EAAD/tP/i/8X/tP/iAAn/WgAA//MAAP+hAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/mAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAAAAAAAAAAAAAAAAAAAAAAAD/4gAAAAAAAAAAAAAAAP/sAAD/yAAA/8gAAAAA//n/4gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/9YAAP/jAAAAAAAA/6P/0/+D/7cAAP+DAAAAAP9MAAAAAP/s/38AAP/YAAAAAAAAAAD/o//E/8UAAP+X/5P/u//L/7L/j/+T/+L/7//TAAD/3P/T/+f/vwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAA/5MAAAAHAAAAAP+//8//PwAA/9j/2AAA/78AAP+h/7cAAP/SAAAAAP+3/5cAAAAAAAAAAP/F/8X/3wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//H/6P/f/+IAAAAA/+kAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/+QAA/+wAAAAAAAAAAP/2AAD/8gAAAA8AAAAAAAgAAAAAAAAAAP/2//oAAP/2AAAAAP/5AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/7//5AAAAAAAAAAD/9gAAAAAAAAAAAAD/7AAA//L/6AAA//wAAAAAAAD/7wAA//kAAP/5AAAAAAAAAAf/8gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//wAAAAD/+UAAP/2/+8AAAAAAAAAAP/s//IAAAAAAAD/7AAAAAYAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/yAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/8gAAAAAAAAAAAAAAAAAAAAAAAP/s/+8AAAAAAAD//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//D/7P/oAAD/+f/2ABD/0QAAAAYAAAAAAAAAAwAU/+z/5QAAAAAAAP/YAAAAAAAAAAD/9gAD/9v/8gAAAAAAAAAN/+EAAAAA//YAAP/wAAD/7//w/+wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/+f/2AAAAAAAAAAAAAAAAAAAAAAAA//IAAAAA//n/9gAA/+wAAP/l//IAAP/yAAAAAP/5//kAAAAAAAAAAAAAAAAABgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//D/9v/o/+X/+f/2/94AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//wAAAAAAAAAAP/yAAAAAAAAAAAAAAAAAAAAAAAAAAD/+QAAAAUAAAAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/7AAAAAD//P/8AAAAAAAAAAAAAP/sAAAAAAAAAAAAAAAAAAoAAAAA/+wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//wAAAAA//YAAAAA//IAAAAAAAAAAP/8//AAAAAAAAAAAAAAAAD//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/2AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/9gAAAAAAAAAAAAAAAP/2AAAAAP/s//YAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/+gAAP/pAAAAAAAAAAr/7AAA//IAAAAAAAAAAP/2//D/3wAAAAAAAAAAAAAAAAAAAAAAAAAA/+n/9gAAAAAAAAAA/+UAAAAA/+EAAP/2AAAAAP/2//P/9gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/2/+kAAAAAAAD/6AAAAAAAAAAAAAAAAAAAAAAAAAAA//YAAAAAAAAAAAAAAAAAAAAAAAAACv/2//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGgAAABoAAAAtAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH/0QAAAAAAAAAAAAAAAP/wAAAAFAAA//AAAAAAABcAAP/wAAAAEAAAABoAAAAAABcAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8ACEAAABiAAD/9gANAA4AAAAAAAAAFAAAAAAAAAAAAAAABgAA//b/8AAAAAAAAP/8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACgAAAAAAAD/8AAAAAD/8AAQADX/vQAoAA8AAP/EADUAAAAdAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABsAAAAAAAAAAAAAAAAAAAAAADUAAAAAAAAAAAAAAAAAAAAAAAD/8gAA//IAAAAo//wADQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8AAAAKAAAAB0ALwAA//IAAP/f/+wAAP/fAAAAAP+wAAAAAP/w/7AAAAAAAAAAAAAAAAD/8AAA//YAEP/f/9//9gAA//r/2P/f//YAFwAAAAAAAP/2AA//8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALwAYAAAAAAAA/+gAAAAtABQAAAAAAAD/nAA1AAAAAAA1/+wANf/f/+UAAAAAAAAANQAA/+8AAAAAAAAAAP/s/+wAAAAAAAAAAAAAAAAAGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/9gAAAAAAAD/5QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGAAAAAAADAAAAAAAGAA3/3AANAAAAAP/oAAAAAAAAAAAAAAAAAAAAAAAAAAD/9gAAAAAAAAAA//YAAAAAAAAAAAAGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/2AAAAAAAAAAAAAAAA/9gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/+8AAP/lAAD/9QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/9gAA/+8AAAAPAAD//AAIAAAAAAAAAAAAAP/5AAAAAP/yAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFgAA//H/+f/2//wAAAAA//wAAAAAAAAAAAAA/+wAAP/o//IAAAAAAAAAAAAA/+8AAP/5AAD/9QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/9v/sAAAAAP/2AAAAAAAJAAAAAP/wAAAADQAJ//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//IAAP/sAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/iAAD/4gAAAAAAAAAA/98AAAAAAAAAAAAAAAAAAP/j/98AAAAAAAD/6AAAAAAAAAAAAAAAAP/o//AAFAALAA0AHf/mABQADwAAAAD/7wAA//b/7//wAA0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/yAAAAAAAAAAAAAP/5AAAAAAAAAAAAAP/5AAD/5f/vAAAAAAAAAA0AAP/5AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/t/+//x//Y//T/5v/nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//YAAAAAAAAAAAAAAAD/8gAAAAAAAAAAAAAAAP/rAAAAAAAA/+///P/8AAAAAP/8AAD/7wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/8v/j/+YAAAAA//wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/sAAAAAP/wAAAAAAAAAAD/8v/3/+b/5v/sAAD/5f/sAAD/7AAA//X/8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/5AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/8/+UAAAAAAAAAAAAAAAD/+QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA0AAAAAAAAAAAAAAAAAAAAAAAD/9gAA/+j/7AAAAAD/3gADAAAAAAADAAAAAAAGAAv/6AAGAAAAAAAAAAAAAAAAAAAAAAAAAAD/9gAAAAAAAP/pAAD/+QAA//n/8P/y/+8AAAAPAAAAAP/l//IAAAAAAAAAAAAA/+wAEAAAAAAAAP/2AAAAAP/vAAD/7AAAAAAAAAAAAAb/5v/8//wAAAAAAAD/8gAA/9gAAAAA/93/9gAAAAAAAAAAAAAAAAAAAAAAAAAA/+4AAAAAAAAAAAAAAAAAAAAAAAP/6AAAAAAAAP/2//L/2P/sAAAAAAAAAAAAAAAA/7cAAP+0/+z/twAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/98AAAAAAAD/7P/sAAAAAAAA//IAAP/bAAAAAP/vAAD/7AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/v/+wAAD/yQAA//b//P/2AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/6/+9AAAAAP/KAAD/8gAAAAAAAP/y//L/yv/fAAAAAP/l//D/6wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP+9AAAAAAAAAAAAAAAAAAAAAP/r//IAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/6f/s/4//0f/l/78AAAAA/+gAAP/2AAAAAAAAAAD/7P/o//AAAAAAAAAAAAAAAAAAAAAAAAAAAP/2/78AAAAEAAD/9gAAAAD//f/2//b//AAAAAD//P/L//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/7//qwAAAAAAAP/8AAD/9gAA//z/6AAA//D/4f/y/+j/8gAA/+EAAAAAAAD/7AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/yAAD/7AAAAAAAAP/oAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/6AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/5AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGAAAAAAAXABMAAAANAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/+z/8gAA/+YAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOAAcAAP/sAAAAAAAAAAD/6wAAAAAAAP/jAAD/9v/2AAD/2AAA//AAAAAAAAAAAAAAAAD/7AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJgAA/9wAAP/2AAAAAAAAAAAAAAAAAAAAAAAA//IAAP/m/+4AAAAAAAAAAAAA//IACv/yAAD/8gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/4v/s/8//3//V/8//7AAA/48AAP/zAAD/qf/2AAAAAAAKAAYACgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/5gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/8/+YAAAAAAAAAAAAAAAD/8gAA/+P/3P/SAAAAAAAA//YAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP+/AAAAAAAAAAAAAP/uAAD/7QAAAAAAAP/B/9//q//FAAD/q//m/+b/iP/uAAD/7P+WAAD/wAAAAAAAAAAA/7f/2P/cAAD/p/+//8X/1f/C/6D/u//Z/+z/3//E/+j/3//z/88AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP+jAAAAAAAAAAD/0//Z/4IAAP/s/+gAAP/YAAD/t//RAAD/2QAAAAD/y/++/6cAAAAAAAD/0v/S/9MAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/qwAAAAAAAAAA//IAAP/YAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUABQAAAAAAAAAAAAAAAAABAAA//wAAAAoAAAAAAAAAAAAEQAAAAAAAP/8AAAAAP/8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/5AAAAAAAAAAAABgAAADcAAAAAAAAAAAAAAAAAAAAAAAAAAP/8AAAAAAAAAAAAFAAAAAAAAAAAAAAAAAAKAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//P/8AAAAAP/yABsAAAAAABsAAAAAAAD//P/2ACEAIQAA//z//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//wAAP/8AAAAAAAtAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/2/+z/7P/yAAAAAAAA//kAGwAAAAAAGwAAAAAAAP/8//YAFAAUAAAAAAAAAAAAAAAAAAcAAP/5/+8AKAAbAAcAB//2ACQAGwAAAAD//AAA//YABv/sAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//AAAAAAAAAAEAAAABwBDAAAAAAAAAAAAAAAAAAAAAAAAAAD/9gAAAAAAAAAAABQAAAAHAAAAAAAAAAAAFAAHAAAAAAAAAAAAAAAAAAcAAAAAAAAAAAAAAAAAAP/4AAcAAP/2//L/6P/l//b/7AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/6//JAAAAAP/DAAD//P/8AAAAAP/5//z/xP/cAAAAAP/l/+X/6wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/JAAAAAAAAAAAAAAAAAAAAAP/x//YAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/8v/f/73/0f/2/70AAAAA/+sAAAAAAAAAAAAAAAAAAP/1AAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/v/74AAAAAAAAAAAAAAAAAAAAAAAD/9QAAAAD/8v/LAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/8T/vQAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/7wAAAAAAAAAA/+8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAdA7ADsAAAA7MDtgABA7gDwgAFA8QD1wAQA9kD3gAkA+AD4AAqA+ID5gArA+gD6wAwA+4D7wA0A/ED+QA2A/wD/QA/A/8EAgBBBAQEDgBFBBAEIQBQBCYEKgBiBCwEMgBnBDQENwBuBDoEPQByBD8ERQB2BdUF1QB9BdgF2wB+Bd0F5wCCBekF/ACNBf4GAwChBgUGBQCnBgcGCwCoBg0GEACtBhMGFACxBhYGHgCzAAIAlwOwA7AAAgOzA7MAEwO0A7QAMAO1A7UAGQO2A7YAIQO4A7kAKgO6A7oAIQO7A70AKgO+A74AJAO/A78AKgPAA8AADQPBA8EAEAPCA8IALQPEA8QACwPFA8UAFgPGA8YAMAPHA8gAKgPJA8kAMAPKA8oAJwPLA8sAKgPMA8wAJwPNA84AJAPPA88AKgPQA9EAGQPSA9IABgPTA9MAEwPUA9QAEAPVA9UACQPWA9cAKgPZA9kAHgPaA9sAJwPcA9wAMwPdA90AIQPeA94AKgPgA+AAKgPiA+IAJAPjA+MAHAPkA+UAEwPmA+YAIQPoA+kAIQPqA+oAMAPrA+sAEAPuA+4AFgPvA+8AMAPxA/EAKgPyA/IAIQPzA/MAAgP0A/UAGQP2A/YAJAP3A/cAKgP4A/kAJAP9A/0AAwP/A/8AEQQABAAALgQBBAEAFwQCBAIAHwQEBAUAKAQGBAYAHwQHBAkAKAQKBAoAIgQLBAsAKAQMBAwAIgQNBA0ADgQOBA4AKwQQBBAAIgQRBBEAFAQSBBIALgQTBBQAKAQVBBUALgQWBBYAJQQXBBcAKAQYBBgAJQQZBBoAIgQbBBsAKAQcBB0AFwQeBB4ABAQfBB8AEQQgBCAADgQhBCEABwQmBCcAJQQoBCgAMQQpBCkAHwQqBCoAKAQsBCwAKAQtBC0AJQQuBC4AIgQvBC8AGgQwBDEAEQQyBDIAHwQ0BDUAHwQ2BDYALgQ3BDcADgQ6BDoAFAQ7BDsALgQ8BDwAMQQ9BD0AHwRABEEAFwRCBEIAIgRDBEMAKAREBEUAIgXVBdUAAQXYBdgAEgXZBdkALwXaBdoAGAXbBdsAIAXdBd4AKQXfBd8AIAXgBeIAKQXjBeMAIwXkBeQAKQXlBeUADAXmBeYADwXnBecALAXpBekACgXqBeoAFQXrBesALwXsBe0AKQXuBe4ALwXvBe8AJgXwBfAAKQXxBfEAJgXyBfMAIwX0BfQAKQX1BfYAGAX3BfcABQX4BfgAEgX5BfkADwX6BfoACAX7BfwAKQX+Bf4AHQX/BgAAJgYBBgEAMgYCBgIAIAYDBgMAKQYFBgUAKQYHBgcAIwYIBggAGwYJBgoAEgYLBgsAIAYNBg4AIAYPBg8ALwYQBhAADwYTBhMAFQYUBhQALwYWBhYAKQYXBhcAIAYYBhgAAQYZBhoAGAYbBhsAIwYcBhwAKQYdBh4AIwACARoAAgACAGgABAAEADAACAAIADAACwALAGoAEAAQADAAEgASADAAFQAVADMAFgAWADUAFwAXADgAGQAZADsAGgAaAD0AGwAbAGsAIQAhAC4AJAAkAG8ALwAvADIAMQAxADYANAA0ADwANgBNAGgAVABYADAAcwB7ADAAjgCOAGoApQC/ADAA0ADXADMA2ADvADUA9AD7AD0A/AEAAGsBQgFCAC4BUAFbAG8BoQGoADIBxgHNADwB1wHXAG8B7QHtADwCEQISADICGQIZADYCJQIpAC4CKgI3AGkCZAJkAC4CZQJlAG8DjgOOAGEDsAOwABwDsQOzAG4DtAO0ACADtQO1AG4DtgO2AE8DtwO3AE4DuAO6AG4DuwO7ACUDvAO9AG4DvgO+ACoDvwPAAG4DwQPBACoDwgPCAAMDwwPDAEwDxAPEACMDxQPFACcDxgPGAG4DxwPHAB4DyAPJAG4DygPKAAMDywPMAG4DzQPNAE4DzgPOAG4DzwPPAE0D0APRAG4D0gPSAAMD0wPTAG4D1APUACoD1QPVAFUD1gPXAG4D2QPZAEsD2gPaACUD2wPbAG4D3APcAAMD3QPeAG4D3wPfAEwD4APgAG4D4QPhACwD4gPiACoD4wPjAAED5APkAG4D5gPmAE8D5wPnAE4D6APoAG4D6QPpAAMD6gPqAG4D6wPrACoD7APsAFED7gPuACcD7wPvAB4D8APxAG4D8gPyAE8D8wPzABwD9AP0AG0D9QP1AG4D9wP3AG4D+AP5ACoD+gP7AEwD/AP8ABsD/QP9AEoD/gP/AF8EAAQAAB8EAQQBAFkEAgQCAEUEAwQDAC0EBAQGAF8EBwQHACQECAQJAF8ECgQKAFkECwQLAF8EDAQMAF4EDQQNAFkEDgQOAAIEDwQPACsEEAQQAFkEEQQRACYEEgQSAF8EEwQTAB0EFAQVAF8EFgQWAAIEFwQYAF8EGQQZACIEGgQaAF8EGwQbAEQEHAQdAFkEHgQeAEYEHwQfAF8EIAQgAFkEIQQhACEEIgQjAGYEJQQlAEcEJgQmACQEJwQnAF8EKAQoAEYEKQQqAF8EKwQrACsELAQsAF8ELQQtAAQELgQuAFkELwQvACgEMAQwAF8EMQQxAF0EMgQyAEUEMwQzAC0ENAQ0AF8ENQQ1AAIENgQ2AF8ENwQ3AFkEOAQ5ACgEOgQ6ACYEOwQ7AB0EPQQ9AEUEPwRAABsEQQRBAFkEQgRCAFsEQwRDAF8ERARFAFkERgRHACsEgQSCABQEgwSEABMEhQSFABQEhgSGAGIEiASIAAUEigSLAEAEjASMAD8EjQSNAAYEjgSOAD8EjwSPAAYEkASRABQEkgSSAFMEkwSTAFAElASUAFMElQSVAFAElgSYAFIEmwScAFIEnQSdABYEowSjAFcEpQSlAFcEpwSnAFcEqASoAFoEqgSqAEEErASsAAcEsgSyAGIEswSzAAUEtAS0AGIEtQS2AAUEuAS4AFcEugS6AFcEvAS8AFcEwwTDAEIExATEAEMEywTLAG8EzATMAGMEzgTOAC8E0gTSAC8E1QTVAGQE2gTaAC8E3ATcAC8E3gTeADEE3wTfAGUE4ATgADQE4QThADcE4gTiADkE4wTjADoE5QTlAD4E5gT9AGMFBAUIAC8FIwUrAC8FPgU+AGQFVQVvAC8FeAV/ADEFgQWIAGUFiQWgADQFoQWkADkFrQWxAD4F1QXVAAgF1gXYAGAF2QXZAAoF2gXaAGAF2wXbAFYF3AXcAEkF3QXfAGAF4AXgAA0F4QXiAGAF4wXjACkF5AXlAGAF5gXmACkF5wXnABEF6AXoAEgF6QXpAAwF6gXqAA4F6wXrAGAF7AXsAAkF7QXuAGAF7wXvABEF8AXxAGAF8gXyAEkF8wXzAGAF9AX0AFgF9QX2AGAF9wX3ABEF+AX4AGAF+QX5ACkF+gX6AAsF+wX8AGAF/gX+ABAF/wX/AA0GAAYAAGAGAQYBABEGAgYDAGAGBAYEAEgGBQYFAGAGBgYGABIGBwYHACkGCAYIAA8GCQYJAGAGCwYLAFYGDAYMAEkGDQYNAGAGDgYOABEGDwYPAGAGEAYQACkGEQYRABUGEwYTAA4GFAYUAAkGFQYWAGAGFwYXAFYGGAYYAAgGGQYZAGwGGgYaAGAGHAYcAGAGHQYeACkGHwYgAEgGLgYuABcGMAYwABoGMgYyABgGMwYzABkGNgY2AFQGOAY4AFwGOgY6AGcHJAckAAYHJQclAD8HsgezAC4AAitCAAQAACzkMNIAOQBhAAD/2P/lAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/c/+gABv/YAAYAAwANAA0ADQANAAYADQAGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADQAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/9v/2//b/7v/s/+z/2P/r/93/8v/5//X/+QAN/9T/5v/1//T/5v/r/+b/7AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAUAAAAAP/5AAD/8v/2//kAAP/8//wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAAP/sAAAAAAAAAAD/7AAA/+j//P/5AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAaAAAAFAAAAAkABgAAAAMABQAF//L/8gADAAAAAP/2//kAAAAAAAD/3//v//L/8P/w//IAAP/i//b//P/5/+7/2P/SAAkAAAAAAAD/9v/s//f/8v/s//T/8P/2/+z/7v/rAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/8QAAAAAAAAAAAAAAAP/3AAD/9AAAAAD/8gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANf/yAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/2AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEwAQAAD/7//2/7D/4v/E/9sAAP/EAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/oQAAAAAAAP/lAAD/qQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/9z/3QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAD/1AAA/+X/8gAA/8oAAAAA//wAAP/0AAAAAAAA/+z/iP/2AAD/tAAAAAD/yv/eAAD/4P+y/2j/pP+eAAAAAAAAAAP/5v/q/+P/3P+0/97/yP/c/7L/p/+wAAAAAAAA//L/pAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/oAAAAAP/wAAAAAAAAAAAAAP/5/+z/3gAA/+wAAAAAAAAAAAAAAAAAAAAA//YAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//P/3//5/+UAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/8AAD//AAAAAAAAAAAAAQAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJAAsAFAAAAAAAAAAAABoAAAAAAAAAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGwAbAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAbAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//wAAAAAAAAAAAAAAAAAAAAAAAoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/8gAAAAAAAAAGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/9gAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/8gAAAAAAAP/sAAD/y//v/8cAAP/v/9L/+gAA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AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/9oAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/2gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/UAAAAAAAAAAAAAAAAAAAAAP+9AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/2AAAAAD/ywAAAAAAAAAAAAD/7AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/9gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/+wAAP/Y/+z/6AAAAAD/7AAAAAAACgAAAAD/9f/1/88AAAAAAAAAAAAAAAAAAAAAAAAAAP/2AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/8f/lAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/2AAAAAAAAAAD/9v/sAAAAAAAAAAAAAP/6AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA0AAAAAAAAAAP/8AAAAAwAAAAkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//wAAAAAAAAAAAAAAAAAAAAA//wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//YAAAAX//IAHQAAAAMAEwAQABcADQAJAAYAAAAAAAAAAAAAAAAAAP/o/+wAAAAA//IAAAAAAA4AAAAAAAD/9f/w//UAAAAAAAAAAAAAAAD/8gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/8IAAP/oAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/Y/8YAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/eAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/+v/9gAA//IAAAAAAAD/7P/yAAD/8P/8AAAADv/m/+7/8v/mAAAAAP/sAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACgAAAAAAAAAiAAAAAP/5//kAAAAAAAAAAAAAAAAAAAAAAAAAAP/2AAAAAAAA//YAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/4//qf/iAAD/5v/fAAAAAAAAAAD/7P/2/+MAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/+P/3P/yAAAAAAAAAAAAAP/SAAoABgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP+/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/iP+W/8H/gv/E/8X/7v/T/+b/5v/m/9//0/+3/7cAAP++AAAAAAAA/+4AAP/S/9n/8v+1/+z/t//R/9gAAAAAAAD/wAAiAAAAAAAA/9j/6P/ZAAD/3wAA/94AAP/fAAAAAAAA/6cAAAAA/+4AFAAAAAAAAAAAAAAAAAAAAAAAAP/sAAAAAAAA/8r/xQAAAAAAAAAAAAD/q//T/9IAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//YAAAARAAAAAAAAAAAAEQAAAAAAAAAAAAAAAAAAAAAAAAAJABgAAAAAAAAAAAAAAAAAAAAAAAAAAAAKAAAACgAAAAoALAAvADEAAAAAAAAAFQBJAAAAAAAAAAAAMgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/3wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//AAAAAAAAAAAAAAAAP/2AC8ALwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADUALwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/s//IAAAAAAAAAAAAAAAAAAAAA//kAAAAAAAAAAAAAAAAAAAAAAAgAAAAvAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA1/88AAAAAAAAAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/7AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/+wAAP/sAAAAAP/iAAAAAAAAAAAAAAAAAAD/6AAAAAAAAAAAAAAAAAAAAAAAAAAA//IAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/x//kAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//oAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/9z/6P/2AAAAAP/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/+gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/3//w//z/0QAKAAYACgAGAAYADQAGABMAAP/8//YAAAAAAAAAAAAAAAAAAAAA//n/8gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//AAAP/2AAAAAP/8AAAAAAAAAAAAAAAA/+EAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/2AAAAAAAAAAD//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/90AAP/YAAAAAAAAAAAAAAAAAAAAAAAA/+wAAP/2//wAAAAAAAAAAP/sAAAAAP/y/+gAAP/5AAAAAAAAAAD/9QAAAAkAAAAAAAD/9QAAAAAAAAAA//cAAAAAAAAAAAAAAAD/7AAAAAAAAAAt//MAAP/qAAYAAAAAAAAAKAAAAAAAAAAAAAD/9gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/8H/xP/2AAD/9v/2AAAAAAAAAAAAAAAA//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/2ACEAEwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAAAAAAAAAAAAAAAAAAAAAAGgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/wf+///z/t//6AAAAFP/9ABAACgAA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AC0A9AD7ADMA/AEAADYBAQEBABABAgECAB4BAwEEABABIQEjAA4BKQEpAAUBSwFPAAoBXAFcACUBXgFhAAIBYgFiAAcBYwFjAAUBZQFoAAcBagF1AAoBdgGHAA4BiQGOAAsBjwGRAA4BkgGYABQBmQGfABsBoQGoAB8BqQG4ACUBuQG+ACIBvwHBACUBwgHFACsBxgHNADEBzgHSADQB1AHUAA4B1QHVAAoB2QHbAA4B3gHeABMB4AHgAA4B4QHhACUB5AHkAA4B6wHrACUB7QHtADEB7gHuACUB7wHwAAoB8QHxACUB9AH0AAcB+AH4ABMB+wH8ACUB/QH+AAoB/wH/ABMCAAIAACUCAQIBAA4CAwIDAA4CBQIGAA4CBwIHACUCCQIJABMCCgILABQCDgIOABsCEQIRAB8CFQIVAA4CGQIZACgCGgIaADQCJwInAAcCKAIpAB8COQJPACUCUgJaACUCXQJdAAUEgwSEADgEogSiADcEpASkADcEpgSmADcEtwS3ADcEuQS5ADcEuwS7ADcEzwTPAA8E1gTWAAME1wTXAAgE2gTaAA8E2wTbABEE3ATcAA8E3QTdABUE3gTeABwE3wTfACAE4ATgACYE4QThACkE4gTiACwE4wTjAC8E5ATkADIE5QTlADUFCQUNAA8FPwVBAAMFQgVCAAgFRAVJAAgFVQVkAA8FZgVrAAwFbAVvAA8FcAVwABEFcQV3ABUFeAV/ABwFgQWIACAFiQWYACYFmQWeACMFnwWgACYFoQWkACwFpQWsADIFrQWxADUFsgWyAA8FtAW1AA8GmgaaABkGnQadABcGoQahABkGogaiABcGowajABgGpQalABcGpganABkGqgaqABgGrgauABcGrwawABoGsgayABoGtQa2AC4GuAa4ABoGvAa8ABcGvQa9ABgGvga+ABcHswezAAcAAgDwAAIAAgAnAAQABAAoAAgACAAoAAsACwAEABAAEAAoABIAEgAoABQAFAApABUAFQAWABYAFgAqABcAFwAsABgAGAAuABkAGQBBABoAGgAZABsAGwBFABwAHAAOAB4AIAARACEAIQA2ACIAIgAPACQAJABPACUAJQAQACgAKQBOACoAKgARACsAKwBOACwALAARAC0ALQBOAC4ALgBGAC8ALwAVADAAMAAXADEAMQArADIAMgAtADMAMwAY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AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABcADwANABwACQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/y//AAAP/6AAAAAP/z//IAAAAA//IAAAAA/+z/8v/7AAD//AAAAAAAAP/mAAAAAAAA/+wAAAAAAAAAAAAAAAD/7P/u/+wADgAH/+7/8v/mAAoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/4wAAAAAAAAAAAAD/7P/mAAD/9v/jAAAAAAAAAAD/qf/c//IAAAAA/+L/4v/m/9IACgAGAAoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/77/2f/c/73/5gAv/97/5v/CAAD/vv/o//b/7gAA/9z/0//yAAD/4v/K/7cAAAAAAAD/wP/W/+b/xP/u/9//0//y/68AAP/s/5b/0f/YAAD/p//BAAAAAAAAAAAAAAAAABn/2P/w/+z/x//S/9L/8v/TAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/6//2AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/8AAAAAP/2AAAAAP/2AAAAAAAAAAAAAP/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//AAAAAAAAAAAAAA//IAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/7P/2//b/7AAAAAAAAAAA/7b/8v/yAAAAAP/2//b/9v/oABoADQAOAAAAAAAAAAAAAAAAAAAAAAAA//n/7//2//YAIQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/X/97/5v/X/+UAQ//Y//L/8gAA/9f/8gAA/+T/8v/y/9gAAAAA//z/5v++AAAACQAA/9L/2wAA/+UACgAO/+X/8f/NAAD/5/+l/8n/2//5/73/5QAAAAAAAAAAAAAAAABM//L/7AAA/+v/2P/Y//L/8gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/9QAjAAD/+QAAAAD/+QAAAAAAAP/1AAAAAAAAAAAAAP/5AAAAAAAAAAAAAAAAAAkAAAAAAAAAAAAAAAAAAAAAACEAEAAAAAAAGQAA//wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAACYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/9gAA//YAAAAAAAAAAAAAAAAAAP/yAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//YAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/2AAAAAAAA/+wAFP/8/+z/6AAA//YAAAAA/+wAAP/m//YAAAAAAAAAAP/lAAAAAAAA/94AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/3gAj/+z/+f/hADz/7//hAAAAAP/eAAAAAP/HAAD/5f/oAAAAAP/yAAD/7AAAAAkAAP/dAAAAAAAAAAAAAAAAACEAEAAAAAAAEwAA//wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAACYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/3wAAAAD/7AAA//r/8wAAAAAAAAAAAAD/3//2AAAAAP/9AAAAAP/iAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/9wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/r/+j/3P/w//AAI//8//D/2//z/+v/7P/w//IAAP/c/+n/8v/6//D/8P/eAAAAAAAA/8T/5v/9//AAAP/7AAAAAAAA/98AAAAA/94AAAAAAAAABwAAAAAAAAAAAAAAAAAA//oAAAAAAAAAAAAA//oAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/9AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/xP/y/+j/8P/8/+j/yv/z/9z/+f/lAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/RAAD/8AAAAAAAAAAAAAAAAAAAAAAAAAAUABQAAAAAAAAAAAAAAAAAAAAA/+P/2P/VAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/5QAAAAAAAP/BAAAAAAAAAAAAAAAAAAAAAAAKAAf/+v/i//b/9v/6AAP/9v/9AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/73/yP/J/+gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/mAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//L/yf/yAAD/8v+iAAAAAAAA/9gAAAAAABQAAAAOABAADwAUAA0AGAAX//r/9gAU//YAF//6//H/+f/8//wABP/5//j/2P+w/8z//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//IAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/2AAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/oAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/yAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAE//YAAAAAAAAAAAAAAAAAAAAJAAD/8gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/9gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/yAAD//AAA//z/9v/8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//L/7AAA/+wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//b/6P/6//z/8v/iAAAAAAAAAAAACv/6AAQAAAAQAAoAEAAAAAYAAAAAAAAAAAAKAAAAAAAAAAD/8v/2//b//P/y//wAAAAA/+wAAP/w//IAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/7AAAAAAAAP/yAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/yAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/2/+z/8gAA/+gAAAAAAAD/+f/5AAAAAAAAAAAAAAAAAAAAAAAAAAD/9gAAAAAAAAAAAAAAAAAAAAYABgAIAAAABgAAAAAAFAAAAAAAAAAA//b/6wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/+UAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/7AAAAAAAAAAAAAAAAP/sAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//z/+P/w//kAAAAAAAkAAP/6AAAAAAAA//IAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/6wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/mAAAAAAAA/8wAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//IAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/+X/7v/8//z/+QAAAAAAAAAAAAAABwAAAAD/7AAAAAAAAAAPAAAAAAAAAAAAAAAA/+MAAP/2//L/8v/2AAD//P/y//YAAAAKABgAAP/2/+j/7AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/8QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEMAAAAAAAAAAAAAAAAAAAAAAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHAEMAQwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKAAD/9gAA//wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/5AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//b/6P/w//b/5v/eAAAAAP/5/+oAAAAAAAAAAAAAAAAAAAAAAAAAAP/yAAAAAAAAAAAAAAAAAAAABQAF//kAAAAFAAD/7AAA/+8AAP/s/+z/9gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/s//YAAAAAAAAAAAAA//YAAP/8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//wAAAAAAAAAAAAAAAAAAAAAAAD/9gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/6AAAAAAAAAAAAAAAAAAAAAAAAAAK//b/8v/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/2AAD/4QAA//YAAAAAAAAAAAAAAAAAAAAA//YAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/yACIAIgAo/+wAAAAAAAAAAAAAAAAAAAAAAAAAAP/OAAAAAAAa//IAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMQAAAAAALgBCAC4AOwAAAAAAAP/qADwAAAAAAAAAAAAAAAAAAAAAAAAAAP/sAAAAAAAAAAD//AAAAAAADQAA//wAIQAAAAAAPgBLAEwAAAAAAAD/8v/2AAAAAAAAAAD/9v/yAA4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/tgAAAAAAAAAAAAAAAAAAAAAAGQANABkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//L/p//yAAYAAAAJAAMAAAAJ//YAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/8gAAAAAAAAAAAAAAAAAAAAAAAAAA/7j/7AAAAAD/uwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/9gAAAAQABAAAAAAAAAAAAAAAAP/Y/5z/6AAAAAAAAAAAAAAAAP/y/97/2wAAAAD/9v/s//AAAP/s//D/5v/o//D/4gAAABQAJgAA/3b/7P/o//IAAAAAAAAAAAAA/+IAAP/5/+wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/9D/yP+9AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//AAAAAAAAAAAAAD/8P/yAAYAAP/wAAD/5v/dAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/2AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//AAAP/y//IAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/7gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/6AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/cADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgAAAAD/5gAAAAD/8v/fAAAAAAAHAA0AAAAAAAAAAAAAAAAAAAAAAAAAAP/wAAAAAAAAAAAAAAAAAAD//P/8AAAAAAAPAAAAAAAOAAAAAAAAAAAAAP/yAAAAAAAAAAAAJf/yAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/yAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/2AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/9//oAAAAAAAAAA//8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/s//L//AAA/+QAAAAAAAAAAAAOAAAAAAAAAAsAEwANAA0ACQAAAAD//AAAABMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//MAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATAAYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//IAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABgANAA0AEwANABcAHAAJAAAAAAAAAA8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/+8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/8gAA//IAAAAAAAD/7//vAAAAAP/1AAAAAAAAAAAAAAAAAAD/9v/8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/8QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAANAA0AEwANABMAEwAGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/5AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIASAACAAQAAAAGAAoAAwAOAA8ACAAcABwACgAeACIACwAkACUAEAA2AFgAEgBeAI0ANQCaAKQAZQC3ALcAcADPAM8AcQEFASAAcgEkASgAjgEqASwAkwEuAUoAlgFQAVsAswFdAV0AvwGIAYgAwAGgAaAAwQHWAdgAwgHcAdwAxQHfAd8AxgHiAeIAxwHmAegAyAHqAeoAywHsAewAzAIEAgQAzQIIAggAzgIMAg0AzwIPAg8A0QISAhIA0gIlAiYA0wIqAjgA1QJQAlEA5AJbAlwA5gJfAmIA6AJkAmUA7AJtAm4A7gJwAnAA8AJzAnUA8QJ3AncA9AJ5AnsA9QKCAoQA+AKGAocA+wKOAo4A/QKQApAA/gKWApYA/wKbApwBAAKfAp8BAgKjAqMBAwKrAqwBBAKvAq8BBgLEAtkBBwLjAuoBHQNKA1kBJQOLA4sBNQTLBM4BNgTQBNMBOgTYBNkBPgTmBQgBQAUOBS8BYwVKBVQBhQVlBWUBkAWABYABkQW2BbcBkgW9Bb4BlAXABcABlgXDBcUBlwXHBccBmgXKBcsBmwXQBdQBnQeyB7IBogACAHkAAgACABMAAwADABYABAAEABkABgAGAB4ABwAHACEACAAIACcACQAJACoACgAKAC0ADgAPACoAHAAcABEAHgAeABcAHwAfABoAIAAgABwAIQAhAB8AIgAiACUAJAAkACwAJQAlAC4ANgBNABMATgBQAB4AUQBTABYAVABYABkAXgBxAB4AcgByACEAcwB7ACcAfAB/ACoAgACAACgAgQCNAC0AmgCkACoAtwC3AB4AzwDPACQBBQEFAC0BBgEdABEBHgEgABwBJAEoABcBKgEsABoBLgFBABwBQgFCAB8BQwFKACUBUAFbACwBXQFdAC4BiAGIABwBoAGgACIB1gHXAC4B2AHYABwB3AHcABcB3wHfABsB4gHiABQB5gHmABcB5wHoABQB6gHqABsB7AHsABcCBAIEABcCCAIIABoCDAINABQCDwIPABsCEgISABsCJQIlAB8CJgImACwCKgI3ACsCOAI4ACoCUAJRACwCWwJcABoCXwJiABoCZAJkABoCZQJlACwCbQJtABACbgJuAAMCcAJwAAMCcwJ0AAMCdQJ1AA0CdwJ3AAMCegJ6AAYCewJ7AAoCggKEAAMChgKHAAoCjgKOAA4CkAKQAAcClgKWAAsCmwKbAAQCnAKcAAgCnwKfAAgCowKjAAcCqwKsAAgCrwKvAAgCxALZAAMC4wLqAAoDSgNZAAgDiwOLAAEEywTLACwEzATMABIEzQTNABUEzgTOABgE0ATQAB0E0QTRACAE0gTSACYE0wTTACkE2ATZACkE5gT9ABIE/gUAAB0FAQUDABUFBAUIABgFDgUhAB0FIgUiACAFIwUrACYFLAUvACkFSgVUACkFZQVlAB0FgAWAACMFtgW3ACkFvQW9AA8FvgW+AAIFwAXAAAIFwwXEAAIFxQXFAAwFxwXHAAIFygXKAAUFywXLAAkF0AXQAAIF0QXRAAkF0gXUAAIHsgeyACwAAgEbAAIAAgBWAAQABABZAAgACABZAAsACwBnABAAEABZABIAEgBZABQAFABoABUAFQBCABYAFgBcABcAFwBDABgAGABEABkAGQBgABoAGgBFABsAGwBiABwAHABVAB4AIABqACEAIQBXACIAIgBpACQAJABsACUAJQBvACgAKQBzACoAKgBqACsAKwBzACwALABqAC0ALQBzAC4ALgBaAC8ALwBBADAAMABbADEAMQBdADIAMgBeADMAMwBfADQANABhADUANQBwADYATQBWAFQAWABZAHMAewBZAI4AjgBnAKUAvwBZAMgAzgBoANAA1wBCANgA7wBcAPAA8wBEAPQA+wBFAPwBAABiAQYBIABVASQBQQBqAUIBQgBXAUMBSgBpAVABWwBsAVwBXABzAV0BXQBvAWEBYQBzAWoBdABzAXYBkABqAZEBmABzAZkBnwBaAaEBqABBAakBwQBbAcIBxQBeAcYBzQBhAc4B0gBwAdUB1QBzAdYB1gBvAdcB1wBsAdgB2ABbAdkB2QBzAdwB3ABqAd4B3wBqAeEB4QBqAeIB4gBzAeMB4wBqAekB6QBvAeoB7ABqAe0B7QBhAe4B7gBbAfEB8QBzAfQB9ABzAfoB+gBzAfsB/ABbAf0B/QBzAf4B/gBvAf8CAABzAgMCBgBqAgoCCgBzAgwCDQBzAg4CDgBaAg8CEABvAhECEgBBAhUCFQBbAhcCFwBmAhkCGQBdAhoCHABwAh4CHgBHAh8CHwBIAiUCKQBXAioCNwByAjkCWgBqAmQCZABXAmUCZQBsAmgCaAAyAmsCawA1Am0CbQAVAm8CbwAMAnICcgAyAnYCdgAMAnkCeQANAnoCegAPAnsCewASAnwCfAAJAn0CfQA0An4CfgAKAn8CfwA4AoACgAAxAocChwASAokCiQABAooCigAzAosCiwAFAowCjAADAo0CjQAEAo4CjgAUAo8CjwA2ApACkAAQApECkQAHApICkgA2ApMCkwAhApQClAA3ApUClQAIApYClgATApcClwALApgCmAAbApkCmQAiApoCmgALApsCmwAOApwCnAARAp0CnQALAp4CngACAp8CnwARAqACoQALAqICowAQAqQCpAALAqUCpQABAqYCpgAEAqcCpwA2AqgCqAAHAqkCqQAGAqoCqgALAqsCrAARAq0CrQALAq4CrgAGAq8CrwARArACuQAxAroCuwAyAukC6gASAvUC9QAyAvYC/QAxAwcDBwA4AxADHAABAx0DJAAEAyUDLwA2AzADMQAHAzIDMgAGAzMDMwAHAzQDPwAGA0ADRwALA0gDSQAiA0oDWQARA1oDZAALA2UDcAABA3EDfAA2A30DiAALA4kDiQA2A4oDiwALA4wDjAA3A40DjQAjA5cDlwAHBIEEggAlBIMEhAAkBIUEhQAlBIYEhgBxBIgEiAAoBIoEiwAZBIwEjAAXBI0EjQAYBI4EjgAXBI8EjwAYBJAEkQAlBJIEkgAmBJMEkwAnBJQElAAmBJUElQAnBJYEmAAWBJsEnAAWBJ0EnQAaBKMEowA/BKUEpQA/BKcEpwA/BKgEqAApBKoEqgBjBKwErABGBLIEsgBxBLMEswAoBLQEtABxBLUEtgAoBLgEuAA/BLoEugA/BLwEvAA/BMMEwwBkBMQExABlBMsEywBsBMwEzABLBM4EzgBYBNIE0gBYBNUE1QBMBNoE2gBYBNwE3ABYBN4E3gBNBN8E3wBOBOAE4ABPBOEE4QBQBOIE4gBRBOME4wBSBOQE5ABTBOUE5QBUBOYE/QBLBQQFCABYBSMFKwBYBT4FPgBMBVUFbwBYBXgFfwBNBYEFiABOBYkFoABPBaEFpABRBaUFrABTBa0FsQBUBbgFuAAqBbkFugA5BbsFuwArBbwFvAA5Bb0FvQAgBb4FvgA5Bb8FvwAdBcAFwQA5BcIFwgAqBcMFxAA5BcUFxQA9BcYFxgAdBccFyAA5BckFyQA8BcoFygAeBcsFywAfBcwFzAA6Bc0FzQAcBc4FzgA7Bc8FzwAsBdAF0AA5BdEF0QAfBdIF0gAqBdMF0wA5BdQF1AAsBi4GLgA+BjAGMAAwBjIGMgAuBjMGMwAvBjYGNgAtBjgGOABrBpsGmwBtBqAGoABuBqEGogBtBqMGowBuBqQGpwBtBqkGqQBuBqsGqwBtBq4GrgBtBq8GsABABrIGsgBuBrUGtgBfBrgGuABABr4GvgBtByQHJAAYByUHJQAXByoHKgBKBy4HLgBJB7IHswBXAAIptAAEAAAqCir+ACkAggAA/+z/9v/2//L/7//v/+//+wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABD/7//2/7D/4v/E/9v/xAATAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/9v+3/7D/owAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/8P/y//YAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/3gAA/+z/8v/o//L/0f/J/+b/7P/e/9H/yf/i/9j/8v/o/+z/6P/R/+v/9v/l/+v/6P/l/+z/2wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/v//b/8AAAAAAAAAAA/+YAAAAAAAAAAP/mAAAAAAAAAAAAAAAAAAAAAAAAAAD/5gAAAAAAA//y//b/8v/sAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAhAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIQAAAAAAAP/s//YADQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/+z/ywBJ/6sADf+r/7f/4//uAEn/q//j/8v/4/+3AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/8v/s/+z/8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/9gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/4AAhAAAAAAAA/9MAAAAAACEAAAAA/+D/8P/TAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/j/+wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP+wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/s/+3/8P/t//D/8QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/i/9j/3AAA/9j/4f/e/+EAAAAAAAAAAAAAAAAAAAAA/8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/9L/5v/Y/+b/3f/R/9v/yAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/6P/YAAD/9v/6/+gAAAAAAAAAAAAA//b/2P/yAAAAAAAAAAD/9gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/sAAAAAAAQAAD/8gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/+j/7//2/9X/7//Y/+j/4v/V/+//4gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAhAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//oAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/wAAD/9gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/yAAD/4//jAAAAAAAAAAAAAAAAAAAAAP/vAAAAAAAAAAAAAAAAAAAAAP/wAAD/8AAGAAD/8gAAAAD/5gAA/8AAAP/A/8YAAAAAAAD/wAAA/+YAAP/G/+wAAAAAAAAAAAAAAAAAAAAAAAD/7AAA//b/7AAA/9j/7AAAAAD/0//Y/+z/0//o/+j/7P/m/+j/7//w/+j/5v/l//L/8P/R/97/2v/o/+j/5v/aAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/8gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/y//L/9gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/9v/2AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/CAAD/6//UAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/8YAO/+pAAD/qf+nAAAAAAA7/6n/2P/G/9j/pwAAAAAAAAAA/90AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/wv/dAAD/1gAAAAAAAP/C/9YAAAAAAAAAAAAAAAD/wv/d/9YAAP/r/+v/3f/r/9T/1AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAN//L/7P/L//L/7P/s/9gAAAAAAAAAAAAAAAD/ywAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADQAA//IAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//kAAP/sAAAAAP/L/9gAAAAAAAAAAAAAAAAAAAAAAAAAAAANAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//IAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/9//8P/sAAYAAAATAA0ADQAAAAAAAAAAAAAAAAAGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/fAAD/8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/7AADABP/ywADAAYADf/s/8sAA//sAAAAAAAAAAAAAAAA/98AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/3//w/+wACgAAACEAGgAaAAAAAAAAAAAAAAAAAAoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/98AAP/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/sAAYAIf+3AAYACgAa/+z/twAG/+wAAAAAAAAAAAAAAAD/3wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/V//D/7AAKAAAAGgAOAA4AAAAAAAAAAAAAAAAACgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/1QAA//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/+wAAAAa/6MAAAAKAA7/7P+jAAD/7AAAAAAAAAAAAAAAAP/VAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//D/+gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP+6AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/7oAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/zQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/2/+H/9gAJAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABkAAAAAAAAAAAAAAAAAGQAAAAAAAAAAAAAAAAAAAAAACf/oAAAAAP/sAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/9gAAAAAAAAAAAAAAAD/2AAAAAAAAAAAAAAAAAAA/9gAAAAAAAD/4f/h/+j/4f/2//YAAAAAABn/sAA6ABn/sP/yAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/3QAAAAAAAAAAAAAAAAAAAAAAAAAA//YAAAAA//kAAP/2AAAAAAAAAAAAAAAAAAD/7wAAAAD/8gAAAAD/9QAA//wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//kAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/8gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/5AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//AAAAAAAAAAAAAAAAAAAAAAAAP/1AAAAAAAAAAAAAP/5AAD//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/+QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/5AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//kAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/+oAB//qAAD/4//q/+r/+QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFcAAAAAAAAAAAAAAAAAAAAAAAD/8f/q/+r/6v/5AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/xAAAAAAAA/+MAAAAAAAD/+P/z/90AAAAAAAYABgAGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/l//n/8f/5//IAAP/5AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/9gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAvAAAAAP/5AAD//AAA//YAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/90AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/2/+wAAP/8AAD/+QAAAAAAAAAA/+wAAAAAAAD/6P/5//oAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/9QAA//r//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/YAAAAAAAAAAD/1AAAAAAAAP/8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/1wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//b/6AAA//wAAP/1AAAAAAAAAAD/9gAAAAAAAP/vAAD/+gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/2AAD/8gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/+IAAAAAAAAAAAAAAAAAAAAA//wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/dAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/9v/sAAD//AAA//kAAAAAAAAAAP/sAAAAAAAA/+gAAP/yAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//oAAP/2AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/2AAAAAAAAAAAAAAAAQApAd0B8wH6AhYCFwIYAh4CHwKYA5QDpwOoA6kDqgOrA6wDrQPsA/AEOAQ5BEgEXgR0BIcEiQSdBKgEqgYRBhUGIwYpBisGLwYwBjIGMwY2ByoHLgACACgB3QHdAAsB+gH6AAECFgIWACYCFwIXACcCGAIYACgCHgIeAA0CHwIfAA4CmAKYABYDlAOUACADpwOnABADqAOoAAYDqQOpACMDqgOqABIDqwOrAAgDrAOsABEDrQOtAAcD7APsAAQD8APwAAIEOAQ4ACEEOQQ5ACIESARIAAoEXgReAB0EdAR0ABwEhwSHAAwEiQSJABcEnQSdABUEqASoAB8EqgSqAAkGEQYRAAUGFQYVAAMGIwYjABQGKQYpAB4GKwYrABMGLwYvABgGMAYwABsGMgYyABkGMwYzABoGNgY2AA8HKgcqACUHLgcuACQAAgFtAAIAAgBsAAQABAAEAAgACAAEAAsACwB8ABAAEAAEABIAEgAEABQAFABtABUAFQBBABYAFgBCABcAFwBDABgAGABEABkAGQBuABoAGgBFABsAGwBvABwAHABKAB0AHQB/AB4AIAADACEAIQABACIAIgACACMAIwB/ACQAJAB7ACUAJQBAACYAJwB/ACgAKQBLACoAKgADACsAKwBLACwALAADAC0ALQBLAC4ALgBMAC8ALwAFADAAMABNADEAMQAGADIAMgAHADMAMwBQADQANAAIADUANQBOADYATQBsAFEAUQA+AFQAWAAEAF0AXQA+AHMAewAEAIAAgAA/AI4AjgB8AKUAvwAEAMgAzgBtANAA1wBBANgA7wBCAPAA8wBEAPQA+wBFAPwBAABvAQEBAQA+AQMBAwB9AQYBIABKASEBIQCAASIBIwB/ASQBQQADAUIBQgABAUMBSgACAUsBTgB/AU8BTwCAAVABWwB7AVwBXABLAV0BXQBAAV4BYAB/AWEBYQBLAWIBaAB/AWoBdABLAXYBkAADAZEBmABLAZkBnwBMAaABoAB/AaEBqAAFAakBwQBNAcIBxQAHAcYBzQAIAc4B0gBOAdQB1AB/AdUB1QBLAdYB1gBAAdcB1wB7AdgB2ABNAdkB2QBLAdoB2wB/AdwB3AADAd4B3wADAeEB4QADAeIB4gBLAeMB4wADAekB6QBAAeoB7AADAe0B7QAIAe4B7gBNAe8B8AB/AfEB8QBLAfQB9ABLAfgB+QB/AfoB+gBLAfsB/ABNAf0B/QBLAf4B/gBAAf8CAABLAgMCBgADAgoCCgBLAgwCDQBLAg4CDgBMAg8CEABAAhECEgAFAhUCFQBNAhkCGQAGAhoCHABOAiUCKQABAioCNwA2AjkCWgADAlsCYgB/AmQCZAABAmUCZQB7AmgCaABkAmsCawBmAm0CbQBrAm8CbwB1AnICcgBkAnUCdQBqAnYCdgB1AnkCeQBpAnoCegA8AnsCewA9An0CfQBlAn4CfgBoAoACgAB6AocChwA9AokCiQBwAosCiwBHApMCkwBnApUClQBIApcClwBxApoCmgBxApsCmwBJAp0CnQBxAp4CngBGAqACoQBxAqQCpABxAqUCpQBwAqoCqgBxAq0CrQBxArACuQB6AroCuwBkAukC6gA9AvUC9QBkAvYC/QB6AxADHABwA0ADRwBxA1oDZABxA2UDcABwA30DiABxA4oDiwBxA7ADsABdA7QDtAAeA7YDtgBiA7cDtwAuA7sDuwAjA74DvgB0A8EDwQB0A8IDwgA6A8MDwwAnA8QDxAAgA8UDxQBgA8cDxwAbA8oDygA6A80DzQAuA88DzwArA9ID0gA6A9QD1AB0A9UD1QBeA9kD2QB5A9oD2gAjA9wD3AA6A98D3wAnA+ED4QBhA+ID4gB0A+MD4wA4A+YD5gBiA+cD5wAuA+kD6QA6A+sD6wB0A+4D7gBgA+8D7wAbA/ID8gBiA/MD8wBdA/gD+QB0A/oD+wAnA/wD/AByA/0D/QAZA/4D/wAkBAAEAAAcBAEEAQBzBAIEAgAvBAMEAwAsBAQEBgAkBAcEBwAhBAgECQAkBAoECgBzBAsECwAkBA0EDQBzBA4EDgAmBA8EDwA7BBAEEABzBBEEEQBfBBIEEgAkBBMEEwAaBBQEFQAkBBYEFgAmBBcEGAAkBBkEGQAfBBoEGgAkBBsEGwApBBwEHQBzBB8EHwAkBCAEIABzBCIEIwB4BCUEJQA5BCYEJgAhBCcEJwAkBCkEKgAkBCsEKwA7BCwELAAkBC0ELQAoBC4ELgBzBC8ELwA3BDAEMAAkBDIEMgAvBDMEMwAsBDQENAAkBDUENQAmBDYENgAkBDcENwBzBDgEOQA3BDoEOgBfBDsEOwAaBD0EPQAvBD8EQAByBEEEQQBzBEMEQwAkBEQERQBzBEYERwA7BIEEggARBIMEhABRBIUEhQARBIgEiAASBIoEiwAVBIwEjAATBI0EjQAUBI4EjgATBI8EjwAUBJAEkQARBJIEkgB+BJMEkwAxBJQElAB+BJUElQAxBJYEmABPBJsEnABPBLMEswASBLUEtgASBMsEywB7BMwEzAAJBM4EzgAKBNIE0gAKBNUE1QBaBNoE2gAKBNwE3AAKBN4E3gALBN8E3wAMBOAE4AANBOEE4QAOBOIE4gAPBOME4wBbBOQE5AAQBOUE5QBcBOYE/QAJBQQFCAAKBSMFKwAKBT4FPgBaBVUFbwAKBXgFfwALBYAFgAB3BYEFiAAMBYkFoAANBaEFpAAPBaUFrAAQBa0FsQBcBbgFuABjBb0FvQBZBb8FvwB2BcIFwgBjBcYFxgB2BcoFygBXBcsFywBYBc0FzQBWBdEF0QBYBdIF0gBjBdUF1QAyBdYF2AAlBdkF2QAdBdoF2gAlBdsF2wAwBdwF3AAtBd0F3wAlBeAF4AAiBeEF4gAlBeMF4wA0BeQF5QAlBeYF5gA0BecF5wAXBegF6AA1BekF6QAzBeoF6gBTBesF6wAlBewF7AAWBe0F7gAlBe8F7wAXBfAF8QAlBfIF8gAtBfMF8wAlBfQF9AAqBfUF9gAlBfcF9wAXBfgF+AAlBfkF+QA0BfoF+gBSBfsF/AAlBf4F/gBVBf8F/wAiBgAGAAAlBgEGAQAXBgIGAwAlBgQGBAA1BgUGBQAlBgYGBgAYBgcGBwA0BggGCABUBgkGCQAlBgsGCwAwBgwGDAAtBg0GDQAlBg4GDgAXBg8GDwAlBhAGEAA0BhMGEwBTBhQGFAAWBhUGFgAlBhcGFwAwBhgGGAAyBhoGGgAlBhwGHAAlBh0GHgA0Bh8GIAA1BpsGmwCBBqEGogCBBqQGpwCBBqsGqwCBBq4GrgCBBrUGtgBQBr4GvgCBByQHJAAUByUHJQATB7IHswABAAIKVAAEAAAKggr4AAkAkgAAABT/3f/R/8kAKAAoACj/9v/w/9EAIQAo/93/yP+/ABr/9f/m/9L/u/+d/+z/7P+3/+X/y//1ABT/0f+i//X/5v/S/7v/nf+6/6QAFP/2ABr/9f/m/9L/u/+d/+z/7P/d/8j/v//q/9X/3v/s/7r/pP+s/5j/oP92//b/8v/i/+L/5f/c/9z/9gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/9v/s//b/9v/jAAAAEAAG//b/4//5AAD/7QAAAAAAAP/m/+P/0QAA/+X/2P/y/8sAAAAAAAb/2AAAAAD/5v/j/9EAAP++AAAAAAAAAAAAAP/m/+P/0QAAAAD/+QAA/+0AAAAA//YAAAAA/74AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/7//o//L/5f/s//L/9v/o/+v/7P/o//L/5f/y/+X/+f/8/+X/5f/s/+z/7//5//L/5f/s/+r/2AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//IAAAAAAAD/9gAAAAAAAAAA//wAAP/vAAAAAAAA//L/8v/Y//z/5f/lAAD/ywAAAAAAAP/sAAAAAP/y//L/2P/y/9sAAP/2AAAAAAAA//L/8v/YAAAAAP/8AAD/7wAAAAD/7//8//L/2wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//z/7P/yAAAAAP/s/+wAAAAA/+wAAP/5/+z/8gAA//z/3wAAAAAAAAAAAAD/7P/yAAAAAAAA//n/9v/y//b/+f/5//L/+f/y//L/+f/y/9v/8v/yAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/YAAAAAP/zAAAAAAAAAAD/8//5AAD/6wAAAAAAAP/f/9z/0v/5/90AAAAA/8QAAAAAAAAAAAAAAAD/3//c/9L/8v/JAAAAAAAAAAAAAP/f/9z/0gAAAAD/+QAA/+sAAAAA//b/+f/y/8kAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/4v/v/+j/8v/iAAD/8v/l//L/7P/yAAD/7//o//IAAAAAAAAAAP/u/+L/4gAA/+j/8v/uAAAAAP/fAAAAAAAAAAAAAAAAAAAAAP/s/9//7AAAAAAAAP/s/9z/7P/c/+wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA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BDYAjwQ3BDcAEQQ4BDkADQQ6BDoARwQ7BDsAAgQ9BD0ATwQ/BEAAdQRBBEEAEQRDBEMAjwREBEUAEQRGBEcAFgRYBFgAQAReBF4AQwRuBG4APwR0BHQAQgR2BHYAPgSBBIIAiQSFBIUAiQSHBIcAjASJBIkAjgSKBIsAOwSMBIwAOQSNBI0AOgSOBI4AOQSPBI8AOgSQBJEAiQSsBKwAPATMBMwAJgTOBM4AKgTSBNIAKgTVBNUAcwTaBNoAKgTcBNwAKgTeBN4AawTfBN8ALATgBOAALgThBOEAMQTiBOIANATjBOMAdATkBOQANwTlBOUAbATmBP0AJgUEBQgAKgUjBSsAKgU+BT4AcwVVBW8AKgV4BX8AawWBBYgALAWJBaAALgWhBaQANAWlBawANwWtBbEAbAW4BbgAHAW7BbsAfAW9Bb0AagW/Bb8AIAXCBcIAHAXFBcUAaQXGBcYAIAXJBckAZwXKBcoAIgXLBcsAJAXMBcwAfwXNBc0AcgXPBc8AfgXRBdEAJAXSBdIAHAXUBdQAfgXVBdUAAQXZBdkABgXbBdsAUAXjBeMAEgXmBeYAEgXnBecAFAXoBegASgXpBekACQXqBeoAcAXsBewAAwXvBe8AFAX3BfcAFAX5BfkAEgX6BfoAYQX+Bf4AcQYBBgEAFAYEBgQASgYGBgYAGQYHBgcAEgYIBggADgYLBgsAUAYOBg4AFAYQBhAAEgYRBhEAbgYTBhMAcAYUBhQAAwYXBhcAUAYYBhgAAQYdBh4AEgYfBiAASgYjBiMAQQYmBiYAPQYoBigARAa1BrYAXAckByQAOgclByUAOQeyB7MAhgABEMYABAAAANcCxgdwBWABygHKAcoB0AJoAsYFYAHKAcoBygHKAcoBuAG4AbgBuAG4AbgBuAHKAcoBygHKAcoBygHKAcoBygHKAcoBygG+Ab4BvgG+Ab4BvgHQAdAB0AHQAdAB0AHQAcoKIBRuBSQSeAUkCtoJeAHKAcoBxAHKAcoNpg80AdAFJAUkAtgC6gL8A7AB1gVCAdwB3AHcBWAJygKAAw4DxgJyAyAH7gbYA9wD8gKABtgG2AZQAjYCaAIMApwCnAKAAoACgAKAAoACgAKAAoAG2AbYBtgG2AbYBtgG2AbYAo4CjgKOAo4CjgKOApwCnAKcApwB4gJAAe4B9AHuAe4CQAH0AegCQAJA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//8AWv8sAd4DYwImAG8AAAAHBz0BIgAAAAMAWgAAAd4DyAALAA8AEwAAMxEhFSEVMxUjFSEVATUhFScnNxdaAXr+2fn5ATH+vgEMmB95JwKQRs5H7kcC3zk5XCZnMP//AFoAAAHUAzUCJgAHAAAABwdMAR4AAP//ADT/9AImA2MCJgAIAAAABwc9AV8AAP//ADT/9AImA0YCJgAIAAAABwdAAV8AAP//ADT/9AImA0oCJgAIAAAABwdJAV8AAP//ADT/9AImAzUCJgAIAAAABwdMAV8AAP//ADT/HgImApwCJgAIAAAABwdrAV8AAP//ADT/9AImA00CJgAIAAAABwdWAV8AAP//ADT/9AImAxgCJgAIAAAABwdEAV8AAP//ADT/9AImA0kCJgAIAAAABwdCAV8AAAABADT/9AJlAyQAMgAABSImJjU0NjYzMhYXJjU0NjMyFhcHJiYjIgYVFBYXByYmIyIGBhUUFjMyNjc1IzUzEQYGAVxWhkxOiFcaLhMGPjMUHgwQCA8LGRwQEC4ZQjJCYjVxaSNAE4vXH2kMUZhraphSBwYUFDA9CAU/AwYfFxYiFzcTG0F2UnyRFRKrRf7sISsA//8AWgAAAjIDRgImAAkAAAAHB0ABRQAA//8AWv8yAjICkAImAAkAAAAHB2gBRQAA//8AWv8ZAjICkAImAAkAAAAHB3MBRQAA//8AWv9WAjICkAImAAkAAAAHB3YBRQAAAAIAIAAAAo4CkAATABcAADMRIzU3NTMVITUzFTMVIxEjESERESE1IW5OTlMBMVRISFT+zwEx/s8B5jcEb29vbzv+GgE1/ssBfWn////9AAAAugNjAiYACgAAAAcHOgCEAAD//wBOAAABCwNjAiYACgAAAAcHPQCEAAD////wAAABGANGAiYACgAAAAcHQACEAAD////TAAABNQNJAiYACgAAAAcHQgCEAAD////sAAABHAMtAiYACgAAAAcHTgCEAAD////+AAABCgMYAiYACgAAAAcHRACEAAD//wBLAAAAvQM1AiYACgAAAAcHTACEAAD////wAAABGANNAiYACgAAAAcHVgCEAAD//wBAAAAA0wNoAiYACgAAAAcHUACEAAD//wBN/zIAuwKQAiYACgAAAAcHaACEAAAAAQAr/ywA2wKQABUAABciJjU0NjcjETMRBgYVFBYzMjcX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Ap4AJwJoAKYAAAAGA6wAAP////MAAAK/Ap4AJwJoAKIAAAAGA60AAP///+gAAAJiAqAAJgJoRQAABgOuAAD////oAAACYgKgACYCaEUAAAYDrwAA//8AAwAAAh0DSgIGADwAAP//AAMAAAIdAxgCBgA7AAD////0AAACVAKZACYCbHYAAAYDpwAA////8wAAAlQCmQAmAmx2AAAGA6gAAP///+oAAAIeAp4AJgJsQAAABgOpAAD////tAAACHgKeAgYCgQAA////9AAAAssCngAnAmwA7QAAAAYDqgAA////8wAAAsgCngAnAmwA6gAAAAYDqwAA////9AAAAscCngAnAmwA6QAAAAYDrAAA////8wAAAsMCngAnAmwA5QAAAAYDrQAA////9AAAAqgCmQAmAm52AAAGA6cAAP////MAAAKoApkAJgJudgAABgOoAAD////qAAACcgKeACYCbkAAAAYDqQAA////7QAAAnICngIGAoIAAP////QAAAMfAp4AJwJuAO0AAAAGA6oAAP////MAAAMcAp4AJwJuAOoAAAAGA6sAAP////QAAAMbAp4AJwJuAOkAAAAGA6wAAP////MAAAMXAp4AJwJuAOUAAAAGA60AAP///+gAAALuAqAAJwJuALwAAAAGA64AAP///+gAAALuAqAAJwJuALwAAAAGA68AAP////QAAAEjApkAJgJwdgAABgOnAAD////zAAABIwKZACYCcHYAAAYDqAAA////6gAAAO0CngAmAnBAAAAGA6kAAP///+0AAADtAp4CBgKDAAD////0AAABmgKeACcCcADtAAAABgOqAAD////zAAABlwKeACcCcADqAAAABgOrAAD////0AAABlgKeACcCcADpAAAABgOsAAD////zAAABkgKeACcCcADlAAAABgOtAAD////oAAABaQKgACcCcAC8AAAABgOuAAD////oAAABaQKgACcCcAC8AAAABgOvAAD////yAAABFgNKAgYAjQAA/////gAAAQoDGAIGAIYAAP////T/9ALGApwAJgJ2YQAABgOnAAD////z//QCuAKcACYCdlMAAAYDqAAA////6v/0ApoCngAmAnY1AAAGA6kAAP///+3/9AKUAp4CBgKFAAD////0//QDRwKeACcCdgDiAAAABgOqAAD////z//QDQwKeACcCdgDe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AicCEA4KDgX//wAD//QDCQKQACYCaAAAAAcDlwIeAAD////6//QDLgKZACYCsAAAAAcDlwJDAAD////z//QDJwKZACYCsQAAAAcDlwI8AAD////0//QDswKeACYCtAAAAAcDlwLIAAD////z//QDrwKeACYCtQAAAAcDlwLEAAD////0//QDrwKeACYCtgAAAAcDlwLEAAD////z//QDqwKeACYCtwAAAAcDlwLAAAD////o//QDTwKgACYCuAAAAAcDlwJkAAD////o//QDTwKgACYCuQAAAAcDlwJkAAD//wBa//QDdQKQACYCbgAAAAcDlwKKAAD////0//QD6wKZACYCxAAAAAcDlwMAAAD////z//QD6wKZACYCxQAAAAcDlwMAAAD////0//QEYwKeACYCyAAAAAcDlwN4AAD////z//QEXwKeACYCyQAAAAcDlwN0AAD////0//QEXgKeACYCygAAAAcDlwNzAAD////z//QEWgKeACYCywAAAAcDlwNvAAD////o//QEMQKgACYCzAAAAAcDlwNGAAD////o//QEMQKgACYCzQAAAAcDlwNGAAAAAgAt//QDjwKcACcAOAAAMzUzNS4CNTQ2NjMyFhYVFAYGBxUzFSM1NjY1NCYmIyIGBhUUFhcVBSImNREzBgYVFBYzMjcXBgYtgxw2I0V+VVV+RiM2HYPpOE4vVz09Vy5NOAI+MixTAgQUEA0QCwocRAQcUGlCXI9SUo9cQmlQHAREPSyKZ0dxQUFxR2eKLD0MOzYBMVCfSBQTBj4FB/////T/9APuApwAJgLrAAAABwOXAwMAAP////P/9APhApwAJgLsAAAABwOXAvYAAP////T/9ARtAp4AJgLvAAAABwOXA4IAAP////P/9ARpAp4AJgLwAAAABwOXA34AAP////T/9ARpAp4AJgLxAAAABwOXA34AAP////P/9ARlAp4AJgLyAAAABwOXA3oAAP///+j/9AQdAqAAJgLzAAAABwOXAzIAAP///+j/9AQdAqAAJgL0AAAABwOXAzIAAP//AC7/9AIiAwICJgKJAAAABwdeARwACv//AC7/9AIiAvUCJgKJAAAABwdcARwAAP//AC7/9AIiAw0CJgKJAAAABwc5ARwAAP//AC7/9AIiAw0CJgKJAAAABwc8ARwAAP//AC7/9AIiAwICJgKJAAAABwejARwAAP//AC7/9AIiAwICJgKJAAAABwegARwAAP//AC7/9AIiAwICJgKJAAAABweiARwAAP//AC7/9AIiAwICJgKJAAAABwefARwAAP//AC7/9AIiAycCJgKJAAAABwekARwAAP//AC7/9AIiAycCJgKJAAAABwehARwAAP//AC7/9AIiAtoCJgKJAAAABwdHARwAAP//AC7/9AIiApICJgKJAAAABwdDARwAAP//AC7/9AIiAtECJgKJAAAABwdBARwAAP//AC7/9AGsAvgCJgKNAAAABwdeAPcAAP//AC7/9AGsAvUCJgKNAAAABwdcAPcAAP//AC7/9AGsAw0CJgKNAAAABwc5APcAAP//AC7/9AGsAw0CJgKNAAAABwc8APcAAP//AC7/9AGsAwICJgKNAAAABwejAPcAAP//AC7/9AGsAwICJgKNAAAABwegAPcAAP//AC7/9AGsAwICJgKNAAAABweiAPcAAP//AC7/9AGsAwICJgKNAAAABwefAPcAAP//AEv/TQHRAvgCJgKPAAAABwdeASMAAP//AEv/TQHRAvUCJgKPAAAABwdcASMAAP//AEv/TQHRAw0CJgKPAAAABwc5ASMAAP//AEv/TQHRAw0CJgKPAAAABwc8ASMAAP//AEv/TQHRAwICJgKPAAAABwejASMAAP//AEv/TQHRAwICJgKPAAAABwegASMAAP//AEv/TQHRAwICJgKPAAAABweiASMAAP//AEv/TQHRAwICJgKPAAAABwefASMAAP//AEv/TQHRAycCJgKPAAAABwekASMAAP//AEv/TQHRAycCJgKPAAAABwehASMAAP//AEv/TQHRAtECJgKPAAAABwdBASMAAP//ADj/9ADqAwICJgKRAAAABgdefAr//wAs//QA6gL1AiYCkQAAAAYHXHwA////7f/0AOoDDQImApEAAAAGBzl8AP//AET/9AELAw0CJgKRAAAABgc8fAD////g//QA7wMCAiYCkQAAAAYHo3wA////2v/0AOoDAgImApEAAAAGB6B8AP///+D/9AD8AwICJgKRAAAABgeifAD////k//QA9gMCAiYCkQAAAAYHn3wA////7//0AQkDJwImApEAAAAGB6R8AP///+//9AEJAycCJgKRAAAABgehfAD////g//QBGALaAiYCkQAAAAYHR3wA////9//0AQECkgImApEAAAAGB0N8AP///8//9AEpAtECJgKRAAAABgdBfAD////h//QBFwMGAiYCkQAAAAYHiHwA////4f/0ARcDBgImApEAAAAGB4B8AP///+P/9AEVAyYCJgKRAAAABgeJfAD//wAu//QB6QMCAiYClwAAAAcHXgENAAr//wAu//QB6QL1AiYClwAAAAcHXAENAAD//wAu//QB6QMNAiYClwAAAAcHOQENAAD//wAu//QB6QMNAiYClwAAAAcHPAENAAD//wAu//QB6QMCAiYClwAAAAcHowENAAD//wAu//QB6QMCAiYClwAAAAcHoAENAAD//wAu//QB6QMCAiYClwAAAAcHogENAAD//wAu//QB6QMCAiYClwAAAAcHnwENAAD//wBO/00B9gMCAiYCmQAAAAcHXgElAAr//wBO/00B9gL1AiYCmQAAAAcHXAElAAD//wA8//QBxwMCAiYCnAAAAAcHXgD0AAr//wA8//QBxwL1AiYCnAAAAAcHXAD0AAD//wA8//QBxwMNAiYCnAAAAAcHOQD0AAD//wA8//QBxwMNAiYCnAAAAAcHPAD0AAD//wA8//QBxwMCAiYCnAAAAAcHowD0AAD//wA8//QBxwMCAiYCnAAAAAcHoAD0AAD//wA8//QBxwMCAiYCnAAAAAcHogD0AAD//wA8//QBxwMCAiYCnAAAAAcHnwD0AAD//wA8//QBxwMnAiYCnAAAAAcHpAD0AAD//wA8//QBxwMnAiYCnAAAAAcHoQD0AAD//wA8//QBxwLRAiYCnAAAAAcHQQD0AAD//wA8//QBxwLaAiYCnAAAAAcHRwD0AAD//wA8//QBxwKSAiYCnAAAAAcHQwD0AAD//wA8//QBxwMGAiYCnAAAAAcHiAD0AAD//wA8//QBxwMGAiYCnAAAAAcHgAD0AAD//wA8//QBxwMmAiYCnAAAAAcHiQD0AAD//wAz//QCigMCAiYCoAAAAAcHXgFeAAr//wAz//QCigL1AiYCoAAAAAcHXAFeAAD//wAz//QCigMNAiYCoAAAAAcHOQFeAAD//wAz//QCigMNAiYCoAAAAAcHPAFeAAD//wAz//QCigMCAiYCoAAAAAcHowFeAAD//wAz//QCigMCAiYCoAAAAAcHoAFeAAD//wAz//QCigMCAiYCoAAAAAcHogFeAAD//wAz//QCigMCAiYCoAAAAAcHnwFeAAD//wAz//QCigMnAiYCoAAAAAcHpAFeAAD//wAz//QCigMnAiYCoAAAAAcHoQFeAAD//wAz//QCigLRAiYCoAAAAAcHQQFeAAD//wAu/zcCIgHyAiYCiQAAAAcHgQEfAAD//wAu/zcCIgMCAiYDZQAAAAcHXgEcAAr//wAu/zcCIgL1AiYDZQAAAAcHXAEcAAD//wAu/zcCIgMNAiYDZQAAAAcHOQEcAAD//wAu/zcCIgMNAiYDZQAAAAcHPAEcAAD//wAu/zcCIgMCAiYDZQAAAAcHowEcAAD//wAu/zcCIgMCAiYDZQAAAAcHoAEcAAD//wAu/zcCIgMCAiYDZQAAAAcHogEcAAD//wAu/zcCIgMCAiYDZQAAAAcHnwEcAAD//wAu/zcCIgMnAiYDZQAAAAcHpAEcAAD//wAu/zcCIgMnAiYDZQAAAAcHoQEcAAD//wAu/zcCIgLRAiYDZQAAAAcHQQEcAAD//wBL/zcB0QHyAiYCjwAAAAYHgXYA//8AS/83AdEDAgImA3EAAAAHB14BIwAK//8AS/83AdEC9QImA3EAAAAHB1wBIwAA//8AS/83AdEDDQImA3EAAAAHBzkBIwAA//8AS/83AdEDDQImA3EAAAAHBzwBIwAA//8AS/83AdEDAgImA3EAAAAHB6MBIwAA//8AS/83AdEDAgImA3EAAAAHB6ABIwAA//8AS/83AdEDAgImA3EAAAAHB6IBIwAA//8AS/83AdEDAgImA3EAAAAHB58BIwAA//8AS/83AdEDJwImA3EAAAAHB6QBIwAA//8AS/83AdEDJwImA3EAAAAHB6EBIwAA//8AS/83AdEC0QImA3EAAAAHB0EBIwAA//8AM/83AooB8gImAqAAAAAHB4EBWAAA//8AM/83AooDAgImA30AAAAHB14BXgAK//8AM/83AooC9QImA30AAAAHB1wBXgAA//8AM/83AooDDQImA30AAAAHBzkBXgAA//8AM/83AooDDQImA30AAAAHBzwBXgAA//8AM/83AooDAgImA30AAAAHB6MBXgAA//8AM/83AooDAgImA30AAAAHB6ABXgAA//8AM/83AooDAgImA30AAAAHB6IBXgAA//8AM/83AooDAgImA30AAAAHB58BXgAA//8AM/83AooDJwImA30AAAAHB6QBXgAA//8AM/83AooDJwImA30AAAAHB6EBXgAA//8AM/83AooC0QImA30AAAAHB0EBXgAAAAEASf9FAfEB8gAoAAAzETQmJzMWFhUVMz4CNxcGBgceAhcGBgcnNjY3LgInBgYHBgYHFVIDBlEFBAQnXmg0CChULRlCSyQhSR1gJ0gcGjk3FwsXCxYRAQFhHUggEz4gmEN0UQ1ODT0xMGtmKDRkIwgpWSsdUVosDR4QHU0wGQAAAgAu/00B6QHyAAsAIQAAJTI2NTQmIyIGFRQWFzUuAjU0NjYzMhYWFRQGBgceAhUBC0FISEFASEgbNFMxPGU8PWU8L1IzAQECNmdVVWdnVVVn6aoJP2tIUnI8PHJSR2o/Ch8zNiMAAQAu/0gBuAHmAB8AAAUnNjY1NCYnLgI1NDY2MzMVJiIjIgYVFBYXFhYVFAYBX0IbFh86NVs3QG9Elx1LKUtZVkRGNR24GyAlEhQgDg04YUxVbjVGAllbT04RETMuFkoAAQBS/00BgwHmAAsAABcRIRUjFzMVIxQWF1IBMeQCzs4DAbMCmUPZO1GZWAABABH/TQHaArIAHQAABSc2NjU0JicGBgcnJSYnBgYHJyUmJic3HgIVFAYByFAKCAUFP3pEIgEQDxtFhEsiARYqdUozdKFUCLMKMFwuID8fHDojRXo/OB8+JkV9R3grPUbS/4syYP//AC//VgDGAdsCBgSEAAD//wBBAV0AuAHbAgcEgQAAAWn//wBBAh4AuAKcAgcEgQAAAioAAQBSAcEAuQKyAAQAABM3MwcHUhZRDyIBwfFclQAAAQBAAAAApwDyAAQAADM3NzMHQA8iNhZclvIA//8A7gIuAW4DAgAHBz4BDwAAAAH/7QHQAFYCngADAAATJzcXJDcdTAHQC8MLAP//AHoCMwGwAwYABweAARUAAP//APT/NwFv/8IABweBARUAAAABAFL/9ADrAZYAEAAAFyImNREzBgYVFBYzMjcXBgawMixTAgQUEA0QCwocDDs2ATFQn0gUEwY+BQf//wDLAjwBXwL4AAcHXgEPAAD//wDLAjwBXwL4AAcHXgEPAAD//wC/Aj4BUwL1AAcHXAEPAAD//wC0Ai4BMAMCAAcHOwEPAAD//wDuAi4BbgMCAAcHPgEPAAD//wBzAi8BggMCAAcHowEPAAD//wBtAi8BewMCAAcHoAEPAAD//wBzAi8BjwMCAAcHogEPAAD//wB3Ai8BiQMCAAcHnwEPAAD//wCCAjIBnAMnAAcHpAEPAAD//wCCAjIBnAMnAAcHoQEPAAD//wBiAkEBvALRAAcHQQEPAAD//wB0AjMBqgMGAAcHiAEPAAD//wB0AjMBqgMGAAcHgAEPAAD//wB2AkwBqAMmAAcHiQEPAAAAAf/0Ac0AhwKZAA4AABMnNjY1NCYnNxYWFRQGBhgJFyEpKglBSR8zAc0mCR4bFx0BLwEuLCMtGgAB//MBzQCGApkADgAAEy4CNTQ2NxcGBhUUFhdiHTMfSUEJKikhFwHNBxotIywuAS8BHRcbHgkAAAH/6gHQAFMCngADAAATJzcXHDJMHQHQwwvDAAAC//QB0AEAAp4ADAAQAAATJzY2NTQnNxYWFRQGFyc3FxgMEhlDCTVBOY8yTB0B0CYLHhU1BC8BMC4sNQzDC8MAAv/zAdAA/AKeAAwAEAAAEyYmNTQ2NxcGFRQWFxcnNxdOIjlANglDGRJsM0wdAdAMNSwuMAEvBDUVHgsmwwvDAAL/9AHQAQACngAMABAAABMnNjY1NCc3FhYVFAYXNxcHGAwSGUMJNUE5XR1MMgHQJgseFTUELwEwLiw1AcMLwwAC//MB0AD8Ap4ADAAQAAATJiY1NDY3FwYVFBYXFzcXB04iOUA2CUMZEjkdTDIB0Aw1LC4wAS8ENRUeCxvDC8MAAv/oAbcA1AKgABUAIwAAEyImJiMiBgcnNjYzMhYWMzI2NxcGBgcnNjY1NCYnNxYWFRQGjxgeGRAMEAIqBCAhGB4ZEAwRASoEIG0IEhggJQc7PjkCUBIRDBMGIyMREgwTBiMjmSEFDgoOEAInAh0fHyEAAv/oAbcA1AKgABUAIwAAEyImJiMiBgcnNjYzMhYWMzI2NxcGBgcmJjU0NjcXBgYVFBYXjxgeGRAMEAIqBCAhGB4ZEAwRASoEIDckOkA6ByUgFxMCUBIRDBMGIyMREgwTBiMjmQchHx8dAicCEA4KDgX//wADAAACHQKQAgYAAgAAAAIAWgAAAhsCkAANABYAADMRIRUhFTMyFhYVFAYjJzMyNjU0JiMjWgGV/r5+Rmw+gGyCdFRUVlRyApBGziRPQmdgQkBDPzgA//8AWgAAAiQCkAIGAAMAAP//AFoAAAHUApACBgJqAAAAAgAa/0QCZAKQAAkAHgAAEwYGByERIw4CAxUjJzUzPgI3PgI3IREzFQcjNd8QIxYBMbcKDg99SQkeDh0gEAwSEwsBTEkJSQElU2wfAgM4W1r+o7zRMgYsY1dBaW1G/bcy0bwA//8AWgAAAd4CkAIGAAYAAAABAAYAAAMeApwALwAAMxMnLgIjIgYHJzYzMhYWFxczETMRMzc+AjMyFwcmJiMiBgYHBxMjAyMRIxEjAwbJRhAdGg8EDgYODxUeMi0XTFpPWU0XLTIeFQ8OBwwFDhscEUbIW6pfT1+qAVydJSMLAgJOBhQ0MqcBFf7rpzI0FAZOAgILIyWd/qQBN/7JATf+yQABACr/9AICApwAKwAABSImJzcWFjMyNjY1NCYjIzUzMjY1NCYjIgYHJzY2MzIWFRQGBxUWFhUUBgYBFkdzMi8sVzkrRipdVEo2Vk1JNy5OHi0jajxcdDMvOUs/awwtMzkrJR46KT88QDo3NDUhHDgjK1lPNE8RBAtTRD9YLwABAFoAAAI2ApAAEwAAMxEzERQGBzM3EzMRIxE0NjcjBwNaUgcDBEfxWFIHAwRH8QKQ/q00azKGAZ79cAFXNGgxhv5i//8AWgAAAjYDSQImA7gAAAAHB0oBTAAEAAEAWgAAAkICnAAZAAAzETMRMzc+AjMyFwcmJiMiBgYHBxMjAyMRWlNxXBwtLh0VDw4HDAUOGBsUV+JbynACkP7rpzI1EwZNAgELJCSc/qMBN/7JAAEAAP/0AhwCkAAYAAAXIiYnNxYzMjY2NzY2NyERIxEjBgYHDgI4EBoOEQ8NEh4dDxQkEwFIU7QQHRESLDkMBAVNBhdMTWfJbP1wAkparldkaygA//8AWgAAAn0CkAIGAA4AAP//AFoAAAIyApACBgAJAAD//wA0//QCZQKcAgYAEAAA//8AWgAAAisCkAIGAncAAP//AFoAAAILApACBgARAAD//wA0//QCGwKcAgYABAAA//8AHAAAAfwCkAIGABUAAAABAAX/9AICApAAFgAAFyImJzcWFjMyNjc3AzMTFzM3EzMDBgaIFh0OEQgUDiAoDQ7gWXoyBC5xVdcZTAwFBUsDBBkcIwH2/tyBgQEk/ec9RgAAAwAv//QCrQKcABEAGAAfAAAFNSYmNTQ2NzUzFRYWFRQGBxUBFBYXEQYGBTQmJxE2NgFJhZWVhUqFlZWF/uxpYWFpAd5oYmJoDF4FgXNzfQRdXQR9c3OBBV4BV1VhAwFtA1xVVVwD/pMDYQD//wAPAAAB8gKQAgYAGQAAAAEAWv9EAmgCkAAMAAAFNSERMxEhETMRMxUHAhb+RFMBH1NJCby8ApD9twJJ/bcy0QAAAQBDAAAB/AKQABQAACERBgYjIiYmNTUzFRQWMzI2NxEzEQGpGDknSms5UlVPJTcUUwEmBAYpXk+enlI/BgQBJf1wAAABAFoAAAMHApAACwAAMxEzETMRMxEzETMRWlLcUdxSApD9twJJ/bcCSf1wAAEAWv9EA1ACkAAQAAAzETMRMxEzETMRMxEzFQcjNVpS3FHcUkkJSQKQ/bcCSf23Akn9tzLRvAAAAgAcAAACpAKQAA0AFgAAMxEjNSERMzIWFhUUBiMnMzI2NTQmIyPu0gEmbEZvQYNtcmhTVVlWYQJKRv7zJ1FBaWFEPkY8PAAAAwBaAAACxAKQAAsAFAAYAAAzETMRMzIWFhUUBiMnMzI2NTQmIyMBETMRWlNmSG09g25nXVNWVlZaAcRTApD+8yZRQmlhRD5GPjr+wAKQ/XAAAAIAWgAAAhgCkAALABQAADMRMxEzMhYWFRQGIyczMjY1NCYjI1pTeUhtPYNuem9TV1ZWbQKQ/vMmUUJpYUQ+Rj46AAEAIP/0AgcCnAAeAAAXIiYnNxYWMzI2NyE1ISYmIyIGByc2NjMyFhYVFAYG80NnKS4hTzNWaAT+7QESCWNWK0sdLiBnPVN8RUd9DDItNCIofHxHaG8hHTYgMU6Xb2+YTQAAAgBa//QDWAKcAA0AIwAAJTI2NjU0JiMiBhUUFhYXIiYmJyMRIxEzETM2NjMyFhYVFAYGAko5Ui1iVlViLFM4TXZEBJJTU5QMjm9ReUREeT1DeVJ6jo56UnlDSU6QY/7LApD+7YeYUZdpaZpUAAACABYAAAHsApAADgAXAAAhESMDIxMmJjU0NjYzMxEDMzUjIgYVFBYBmXmqYLdAVDtoQ83Bbm5MU1MBFf7rAR4RWk9EUSP9cAFZ9DRBQD8A//8AWgAAAd4DYwIGAF4AAP//AFoAAAHeAy0CBgBiAAAAAQAc//QCfgKQACQAAAUiJic3FhYzMjY2NTQmIyIGBxEjESM1IRUjFTY2MzIWFhUUBgYByhEkCw8HFgoYMiFUTR02FVSyAevlGDkiQ2k9NFIMBgRDAwUZOzJKQwUF/r4CSkZGwwUFK1xKTFknAP//AFoAAAHUA2MCJgOzAAAABwc9ASIAAAABADT/9AIbApwAHgAABSImJjU0NjYzMhYXByYmIyIGByEVIRYWMzI2NxcGBgFSVIFJSoNVO14cLRpEKVdtCwET/uwFbF0vSh8uJ2IMTZhvb5dOMSA2HCJvaEd8fCgiNC0y//8AKv/0Ae8CnAIGABQAAP//AFoAAACtApACBgAKAAD////sAAABHAMtAgYAhQAAAAMAEgAAAPUDLQALABcAGwAAEyImNTQ2MzIWFRQGMyImNTQ2MzIWFRQGAxEzET8TGhoTFBkZdRMaGhMUGRmCUwLLHBUWGxsWFRwcFRYbGxYVHP01ApD9cP//AB//9AGJApACBgALAAAAAgAG//QDWwKQACAAKQAAFyImJzcWMzI2Njc2NjchETMyFhYVFAYjIxEjBgYHDgIlMzI2NTQmIyM+EBoOEQ4OEh0dEBQkEwE0W0htPYNur6AQHRATLDkBqFFTV1ZWTwwEBU0GF0xNZ8ls/vMmUUJpYQJKWq9XZGsnUD5GPjoAAgBaAAADdQKQABMAHAAAMxEzESERMxEzMhYWFRQGIyMRIRElMzI2NTQmIyNaUwEnVFtIbT2DbrD+2QF7UVNXVlZPApD+7QET/vMmUUJpYQE1/stEPkY+OgAAAQAcAAACdQKQABYAADMRIzUhFSMVNjYzMhYVFSM1NCYjIgcRzrIB6+UYOxxreVJNTTgvAkpGRsMFBWBuw8NKPwr+vv//AFoAAAJCA2cCJgO6AAAABwc9AUMABP//AFoAAAI2A2cCJgO4AAAABwc6AUwABP//AAX/9AICA0UCJgPDAAAABwdKAQEAAAABAFr/RAIrApAACwAABTUjETMRIREzESMHAR/FUwErU7sIvLwCkP23Akn9cLwAAgAcAAACOgK8ABMAHAAAMxEjNTM1MxUzFSMVMzIWFhUUBiMnMzI2NTQmIyOmiopU6upOSG09fm5USlNRU1hDAftEfX1EiCJMP2ldQjtFPjUAAAMANP/0AmUCnAAPABYAHQAABSImJjU0NjYzMhYWFRQGBgMiBgchJiYDMjY3IRYWAUxSf0dHf1JTfkhIflNSaAoBiApoUlZrBf50BWsMUJptbZZOTpZtbZpQAmJyaWly/eSDenqDAAEAAAAAAjECnAAYAAAzAzMTFhYXMzY2Nzc2NjMyFwcmJiMiBgcD0tJZaREcEwQQGRBAFDo0GxURBQ0IFhoLkwKQ/p46ZTo6ZTrjSUIJTQIEJSX9/gAAAQBaAAAB3QM8AAcAADMRITczByERWgEtD0cJ/tkCkKzy/bYAAQAhAAAB6gKQAA0AADMRIzU3ESEVIRUzFSMRcE9PAXr+2ZWVASs3BAEqRuQ7/tUAAQAG/0QDNQKcADQAADMTJy4CIyIGByc2MzIWFhcXMxEzETM3PgIzMhcHJiYjIgYGBwcTMxUHIzUjAyMRIxEjAwbJRhAdGg8EDgYODxUeMi0XTFpPWU0XLTIeFQ8OBwwFDhscEUafQAlJIKpfT1+qAVydJSMLAgJOBhQ0MqcBFf7rpzI0FAZOAgILIyWd/usy0bwBN/7JATf+yQAAAQAq/0QCAgKcAC4AABc1JiYnNxYWMzI2NjU0JiMjNTMyNjU0JiMiBgcnNjYzMhYVFAYHFRYWFRQGBgcH8TpiKy8sVzkrRipdVEo2Vk1JNy5OHi0jajxcdDMvOUsyVzcIvLIFLSw5KyUeOik/PEA6NzQ1IRw4IytZTzRPEQQLU0Q4UjIHswABAFr/RAJaApwAHgAAMxEzETM3PgIzMhcHJiYjIgYGBwcTMxUHIzUjAyMRWlNxXBwtLh0VDw4HDAUOGBsUV7RGCUkhynACkP7rpzI1EwZNAgELJCSc/uoy0bwBN/7JAAABABwAAALKApwAGwAAMxEjNSERMzc+AjMyFwcmJiMiBgYHBxMjAyMR4sYBGnFcHCwvHRUPDgcMBQ4YHBRX4lrKcAJKRv7rpzI1EwZNAgELJCSc/qMBN/7JAAABAFr/RAJ7ApAAEAAAMxEzESERMxEzFQcjNSMRIRFaUwExVEkJSUv+zwKQ/u0BE/23MtG8ATX+ywAAAQA0/0QCGwKcACAAAAU1LgI1NDY2MzIWFwcmJiMiBgYVFBYWMzI2NxcGBgcHAStIb0BMhFM8XBwtGkIqPl0zMls+L0ofLiBOMQi8sgpVkGNqmFIxIDYcIkF2UlJ5QigiNCUvCLP/////AAAB3QKQAgYAGgAAAAH//wAAAd0CkAAWAAAzNSM1NzMDMxcWFhczNjY3NzMDMxUjFcSLWB2vWVUQHxAEESIPVFevdYvwNwMBZrkkRiUlRiS5/po68AAAAQAP/0QCDgKQAB4AADMTAzMXFhYXMzY2NzczAxMzFQcjNSMnJiYnIwYGBwcPv7JcWQ0XDwQOFQxXWLOXRAlIJ2ANGxAEDhoMXwFTAT2oFiwdHSwWqP6//vgy0byxGDMeHjMYsQAAAQBD/0QCRQKQABkAACERBgYjIiYmNTUzFRQWMzI2NxEzETMVByM1AakYOSdKazlSVU8lNxRTSQlHASYEBileT56eUj8GBAEl/bcy0bwAAQBaAAACEwKQABQAADMRMxE2NjMyFhYVFSM1NCYjIgYHEVpTGDkmS2s5UlVQJDcUApD+/gQGKV5PwsJTPgYE/rf//wBaAAAArQKQAgYACgAA//8ABgAAAx4DRQImA7YAAAAHB0oBkgAA//8AAwAAAh0DRQImA7AAAAAHB0oBEAAA//8ACAAAAwUCkAIGAE4AAP//AFoAAAHeA0UCJgO1AAAABwdKARwAAP//ADr/9AJeApwCBgEDAAD//wBaAAACNgMcAiYDuAAAAAcHRAFMAAT//wA0//QCZQMtAiYDvgAAAAcHTgFMAAD//wA0//QCZQKcAgYD4gAA//8ABf/0AgIDGAImA8MAAAAHB0QA/AAA//8ABf/0AgIDbAImA8MAAAAHB1QA/AAA//8ANP/0AbEB8gIGABwAAAACADX/9AHwAtoADgAsAAATFBYzMjY1NCYjIgYHFBQTIiY1ND4CNzY2NxcGBgcOAwc2NjMyFhUUBgaETEo4SUQ/I0wllm14K1BxRSkmFhATMh86VjkgBiBXLlZtOmEBF2p1Z1JLWSYyCRP+06CTe5hTKAoGCwpLDQ0FCRUtV0soKXhrTXI+AAMAUgAAAdUB5gAPABgAIQAAMxEzMhYVFAYHFRYWFRQGIwMzMjY1NCYjIxEzMjY1NCYjI1K7UGMrJik9bFRyXD00MzhiaTw7Pj5kAeY5Qig1CwMKNjVIQwEaJyIiJv6QLSglKgABAFIAAAGBAeYABQAAMxEhFSMRUgEv3QHmQ/5dAAACABP/VAH+AeYABgAYAAA3BgYHMxEjAxUjJzUzPgI3NyERMxUHIzW3CBsR4ptnRwkYDhcWCRoBLkcIR/9IWhoBYP5drLs0CCNTTtf+XTS7rAD//wAu//QBygHyAgYAIAAAAAEADQAAApwB8gApAAAzNycmJiMiByc2MzIWFxczNTMVMzc2NjMyFwcmIyIGBwcXIycjFSM1IwcNmScQIhQKBg8NECg/GSxNSU0sGj4oEAwOBgoTIxEmmVl6UElQev9hKhgCTQUqPmzIyGw+KgVNAhgqYf/b29vbAAEAJf/0AaEB8gArAAAXIiYnNxYWMzI2NTQmIyM1MzI2NTQmIyIGByc2NjMyFhYVFAYHFRYWFRQGBt0yWysjIkclMkdBO0M3Ozo5LCo9HSMjVDQwUDEqJio7N1kMGyM1HBUvKCkpOykkJSUWFTYZHRw6LSM6DwQLOTUtQSQAAAEAUgAAAeMB5gAXAAAzETMVFAYHMzY2NxMzESM1NDY3IwYGBwNSUAUDBA4lDbhNUAUDBA0mDbkB5sonXS8XOxYBFf4ayideLxY8Fv7q//8AUgAAAeMC1gImBAQAAAAHB0gBHQABAAEAUgAAAeUB8gAXAAAzETMVMzc+AjMyFwcmIyIGBwcTIycjFVJSXjAUJiwaEAwOBgoTIBQppVqHYAHmyGwsLQ8FTQIWLGD/ANvbAAABAAr/9AHBAeYAFgAAFyImJzcWFjMyNjc2NjchESMRIwYGBwY2DRQLEAUKBxogBwoSCQErU5cHEQgVDAQETAEDMTZPnU/+GgGjQ4dDogABAFIAAAInAeYAIwAAMxEzFxYWFzM2Njc3MxEjNTQ2NjcjBgYHByMnJiYnIx4CFRVSX18LFwoECxcKXV5LAwUCBAoYC1w3XgoYCwQCBAMB5uQeOx0dOx7k/hraFjs+GRw8G+HhGzwcGT47FtoAAAEAUgAAAeAB5gALAAAzETMVMzUzESM1IxVSUupSUuoB5sXF/hrY2P//AC7/9AHwAfICBgAqAAAAAQBSAAAB1wHmAAcAADMRIREjESMRUgGFUuEB5v4aAaP+XQD//wBS/zMB+wHyAgYAKwAA//8ALv/0Aa8B8gIGAB4AAAABABoAAAGyAeYABwAAMxEjNSEVIxG9owGYowGjQ0P+XQD//wAM/y8BxwHmAgYANAAAAAMAL/8zAq8CyAAjADAAPQAABTU3BgYjIiY1NDY2MzIWFyc1MxUHNjYzMhYVFAYGIyImJxcVAzI2NxEmJiMiBhUUFiEyNjU0JiMiBgcRFhYBRwIUMR1TZTNUMR0vFgJQAhc3G1ZbM1UyFzEYAp4WJhQUKxUwQT4BJTNANTsUKhcWLM2cSQ8VhXlPcz4UD0ixsUoRFIdxUnY+ExBInAEGEBMBMBIPZ1NXY2daUGMOFP7PEw4A//8ADgAAAbAB5gIGADMAAAABAFL/VAIXAeYADAAABTUhETMRMxEzETMVBwHI/opS2lJHCKysAeb+XQGj/l00uwABADsAAAGuAeYAEwAAITUGBiMiJjU1MxUUFjMyNjc1MxEBXBkmIFxmUj1DFiQVUsIFBU5bhYU2MAUE4v4aAAEAUgAAApsB5gALAAAzETMRMxEzETMRMxFSUqtPrFEB5v5dAaP+XQGj/hoAAQBS/1QC4gHmABAAADMRMxEzETMRMxEzETMVByM1UlKrT6xRRwhHAeb+XQGj/l0Bo/5dNLusAAACABoAAAIqAeYADAAUAAAzESM1MxUzMhYVFAYjJzMyNTQmIyPGrP5RV2pqV1FJeTw9SQGjQ7NIUFFKQlkuKgAAAwBSAAACUAHmAAoAEgAWAAAzETMVMzIWFRQGIyczMjU0JiMjBREzEVJSRVZra1ZFPHk7PjwBWlIB5rNIUFFKQlkuKvMB5v4aAAACAFIAAAHBAeYACgASAAAzETMVMzIWFRQGIyczMjU0JiMjUlJcVmtrVlxTeTs+UwHms0hQUUpCWS4qAAABABj/9AGaAfIAHgAAFyImJzcWFjMyNjcjNTMmJiMiBgcnNjYzMhYWFRQGBrcuUh8iFzskQ1QE19UJTzokNRUnGUs2PWQ9O2cMIR0yFBpUVTtMSxkSMhcjN3JXVXE4AAACAFL/9AK0AfIACwAhAAAlMjY1NCYjIgYVFBYXIiYmJyMVIxEzFTM2NjMyFhYVFAYGAd48RUU8O0lJPzlcOgZpUlJqDHZSOl85OV84Z1NUaGhUU2dENWVH1QHmyGVvPHJSUHI8AAACACAAAAGwAeYADwAYAAAhNSMjByM3JiY1NDY2MzMRJzM1IyIGFRQWAV5aAYZdlC5BMlc2rJ5MTDlBQcDAyw5DOjY/G/4a/KonKystAP//AC7/9AHKAw0CBgEuAAD//wAu//QBygKvAgYBMgAAAAEACP8nAfMCyAAqAAAFIiYnNxYWMzI2NjU0JiYjIgYHESMRIzU3NTMVMxUjFQc2NjMyFhUUDgIBJxMfCxAIFQsjOCEbNigiOyRSSkpStrYEIkwxV10cNUzZCAU+AwU1h3xWYikjJf7FAjsrBV1dMF1hIS2LlXGWWCX//wBSAAABhQMOAiYD/wAAAAcHPAD2AAEAAQAu//QBrwHyAB4AAAUiJiY1NDY2MzIWFwcmJiMiBgczFSMWFjMyNjcXBgYBEkFoO0BqPzBGGScWMiA8Ugri5AVTRCM8FiEhUAw4cVVWcjgiFzQTGU1KO1RVHRM0HSH//wAc//QBgwHyAgYALgAA//8ARQAAALMCtgIGACQAAP///+oAAAEOAq8CBgFUAAAAAwARAAAA8AKuAAsAFwAbAAATIiY1NDYzMhYVFAYzIiY1NDYzMhYVFAYDETMRPxMbGxMUGhpvExsbExQaGn9SAkwcFRUcHBUVHBwVFRwcFRUc/bQB5v4a////2P8nALICtgIGACUAAAACAAz/9AK1AeYAHgAmAAAXIiYnNxYWMzI2NzY2NyEVMzIWFRQGIyMRIwYGBwYGJTMyNTQmIyM4DRUKDwUKBxclCQsLBAEkQFZra1aTiQQLDA1GAUo3ejw+NwwEBEwBAzA3S55Ss0hQUUoBo0OPR0xKTlkuKgAAAgBSAAACzQHmABIAGgAAMxEzFTM1MxUzMhYVFAYjIzUjFSUzMjU0JiMjUlLVUkBXa2tXktUBJzh5Oz44AebFxbNIUFFK2NhCWS4q//8ACAAAAdcCyAIGAU8AAP//AFIAAAHlAw4CJgQGAAAABwc8ARQAAf//AFIAAAHjAw4CJgQEAAAABwc5AR0AAf//AAz/LwHHAtUCJgQPAAAABwdIAPMAAAABAFL/VAHcAeYACwAAFycjETMRMxEzESMH8wOeUuZSmgmsrAHm/l0Bo/4arAAAAgAaAAACFgJuABIAGgAAMxEjNTM1MxUzFSMVMzIWFRQGIyczMjU0JiMjspiYUry8UVdqaldRSHo8PkgBt0N0dEOESFBRSkJZLioA//8ALv/0AfAB8gIGAgMAAAABAAwAAAHyAfIAGAAAMwMzExYWFzM2Njc3NjYzMhYXByYjIgYHA7uvVVwLGAsECRMKMBQ3Mg8VDBAKDxYaDG0B5v7sJEgjI0gklEhEBAVKBiQl/qQAAAEAUgAAAY8CkgAHAAAzETM3MwcjEVLqEEMJ4gHmrO/+XQABABwAAAGUAeYADQAAMzUjNTc1IRUjFTMVIxVlSUkBL92Ghs82BdxDmTvPAAEADf9UArsB8gAuAAAzNycmJiMiByc2MzIWFxczNTMVMzc2NjMyFwcmIyIGBwcXMxUHIzUjJyMVIzUjBw2ZJxAiFAoGDw0QKD8ZLE1JTSwaPigQDA4GChMjESZxRwhHKXpQSVB6/2EqGAJNBSo+bMjIbD4qBU0CGCphvDS7rNvb29sAAAEAJf9UAaEB8gAtAAAXJyYmJzcWFjMyNjU0JiMjNTMyNjU0JiMiBgcnNjYzMhYWFRQGBxUWFhUUBgcHugQmSCMjIkclMkdBO0M3Ozo5LCo9HSMjVDQwUDEqJio7WUEJrKIEHBw1HBUvKCkpOykkJSUWFTYZHRw6LSM6DwQLOTU6SwqjAAEAUv9UAgUB8gAcAAAzETMVMzc+AjMyFwcmIyIGBwcXMxUHIzUjJyMVUlJeMBQmLBoQDA4GChMgFCl6SwlGK4dgAebIbCwtDwVNAhYsYL00u6zb2wAAAQAaAAACWQHyABkAADMRIzUzFTM3PgIzMhcHJiMiBgcHEyMnIxXGrP5dMRQmKxoQDQ8GChMgEymlW4dfAaNDyGwsLQ8FTQIWLGD/ANvbAAABAFP/VAInAeYAEAAAMxEzFTM1MxEzFQcjNSM1IxVTUupSRglHSOoB5sXF/l00u6zY2AAAAQAu/1QBrwHyAB0AABcnJiY1NDY2MzIWFwcmJiMiBgYVFBYzMjY3FwYHB+oEUGhBaz4wRRkqFS8dLEUnU0MiOhYkNUMJrKQOgmpScjwiFzYTGC9VOFNnHRQ3LwyjAAEADP8zAccB5gAPAAAXNQMzExYWFzM2NjcTMwMVw7dVWwsYCwQLGApbUbLNzQHm/vckRyIiRyQBCf4azQAAAQAM/zMBxwHmABYAABc1IzU3MwMzExYWFzM2NjcTMwMzFSMVw5ROMKFVWwsYCwQLGApbUZx4js3NNgUBq/73JEciIkckAQn+VTvNAAEADv9UAc4B5gAeAAAzNyczFxYWFzM2Njc3MwcXMxUHIzUjJyYmJyMGBgcHDp+TWUELGA0ECxYLO1aTc0kIRilHDRoOBA0YDEL+6GsTKhQUKhNr8bI0u6xxFiwVFSsXcQAAAQA7/1QB9QHmABgAACE1BgYjIiY1NTMVFBYzMjY3NTMRMxUHIzUBXBkmIFxmUj1DFiQVUkcJRsIFBU5bhYU2MAUE4v5dNLusAP//AFIAAAHXAsgCBgAjAAD//wANAAACnALVAiYEAgAAAAcHSAFVAAD//wBS//QA2ALIAgYAJwAA//8ANP/0AbEC1QImA/wAAAAHB0gBBgAA//8AOv/0AusB8gIGAR4AAP//AC7/9AHKAtUCJgQBAAAABwdIAQgAAP//ACX/9AHCAfICBgHkAAD//wBSAAAB4wKTAiYEBAAAAAcHQwEdAAH//wAu//QB8AKvAiYECgAAAAcHTQEPAAD//wAu//QB8AHyAgYCAwAA//8ADP8vAccCkgImBA8AAAAHB0MA8wAA//8ADP8vAccC+QImBA8AAAAHB1MA8wAAAAIAL//0AeIC2gAmADMAAAUiJiY1NDY3LgI1NDY2Nz4CNxcGBgcOAhUUFhYXHgIVFAYGJxQWFjMyNjU0JicGBgECN2E7alciPyg5aUgoLRwPERU2H0ZVJShAJS1FKDZjySY+I0JKPS5OWgw0YUJcbhsYLTEcMi8UCQQGCQdLCw0ECAkTFxEdIxofQlQ7RGo72i1DJl1JPE4iE2IAAAQAO//0A28CigAqADoARgBKAAAXIiYnJzI2NREzFhYXFzMuAjU1NDMyFhcXIgYVESMmJicnIx4CFRUUBgEiJiY1NDY2MzIWFhUUBgYnMjY1NCYjIgYVFBYHNTMVWwkICAcREVwuWCs5BAUFAk4ICgcHERJcLVgsOAQFBQEkAlIqRioqRioqRikpRionLy8nJy8vWP0MAgFBEhgCHGfMaIE/YVgvnmMCAkERGP3kZ81ogD9hVzCfMTEBICZIMzRHJiZHNDNIJjc5MTI5OTIxObUyMgAAAwAg//QCUgKcAAsANQBBAAATFBYXNjY1NCYjIgYTIiYmNTQ2NjcmJjU0NjYzMhYVFAYGBxYWFzY2NzMGBgcWFhcHJiYnBgYnFBYzMjY3JiYnBga9EQ4tQx0hJSwrO1syJToiFBcmRS09RCxDJSBYLh4vD00TOSciPhsWIk0oJV6ySzYiPxwwWSMiMAICGzoeHkErHSs2/ckvUjUsRDYXKU0kLEYpSDorRDgbMl8nKWE4QHc0FyAIRAolHCIpuzdCHBkqZDUcPQACACz/9AHFAooACwAXAAAXIiY1NDYzMhYVFAYnMjY1NCYjIgYVFBb5YG1tYF9tbV84REQ4OEVFDK2goaiooaCtQn+MjHt7jIx/AAEATwAAAbcCfgAMAAAzNTMRIzU2NjczETMVT5J0LEEaP4REAdY1CBcQ/cZEAAABACQAAAHEAooAGwAAMzU+AjU0JiMiBgcnNjYzMhYVFAYGBzY2MzMVKGCGRjw9KEQcLyhbPllmQ3VMGjgZuTFgkXUzN0YtIC8sNWdVPHuHTwIERwABABr/9AG+AooAKgAAFyImJzcWFjMyNjU0JiYjNTI2NjU0JiMiBgcnNjYzMhYVFAYHFRYWFRQGBuxMZiAqHU44OkonWUxETyI7MyhDHSwlWjhTbEA0OlA4Xww3IzYeLkA1JjkgPyA2IS82JB00Iy1VTTpKFAQNU0I4UiwAAgARAAAB1QJ+AAkAFAAANzM1NDY3IwYGBxM1ITUBMxEzFSMVaMgEAQQMGg4z/uEBEVxXV/K5GkgZFywX/jSwNgGY/nRCsAAAAQAZ//QBwQJ+ACAAABciJic3FhYzMjY1NCYjIgYHJxMhFSMHNjYzMhYWFRQGBupMZCEoHUw4O1FKPiEvHSwVAT/3ERcuHTdZNj1iDDYhNhwtT0NCShQTHAEzR70MDitYRUVhMgAAAgAw//QByQKKAAsAKAAAASIGBxYWMzI2NTQmAyImJjU0NjYzMhYXByYmIyIGBgc2NjMyFhUUBgYBBR9IHghHPS9AOzQ+ZDpFbz80SxsuEzgeLUovAh5QJ1NjNFUBSCgsXWJNPz5J/qxEiWaAnEcnHTMXGzN3ZSUrY2I9XDQAAQAsAAABxwJ+AA0AADM+AjchNSEVDgMHsQYnTT/+wgGbOUgoFAR4v6lXRzNIhYeaXQADACn/9AHIAooAHwAsADkAABciJiY1NDY2NzUmJjU0NjYzMhYVFAYGBxUeAhUUBgYDNjY1NCYjIgYVFBYWAzI2NTQmJicGBhUUFvo8XjcjNx4jNjBSM1NhHCgUHTIgM10RICM6NSw7KUQFOEUwTy4mM08MLVAyKkExEAQZSDIxSilgSiE7Lw8EECw9Ky9OLQFoHUAjL0I4LyYyI/7GPzEpNCYSGUYsNUUAAAIAKP/0AcACigALACgAABMUFjMyNjcmJiMiBhMiJic3FhYzMjY2NwYGIyImNTQ2NjMyFhYVFAYGdTs7IEcfCEg9LkFYM00aLhQ3Hi1MLwEeUChSYzRVMz9kOUVuAb0+SSgtXWFN/fgnHDQXHDR4ZiYsY2I9XDREiGeAnEcAAAMALP/0AcUCigALABcAIwAAFyImNTQ2MzIWFRQGJzI2NTQmIyIGFRQWNyImNTQ2MzIWFRQG+WBtbWBfbW1fOEhIODlISDkZJCQZGSMjDK2goaiooaCtQoKJin19iomCzSMfICIiIB8jAAADACz/9AHFAooACwAVAB8AABciJjU0NjMyFhUUBgMiBgcTNjY1NCYDMjY3AwYGFRQW+WBtbWBfbW1fHzUR2wUFSDggMxHbBAZIDK2goaiooaCtAlcmKf7IGj4ljH796CgrATgaPiWLgwAAAgA3//QB4wKKAAsAFwAABSImNTQ2MzIWFRQGJzI2NTQmIyIGFRQWAQ1kcnJkZHJyZDtISDs7SEgMsJ2eq6uenbBEf4qKenqKin8AAAEAMgAAAPkCfgAIAAAzESM1NjY3MxGndSxCGj8CGjUIFxD9ggAAAQAlAAABwAKKABsAADM1PgI1NCYjIgYHJzY2MzIWFRQGBgc2NjMzFStghEU5PihFGzAqWz1ZZEJ0Sho4GbExYJF1MzdGLSAvLjNnVTx7h08CBEf//wAa//QBvgKKAgYETgAA//8AIgAAAeYCfgAGBE8RAP//ABn/9AHBAn4CBgRQAAD//wA9//QB1gKKAAYEUQ0AAAEALAAAAbkCfgANAAAzPgI3ITUhFQ4DB6cGJUw+/tABjThGKBMEeL+pV0czSIWHml3//wA3//QB1gKKAAYEUw4A//8ANP/0AcwCigAGBFQMAAADADf/9AHjAooACwAXACMAAAUiJjU0NjMyFhUUBicyNjU0JiMiBhUUFjciJjU0NjMyFhUUBgENZHJyZGRycmQ+SUk+PUpKPRkkJBkZJCQMsJ2eq6uenbBEgoeIfHyIh4LLIx8gIiIgHyMAAwA3//QB4wKKAAsAFAAdAAAFIiY1NDYzMhYVFAYDIgYHEzY1NCYDMjY3AwYVFBYBDWRycmRkcnJkIjcT6gxNPSM3EuoMTQywnZ6rq56dsAJXJyn+xjZKjH796CkqATs2SouDAAIALP/0AcUCSgALABcAABciJjU0NjMyFhUUBicyNjU0JiMiBhUUFvleb29eXW9vXTtBQTs7QkIMl5SVlpaVlJdCfG1uenpubXwAAQBPAAABtwI+AAwAADM1MxEjNTY2NzMRMxVPknQsQRo/hEQBljUIFxD+BkQAAAEAJAAAAcQCSAAbAAAzNT4CNTQmIyIGByc2NjMyFhUUBgYHNjYzMxUoX4VGOzsoRRwvKFs+V2ZAcUgaOBmwMU96ZC41RCwgLiw1ZlM2Zm9DAgRHAAEAGv+qAb4CSgAqAAAXIiYnNxYWMzI2NTQmJiM1MjY2NTQmIyIGByc2NjMyFhUUBgcVFhYVFAYG7ExmICodTjg6SidZTERPIjszKEMdLCVaOFNsQDQ6UDhfVjcjNh4tQjYmOSFAITchLzgkHTQjLVdNOk0TBA1VQzhULQACABH/tgHVAj4ACAATAAA3MzU0NjcjBgcTNSE1ATMRMxUjFWjIBAEEGRsz/uEBEVxXV6DLGkUZMjD+Nag3Aan+YkKoAAEAGf+qAcECPgAgAAAXIiYnNxYWMzI2NTQmIyIGBycTIRUjBzY2MzIWFhUUBgbqTGQhKB1MODtRSj4hLx0sFQE/9xEXLh03WTY9YlY3IjQcLFFDQ0sTFBwBOEfCDA8rWkVGYzMA//8AMf/0AcoCigIGBFEBAAABACz/tgHHAj4ADQAAFz4CNyE1IRUOAwexBidNP/7CAZs5SCgUBEp5w61YRzNJh4ucXgD//wAp//QByAKKAgYEUwAAAAIAHv+qAcICSgALACYAABMUFjMyNjcmJiMiBhMiJic3FjMyNjY3BgYjIiY1NDY2MzIWFRQGBmw6PyNLHwZKQTFEYDBGICMxPi9KLwMfUypYYTVZNWl4Pm8BdUNPKC5naVL98x4bOi4xc2IlK2xkP2A2ppJ6oE4A//8ANP/0Ac0CSgAGBGMIAAABADIAAAD5Aj4ACAAAMxEjNTY2NzMRp3UsQho/Ado1CBcQ/cIAAAEAKQAAAbwCSAAbAAAzNT4CNTQmIyIGByc2NjMyFhUUBgYHNjYzMxUwX4BANzwoQBwvKFc9WGI8bUgaOBmjMU96ZC41RCwgLiw1ZlM2Zm9DAgRH//8AGv+qAb4CSgIGBGYAAP//ABn/tgHdAj4ABgRnCAD//wAZ/6oBwQI+AgYEaAAA//8AOf/0AdICigAGBFEJAAABACz/tgG5Aj4ADQAAFz4CNyE1IRUOAwelBiZNPv7QAY04RykTBEp6wq1YRzNJh4qcXwD//wAx//QB0AKKAAYEUwgA//8AJv+qAcoCSgAGBGwIAAACACz/9AHFApwACwAXAAAXIiY1NDYzMhYVFAYnMjY1NCYjIgYVFBb5Xm9vXl1vb104REQ4OEVFDKusqqenqqyrQoSRj4CAj5GEAAEATwAAAbcCkAAMAAAzNTMRIzU2NjczETMVT5J0LEEaP4REAek0CBcQ/bREAAABACQAAAHEApwAGQAAMzU2NjU0JiMiBgcnNjYzMhYVFAYHNjYzMxUompI8PShEHC8oWz5ZZo1zGjgZtTGGzFQ5SSwgLiw1alhhy20CBEcAAAEAGv/0Ab4CnAAqAAAXIiYnNxYWMzI2NTQmJiM1MjY2NTQmIyIGByc2NjMyFhUUBgcVFhYVFAYG7ExmICodTjg6SidZTERPIjszKEMdLCVaOFNsPzU6UDhfDDcjNh4uQjknOyA/ITkjLzkkHDQjLFZPPE4TBA5VRDpULQACABEAAAHVApAACQAUAAA3MzU0NjcjBgYHEzUhNQEzETMVIxVoyAQBBAwaDjP+4QERXFdX9sgZRhkYMRj+K7U2AaX+ZkG1AAABABn/9AHBApAAIAAAFyImJzcWFjMyNjU0JiMiBgcnEyEVIwc2NjMyFhYVFAYG6kxkISgdTDg7UUo+IS8dLBUBP/cRFy4dN1k2PWIMNiE2HC1UR0dOExMbATNGvg0OLF1ISGU1AAACADH/9AHKApwACwAoAAABIgYHFhYzMjY1NCYDIiYmNTQ2NjMyFhcHJiYjIgYGBzY2MzIWFRQGBgEGH0geB0g9L0A7Mz9kOkVvPzRLGy4TOB0tSy8CHlAnU2MzVgFaKC1la1FDQ07+mkiRbIGcRiYdMxcbNHdlJStnaD9gNgABACwAAAHHApAADQAAMz4CNyE1IRUOAwexBiVOQP7CAZs6SCgTBH3Fr1lGMkqIjZ9gAAMAKf/0AcgCmgAfACsAOAAAFyImJjU0NjY3NSYmNTQ2NjMyFhUUBgYHFR4CFRQGBgM2NTQmIyIGFRQWFgMyNjU0JiYnBgYVFBb6PF43IzceJDUwUjNTYRspFB0zHzNdEUM6NSw7KUQFOEUwTi8nMk8MLVAyLEUzEAQaSjQySyphTCI9MA8EES5BLS9OLQFwPUgwRDowJzQk/r0/MSw3KBIZSy81RQACACj/9AHAApwACwAoAAATFBYzMjY3JiYjIgYTIiYnNxYWMzI2NjcGBiMiJjU0NjYzMhYWFRQGBnU7OiJHHwZJPy5BXTVOHC4VOh8qSC8DHVEpUmI0VTM/ZDlDbQHHQk8pLmVqUv3qJxw0Fxw0d2YlK2hmQGA1RYpphaJJAAABAEH/9AC4AHIACwAAFyImNTQ2MzIWFRQGfRkjIxkYIyMMIxsdIyMdGyMAAAEAL/9WAMYAcgASAAAXJzY2JwYiIyImNTQ2MzIWFRQGQxQrMAECBgIYIyQZICVGqjATPygBHRwbHzQtQGH//wBB//QAuAHbAicEgQAAAWkABgSBAAD//wAv/1YAxgHbAicEgQAAAWkABgSCAAD//wBe//QDcwByACYEgR0AACcEgQFsAAAABwSBArsAAAACAFX/9ADMAp4ABQARAAA3AyczBwMHIiY1NDYzMhYVFAZ0CwJTAgscGSMjGRgjI8YBel5e/obSIxsdIyMdGyMAAgBV/0gAzAHyAAUAEQAAFzcTMxMXAyImNTQ2MzIWFRQGZwILOQsCKRkjIxkYIyO4XgF6/oZeAiwkHBsjIxscJAAAAgAm//QBeQKqABkAJQAANyY+AzU0JiMiBgcnNjYzMhYVFA4DFwciJjU0NjMyFhUUBqAHGCstIDEwITsXLyBVN0xbIC8sGwUiGSIiGRkjI8YvSDw2NiAoOR8bKyQvVkonPzg6QirSIxsdIyMdGyMAAAIAMP88AYMB8gAZACUAABciJjU0PgMnMxYOAxUUFjMyNjcXBgYDIiY1NDYzMhYVFAbXTFsgLywaBUkHGCstIDAxIToXMCBVKxkjIxkYIyPEVkonPzg6QiovSDw2NiAoOB4bKyMwAjgkHBsjIxscJAABAFABrwCoArIABQAAEycnMwcHYxADWAMQAa+nXFyn//8AUAGvAVkCsgAmBIoAAAAHBIoAsQAAAAEAOQGsALsCuAARAAATIiY1NDY3FwYGFTYzMhYVFAZ4HiE2NBgmJgMGFCEeAawvKzxYHicZOSoBGhkZHgAAAQA/Aa8AwQK7ABEAABMnNjY1BiMiJjU0NjMyFhUUBlYXJiUDBRUgHhcdIjcBryYZOSsBGhgaHi8sPFf//wA5AawBbAK4ACYEjAAAAAcEjACxAAD//wA/Aa8BcgK7ACYEjQAAAAcEjQCxAAD//wA//28AwQB7AgcEjQAA/cD//wA//28BcgB7ACYEkAAAAAcEkACxAAAAAQAtAEIA2QG2AAYAADcnNTcXBxe1iIgkdnZCmz6bHpyeAAEANgBCAOIBtgAGAAA3JzcnNxcVWSN2diOJQhyenB6bPv//AC0AQgF3AbYAJgSSAAAABwSSAJ4AAP//ADYAQgGAAbYAJgSTAAAABwSTAJ4AAAABACkA2wEPARoAAwAANzUzFSnm2z8/AAABACkA3wG3ARgAAwAANzUhFSkBjt85OQABACkA3wL3ARgAAwAANzUhFSkCzt85OQABACkA3wWzARgAAwAANzUhFSkFit85OQABACkA3whvARgAAwAAARUhNQhv97oBGDk5AAEAKQDfAckBGAADAAA3NSEVKQGg3zk5//8AKQDfAvcBGAIGBJgAAP//AEEBAwC4AYECBwSBAAABDwABACgAjwEIAYAACwAANyImNTQ2MzIWFRQGmC1DQy0tQ0OPQjY2Q0M2NkIAAAEADP+CAej/uQADAAAXNSEVDAHcfjc3//8ADAI4AegCbwIHBJ8AAAK2AAEAAP8XAjP/vwANAAAFIiYnNxYWMzI2NxcGBgEaYY4rIymBTU2BKCMrjelKNycyPD0xJzdKAAEAUv9QAQkC3AANAAAXJiY1NDY3FwYGFRQWF9Y+RkY+Mzo5OTqwZd2EhN5kGF/dcnLdXwABACb/UADdAtwADQAAFyc2NjU0Jic3FhYVFAZZMzo5OTozPkZGsBhf3XJy3V8YZN6EhN0AAQBe/2gBEQLEAAcAABcRMxUjETMVXrN1dZgDXC/9Ai8AAAEAH/9oANECxAAHAAAXNTMRIzUzER90dLKYLwL+L/ykAAABACL/aAERAsQAKwAAFyImNTQ2NTQmJzU2NjU0JjU0NjMzFSMiBhUUFhUUBgcVFhYVFAYVFBYzMxXkOzoJIzMzIwk6Oy0bKBwGHCAgHAYcKBuYOE03WDIdMAE0ATAcM1g3TTgvKjEuVDMxMwkECTQwM1QuMSovAAABAB//aAENAsQAKwAAFzUzMjY1NCY1NDY3NSYmNTQ2NTQmIyM1MzIWFRQGFRQWFxUGBhUUFhUUBiMfGikbBRsgIBsFGykaLDw5CSQyMiQJOTyYLyoxLlQzMDQJBAkzMTNULjEqLzhNN1gzHDABNAEwHTJYN004AAABAAr/YAFRAsYAAwAAFwEzAQoBCzz+9aADZvyaAAABAFz/BgCWAu4AAwAAFxEzEVw6+gPo/BgAAAEADv9gAVQCxgADAAAFATMBARn+9TsBC6ADZvyaAAIAXP8GAJYC7gADAAcAABMRMxEDETMRXDo6OgEjAcv+Nf3jAdD+MAABADoBpAFoAsgADgAAEyc3JzcXNzMXNxcHFwcniig5YQ9mCTEJZw9hOCdHAaQdXiguGWxrGC4oXh1WAAABADb/sAGQAsgACwAAFxMHNRcnMwc3FScTwAWPjwVGBY+PBVACOwVHBaCgBUcF/cUAAAEANv+wAZACyAAVAAAXNwc1Fyc3BzUXJzMHNxUnFwc3FScXwAWPjwUFj48FRgWPjwUFj48FUKAFRwexsQdHBaCgBUcHsbEHRwWgAAACAC3/wAHEAqwANABEAAAXIiYnNxYWMzI2NTQuBDU0NjcmJjU0NjMyFhcHJiYjIgYVFB4EFRQGBxYWFRQGBgMUHgIXNjY1NC4CJwYG7DVZHzIZOigoLSg/Rj8oMSUPEU1LL08cKBg2ISolKD9HPygvJg4QKUmmJz5HHx0fJz5GHxwhQCYhLRgcKRwdJR0eKT4uLEAVECgaNE4iFzUUGiUaGyUdHio+Li88FhAoGic+JAGcISsgHRIOJiEiLCAdEhAoAAIAKf+wAdACkAADAA4AAAURMxEDIiYmNTQ2NjMzEQF8VKtIckI/bUUsUALg/SABMi5gS09dKf5SAP//AFz/BgErAu4AJgSpAAAABwSpAJUAAP//AFX/9AHQAp4AJgSGAAAABwSGAQQAAP//ACb/9AL/AqoAJgSIAAAABwSIAYYAAP//AFX/9AJ3AqoAJgSGAAAABwSIAP4AAP//ACb/9AJSAqoAJgSIAAAABwSGAYYAAAACABv/9AGBAqoAGwAnAAA3JyczFQc+AjU0JiMiByc2NjMyFhUUDgMVByImNTQ2MzIWFRQGqwoFRgYSKR03NUo0LyNaNlFiIDAwIBsZIiIZGSMjxvtTQYsjNzklLD1AKyktWUQtQjY1QSzSIxsdIyMdGyMAAAEAXgAAARECsQAFAAAzETMVIxFes3UCsS/9fgABAB8AAADRArEABQAAMxEjNTMRk3SyAoIv/U8AAQBe/8wBEQJ+AAUAABcRMxEzFV4+dTQCsv19LwAAAQAf/8wA0QJ+AAUAABc1MxEzER90PjQvAoP9TgAAAgBe/2gBWwLEAAcACwAAFxEzFSMRMxUnMxEjXv1ubsotLZgDXC/9Ai8vAv4AAAIAH/9oARwCxAAHAAsAABc1MxEjNTMRJzMRIx9ubv1gLCyYLwL+L/ykLwL+AAABAF4BFgERAsQABQAAExEzFSMRXrN1ARYBri/+gQABAB8BFgDRAsQABQAAExEjNTMRk3SyARYBfy/+UgABAF7/aAERARYABQAAFxEzETMVXj51mAGu/oEvAAABAB//aADRARYABQAAFzUzETMRH3Q+mC8Bf/5SAAADADH/9QK3Ao0AEwAjAD8AAAUiLgI1ND4CMzIeAhUUDgInMjY2NTQmJiMiBgYVFBYWNyImJjU0NjYzMhYXByYmIyIGFRQWMzI2NxcGBgF0QXVaMzNadUFBdVozM1p1QUx9S0t9TEt+S0t+UzJTMTRVMCo7GCMUKRo3Q0E2IDAWHhw+Cy9XfExMelYuLlZ6TEx8Vy8qSYRXV4JISIJXV4RJXi9ZPjpVLiEYJxQVSztCTRkTKhghAAQAMf/1ArcCjQATACMALgA3AAAFIi4CNTQ+AjMyHgIVFA4CJzI2NjU0JiYjIgYGFRQWFicRMzIWFRQGIyMVNTMyNjU0JiMjAXRBdVozM1p1QUF1WjMzWnVBTH1LS31MS35LS34sij5WVj5JPi0xMiw+Cy9XfExMelYuLlZ6TEx8Vy8qSYRXV4JISIJXV4RJagFrOD1CQXOlJikkIAAABAAXAT8BkALJAA8AHwAtADUAABMiJiY1NDY2MzIWFhUUBgYnMjY2NTQmJiMiBgYVFBYWJzUzMhYVFAYHFyMnIxU1MzI1NCYjI9MzVjMzVjM0VjMzVjQqQygoQyoqQycnQx5MIC4UES4uIykaKxIXHAE/Mlk6O1gyMlg7OlkyJShJLy9JKSlJLy9JKD3LHSQSHwZTRkZmIg8SAAIAAwFuAmACpAAHABsAABMRIzUhFSMRMxEzFxczNzczESM1NyMHIycjFxVmYwEDZJRJLxwEHC5INwcESS9JBAcBbgEANjb/AAE2dE5OdP7KiWnCwmmJAAACABsBYgJgAqsAJgA6AAATIiYnNxYWMzI1NCYnJyYmNTQ2MzIWFwcmJiMiBhUUFhcXFhYVFAY3ETMXFzM3NzMRIzU3IwcjJyMXFYwhORchEikZMRUWLxYmOy4cMhEdECQRFxgXEy4dIjt4SS8cBBwuSDcHBEkvSQQHAWIaFiURFScUEAoXCygjJzEWECcMEhcPDxMJFw0nIyM4DAE2dE5OdP7KiWnCwmmJAAIAHAFiAn4CqwATAC4AABMRMxcXMzc3MxEjNTcjByMnIxcVBSImNTQ2NjMyFhcHJiYjIgYVFBYzMjY3FwYGHEkvHAQcLkg3BwRJL0kEBwHEPVQoQykeMA4gDRoTIzY0JBUeDiETMwFuATZ0Tk50/sqJacLCaYkMV00zSigXECUNDjo4OTwQECIWGQAAAwAcAW4ChgKkABMAHAAkAAATETMXFzM3NzMRIzU3IwcjJyMXFSERMzIWFRQGIyczMjY1NCMjHEkvHAQcLkg3BwRJL0kEBwE+XEpOTkgiHy4uXR4BbgE2dE5OdP7KiWnCwmmJATZPSUpULzs0aQACADP/ZQMcAoYAQABOAAAFIiYmNTQ+AjMyFhYVFAYGIyImJyMGBiMiJjU0PgIzMhYXMzczBwYzMjY2NTQmJiMiDgIVFBYWMzI2NxcGBgMyNjc3JiYjIgYGFRQWAZNioF5CdZZUZZNQPlwuKDoFAhlAITNFGzJHLBopDQILNyceVCA9KT97W0N9ZDpOh1UuUiIWK19GFS4ZHQ4eFCc5HyibUqB0ZaN0P1OVY1d3PCclHSdJRChSRCoXGSjIdTFdQVF+SDZljlhhiUgaEzEaGQEMHB+fFxM2TiYwKgAAAgAz/+gC3AKwAEAATQAABSImJjU0PgIzMhYWFRQGBiMiJicjBgYjIiY1ND4CMzIWFzM3MwcGFjMyNjY1NCYjIg4CFRQWFjMyNjcXBgYnMjc3JiYjIgYGFRQWAW9WkFY9a4pOWYZKNVQuJjAFAhY/IyxAGS9EKhgnDQIMOCgNFCMaNiR9ej1yWjRHd0kjRBwXJU85KDEbDRsUIzUcIxhGi2lak2k4SYJYUHA5KSQdKEc6Jk5AJxcZKLI8NitVPWyGMFp+Tlp1ORERLhYT7DqJFxIxSCMoKAAAAgAjAAAB0wKKABsAHwAAMzcjNTM3IzUzNzMHMzczBzMVIwczFSMHIzcjBxMzNyNaGVBXElVcFzUXhRg1GFFXElVcGTUYhBkghBKEzDmUOre3t7c6lDnMzMwBBZQA//8ARQAAALMCtgIGACQAAAACAAMAAAHUAgYACQARAAATBzMnJiYnIwYGAxMzEyMnIwe0GJwYDhgOBA0Zv7leulgwxTABGkpKK1MrK1P+uwIG/fqSkgAAAwBaAAAB5QIGABAAGQAiAAAzETMyFhYVFAYHFRYWFRQGIwMzMjY1NCYjIxEzMjY1NCYjI1qqOVgyLS03QXddZE5EOz4+UVpBTUlFWgIGGTgvJT4MBAo9NU1KASsqKCgj/nYrMywrAAABADT/9AHXAhIAGwAABSImJjU0NjYzMhYXByYmIyIGFRQWMzI2NxcGBgEqRnBAQ3JIMk8aLxYzIkxdWUwnOxkuIlUMP3lWVXlCKBozFhlrXV5sHRoyJSYAAgBaAAAB9wIGAAgAEQAAMxEzMhYVFAYjJzMyNjU0JiMjWo+Ajo19QD5cWlpcPgIGgYCAhUFkYFtkAAEAWgAAAaoCBgALAAAzESEVIxUzFSMVMxVaAUbzzs79AgZClj+tQgABAFoAAAGhAgYACQAAMxEhFSMVMxUjFVoBR/TPzwIGRKNA3wABADT/9AHjAhIAHgAABSImJjU0NjYzMhYXByYmIyIGFRQWMzI3NSM1MxUGBgEzSnNCRHZLOU8ZLhU1KFFgW1Y8IXC8HFwMP3lWVXpBKRgzFBprX11sHH894hkiAAEAWgAAAfgCBgALAAAzETMVMzUzESM1IxVaU/hTU/gCBtPT/frr6wABAFoAAACtAgYAAwAAMxEzEVpTAgb9+gABAB//9AFfAgYADwAAFyImJzcWMzI2NREzERQGBr43Tho6JDkqK1QiRwwtKyk6LzkBY/6XLk0uAAEAWgAAAf4CBgAMAAAzETMVMzczBxMjAwcVWlMD2lytxVmeWgIG9vbI/sIBBF+lAAEAWgAAAZoCBgAFAAAzETMRMxVaU+0CBv4/RQABAFoAAAItAgYAGQAAMxEzExczNxMzESMRNDY3IwcHIycnIxYWFRFaXWYlBCZkXUsGAwQtYyhjLQQDBwIG/vhnZwEI/foBACNdJHX9/XUjXiP/AAABAFoAAAHvAgYAEwAAMxEzExczJiY1NTMRIwMnIxYWFRVaVL88BAMITVPAPAQDCAIG/s5vJ10q8/36ATJvKFoq9QACADT/9AIaAhIADwAbAAAFIiYmNTQ2NjMyFhYVFAYGJzI2NTQmIyIGFRQWASdHbj4+bkdHbj4+bkdHVlZHR1ZWDEJ6VFV5QEB5VVR6QkZtXV5qal5dbQAAAgBaAAAB3AIGAAsAFAAAMxEzMhYWFRQGIyMVETMyNjU0JiMjWrE+XjV1XF5YRUFDRVYCBh5EO1VQxAEAMjM1KgAAAgAz/2cCIwISAAsAJQAAJTI2NTQmIyIGFRQWFyImJyYmNTQ2NjMyFhYVFAYHFhYzMjY3FwYBJkdWVkdIVVXxUWoZWm4+bkdHbj5vWRNGLhIdDBAeNm9gXWpqXWBvz1E/Do9xVHlAQHlUcY8OKSMFBD4PAAACAFoAAAHnAgYADgAWAAAzETMyFhYVFAYHFyMnIxURMzI1NCYjI1qzOlk0QTaKWYFgV4FEPlYCBhxCOTpMD9rQ0AEMXjIoAAABACr/9AG0AhIAKAAAFyImJzcWFjMyNjU0JicnJiY1NDYzMhYXByYmIyIGFRQWFxceAhUUBvM+ZiUsIVEuMzcxJEE1TWVPOVccKxpCJiw0LShCJjshaAwqITkeJCwjJiIPGhRBOEFOJhk2FxwmIx8iEBoOIjUsQFcAAAEAHAAAAbcCBgAHAAAzESM1IRUjEcCkAZukAcFFRf4/AAABAFf/9AHwAgYAFQAABSImJjURMxEUFhYzMjY2NREzERQGBgEkOl02UyA4IyQ4IE81XAwrZFUBLv7RO0UdHUU7AS/+0lVkKwABAAAAAAG/AgYADQAAMwMzExYWFzM2NjcTMwOwsFdVDhgOBA8XDlNUrwIG/vQtUC0tUC0BDP36AAEAFwAAApQCBgAhAAAzAzMTFhYXMzY2NxMzExYWFzM2NjcTMwMjAyYmJyMGBgcDi3RSNwgQCAMJFQpKSEgKFQoECA4IN01xYVAHDQYEBwwITgIG/vIqVCkpVCoBDv7yKVQqKlQpAQ79+gEiHzsdHTsf/t4AAQAPAAABtgIGABkAADMTJzMXFhYXMzY2NzczBxMjJyYmJyMGBgcHD6GWW0YKEw0ECxMJQ1iWoVxMChcNBAsVC0oBC/t6ESUXFyURev/++YAUKRgYKRSAAAH//wAAAaACBgAPAAAzNQMzFxYWFzM2Njc3MwMVpqdYQg0bDgQOGg1CVqfEAUKJHDgdHTgcif6+xAABAC0AAAGxAgYACQAAMzUBITUhFQEhFS0BG/7+AWf+5QEfMQGRRDH+cEUA//8AAwAAAdQC7wImBMwAAAAHBzoA6/+M//8AAwAAAdQC7wImBMwAAAAHBz0A6/+M//8AAwAAAdQC0gImBMwAAAAHB0AA6/+M//8AAwAAAdQC1QImBMwAAAAHB0IA6/+M//8AAwAAAdQCuQImBMwAAAAHB04A6/+M//8AAwAAAdQCpAImBMwAAAAHB0QA6/+M//8AAwAAAdQC1gImBMwAAAAHB0kA6/+M//8AAwAAAdQC/AImBMwAAAAHB1IA6/+M//8AAwAAAdQC2QImBMwAAAAHB1YA6/+M//8AA/8yAdQCBgImBMwAAAAHB2gA6wAA//8AAwAAAdQC9AImBMwAAAAHB1AA6/+M//8AAwAAAdQDBAImBMwAAAAHB48A6/+M//8AAwAAAdQDBAImBMwAAAAHB5EA6/+M//8AAwAAAdQDFgImBMwAAAAHB5MA6/+M//8AAwAAAdQDNwImBMwAAAAHB5UA6/+M//8AA/8yAdQC0gImBMwAAAAnB0AA6/+MAAcHaADrAAD//wADAAAB1ANAAiYEzAAAAAcHlwDr/4z//wADAAAB1ANAAiYEzAAAAAcHmQDr/4z//wADAAAB1ANEAiYEzAAAAAcHmwDr/4z//wADAAAB1AM7AiYEzAAAAAcHnQDr/4z//wAD/zIB1ALWAiYEzAAAACcHSQDr/4wABwdoAOsAAAACAAP/LAHyAgYACQAjAAATBzMnJiYnIwYGEyImNTQ2NyMnIwcjEzMTBgYVFBYzMjcXBga0GJwYDhgOBA0Z4Sg4MhkSMMUwVLleuiMtHBIXExYOLQEaSkorUysrU/3nLCspQxGSkgIG/foOPSAXFw4tCxEAAAMAA/8sAdQCBgARABsAIwAAFyImNTQ2NxcGFRQWMzI3FwYGAwczJyYmJyMGBgMTMxMjJyMH+Sg4MyQhNx4RFhMXDy1ZGJwYDhgOBA0Zv7leulgwxTDULCssRxofKTMXFw4tCxEB7kpKK1MrK1P+uwIG/fqSkv//AAP/LAHUAu8CJgT8AAAABwc9AOv/jAACAAgAAAKXAgYABgAWAAATBzM1IwYGAQEhFSMVMxUjFTMVITUjB/wwigMWK/72AR4BZ+O+vu3+v6xMASRZ/ChU/rUCBkKWP61CjY3//wAIAAAClwLvAiYE/gAAAAcHPQHS/4z//wAIAAAClwKkAiYE/gAAAAcHRAHS/4wAAwAhAAAB+QIGABMAHAApAAAzNSM1NxEzMhYVFAYHFRYWFRQGIwMzMjY1NCYjIxEzMjY1NCYjIxUzFSNtTEyqVm4tLjhBd11kTkQ7Pj5RV0RRTElXgIB/NwMBTThFIzwMBApBOE1KATEsKCkl/mAxOTMwRzoA//8AWgAAAeUCwQImBM0AAAAHB0wBFP+M//8AWv9WAeUCBgImBM0AAAAHB3YBHgAA//8ANP8eAdcCEgImBM4AAAAHB20BJgAA//8ANP/0AdcC7wImBM4AAAAHBz0BJ/+M//8ANP/0AdcC0gImBM4AAAAHB0ABJ/+M//8ANP/0AdcC2QImBM4AAAAHB1YBJ/+M//8ANP/0AdcCwQImBM4AAAAHB0wBJ/+M//8AWgAAAfcC2QImBM8AAAAHB1YBG/+M//8AWgAAAfcCwQImBM8AAAAHB0wBG/+M//8AWv8yAfcCBgImBM8AAAAHB2gBGQAA//8AWv9WAfcCBgImBM8AAAAHB3YBGQAA//8AIQAAAgsCBgIGBbIAAP//AFoAAAGqAu8CJgTQAAAABwc6AQj/jP//AFoAAAGqAu8CJgTQAAAABwc9AQj/jP//AFoAAAGqAtICJgTQAAAABwdAAQj/jP//AFoAAAGqAtkCJgTQAAAABwdWAQj/jP//AFoAAAGqArkCJgTQAAAABwdOAQj/jP//AFoAAAGqAqQCJgTQAAAABwdEAQj/jP//AFoAAAGqAtYCJgTQAAAABwdJAQj/jP//AFoAAAGqAsECJgTQAAAABwdMAQj/jP//AFr/MgGqAgYCJgTQAAAABwdoARIAAP//AFoAAAGqAvQCJgTQAAAABwdQAQj/jP//AFcAAAG5AtUCJgTQAAAABwdCAQj/jP//AFoAAAHnAwQCJgTQAAAABwePAQj/jP//ADUAAAGqAwQCJgTQAAAABweRAQj/jP//AFoAAAHXAxYCJgTQAAAABweTAQj/jP//AFoAAAGqAzcCJgTQAAAABweVAQj/jP//AFr/MgGqAtICJgTQAAAAJwdAAQj/jAAHB2gBEgAAAAEAWv8sAboCBgAfAAAFIiY1NDY3IxEhFSMVMxUjFTMVIw4CFRQWMzI3FwYGAWooNy4c+wFG887O/QMXKhseEhUTFw4u1CwrKUISAgZClj+tQgMfLhsXFw4tCxH//wBa/ywBqgIGAiYE0AAAAAcHbwELAAD//wBa/ywBqgLvAiYFHwAAAAcHPQEI/4wAAwBaAAABqgNUAAsADwATAAAzESEVIxUzFSMVMxUBNSEVJyc3F1oBRvPOzv3+2AEMmB95JwIGQpY/rUICazk5XCZnMP//AFoAAAGhAsECJgTRAAAABwdMAQr/jP//ADT/9AHjAu8CJgTSAAAABwc9ATT/jP//ADT/9AHjAtICJgTSAAAABwdAATT/jP//ADT/9AHjAtYCJgTSAAAABwdJATT/jP//ADT/9AHjAsECJgTSAAAABwdMATT/jP//ADT/HgHjAhICJgTSAAAABwdrATEAAP//ADT/9AHjAtkCJgTSAAAABwdWATT/jP//ADT/9AHjAqQCJgTSAAAABwdEATT/jP//ADT/9AHlAtUCJgTSAAAABwdCATT/jAABADT/9AIYAoEALgAABSImJjU0NjYzMhcmNTQ2MzIWFwcmJiMiBhUUFwcmJiMiBhUUFjMyNzUjNTMVBgYBM0pzQkR2SyYeBDcuExsMEAcMCRUXGi4VNShRYFtWPCFwvBxcDD95VlV6QQkMDyg1BgU7AgQXEh8gMxAWa19dbBx/PeIZIv//AFoAAAH4AtICJgTTAAAABwdAASn/jP//AFr/MgH4AgYCJgTTAAAABwdoASkAAP//AFr/GQH4AgYCJgTTAAAABwdzASkAAP//AFr/VgH4AgYCJgTTAAAABwd2ASkAAAACACAAAAJWAgYAEwAXAAAzESM1NzUzFTM1MxUzFSMRIzUjFREzNSNuTk5T+FNKSlP4+PgBejUFUlJSUjr+huvrASxO/////AAAALkC7wImBNQAAAAHBzoAg/+M//8ATQAAAQoC7wImBNQAAAAHBz0Ag/+M////7wAAARcC0gImBNQAAAAHB0AAg/+M////0gAAATQC1QImBNQAAAAHB0IAg/+M////6wAAARsCuQImBNQAAAAHB04Ag/+M/////QAAAQkCpAImBNQAAAAHB0QAg/+M//8ASgAAALwCwQImBNQAAAAHB0wAg/+M////7wAAARcC2QImBNQAAAAHB1YAg/+M//8APwAAANIC9AImBNQAAAAHB1AAg/+M//8ATP8yALoCBgImBNQAAAAHB2gAgwAA//8AK/8sAQoC7wImBTwAAAAHBz0Ag/+MAAEAK/8sANsCBgAVAAAXIiY1NDY3IxEzEQYGFRQWMzI3FwYGiyg4KxgUUx8iHhEWExcPLdQsKys8FgIG/foYNB8XFw4tCxEA////8QAAARUC1gImBNQAAAAHB0kAg/+M//8AH//0AcMC0gImBNUAAAAHB0ABL/+M//8AWv8eAf4CBgImBNYAAAAHB2sBKwAA//8AWv8yAf4CBgImBNYAAAAHB2gBKwAA//8AWv9WAf4CBgImBNYAAAAHB3YBKwAA//8AUwAAAZoC7wImBNcAAAAHBz0Aif+MAAIAWgAAAZoCZgAFAAoAADMRMxEzFQMnMwcHWlPtYgQ7AQ4CBv4/RQGS1DmbAP//AFr/HgGaAgYCJgTXAAAABwdrAQQAAP//AFoAAAGaAgYCJgTXAAAABwSBAN8A7f//AFr/MgGaAgYCJgTXAAAABwdoAQQAAP//AAP/MgGaAqQCJgTXAAAAJwdEAIn/jAAHB2gBBAAA//8AWv9WAZoCBgImBNcAAAAHB3YBBAAAAAH/+gAAAZ8CBgANAAAzNQcnNxEzFTcXBxUzFV9HHmVTkh6w7a4nMDgBF/JOMV6ORQD//wBaAAACLQLvAiYE2AAAAAcHPQFD/4z//wBaAAACLQLBAiYE2AAAAAcHTAFD/4z//wBa/zICLQIGAiYE2AAAAAcHaAFDAAD//wBaAAAB7wLvAiYE2QAAAAcHPQEt/4z//wBaAAAB7wLvAiYE2QAAAAcHOgEt/4z//wBaAAAB7wLZAiYE2QAAAAcHVgEt/4z//wBaAAAB7wLVAiYE2QAAAAcHQgEt/4z//wBa/x4B7wIGAiYE2QAAAAcHawErAAD//wBaAAAB7wLBAiYE2QAAAAcHTAEt/4z//wBa/zIB7wIGAiYE2QAAAAcHaAErAAD//wBa/1YB7wIGAiYE2QAAAAcHdgErAAD//wA0//QCGgLvAiYE2gAAAAcHOgEm/4z//wA0//QCGgLvAiYE2gAAAAcHPQEm/4z//wA0//QCGgLSAiYE2gAAAAcHQAEm/4z//wA0//QCGgLVAiYE2gAAAAcHQgEm/4z//wA0//QCGgK5AiYE2gAAAAcHTgEm/4z//wA0//QCGgKkAiYE2gAAAAcHRAEm/4z//wA0//QCGgL4AiYE2gAAAAcHVAEm/4z//wA0//QCGgLZAiYE2gAAAAcHVgEm/4z//wA0/zICGgISAiYE2gAAAAcHaAEmAAD//wA0//QCGgL0AiYE2gAAAAcHUAEm/4z//wA0//QCGgMEAiYE2gAAAAcHjwEm/4z//wA0//QCGgMEAiYE2gAAAAcHkQEm/4z//wA0//QCGgMWAiYE2gAAAAcHkwEm/4z//wA0//QCGgM3AiYE2gAAAAcHlQEm/4z//wA0/zICGgLSAiYE2gAAACcHQAEm/4wABwdoASYAAAADAC//6QIfAh4ABwAfACcAABMUFxMmIyIGAyc3JiY1NDY2MzIXNxcHFhYVFAYGIyInNzI2NTQnAxaGGvIpQklYMyQ8Gh0+bkdbQDglPBodPm5HXT+cSVcZ8ioBBEgyARorbP6GHUYjXThVeEE1QR1GIlw5U3tCNwxvXkcy/uYsAAIANAAAAq4CBgAQABkAACEiJjU0NjMhFSMVMxUjFTMVJTMRIyIGFRQWAUiDkZCAAWDlwMDv/pgmJmBcXIKAgIRClj+tQkIBg2RfW2UA//8ANP/0Ai0CowImBNoAAAAHB2IBmQAg//8ANP/0Ai0C7wImBWYAAAAHBz0BJv+M//8ANP/0Ai0C7wImBWYAAAAHBzoBJv+M//8ANP/0Ai0C9AImBWYAAAAHB1ABJv+M//8ANP/0Ai0C1QImBWYAAAAHB0IBHP+M//8ANP8yAi0CowImBWYAAAAHB2gBJwAAAAIANP8sAhoCEgAhAC0AAAUiJjU0NjcuAjU0NjYzMhYWFRQGBgcGBhUUFjMyNxcGBgMyNjU0JiMiBhUUFgE0KDghH0JlOT5tSEduPixKLjgpHhEWExcPLSFHVlZHSVRU1CwrHD8XBER3UFV5QEB5VUhqQxATQBcXFw4tCxEBDm1dXmpqXl1tAP//ADT/LAIaAu8CJgVsAAAABwc9ASb/jP//ADT/9AIaAtYCJgTaAAAABwdJASb/jAAEADT/9AIaA1QADwAbAB8AIwAABSImJjU0NjYzMhYWFRQGBicyNjU0JiMiBhUUFgM1IRUnJzcXASdHbj4+bkdHbj4+bkdHVlZHR1ZWQAEMmB95JwxCelRVeUBAeVVUekJGbV1eampeXW0CMTk5XCZnMP//AFoAAAHcAsECJgTbAAAABwdMAR7/jP//AFoAAAHnAu8CJgTdAAAABwc9ARr/jP//AFoAAAHnAsECJgTdAAAABwdMARr/jP//AFoAAAHnAtkCJgTdAAAABwdWARr/jP//AFr/HgHnAgYCJgTdAAAABwdrAR0AAP//AFr/MgHnAgYCJgTdAAAABwdoAR0AAP//AFr/MgHnAqQCJgTdAAAAJwdEARr/jAAHB2gBHQAA//8AWv9WAecCBgImBN0AAAAHB3YBHQAA//8AKv/0AbQC7wImBN4AAAAHBz0A/v+M//8AKv/0AbQC0gImBN4AAAAHB0AA/v+M//8AKv/0AbQC2QImBN4AAAAHB1YA/v+M//8AKv8eAbQCEgImBN4AAAAHB20A9AAA//8AKv8eAbQCEgImBN4AAAAHB2sBAwAA//8AKv/0AbQCwQImBN4AAAAHB0wA/v+M//8AKv8yAbQCEgImBN4AAAAHB2gBAwAA//8AKv/0A4QCEgAmBN4AAAAHBN4B0AAAAAEAW//0AicCEgAmAAAFIiYnNxYWMzI2NTQmJicnNyYmIyIGFREjETQ2MzIWFwcWFhUUBgYBhDFPGisYNBwpLBtCPQZxDjYqP0dUdGpJXhZxU08nSQwkGTIXFS4kGSgeCC5yGiVLS/7HAUdcb0o7cRBKOihEKP//ABwAAAG3AtkCJgTfAAAABwdWAOr/jP//ABwAAAG3AsECJgTfAAAABwdMAOr/jP//ABz/HgG3AgYCJgTfAAAABwdtAOUAAP//ABz/HgG3AgYCJgTfAAAABwdrAOoAAP//ABz/MgG3AgYCJgTfAAAABwdoAOoAAP//ABz/VgG3AgYCJgTfAAAABwd2AOoAAP//ABwAAAG3ArkCJgTfAAAABwdOAOr/jAABABwAAAG3AgYAEAAAMzUjNTczNSM1IRUjFTMVIxXAfFkjpAGbpHx85TYEokVFojrl//8AV//0AfAC7wImBOAAAAAHBzoBJP+M//8AV//0AfAC7wImBOAAAAAHBz0BJP+M//8AV//0AfAC0gImBOAAAAAHB0ABJP+M//8AV//0AfAC1QImBOAAAAAHB0IBJP+M//8AV//0AfACuQImBOAAAAAHB04BJP+M//8AV//0AfACpAImBOAAAAAHB0QBJP+M//8AV//0AfAC1gImBOAAAAAHB0kBJP+M//8AV//0AfAC/AImBOAAAAAHB1IBJP+M//8AV//0AfIC+AImBOAAAAAHB1QBJP+M//8AV//0AfAC2QImBOAAAAAHB1YBJP+M//8AV//0AfADFwImBOAAAAAHB4sBJP+M//8AV//0AfADVAImBOAAAAAHB4UBJP+M//8AV//0AfADTgImBOAAAAAHB40BJP+M//8AV//0AfADVAImBOAAAAAHB4cBJP+M//8AV/8yAfACBgImBOAAAAAHB2gBJAAA//8AV//0AfAC9AImBOAAAAAHB1ABJP+MAAEAV//0AmMCrQAhAAABERQGBiMiJiY1ETMRFBYWMzI2NjURMzY2NTQnNxYWFRQGAfA1XDs6XTZTIDgjJDggHyczDkAKDUUB4v72VWQrK2RVAS7+0TtFHR1FOwEvAygoHRkeECgXOTj//wBX//QCYwLvAiYFmQAAAAcHPQEk/4z//wBX//QCYwLvAiYFmQAAAAcHOgEk/4z//wBX//QCYwL0AiYFmQAAAAcHUAEk/4z//wBX//QCYwLVAiYFmQAAAAcHQgEk/4z//wBX/zICYwKtAiYFmQAAAAcHaAEkAAAAAQBX/ywB8AIGACYAAAUiJjU0NjcuAjURMxEUFhYzMjY2NREzERQGBwYGFRQWMzI3FwYGATAoNyEXNFAuUyA4IyQ4IE9RRiAoHhIVExcOLtQsKyM6FQUvYU4BLv7RO0UdHUU7AS/+0mhqDwc9HhcXDi0LEf//AFf/LAHwAu8CJgWfAAAABwc9AST/jP//ABcAAAKUAu8CJgTiAAAABwc6AVb/jP//ABcAAAKUAu8CJgTiAAAABwc9AVb/jP//ABcAAAKUAtICJgTiAAAABwdAAVb/jP//ABcAAAKUArkCJgTiAAAABwdOAVb/jP////8AAAGgAu8CJgTkAAAABwc6AND/jP////8AAAGgAu8CJgTkAAAABwc9AND/jP////8AAAGgAtICJgTkAAAABwdAAND/jP////8AAAGgArkCJgTkAAAABwdOAND/jP////8AAAGgAsECJgTkAAAABwdMAND/jP//////MgGgAgYCJgTkAAAABwdoAM4AAP////8AAAGgAvQCJgTkAAAABwdQAND/jP////8AAAGgAtUCJgTkAAAABwdCAND/jP//AC0AAAGxAu8CJgTlAAAABwc9APr/jP//AC0AAAGxAtkCJgTlAAAABwdWAPr/jP//AC0AAAGxAsECJgTlAAAABwdMAPr/jP//AC3/MgGxAgYCJgTlAAAABwdoAP0AAP//AC3/VgGxAgYCJgTlAAAABwd2AP0AAAACACEAAAILAgYADAAZAAAzNSM1NzUzMhYVFAYjJzMyNjU0JiMjFTMVI25NTY+Ajo19QD5cWlpcPn5++CsE34GAgIVBZGBbZJ0vAAIAWgAAAdwCBgAOABcAADMRMxUzMhYWFRQGBiMjFTUzMjY1NCYjI1pTXj1eNjZePV5VRUJDRFUCBlYdRDs4SSNwrzE0NSgAAAIAOv/0AhICEgAZACAAAAUiJiY1NDY3ISYmIyIGByc2NjMyFhYVFAYGJzI2NyEWFgEiRmg6AQEBggRTSidCGSgeWzpHajs+bEY+VAn+0AVRDEN5UAYMB1ZfHxU3GyZBeVRTe0JEV09OWAABAFr/9AIHAhIAHwAABSImJzcWFjMyNjY1NCYjIgYHESMRMxU2NjMyFhYVFAYBaREnDRQJEw0WJBZGOx9MGFNRH1AsN1czVQwGB0EEBCRZUG5XKyP+ggIGPyArNXVhkYIAAAIAWv9oAbQCBgADABMAADMRMxEXIiYnNxYWMzI2NREzERQGWlOBFiUNEAoXDSUYUz4CBv36mAgFQQMFMywB+f4ESlgAAQBa/2gB7wIGACAAAAUiJic3FhYzMjY1IwMnIxYWFRUjETMTFzMmJjU1MxEUBgF4FCALDwgUCh0UA8A8BAMITVS/PAQDCE03mAcEPgIFLigBMm8oWir1Agb+zm8nXSrz/fdDUgD//wADAAAB1AIGAgYEzAAA//8AWgAAAeUCBgIGBM0AAAABAFoAAAGiAgYABQAAMxEhFSMRWgFI9QIGRv5AAAACAB4AAAHlAgYABQALAAAzNRMzExUlIScnIwcetF+0/pEBFVE4AzgxAdX+KzFF2KWl//8AWgAAAaoCBgIGBNAAAP//AC0AAAGxAgYCBgTlAAD//wBaAAAB+AIGAgYE0wAAAAMANP/0AhoCEgAPABsAHwAABSImJjU0NjYzMhYWFRQGBicyNjU0JiMiBhUUFic1MxUBJ0duPj5uR0duPj5uR0lWVklJV1cStgxCelVVeEBAeFVVekJDbmBgampgYG64Pz///wBaAAAArQIGAgYE1AAA//8AWgAAAf4CBgIGBNYAAAABAAAAAAG+AgYADQAAMRMzEyMDJiYnIwYGBwOuYa9XVQ0YDgQPFg5VAgb9+gEMLFIsLFIs/vQA//8AWgAAAi0CBgIGBNgAAP//AFoAAAHvAgYCBgTZAAAAAwAxAAABpwIGAAMABwALAAAzNSEVJTUzFSU1IRUxAXb+yfn+0AFmQkLvPz/VQkL//wA0//QCGgISAgYE2gAAAAEAWgAAAfICBgAHAAAzESERIxEjEVoBmFPyAgb9+gHA/kAA//8AWgAAAdwCBgIGBNsAAAABACwAAAGxAgYACwAAMzU3JzUhFSEXByEVLLu4AW3++qSpASAx19EtQbzHQgD//wAcAAABtwIGAgYE3wAA/////wAAAaACBgIGBOQAAAADADD/7gJfAhgAEQAYAB8AAAU1JiY1NDY3NTMVFhYVFAYHFQMUFhcRBgYFNCYnETY2ASJvg4NvS2+Dg2/tWEpKWAGPWEpKWBJHBWxeX2oER0cEal9ebAVHARZBSgQBHARIQUFIBP7kBEr//wAPAAABtgIGAgYE4wAAAAEAPwAAAjICBgAXAAAhNSYmNTUzFRQWFxEzETY2NTUzFRQGBxUBEmRvUENATUFCUG9kuwVfZoF8SEMEAQv+9QRDSHyBZl8FuwAAAQAsAAACJQISACcAADM1MzUuAjU0NjYzMhYWFRQGBgcVMxUjNTY2NTQmJiMiBgYVFBYXFSxrFywdPG1ISW08HSwXa8wvPiZGMjFGJj4uQgMVPE8xSXFCQnFJMU88FQNCOyNnSzZWMTFWNktnIzsA////6wAAARsCuQIGBTUAAP////8AAAGgArkCBgWoAAAAAwADAAACgwIGAAkAEQAVAAATBzMnJiYnIwYGAxMzEyMnIwchETMRtBicGA4YDgQNGb+5XrpYMMUwAdlTARpKSitTKytT/rsCBv36kpIBnv5iAAIAWgAAAv8CBgALAA8AADMRMxUzNTMRIzUjFSERMxFaU/hTU/gB/1MCBtPT/frr6wGe/mIAAAIALAAAAv0CEgAnACsAADM1MzUuAjU0NjYzMhYWFRQGBgcVMxUjNTY2NTQmJiMiBgYVFBYXFSERMxEsaxcsHTxtSEltPB0sF2vMLz4mRjIxRiY+LgGzU0IDFTxPMUlxQkJxSTFPPBUDQjsjZ0s2VjExVjZLZyM7AZ7+Yv//AAMAAAHUAgYCBgTMAAAAAgBaAAAB3wIGAA0AFQAAMxEhFSEVMzIWFhUUBiMnMzI1NCYjI1oBYP7zYzteNnFbZluGRURYAgZFlho/NlJKPmAuJ///AFoAAAHlAgYCBgTNAAD//wBaAAABogIGAgYFugAAAAIAGv9UAh4CBgAIAB0AADcGBzMRIw4CAyMnNTM+Ajc+AjchETMVByM1IcsXI/OSBwwMakcIGwwZGQ0LDw8JASZGCEf+mvB1NQF8KEFB/jy8NgYkTEExUFM1/kA2vKwA//8AWgAAAaoCBgIGBNAAAAABAAYAAAKzAhIAKwAAMxMnJiYjIiIHJzYzMhYXFzM1MxUzNzY2MzIXByYiIyIGBwcTIycjFSM1IwcGqTkTHxQFCwUODRUoPhw+R05GPh0+JxUNDQYKBRQgEzmpWYtLTkyLARN1JhYCSwUnOYLW1oI5JwVLAhYmdf7t7e3t7QABACv/9AG/AhIAKQAAFyImJzcWFjMyNjU0JiMjNTMyNjU0JiMiByc2NjMyFhUUBgcVFhYVFAYG8ztiKyokSy8zSElDQTFEPDssSTYrIFsxU2MqKC8/Nl0MJCc4ICAxLi8uOCoqJSszNxwjTD4oPQ4ECUEzMkgmAAABAFoAAAHvAgYAEwAAMxEzFRQGBzM3EzMRIzU0NjcjBwNaTQgDBDy+VU0IAwQ8wAIG8ypdJ28BMv369SpaKG/+zv//AFoAAAHvArsCJgXdAAAABwdKASr/dgABAFoAAAICAhIAGAAAMxEzFTM3NjYzMhYXByYiIyIGBwcTIycjFVpTWE0iOCcJEwcPBQoGEhwYR71ZpFgCBtWDOSUEAkoCFSd1/u3t7QABAAD/9AHUAgYAGQAAFyImJzcWFjMyNjY3NjY3IREjESMGBgcOAjINGgsRBgoGDxkYDREfEAEgU44NFw4RJzMMAwRLAQMSOjtPnFL9+gHCQYE/UVkj//8AWgAAAi0CBgIGBNgAAP//AFoAAAH4AgYCBgTTAAD//wA0//QCGgISAgYE2gAA//8AWgAAAfICBgIGBccAAP//AFoAAAHcAgYCBgTbAAD//wA0//QB1wISAgYEzgAA//8AHAAAAbcCBgIGBN8AAAABAAX/9AG8AgYAEwAAFyInNxYzMjc3AzMXFzM3NzMDBgZ4JBYRERQuFAy9V18sBCdYUrMWQwwIRwYmGQGK0Gxs0P5dNDsAAwAv//QCUwISABEAGAAfAAAFNSYmNTQ2NzUzFRYWFRQGBxUDFBYXEQYGBTQmJxE2NgEdcH5+cEdwf39w51RMTFQBh1NNTVMMTwRjXFxjBElJBGNcXGMETwESP0QCAQkCQz8/QwL+9wJE//8ADwAAAbYCBgIGBOMAAAABAFr/VAIpAgYADAAABTUhETMRMxEzETMVBwHa/oBT4lRGCKysAgb+QAHA/kA2vAABAEMAAAHDAgYAEwAAITUGBiMiJjU1MxUUFjMyNjc1MxEBbxMuIF5tUkNAHSoQVOEEBE5hfn49MAQE4/36AAEAWgAAAqsCBgALAAAzETMRMxEzETMRMxFaULBQsVACBv5AAcD+QAHA/foAAQBa/1QC8QIGABAAADMRMxEzETMRMxEzETMVByM1WlCwULFQRghHAgb+QAHA/kABwP5ANrysAAACABwAAAJEAgYADAAVAAAzESM1IRUzMhYVFAYjJzMyNjU0JiMjyq4BAVZddHRdVk5CRkVFTAHARsxGUVdMQy4yMCsAAAMAWgAAAnYCBgAKABMAFwAAMxEzFTMyFhUUBiMnMzI2NTQmIyMFETMRWlNMXXR0XUxEQkZFRUIBdlMCBsxGUVdMQy4yMCv+Agb9+gACAFoAAAHeAgYACgATAAAzETMVMzIWFRQGIyczMjY1NCYjI1pTYF10dF1gWEJGRUVWAgbMRlFXTEMuMjArAAEAIP/0AcICEgAeAAAXIiYnNxYWMzI2NyM1MyYmIyIGByc2NjMyFhYVFAYGzThYHS4ZPyhGVgTf3glRQSY7GiwjUjVEaz5BbgwtHDQZHldeP0tTGxc0ISM/d1VdejwAAAIAWv/0Av0CEgALACAAACUyNjU0JiMiBhUUFhciJicjFSMRMxUzNjYzMhYWFRQGBgINRlRURkZUVEdlgQhzU1N0DIBhRmw9PWw6bV5faGhfXm1GhHPrAgbTanVAeFVUe0IAAgAWAAABsAIGAA4AFgAAITUjByM3JiY1NDY2MzMRAzM1IyIGFRQBXF+JXpg2QjNaObSrV1Y/QdHR2g5LPDlCHP36AQy4JzJfAP//AFoAAAGqAu8CBgUOAAD//wBaAAABqgK5AgYFEgAAAAEAHP/2AiYCBgAjAAAFIic3FhYzMjY2NTQmIyIGBxUjESM1IRUjFTY2MzIWFhUUBgYBix8XDQYSBxMmGkE9HCYRVJMBpL0TLBw4WjYsRgoHQQIEEioiNTEEBPQBwUVFkgQEIUg7OUUfAP//AFoAAAGiAtkCJgXYAAAABwc9AQ7/dgABADT/9AHXAhIAHgAABSImJjU0NjYzMhYXByYmIyIGBzMVIxYWMzI2NxcGBgEqRnBAQnJIMlAaLxY1JENYCt7fBVhJJzsZLiJVDD55WFh4PygaMxYZUU0/WF0dGjIlJv//ACr/9AG0AhICBgTeAAD//wBaAAAArQIGAgYE1AAA////6wAAARsCuQIGBTUAAAADABIAAAD1AroACwAXABsAABMiJjU0NjMyFhUUBjMiJjU0NjMyFhUUBgMRMxE/ExoaExQZGXUTGhoTFBkZglMCWBsWFhsbFhYbGxYWGxsWFhv9qAIG/fr//wAf//QBXwIGAgYE1QAAAAIAAP/0AtQCBgAgACkAABciJic3FhYzMjY2NzY2NyEVMzIWFRQGIyMRIwYGBw4CJTMyNjU0JiMjMg0aCxEGCgYPGRgNER8QAQxDXHV1XJZ6DRcOESczAWo6QkdFRTkMAwRLAQMSOjtPnFLMRlFXTAHCQYE/UVkjTy4yMCsAAAIAWgAAAv8CBgASABsAADMRMxUzNTMVMzIWFRQGIyM1IxUlMzI2NTQmIyNaU+pUQ1x1dV2W6gE+OkJHRkQ5AgbT08xGUVdM6+tDLjIwKwAAAQAcAAACIAIGABcAADMRIzUhFSMVNjYzMhYVFSM1NCYjIgYHFa+TAaS9EywcXGZSPTscJhEBwUVFkgQES12Pjz4vBAT0//8AWgAAAgIC2QImBd8AAAAHBz0BI/92//8AWgAAAe8C2QImBd0AAAAHBzoBKv92//8ABf/0AbwCuwImBegAAAAHB0oA4/92AAEAWv9UAe4CBgALAAAFJyMRMxEzETMRIwcBAASiU+1UnwqsrAIG/kABwP36rAACABwAAAH0Ai4AEgAbAAAzESM1MzUzFTMVIxUzMhYVFAYjJzMyNjU0JiMjjXFxVMLCQlx1dV1BOUJGRUQ4AZE7YmI7XkRQVUo/LTIvKQADADT/9AIaAhIADwAWAB0AAAUiJiY1NDY2MzIWFhUUBgYDIgYHISYmAzI2NyEWFgEnR24+Pm5HR24+Pm5HQVUJAT4JVUFEVwX+wAVWDEB7Vld4Pj54V1Z7QAHbU05OU/5oYFhYYAABAAAAAAHlAhIAGQAAMwMzExYWFzM2Njc3NjYzMhYXByYmIyIGBwOvr1dVDhgOBQ0VDTASMjAPFAoRBgkHExUIeAIG/vMrUi0yTCygQjcDBEsDAR8b/nYAAQBaAAABqgKvAAcAADMRMzczByMRWv0PRAj1Agap7/5AAAEAIQAAAbgCBgANAAAzNSM1NzUhFSMVMxUjFXBPTwFI9ZWV4DYE7EamOuAAAQAG/1QCzQISADAAADMTJyYmIyIiByc2MzIWFxczNTMVMzc2NjMyFwcmIiMiBgcHFzMVByM1IycjFSM1IwcGqTkTHxQFCwUODRUoPhw+R05GPh0+JxUNDQYKBRQgEzl+RQhHJItLTkyLARN1JhYCSwUnOYLW1oI5JwVLAhYmdc02vKzt7e3tAAEAK/9UAb8CEgAqAAAXJyYnNxYWMzI2NTQmIyM1MzI2NTQmIyIHJzY2MzIWFRQGBxUWFhUUBgcH0ANaSCokSy8zSElDQTFEPDssSTYrIFsxU2MqKC8/W0UJrKIJQDggIDEuLy44KiolKzM3HCNMPig9DgQJQTNCUQqjAAABAFr/VAIdAhIAHQAAMxEzFTM3NjYzMhYXByYiIyIGBwcXMxUHIzUjJyMVWlNYTSI4JwkTBw8FCgYSHBhHjUsIRyWkWAIG1YM5JQQCSgIVJ3XNNrys7e0AAQAcAAACcgISABoAADMRIzUhFTM3NjYzMhYXByYiIyIGBwcTIycjFcquAQFYTSI4JwkTBw8FCgUTHBhHvVmkWAHARtWDOSUEAkoCFSd1/u3t7QAAAQBa/1QCPwIGABAAADMRMxUzNTMRMxUHIzUjNSMVWlP4U0cIR0v4AgbT0/5ANrys6+sAAAEANP9UAdcCEgAcAAAXJyYmNTQ2NjMyFhcHJiYjIgYVFBYzMjY3FwYHB/cEVGtDckgyTxovFjMiTF1ZTCc7GS47VwmspRGIcFV5QigaMxYZa11ebB0aMkEJoQD/////AAABoAIGAgYE5AAAAAH//wAAAaACBgAWAAAzNSM1NzMDMxcWFhczNjY3NzMDMxUjFaZxWQeWWEINGw4EDhoNQlaWYHGqNwQBIYkcOB0dOByJ/t87qgAAAQAP/1QB0QIGAB4AADMTJzMXFhYXMzY2NzczBxczFQcjNSMnJiYnIwYGBwcPoZZbRgoTDQQLEwlDWJZ2RghHKEwKFw0ECxULSgEL+3oRJRcXJRF6/8E2vKyAFCkYGCkUgAABAEP/VAIKAgYAGAAAITUGBiMiJjU1MxUUFjMyNjc1MxEzFQcjNQFvEy4gXm1SQ0AdKhBURwlH4QQETmF+fj0wBATj/kA2vKwAAAEAWgAAAdoCBgATAAAzETMVNjYzMhYVFSM1NCYjIgYHFVpTFC4fX21SQkEdKhECBsgEBE1il5c+LwQE/AD//wBaAAAArQIGAgYE1AAA//8ABgAAArMCvgImBdsAAAAHB0oBWv95//8AAwAAAdQCvgImBdUAAAAHB0oA6v95//8ACAAAApcCBgIGBP4AAP//AFoAAAGqAtECJgXaAAAABwdKAQn/jP//ADr/9AISAhICBgW0AAD//wBaAAAB7wKOAiYF3QAAAAcHRAEq/3b//wA0//QCGgKmAiYF4wAAAAcHTgEn/3n//wA0//QCGgISAgYGBwAA//8ABf/0AbwCjgImBegAAAAHB0QA4/92//8ABf/0AbwC4gImBegAAAAHB1QA4/92AAMAIP/0AgcCEgALADIAPgAAExQWFzY2NTQmIyIGEyImJjU0NjcmJjU0NjYzMhYVFAYGBxYWFzY3MwYGBxYWFwcmJwYGJxQWMzI2NyYmJwYGqg4MJjUXGx4lIjRNK0IrERQhPCg1PCU5HxxIJjMYSxAwIRw1FhU+RR9Skj0sGjMXKEgdHCQBkRQrFxYwIRYhKf5EJ0MpNUQaHzwcIzsjPzAhNCwUJUUdQFMzWykQFwZCDy0bIZgoMRUQIEooFC4AAAIAN//0AcICEgALABcAABciJjU0NjMyFhUUBicyNjU0JiMiBhUUFvxaa2pbW2trWzNAQDMyQUEMkn9/jo5/f5JCZWprYGBramUAAQAyAAAA7gIGAAgAADMRIzU2NjczEZxqKTsZPwGpNQcUDf36AAABACIAAAGYAhIAGgAAMzU2NjU0JiMiBgcnNjYzMhYVFAYGBzY2MzMVKH+KMzQlPRguJVc0UF48ZUAWNRuTMG6WPSwzIxgtJipVRTFiaTsCA0YAAQAX//QBlwISACgAABciJic3FhYzMjY1NCYjNTI2NTQmIyIGByc2NjMyFhUUBgcVFhYVFAYG1UJfHSgaSDQwP05mWUczLCI/GioiUjNNYzkuNEc0WAwsHjQYJDAoLDQ8NCYkKhwZMx0lR0EtPBEDC0M1L0MkAAIAJAAAAb8CBgAJABQAADczNTQ2NyMGBgcTNSE1EzMRMxUjFXitAgEDDRQOL/7/8V1NTcmFFjsWFB4V/pKKNgFG/sM/igABAB//9AGeAgYAIAAAFyImJzcWFjMyNjU0JiMiBgcnNyEVIwc2NjMyFhYVFAYG2kRZHiYaRDIyRUAzHysZKhIBJN8MEykZMVAxN1oMLBw1FiU7MzI5ERAZ/0SPCQ0jSDg5TyoAAgA+//QBugISAAsAKAAAASIGBxYWMzI2NTQmAyImJjU0NjYzMhYXByYmIyIGBgc2NjMyFhUUBgYBAxtBGghBNSk5NS46XDY/ZzswRxktEjMdJ0MpAhtLJUpaMFABAx4iSUc6Li85/vE3cFZnfzshGDISFidbTh0jUVEzTCoAAQAhAAABjAIGAA0AADM+AjchNSEVDgMHjgUhRDf+8gFrMz8kEQRflodGRDE6aWt7TAADADb/9AG1AhIAHQAqADcAABciJiY1NDY2NzUmJjU0NjYzMhYVFAYHFRYWFRQGBgM2NjU0JiMiBhUUFhYVMjY1NCYmJwYGFRQW9zdYMiAyGyExLEwvTlo0HCg9L1YTHR80LygzJDsyPihFKiExRQwlQCgjNScNBBQ8KCo9Ik48KkESAxU8NShBJQEqFjMaJTEqJBwoG/suJx8oHg4SNSQoNQACADH/9AGqAhIACgAnAAATFBYzMjY3JiMiBhMiJic3FhYzMjY2NwYGIyImNTQ2NjMyFhYVFAYGfjQzGj8cD20nOU4xSBgsEjQcJ0EpAhpIJUlbL08vOlw2P2UBajE3HiKROf5aIRcyERYnW00dIlFRM0wqN3BWZ4A6AAIAVf/0AMwCBgAFABEAADcnJzMPAiImNTQ2MzIWFRQGdAsCUwILHBkjIxkYIyPG8FBQ8NIjGx0jIx0bIwAAAgBVAAAAzAISAAUAEQAAMzc3MxcXAyImNTQ2MzIWFRQGZwILOQsCKRkjIxkYIyNQ8PBQAZQkHBsjIxscJAACADD/9AFvAiYAGAAkAAA3Jj4DNTQmIyIHJzY2MzIWFRQOAxcHIiY1NDYzMhYVFAagBhYoKh0rLD4yKB9PNEdWHisqGAQiGSIiGRkjI8YgLiMjKBwdKjEwHSVEOiUyJSEoHdIjGx0jIx0bIwACADr/4AF5AhIAGAAkAAAXIiY1ND4DJzMWDgMVFBYzMjcXBgYDIiY1NDYzMhYVFAbXR1YeKyoYBUkGFigqHSwrPjIoH08oGSMjGRgjIyBEOiUyJSEoHSAuIyMoHB0qMTAcJgG0JBwbIyMbHCQA//8AUAFaAKgCXQIGBIoAq///AFABWgFZAl0CBgSLAKv//wA5AVcAuwJjAgYEjACr//8APwFaAMECZgIGBI0Aq///ADkBVwFsAmMABgSOAKv//wA/AVoBcgJmAAYEjwCr//8AKQDvAQ8BLgIGBJYAFAABACkA8wFzASwAAwAANzUhFSkBSvM5OQABACkA8wKGASwAAwAANzUhFSkCXfM5OQABAFL/ggEJAnYADQAAFyYmNTQ2NxcGBhUUFhfWPkZGPjM6OTk6flO6bW25VBhPtl1dt04AAQAm/4IA3QJ2AA0AABcnNjY1NCYnNxYWFRQGWTM6OTk6Mz5GRn4YTrddXbZPGFS5bW26AAEAXv+aARECXQAHAAAXETMVIxEzFV6zdXVmAsMv/ZsvAAABAB//mgDRAl0ABwAAFzUzESM1MxEfdHSyZi8CZS/9PQAAAQAi/5oBEQJdACsAABciJjU0NjU0Jic1MjY1NCY1NDYzMxUjIgYVFBYVFAYHFRYWFRQGFRQWMzMV5Ds6CSMzMyMJOjstGygcBhwgIBwGHCgbZjFEJj4kHC4BNC4bJT0nRDEvIighOiIvMggECTIuIjsgKCMvAAEAH/+aAQ0CXQArAAAXNTMyNjU0JjU0Njc1JiY1NDY1NCYjIzUzMhYVFAYVFBYzFQYGFRQWFRQGIx8aKRsFGyAgGwUbKRosPDkJJDIyJAk5PGYvIyggOyIuMgkECDIvIjohKCIvMUQnPSUbLjQBLhwkPiZEMf//ACMBfwFNAx0CBwZhAAABi///AFcBiwDsAxECBwZiAAABi///ACgBiwFAAx0CBwZjAAABi///ACMBfwE/Ax0CBwZkAAABi///ACoBiwFQAxECBwZlAAABi///ACMBfwFDAxECBwZmAAABi///AC0BfwFGAx0CBwZnAAABi///ADIBiwFDAxECBwZoAAABi///AC0BfwFAAx0CBwZpAAABi///ACcBfwFAAx0CBwZqAAABi///AB4BrgFRAvQCBwZaAAACQ///AB4CNwFRAmwCBwZbAAACQ///AB4B4wFRAsACBwZcAAACQ///AEEBPADGA14CBwZrAAABi///ACcBPACsA14CBwZsAAABi///ACsBgwCGAeICBwZtAAABi///ACEBFwCQAeICBwZuAAABi///ACP/QwFNAOECBwZhAAD/T///AFf/TwDsANUCBwZiAAD/T///ACj/TwFAAOECBwZjAAD/T///ACP/QwE/AOECBwZkAAD/T///ACr/TwFQANUCBwZlAAD/T///ACP/QwFDANUCBwZmAAD/T///AC3/QwFGAOECBwZnAAD/T///ADL/TwFDANUCBwZoAAD/T///AC3/QwFAAOECBwZpAAD/T///ACf/QwFAAOECBwZqAAD/TwABAB7/awFRALEACwAAFzUjNTM1MxUzFSMVm319OH5+lYk1iIg1iQAAAQAe//QBUQApAAMAABc1IRUeATMMNTX//wAe/6ABUQB9AiYGWwBUAAYGWwCs//8AQf8AAMYBIgIHBmsAAP9P//8AJ/8AAKwBIgIHBmwAAP9P//8AK/9HAIb/pgIHBm0AAP9P//8AIf7bAJD/pgIHBm4AAP9PAAIAI//0AU0BkgALABcAABciJjU0NjMyFhUUBicyNjU0JiMi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 diff --git a/d2renderers/d2fonts/ttf/SourceCodePro-Regular.ttf b/d2renderers/d2fonts/ttf/SourceCodePro-Regular.ttf new file mode 100644 index 000000000..1decfb95a Binary files /dev/null and b/d2renderers/d2fonts/ttf/SourceCodePro-Regular.ttf differ diff --git a/d2renderers/d2fonts/ttf/SourceSansPro-Bold.ttf b/d2renderers/d2fonts/ttf/SourceSansPro-Bold.ttf new file mode 100644 index 000000000..eb7194047 Binary files /dev/null and b/d2renderers/d2fonts/ttf/SourceSansPro-Bold.ttf differ diff --git a/d2renderers/d2fonts/ttf/SourceSansPro-Italic.ttf b/d2renderers/d2fonts/ttf/SourceSansPro-Italic.ttf new file mode 100644 index 000000000..82e7daaf2 Binary files /dev/null and b/d2renderers/d2fonts/ttf/SourceSansPro-Italic.ttf differ diff --git a/d2renderers/d2fonts/ttf/SourceSansPro-Regular.ttf b/d2renderers/d2fonts/ttf/SourceSansPro-Regular.ttf new file mode 100644 index 000000000..56238468c Binary files /dev/null and b/d2renderers/d2fonts/ttf/SourceSansPro-Regular.ttf differ diff --git a/d2renderers/d2svg/NOTICE.txt b/d2renderers/d2svg/NOTICE.txt new file mode 100644 index 000000000..cce18ba29 --- /dev/null +++ b/d2renderers/d2svg/NOTICE.txt @@ -0,0 +1,6 @@ +github-markdown.css derived and modified from https://github.com/sindresorhus/github-markdown-css. + +Attribution: + +MIT License +https://github.com/sindresorhus/github-markdown-css/blob/main/license diff --git a/d2renderers/d2svg/class.go b/d2renderers/d2svg/class.go new file mode 100644 index 000000000..2aaa6ee19 --- /dev/null +++ b/d2renderers/d2svg/class.go @@ -0,0 +1,135 @@ +package d2svg + +import ( + "fmt" + "io" + "strings" + + "oss.terrastruct.com/d2/d2target" + "oss.terrastruct.com/d2/lib/geo" + "oss.terrastruct.com/d2/lib/label" +) + +func classHeader(box *geo.Box, text string, textWidth, textHeight, fontSize float64) string { + str := fmt.Sprintf(``, + box.TopLeft.X, box.TopLeft.Y, box.Width, box.Height) + + if text != "" { + tl := label.InsideMiddleCenter.GetPointOnBox( + box, + 0, + textWidth, + textHeight, + ) + + str += fmt.Sprintf(`%s`, + // TODO use monospace font + "text", + tl.X+textWidth/2, + tl.Y+textHeight*3/4, + fmt.Sprintf("text-anchor:%s;font-size:%vpx;fill:%s", + "middle", + 4+fontSize, + "white", + ), + escapeText(text), + ) + } + return str +} + +const ( + prefixPadding = 10 + prefixWidth = 20 + typePadding = 20 +) + +func classRow(box *geo.Box, prefix, nameText, typeText string, fontSize float64) string { + // Row is made up of prefix, name, and type + // e.g. | + firstName string | + prefixTL := label.InsideMiddleLeft.GetPointOnBox( + box, + prefixPadding, + box.Width, + fontSize, + ) + typeTR := label.InsideMiddleRight.GetPointOnBox( + box, + typePadding, + 0, + fontSize, + ) + accentColor := "rgb(13, 50, 178)" + + return strings.Join([]string{ + fmt.Sprintf(`%s`, + prefixTL.X, + prefixTL.Y+fontSize*3/4, + fmt.Sprintf("text-anchor:%s;font-size:%vpx;fill:%s", "start", fontSize, accentColor), + prefix, + ), + + fmt.Sprintf(`%s`, + prefixTL.X+prefixWidth, + prefixTL.Y+fontSize*3/4, + fmt.Sprintf("text-anchor:%s;font-size:%vpx;fill:%s", "start", fontSize, "black"), + escapeText(nameText), + ), + + fmt.Sprintf(`%s`, + typeTR.X, + typeTR.Y+fontSize*3/4, + fmt.Sprintf("text-anchor:%s;font-size:%vpx;fill:%s", "end", fontSize, accentColor), + escapeText(typeText), + ), + }, "\n") +} + +func visibilityToken(visibility string) string { + switch visibility { + case "protected": + return "#" + case "private": + return "-" + default: + return "+" + } +} + +func drawClass(writer io.Writer, targetShape d2target.Shape) { + fmt.Fprintf(writer, ``, + targetShape.Pos.X, targetShape.Pos.Y, targetShape.Width, targetShape.Height, shapeStyle(targetShape)) + + box := geo.NewBox( + geo.NewPoint(float64(targetShape.Pos.X), float64(targetShape.Pos.Y)), + float64(targetShape.Width), + float64(targetShape.Height), + ) + rowHeight := box.Height / float64(2+len(targetShape.Class.Fields)+len(targetShape.Class.Methods)) + headerBox := geo.NewBox(box.TopLeft, box.Width, 2*rowHeight) + + fmt.Fprint(writer, + classHeader(headerBox, targetShape.Label, float64(targetShape.LabelWidth), float64(targetShape.LabelHeight), float64(targetShape.FontSize)), + ) + + rowBox := geo.NewBox(box.TopLeft.Copy(), box.Width, rowHeight) + rowBox.TopLeft.Y += headerBox.Height + for _, f := range targetShape.Class.Fields { + fmt.Fprint(writer, + classRow(rowBox, visibilityToken(f.Visibility), f.Name, f.Type, float64(targetShape.FontSize)), + ) + rowBox.TopLeft.Y += rowHeight + } + + fmt.Fprintf(writer, ``, + rowBox.TopLeft.X, rowBox.TopLeft.Y, + rowBox.TopLeft.X+rowBox.Width, rowBox.TopLeft.Y, + fmt.Sprintf("stroke-width:1;stroke:%v", targetShape.Stroke)) + + for _, m := range targetShape.Class.Methods { + fmt.Fprint(writer, + classRow(rowBox, visibilityToken(m.Visibility), m.Name, m.Return, float64(targetShape.FontSize)), + ) + rowBox.TopLeft.Y += rowHeight + } +} diff --git a/d2renderers/d2svg/code.go b/d2renderers/d2svg/code.go new file mode 100644 index 000000000..3356a290d --- /dev/null +++ b/d2renderers/d2svg/code.go @@ -0,0 +1,53 @@ +package d2svg + +import ( + "strings" + + "github.com/alecthomas/chroma" + "github.com/alecthomas/chroma/formatters/svg" +) + +// Copied private functions from chroma. Their public functions do too much (write the whole SVG document) +// https://github.com/alecthomas/chroma +// >>> BEGIN + +var svgEscaper = strings.NewReplacer( + `&`, "&", + `<`, "<", + `>`, ">", + `"`, """, + ` `, " ", + ` `, "    ", +) + +func styleToSVG(style *chroma.Style) map[chroma.TokenType]string { + converted := map[chroma.TokenType]string{} + bg := style.Get(chroma.Background) + // Convert the style. + for t := range chroma.StandardTypes { + entry := style.Get(t) + if t != chroma.Background { + entry = entry.Sub(bg) + } + if entry.IsZero() { + continue + } + converted[t] = svg.StyleEntryToSVG(entry) + } + return converted +} + +func styleAttr(styles map[chroma.TokenType]string, tt chroma.TokenType) string { + if _, ok := styles[tt]; !ok { + tt = tt.SubCategory() + if _, ok := styles[tt]; !ok { + tt = tt.Category() + if _, ok := styles[tt]; !ok { + return "" + } + } + } + return styles[tt] +} + +// <<< END diff --git a/d2renderers/d2svg/d2svg.go b/d2renderers/d2svg/d2svg.go new file mode 100644 index 000000000..5c4e14d4a --- /dev/null +++ b/d2renderers/d2svg/d2svg.go @@ -0,0 +1,794 @@ +// d2svg implements an SVG renderer for d2 diagrams. +// The input is d2exporter's output +package d2svg + +import ( + "bytes" + _ "embed" + "encoding/xml" + "errors" + "fmt" + "hash/fnv" + "io" + "strings" + + "math" + + "github.com/alecthomas/chroma" + "github.com/alecthomas/chroma/formatters" + "github.com/alecthomas/chroma/lexers" + "github.com/alecthomas/chroma/styles" + + "oss.terrastruct.com/d2/d2renderers/d2fonts" + "oss.terrastruct.com/d2/d2renderers/textmeasure" + "oss.terrastruct.com/d2/d2target" + "oss.terrastruct.com/d2/lib/geo" + "oss.terrastruct.com/d2/lib/go2" + "oss.terrastruct.com/d2/lib/label" + "oss.terrastruct.com/d2/lib/shape" +) + +const ( + padding = 100 + MIN_ARROWHEAD_STROKE_WIDTH = 2 +) + +//go:embed github-markdown.css +var mdCSS string + +func setViewbox(writer io.Writer, diagram *d2target.Diagram) (width int, height int) { + tl, br := diagram.BoundingBox() + w := br.X - tl.X + padding*2 + h := br.Y - tl.Y + padding*2 + // TODO minify + + // TODO background stuff. e.g. dotted, grid, colors + fmt.Fprintf(writer, ` +`, w, h, tl.X-padding, tl.Y-padding, w, h) + + return w, h +} + +func arrowheadMarkerID(isTarget bool, connection d2target.Connection) string { + var arrowhead d2target.Arrowhead + if isTarget { + arrowhead = connection.DstArrow + } else { + arrowhead = connection.SrcArrow + } + + return fmt.Sprintf("mk-%s", hash(fmt.Sprintf("%s,%t,%d,%s", + arrowhead, isTarget, connection.StrokeWidth, connection.Stroke, + ))) +} + +func arrowheadDimensions(arrowhead d2target.Arrowhead, strokeWidth float64) (width, height float64) { + var widthMultiplier float64 + var heightMultiplier float64 + switch arrowhead { + case d2target.ArrowArrowhead: + widthMultiplier = 5 + heightMultiplier = 5 + case d2target.TriangleArrowhead: + widthMultiplier = 5 + heightMultiplier = 6 + case d2target.LineArrowhead: + widthMultiplier = 5 + heightMultiplier = 8 + case d2target.FilledDiamondArrowhead: + widthMultiplier = 11 + heightMultiplier = 7 + case d2target.DiamondArrowhead: + widthMultiplier = 11 + heightMultiplier = 9 + } + + clippedStrokeWidth := go2.Max(MIN_ARROWHEAD_STROKE_WIDTH, strokeWidth) + return clippedStrokeWidth * widthMultiplier, clippedStrokeWidth * heightMultiplier +} + +func arrowheadMarker(isTarget bool, id string, connection d2target.Connection) string { + arrowhead := connection.DstArrow + if !isTarget { + arrowhead = connection.SrcArrow + } + strokeWidth := float64(connection.StrokeWidth) + width, height := arrowheadDimensions(arrowhead, strokeWidth) + + var path string + switch arrowhead { + case d2target.ArrowArrowhead: + attrs := fmt.Sprintf(`class="connection" fill="%s" stroke-width="%d"`, connection.Stroke, connection.StrokeWidth) + if isTarget { + path = fmt.Sprintf(``, + attrs, + 0., 0., + width, height/2, + 0., height, + width/4, height/2, + ) + } else { + path = fmt.Sprintf(``, + attrs, + 0., height/2, + width, 0., + width*3/4, height/2, + width, height, + ) + } + case d2target.TriangleArrowhead: + attrs := fmt.Sprintf(`class="connection" fill="%s" stroke-width="%d"`, connection.Stroke, connection.StrokeWidth) + if isTarget { + path = fmt.Sprintf(``, + attrs, + 0., 0., + width, height/2.0, + 0., height, + ) + } else { + path = fmt.Sprintf(``, + attrs, + width, 0., + 0., height/2.0, + width, height, + ) + } + case d2target.LineArrowhead: + attrs := fmt.Sprintf(`class="connection" fill="none" stroke="%s" stroke-width="%d"`, connection.Stroke, connection.StrokeWidth) + if isTarget { + path = fmt.Sprintf(``, + attrs, + strokeWidth/2, strokeWidth/2, + width-strokeWidth/2, height/2, + strokeWidth/2, height-strokeWidth/2, + ) + } else { + path = fmt.Sprintf(``, + attrs, + width-strokeWidth/2, strokeWidth/2, + strokeWidth/2, height/2, + width-strokeWidth/2, height-strokeWidth/2, + ) + } + case d2target.FilledDiamondArrowhead: + attrs := fmt.Sprintf(`class="connection" fill="%s" stroke-width="%d"`, connection.Stroke, connection.StrokeWidth) + if isTarget { + path = fmt.Sprintf(``, + attrs, + 0., height/2.0, + width/2.0, 0., + width, height/2.0, + width/2.0, height, + ) + } else { + path = fmt.Sprintf(``, + attrs, + 0., height/2.0, + width/2.0, 0., + width, height/2.0, + width/2.0, height, + ) + } + case d2target.DiamondArrowhead: + attrs := fmt.Sprintf(`class="connection" fill="white" stroke="%s" stroke-width="%d"`, connection.Stroke, connection.StrokeWidth) + if isTarget { + path = fmt.Sprintf(``, + attrs, + 0., height/2.0, + width/2, height/8, + width, height/2.0, + width/2.0, height*0.9, + ) + } else { + path = fmt.Sprintf(``, + attrs, + width/8, height/2.0, + width*0.6, height/8, + width*1.1, height/2.0, + width*0.6, height*7/8, + ) + } + default: + return "" + } + + var refX float64 + refY := height / 2 + switch arrowhead { + case d2target.DiamondArrowhead: + if isTarget { + refX = width - 0.6*strokeWidth + } else { + refX = width/8 + 0.6*strokeWidth + } + width *= 1.1 + default: + if isTarget { + refX = width - 3/2*strokeWidth + } else { + refX = 3 / 2 * strokeWidth + } + } + + return strings.Join([]string{ + fmt.Sprintf(``, + path, + "", + }, " ") +} + +// compute the (dx, dy) adjustment to apply to get the arrowhead-adjusted end point +func arrowheadAdjustment(start, end *geo.Point, arrowhead d2target.Arrowhead, strokeWidth int) *geo.Point { + distance := float64(strokeWidth) / 2.0 + if arrowhead != d2target.NoArrowhead { + distance += float64(strokeWidth) + } + + v := geo.NewVector(end.X-start.X, end.Y-start.Y) + return v.Unit().Multiply(-distance).ToPoint() +} + +// returns the path's d attribute for the given connection +func pathData(connection d2target.Connection) string { + var path []string + route := connection.Route + + sourceAdjustment := arrowheadAdjustment(route[0], route[1], connection.SrcArrow, connection.StrokeWidth) + path = append(path, fmt.Sprintf("M %f %f", + route[0].X-sourceAdjustment.X, + route[0].Y-sourceAdjustment.Y, + )) + + if connection.IsCurve { + i := 1 + for ; i < len(route)-3; i += 3 { + path = append(path, fmt.Sprintf("C %f %f %f %f %f %f", + route[i].X, route[i].Y, + route[i+1].X, route[i+1].Y, + route[i+2].X, route[i+2].Y, + )) + } + // final curve target adjustment + targetAdjustment := arrowheadAdjustment(route[i+1], route[i+2], connection.DstArrow, connection.StrokeWidth) + path = append(path, fmt.Sprintf("C %f %f %f %f %f %f", + route[i].X, route[i].Y, + route[i+1].X, route[i+1].Y, + route[i+2].X+targetAdjustment.X, + route[i+2].Y+targetAdjustment.Y, + )) + } else { + for i := 1; i < len(route)-1; i++ { + prevSource := route[i-1] + prevTarget := route[i] + currTarget := route[i+1] + prevVector := prevSource.VectorTo(prevTarget) + currVector := prevTarget.VectorTo(currTarget) + + dist := geo.EuclideanDistance(prevTarget.X, prevTarget.Y, currTarget.X, currTarget.Y) + units := math.Min(10, dist/2) + + prevTranslations := prevVector.Unit().Multiply(units).ToPoint() + currTranslations := currVector.Unit().Multiply(units).ToPoint() + + path = append(path, fmt.Sprintf("L %f %f", + prevTarget.X-prevTranslations.X, + prevTarget.Y-prevTranslations.Y, + )) + + // If the segment length is too small, instead of drawing 2 arcs, just skip this segment and bezier curve to the next one + if units < 10 && i < len(route)-2 { + nextTarget := route[i+2] + nextVector := geo.NewVector(nextTarget.X-currTarget.X, nextTarget.Y-currTarget.Y) + i++ + nextTranslations := nextVector.Unit().Multiply(units).ToPoint() + + // These 2 bezier control points aren't just at the corner -- they are reflected at the corner, which causes the curve to be ~tangent to the corner, + // which matches how the two arcs look + path = append(path, fmt.Sprintf("C %f %f %f %f %f %f", + // Control point + prevTarget.X+prevTranslations.X, + prevTarget.Y+prevTranslations.Y, + // Control point + currTarget.X-nextTranslations.X, + currTarget.Y-nextTranslations.Y, + // Where curve ends + currTarget.X+nextTranslations.X, + currTarget.Y+nextTranslations.Y, + )) + } else { + path = append(path, fmt.Sprintf("S %f %f %f %f", + prevTarget.X, + prevTarget.Y, + prevTarget.X+currTranslations.X, + prevTarget.Y+currTranslations.Y, + )) + } + } + + lastPoint := route[len(route)-1] + secondToLastPoint := route[len(route)-2] + + targetAdjustment := arrowheadAdjustment(secondToLastPoint, lastPoint, connection.DstArrow, connection.StrokeWidth) + path = append(path, fmt.Sprintf("L %f %f", + lastPoint.X+targetAdjustment.X, + lastPoint.Y+targetAdjustment.Y, + )) + } + + return strings.Join(path, " ") +} + +func labelMask(id string, connection d2target.Connection, labelTL, tl, br *geo.Point) string { + width := br.X - tl.X + height := br.Y - tl.Y + return strings.Join([]string{ + fmt.Sprintf(``, + id, tl.X, tl.Y, width, height, + ), + fmt.Sprintf(``, + tl.X, tl.Y, width, height, + ), + fmt.Sprintf(``, + labelTL.X, labelTL.Y, + connection.LabelWidth, + connection.LabelHeight, + ), + ``, + }, "\n") +} + +func drawConnection(writer io.Writer, connection d2target.Connection, markers map[string]struct{}) { + var markerStart string + if connection.SrcArrow != d2target.NoArrowhead { + id := arrowheadMarkerID(false, connection) + if _, in := markers[id]; !in { + marker := arrowheadMarker(false, id, connection) + if marker == "" { + panic(fmt.Sprintf("received empty arrow head marker for: %#v", connection)) + } + fmt.Fprint(writer, marker) + markers[id] = struct{}{} + } + markerStart = fmt.Sprintf(`marker-start="url(#%s)" `, id) + } + + var markerEnd string + if connection.DstArrow != d2target.NoArrowhead { + id := arrowheadMarkerID(true, connection) + if _, in := markers[id]; !in { + marker := arrowheadMarker(true, id, connection) + if marker == "" { + panic(fmt.Sprintf("received empty arrow head marker for: %#v", connection)) + } + fmt.Fprint(writer, marker) + markers[id] = struct{}{} + } + markerEnd = fmt.Sprintf(`marker-end="url(#%s)" `, id) + } + + var labelTL *geo.Point + var mask string + if connection.Label != "" { + labelTL = connection.GetLabelTopLeft() + labelTL.X = math.Round(labelTL.X) + labelTL.Y = math.Round(labelTL.Y) + + if label.Position(connection.LabelPosition).IsOnEdge() { + strokeWidth := float64(connection.StrokeWidth) + tl, br := geo.Route(connection.Route).GetBoundingBox() + tl.X -= strokeWidth + tl.Y -= strokeWidth + br.X += strokeWidth + br.Y += strokeWidth + if connection.SrcArrow != d2target.NoArrowhead { + width, height := arrowheadDimensions(connection.SrcArrow, strokeWidth) + tl.X -= width + tl.Y -= height + br.X += width + br.Y += height + } + if connection.DstArrow != d2target.NoArrowhead { + width, height := arrowheadDimensions(connection.DstArrow, strokeWidth) + tl.X -= width + tl.Y -= height + br.X += width + br.Y += height + } + + tl.X = math.Min(tl.X, labelTL.X) + tl.Y = math.Min(tl.Y, labelTL.Y) + br.X = math.Max(br.X, labelTL.X+float64(connection.LabelWidth)) + br.Y = math.Max(br.Y, labelTL.Y+float64(connection.LabelHeight)) + + maskID := fmt.Sprintf("mask-%s", hash(connection.ID)) + fmt.Fprint(writer, labelMask(maskID, connection, labelTL, tl, br)) + mask = fmt.Sprintf(`mask="url(#%s)" `, maskID) + } + } + + fmt.Fprintf(writer, ``, + pathData(connection), + connectionStyle(connection), + markerStart, + markerEnd, + mask, + ) + + if connection.Label != "" { + fontClass := "text" + if connection.Bold { + fontClass += "-bold" + } else if connection.Italic { + fontClass += "-italic" + } + textStyle := fmt.Sprintf("text-anchor:%s;font-size:%vpx;fill:%s", "middle", connection.FontSize, "black") + x := labelTL.X + float64(connection.LabelWidth)/2 + y := labelTL.Y + float64(connection.FontSize) + fmt.Fprintf(writer, `%s`, + fontClass, + x, y, + textStyle, + renderText(connection.Label, x, float64(connection.LabelHeight)), + ) + } +} + +func drawShape(writer io.Writer, targetShape d2target.Shape) error { + tl := geo.NewPoint(float64(targetShape.Pos.X), float64(targetShape.Pos.Y)) + width := float64(targetShape.Width) + height := float64(targetShape.Height) + style := shapeStyle(targetShape) + shapeType := d2target.DSL_SHAPE_TO_SHAPE_TYPE[targetShape.Type] + + s := shape.NewShape(shapeType, geo.NewBox(tl, width, height)) + + switch targetShape.Type { + case d2target.ShapeClass: + drawClass(writer, targetShape) + return nil + case d2target.ShapeSQLTable: + drawTable(writer, targetShape) + return nil + case d2target.ShapeOval: + rx := width / 2 + ry := height / 2 + cx := tl.X + rx + cy := tl.Y + ry + fmt.Fprintf(writer, ``, + cx, cy, rx, ry, style, + ) + + case d2target.ShapeImage: + fmt.Fprintf(writer, ``, + targetShape.Icon.String(), + targetShape.Pos.X, targetShape.Pos.Y, targetShape.Width, targetShape.Height, style) + case d2target.ShapeText: + case d2target.ShapeCode: + // TODO should standardize "" to rectangle + case d2target.ShapeRectangle, "": + fmt.Fprintf(writer, ``, + targetShape.Pos.X, targetShape.Pos.Y, targetShape.Width, targetShape.Height, style) + + default: + for _, pathData := range s.GetSVGPathData() { + fmt.Fprintf(writer, ``, pathData, style) + } + } + + if targetShape.Icon != nil && targetShape.Type != d2target.ShapeImage { + iconPosition := label.Position(targetShape.IconPosition) + var box *geo.Box + if iconPosition.IsOutside() { + box = s.GetBox() + } else { + box = s.GetInnerBox() + } + iconSize := targetShape.GetIconSize(box) + + tl := iconPosition.GetPointOnBox(box, label.PADDING, float64(iconSize), float64(iconSize)) + + fmt.Fprintf(writer, ``, + targetShape.Icon.String(), + tl.X, + tl.Y, + iconSize, + iconSize, + ) + } + + if targetShape.Label != "" { + labelPosition := label.Position(targetShape.LabelPosition) + var box *geo.Box + if labelPosition.IsOutside() { + box = s.GetBox() + } else { + box = s.GetInnerBox() + } + labelTL := labelPosition.GetPointOnBox(box, label.PADDING, float64(targetShape.LabelWidth), float64(targetShape.LabelHeight)) + + fontClass := "text" + if targetShape.Bold { + fontClass += "-bold" + } else if targetShape.Italic { + fontClass += "-italic" + } + + switch targetShape.Type { + case d2target.ShapeCode: + lexer := lexers.Get(targetShape.Language) + if lexer == nil { + return fmt.Errorf("code snippet lexer for %s not found", targetShape.Language) + } + style := styles.Get("github") + if style == nil { + return errors.New(`code snippet style "github" not found`) + } + formatter := formatters.Get("svg") + if formatter == nil { + return errors.New(`code snippet formatter "svg" not found`) + } + iterator, err := lexer.Tokenise(nil, targetShape.Label) + if err != nil { + return err + } + + svgStyles := styleToSVG(style) + containerStyle := fmt.Sprintf(`stroke: %s;fill:%s`, targetShape.Stroke, style.Get(chroma.Background).Background.String()) + + fmt.Fprintf(writer, ``, box.TopLeft.X, box.TopLeft.Y, targetShape.Opacity) + fmt.Fprintf(writer, ``, + targetShape.Width, targetShape.Height, containerStyle) + // Padding + fmt.Fprintf(writer, ``) + + for index, tokens := range chroma.SplitTokensIntoLines(iterator.Tokens()) { + // TODO mono font looks better with 1.2 em (use px equivalent), but textmeasure needs to account for it. Not obvious how that should be done + fmt.Fprintf(writer, "", 1*float64(index+1)) + for _, token := range tokens { + text := svgEscaper.Replace(token.String()) + attr := styleAttr(svgStyles, token.Type) + if attr != "" { + text = fmt.Sprintf("%s", attr, text) + } + fmt.Fprint(writer, text) + } + fmt.Fprint(writer, "") + } + fmt.Fprintf(writer, "") + case d2target.ShapeText: + render, err := textmeasure.RenderMarkdown(targetShape.Label) + if err != nil { + return err + } + fmt.Fprintf(writer, ``, + box.TopLeft.X, box.TopLeft.Y, targetShape.Width, targetShape.Height, + ) + // we need the self closing form in this svg/xhtml context + render = strings.ReplaceAll(render, "
", "
") + fmt.Fprintf(writer, `
%v
`, render) + fmt.Fprint(writer, `
`) + default: + textStyle := fmt.Sprintf("text-anchor:%s;font-size:%vpx;fill:%s", "middle", targetShape.FontSize, "black") + x := labelTL.X + float64(targetShape.LabelWidth)/2 + // text is vertically positioned at its baseline which is at labelTL+FontSize + y := labelTL.Y + float64(targetShape.FontSize) + fmt.Fprintf(writer, `%s`, + fontClass, + x, y, + textStyle, + renderText(targetShape.Label, x, float64(targetShape.LabelHeight)), + ) + } + } + return nil +} + +func escapeText(text string) string { + buf := new(bytes.Buffer) + _ = xml.EscapeText(buf, []byte(text)) + return buf.String() +} + +func renderText(text string, x, height float64) string { + if !strings.Contains(text, "\n") { + return escapeText(text) + } + rendered := []string{} + lines := strings.Split(text, "\n") + for i, line := range lines { + dy := height / float64(len(lines)) + if i == 0 { + dy = 0 + } + escaped := escapeText(line) + if escaped == "" { + // if there are multiple newlines in a row we still need text for the tspan to render + escaped = " " + } + rendered = append(rendered, fmt.Sprintf(`%s`, x, dy, escaped)) + } + return strings.Join(rendered, "") +} + +func shapeStyle(shape d2target.Shape) string { + out := "" + + out += fmt.Sprintf(`fill:%s;`, shape.Fill) + out += fmt.Sprintf(`stroke:%s;`, shape.Stroke) + out += fmt.Sprintf(`opacity:%f;`, shape.Opacity) + out += fmt.Sprintf(`stroke-width:%d;`, shape.StrokeWidth) + + return out +} + +func connectionStyle(connection d2target.Connection) string { + out := "" + + out += fmt.Sprintf(`stroke:%s;`, connection.Stroke) + out += fmt.Sprintf(`opacity:%f;`, connection.Opacity) + out += fmt.Sprintf(`stroke-width:%d;`, connection.StrokeWidth) + if connection.StrokeDash != 0 { + dashSize, gapSize := getStrokeDashAttributes(float64(connection.StrokeWidth), connection.StrokeDash) + out += fmt.Sprintf(`stroke-dasharray:%f,%f;`, dashSize, gapSize) + } + + return out +} + +func getStrokeDashAttributes(strokeWidth, dashGapSize float64) (float64, float64) { + // as the stroke width gets thicker, the dash gap gets smaller + scale := math.Log10(-0.6*strokeWidth+10.6)*0.5 + 0.5 + scaledDashSize := strokeWidth * dashGapSize + scaledGapSize := scale * scaledDashSize + return scaledDashSize, scaledGapSize +} + +func embedFonts(buf *bytes.Buffer) { + content := buf.String() + buf.WriteString(``) +} + +// TODO minify output at end +func Render(diagram *d2target.Diagram) ([]byte, error) { + buf := &bytes.Buffer{} + _, _ = setViewbox(buf, diagram) + + buf.WriteString(``) + + hasMarkdown := false + for _, s := range diagram.Shapes { + if s.Label != "" && s.Type == d2target.ShapeText { + hasMarkdown = true + break + } + } + if hasMarkdown { + fmt.Fprintf(buf, ``, mdCSS) + } + + // SVG has no notion of z-index. The z-index is effectively the order it's drawn. + // So draw from the least nested to most nested + highest := 1 + for _, s := range diagram.Shapes { + highest = go2.Max(highest, s.Level) + } + for i := 1; i <= highest; i++ { + for _, s := range diagram.Shapes { + if s.Level == i { + err := drawShape(buf, s) + if err != nil { + return nil, err + } + } + } + } + + markers := map[string]struct{}{} + for _, c := range diagram.Connections { + drawConnection(buf, c, markers) + } + + embedFonts(buf) + + buf.WriteString(`
`) + return buf.Bytes(), nil +} + +func hash(s string) string { + const secret = "lalalas" + h := fnv.New32a() + h.Write([]byte(fmt.Sprintf("%s%s", s, secret))) + return fmt.Sprint(h.Sum32()) +} diff --git a/d2renderers/d2svg/github-markdown.css b/d2renderers/d2svg/github-markdown.css new file mode 100644 index 000000000..44ff18757 --- /dev/null +++ b/d2renderers/d2svg/github-markdown.css @@ -0,0 +1,785 @@ +.md em, +.md dfn { + font-family: "font-italic"; +} + +.md b, +.md strong { + font-family: "font-bold"; +} + +/* based on https://github.com/sindresorhus/github-markdown-css */ +@media (prefers-color-scheme: dark) { + .md { + color-scheme: dark; + --color-fg-default: #c9d1d9; + --color-fg-muted: #8b949e; + --color-fg-subtle: #484f58; + --color-canvas-default: #0d1117; + --color-canvas-subtle: #161b22; + --color-border-default: #30363d; + --color-border-muted: #21262d; + --color-neutral-muted: rgba(110, 118, 129, 0.4); + --color-accent-fg: #58a6ff; + --color-accent-emphasis: #1f6feb; + --color-attention-subtle: rgba(187, 128, 9, 0.15); + --color-danger-fg: #f85149; + } +} + +@media (prefers-color-scheme: light) { + .md { + color-scheme: light; + --color-fg-default: #24292f; + --color-fg-muted: #57606a; + --color-fg-subtle: #6e7781; + --color-canvas-default: #ffffff; + --color-canvas-subtle: #f6f8fa; + --color-border-default: #d0d7de; + --color-border-muted: hsla(210, 18%, 87%, 1); + --color-neutral-muted: rgba(175, 184, 193, 0.2); + --color-accent-fg: #0969da; + --color-accent-emphasis: #0969da; + --color-attention-subtle: #fff8c5; + --color-danger-fg: #cf222e; + } +} + +.md { + -ms-text-size-adjust: 100%; + -webkit-text-size-adjust: 100%; + margin: 0; + color: var(--color-fg-default); + background-color: var(--color-canvas-default); + font-family: "font-regular"; + font-size: 16px; + line-height: 1.5; + word-wrap: break-word; +} + +.md details, +.md figcaption, +.md figure { + display: block; +} + +.md summary { + display: list-item; +} + +.md [hidden] { + display: none !important; +} + +.md a { + background-color: transparent; + color: var(--color-accent-fg); + text-decoration: none; +} + +.md a:active, +.md a:hover { + outline-width: 0; +} + +.md abbr[title] { + border-bottom: none; + text-decoration: underline dotted; +} + +.md dfn { + font-style: italic; +} + +.md h1 { + margin: 0.67em 0; + font-weight: 600; + padding-bottom: 0.3em; + font-size: 2em; + border-bottom: 1px solid var(--color-border-muted); +} + +.md mark { + background-color: var(--color-attention-subtle); + color: var(--color-text-primary); +} + +.md small { + font-size: 90%; +} + +.md sub, +.md sup { + font-size: 75%; + line-height: 0; + position: relative; + vertical-align: baseline; +} + +.md sub { + bottom: -0.25em; +} + +.md sup { + top: -0.5em; +} + +.md img { + border-style: none; + max-width: 100%; + box-sizing: content-box; + background-color: var(--color-canvas-default); +} + +.md code, +.md kbd, +.md pre, +.md samp { + font-family: monospace, monospace; + font-size: 1em; +} + +.md figure { + margin: 1em 40px; +} + +.md hr { + box-sizing: content-box; + overflow: hidden; + background: transparent; + border-bottom: 1px solid var(--color-border-muted); + height: 0.25em; + padding: 0; + margin: 24px 0; + background-color: var(--color-border-default); + border: 0; +} + +.md input { + font: inherit; + margin: 0; + overflow: visible; + font-family: inherit; + font-size: inherit; + line-height: inherit; +} + +.md [type="button"], +.md [type="reset"], +.md [type="submit"] { + -webkit-appearance: button; +} + +.md [type="button"]::-moz-focus-inner, +.md [type="reset"]::-moz-focus-inner, +.md [type="submit"]::-moz-focus-inner { + border-style: none; + padding: 0; +} + +.md [type="button"]:-moz-focusring, +.md [type="reset"]:-moz-focusring, +.md [type="submit"]:-moz-focusring { + outline: 1px dotted ButtonText; +} + +.md [type="checkbox"], +.md [type="radio"] { + box-sizing: border-box; + padding: 0; +} + +.md [type="number"]::-webkit-inner-spin-button, +.md [type="number"]::-webkit-outer-spin-button { + height: auto; +} + +.md [type="search"] { + -webkit-appearance: textfield; + outline-offset: -2px; +} + +.md [type="search"]::-webkit-search-cancel-button, +.md [type="search"]::-webkit-search-decoration { + -webkit-appearance: none; +} + +.md ::-webkit-input-placeholder { + color: inherit; + opacity: 0.54; +} + +.md ::-webkit-file-upload-button { + -webkit-appearance: button; + font: inherit; +} + +.md a:hover { + text-decoration: underline; +} + +.md hr::before { + display: table; + content: ""; +} + +.md hr::after { + display: table; + clear: both; + content: ""; +} + +.md table { + border-spacing: 0; + border-collapse: collapse; + display: block; + width: max-content; + max-width: 100%; + overflow: auto; +} + +.md td, +.md th { + padding: 0; +} + +.md details summary { + cursor: pointer; +} + +.md details:not([open]) > *:not(summary) { + display: none !important; +} + +.md kbd { + display: inline-block; + padding: 3px 5px; + font: 11px ui-monospace, SFMono-Regular, SF Mono, Menlo, Consolas, Liberation Mono, + monospace; + line-height: 10px; + color: var(--color-fg-default); + vertical-align: middle; + background-color: var(--color-canvas-subtle); + border: solid 1px var(--color-neutral-muted); + border-bottom-color: var(--color-neutral-muted); + border-radius: 6px; + box-shadow: inset 0 -1px 0 var(--color-neutral-muted); +} + +.md h1, +.md h2, +.md h3, +.md h4, +.md h5, +.md h6 { + margin-top: 24px; + margin-bottom: 16px; + font-weight: 600; + line-height: 1.25; +} + +.md h2 { + font-weight: 600; + padding-bottom: 0.3em; + font-size: 1.5em; + border-bottom: 1px solid var(--color-border-muted); +} + +.md h3 { + font-weight: 600; + font-size: 1.25em; +} + +.md h4 { + font-weight: 600; + font-size: 1em; +} + +.md h5 { + font-weight: 600; + font-size: 0.875em; +} + +.md h6 { + font-weight: 600; + font-size: 0.85em; + color: var(--color-fg-muted); +} + +.md p { + margin-top: 0; + margin-bottom: 10px; +} + +.md blockquote { + margin: 0; + padding: 0 1em; + color: var(--color-fg-muted); + border-left: 0.25em solid var(--color-border-default); +} + +.md ul, +.md ol { + margin-top: 0; + margin-bottom: 0; + padding-left: 2em; +} + +.md ol ol, +.md ul ol { + list-style-type: lower-roman; +} + +.md ul ul ol, +.md ul ol ol, +.md ol ul ol, +.md ol ol ol { + list-style-type: lower-alpha; +} + +.md dd { + margin-left: 0; +} + +.md tt, +.md code { + font-family: ui-monospace, SFMono-Regular, SF Mono, Menlo, Consolas, Liberation Mono, + monospace; + font-size: 12px; +} + +.md pre { + margin-top: 0; + margin-bottom: 0; + font-family: ui-monospace, SFMono-Regular, SF Mono, Menlo, Consolas, Liberation Mono, + monospace; + font-size: 12px; + word-wrap: normal; +} + +.md ::placeholder { + color: var(--color-fg-subtle); + opacity: 1; +} + +.md input::-webkit-outer-spin-button, +.md input::-webkit-inner-spin-button { + margin: 0; + -webkit-appearance: none; + appearance: none; +} + +.md::before { + display: table; + content: ""; +} + +.md::after { + display: table; + clear: both; + content: ""; +} + +.md > *:first-child { + margin-top: 0 !important; +} + +.md > *:last-child { + margin-bottom: 0 !important; +} + +.md a:not([href]) { + color: inherit; + text-decoration: none; +} + +.md .absent { + color: var(--color-danger-fg); +} + +.md .anchor { + float: left; + padding-right: 4px; + margin-left: -20px; + line-height: 1; +} + +.md .anchor:focus { + outline: none; +} + +.md p, +.md blockquote, +.md ul, +.md ol, +.md dl, +.md table, +.md pre, +.md details { + margin-top: 0; + margin-bottom: 16px; +} + +.md blockquote > :first-child { + margin-top: 0; +} + +.md blockquote > :last-child { + margin-bottom: 0; +} + +.md sup > a::before { + content: "["; +} + +.md sup > a::after { + content: "]"; +} + +.md h1:hover .anchor, +.md h2:hover .anchor, +.md h3:hover .anchor, +.md h4:hover .anchor, +.md h5:hover .anchor, +.md h6:hover .anchor { + text-decoration: none; +} + +.md h1 tt, +.md h1 code, +.md h2 tt, +.md h2 code, +.md h3 tt, +.md h3 code, +.md h4 tt, +.md h4 code, +.md h5 tt, +.md h5 code, +.md h6 tt, +.md h6 code { + padding: 0 0.2em; + font-size: inherit; +} + +.md ul.no-list, +.md ol.no-list { + padding: 0; + list-style-type: none; +} + +.md ol[type="1"] { + list-style-type: decimal; +} + +.md ol[type="a"] { + list-style-type: lower-alpha; +} + +.md ol[type="i"] { + list-style-type: lower-roman; +} + +.md div > ol:not([type]) { + list-style-type: decimal; +} + +.md ul ul, +.md ul ol, +.md ol ol, +.md ol ul { + margin-top: 0; + margin-bottom: 0; +} + +.md li > p { + margin-top: 16px; +} + +.md li + li { + margin-top: 0.25em; +} + +.md dl { + padding: 0; +} + +.md dl dt { + padding: 0; + margin-top: 16px; + font-size: 1em; + font-style: italic; + font-weight: 600; +} + +.md dl dd { + padding: 0 16px; + margin-bottom: 16px; +} + +.md table th { + font-weight: 600; +} + +.md table th, +.md table td { + padding: 6px 13px; + border: 1px solid var(--color-border-default); +} + +.md table tr { + background-color: var(--color-canvas-default); + border-top: 1px solid var(--color-border-muted); +} + +.md table tr:nth-child(2n) { + background-color: var(--color-canvas-subtle); +} + +.md table img { + background-color: transparent; +} + +.md img[align="right"] { + padding-left: 20px; +} + +.md img[align="left"] { + padding-right: 20px; +} + +.md span.frame { + display: block; + overflow: hidden; +} + +.md span.frame > span { + display: block; + float: left; + width: auto; + padding: 7px; + margin: 13px 0 0; + overflow: hidden; + border: 1px solid var(--color-border-default); +} + +.md span.frame span img { + display: block; + float: left; +} + +.md span.frame span span { + display: block; + padding: 5px 0 0; + clear: both; + color: var(--color-fg-default); +} + +.md span.align-center { + display: block; + overflow: hidden; + clear: both; +} + +.md span.align-center > span { + display: block; + margin: 13px auto 0; + overflow: hidden; + text-align: center; +} + +.md span.align-center span img { + margin: 0 auto; + text-align: center; +} + +.md span.align-right { + display: block; + overflow: hidden; + clear: both; +} + +.md span.align-right > span { + display: block; + margin: 13px 0 0; + overflow: hidden; + text-align: right; +} + +.md span.align-right span img { + margin: 0; + text-align: right; +} + +.md span.float-left { + display: block; + float: left; + margin-right: 13px; + overflow: hidden; +} + +.md span.float-left span { + margin: 13px 0 0; +} + +.md span.float-right { + display: block; + float: right; + margin-left: 13px; + overflow: hidden; +} + +.md span.float-right > span { + display: block; + margin: 13px auto 0; + overflow: hidden; + text-align: right; +} + +.md code, +.md tt { + padding: 0.2em 0.4em; + margin: 0; + font-size: 85%; + background-color: var(--color-neutral-muted); + border-radius: 6px; +} + +.md code br, +.md tt br { + display: none; +} + +.md del code { + text-decoration: inherit; +} + +.md pre code { + font-size: 100%; +} + +.md pre > code { + padding: 0; + margin: 0; + word-break: normal; + white-space: pre; + background: transparent; + border: 0; +} + +.md .highlight { + margin-bottom: 16px; +} + +.md .highlight pre { + margin-bottom: 0; + word-break: normal; +} + +.md .highlight pre, +.md pre { + padding: 16px; + overflow: auto; + font-size: 85%; + line-height: 1.45; + background-color: var(--color-canvas-subtle); + border-radius: 6px; +} + +.md pre code, +.md pre tt { + display: inline; + max-width: auto; + padding: 0; + margin: 0; + overflow: visible; + line-height: inherit; + word-wrap: normal; + background-color: transparent; + border: 0; +} + +.md .csv-data td, +.md .csv-data th { + padding: 5px; + overflow: hidden; + font-size: 12px; + line-height: 1; + text-align: left; + white-space: nowrap; +} + +.md .csv-data .blob-num { + padding: 10px 8px 9px; + text-align: right; + background: var(--color-canvas-default); + border: 0; +} + +.md .csv-data tr { + border-top: 0; +} + +.md .csv-data th { + font-weight: 600; + background: var(--color-canvas-subtle); + border-top: 0; +} + +.md .footnotes { + font-size: 12px; + color: var(--color-fg-muted); + border-top: 1px solid var(--color-border-default); +} + +.md .footnotes ol { + padding-left: 16px; +} + +.md .footnotes li { + position: relative; +} + +.md .footnotes li:target::before { + position: absolute; + top: -8px; + right: -8px; + bottom: -8px; + left: -24px; + pointer-events: none; + content: ""; + border: 2px solid var(--color-accent-emphasis); + border-radius: 6px; +} + +.md .footnotes li:target { + color: var(--color-fg-default); +} + +.md .task-list-item { + list-style-type: none; +} + +.md .task-list-item label { + font-weight: 400; +} + +.md .task-list-item.enabled label { + cursor: pointer; +} + +.md .task-list-item + .task-list-item { + margin-top: 3px; +} + +.md .task-list-item .handle { + display: none; +} + +.md .task-list-item-checkbox { + margin: 0 0.2em 0.25em -1.6em; + vertical-align: middle; +} + +.md .contains-task-list:dir(rtl) .task-list-item-checkbox { + margin: 0 -1.6em 0.25em 0.2em; +} diff --git a/d2renderers/d2svg/table.go b/d2renderers/d2svg/table.go new file mode 100644 index 000000000..da08c628e --- /dev/null +++ b/d2renderers/d2svg/table.go @@ -0,0 +1,136 @@ +package d2svg + +import ( + "fmt" + "io" + "math" + "strings" + + "oss.terrastruct.com/d2/d2target" + "oss.terrastruct.com/d2/lib/geo" + "oss.terrastruct.com/d2/lib/label" +) + +func tableHeader(box *geo.Box, text string, textWidth, textHeight, fontSize float64) string { + str := fmt.Sprintf(``, + box.TopLeft.X, box.TopLeft.Y, box.Width, box.Height, "#0a0f25") + + if text != "" { + tl := label.InsideMiddleLeft.GetPointOnBox( + box, + 20, + textWidth, + textHeight, + ) + + str += fmt.Sprintf(`%s`, + "text", + tl.X, + tl.Y+textHeight*3/4, + fmt.Sprintf("text-anchor:%s;font-size:%vpx;fill:%s", + "start", + 4+fontSize, + "white", + ), + escapeText(text), + ) + } + return str +} + +func tableRow(box *geo.Box, nameText, typeText, constraintText string, fontSize, longestNameWidth float64) string { + // Row is made up of name, type, and constraint + // e.g. | diagram int FK | + nameTL := label.InsideMiddleLeft.GetPointOnBox( + box, + prefixPadding, + box.Width, + fontSize, + ) + constraintTR := label.InsideMiddleRight.GetPointOnBox( + box, + typePadding, + 0, + fontSize, + ) + + // TODO theme based + primaryColor := "rgb(13, 50, 178)" + accentColor := "rgb(74, 111, 243)" + neutralColor := "rgb(103, 108, 126)" + + return strings.Join([]string{ + fmt.Sprintf(`%s`, + nameTL.X, + nameTL.Y+fontSize*3/4, + fmt.Sprintf("text-anchor:%s;font-size:%vpx;fill:%s", "start", fontSize, primaryColor), + escapeText(nameText), + ), + + // TODO light font + fmt.Sprintf(`%s`, + nameTL.X+longestNameWidth, + nameTL.Y+fontSize*3/4, + fmt.Sprintf("text-anchor:%s;font-size:%vpx;fill:%s", "start", fontSize, neutralColor), + escapeText(typeText), + ), + + fmt.Sprintf(`%s`, + constraintTR.X, + constraintTR.Y+fontSize*3/4, + fmt.Sprintf("text-anchor:%s;font-size:%vpx;fill:%s;letter-spacing:2px;", "end", fontSize, accentColor), + constraintText, + ), + }, "\n") +} + +func constraintAbbr(constraint string) string { + switch constraint { + case "primary_key": + return "PK" + case "foreign_key": + return "FK" + case "unique": + return "UNQ" + default: + return "" + } +} + +func drawTable(writer io.Writer, targetShape d2target.Shape) { + fmt.Fprintf(writer, ``, + targetShape.Pos.X, targetShape.Pos.Y, targetShape.Width, targetShape.Height, shapeStyle(targetShape)) + + box := geo.NewBox( + geo.NewPoint(float64(targetShape.Pos.X), float64(targetShape.Pos.Y)), + float64(targetShape.Width), + float64(targetShape.Height), + ) + rowHeight := box.Height / float64(1+len(targetShape.SQLTable.Columns)) + headerBox := geo.NewBox(box.TopLeft, box.Width, rowHeight) + + fmt.Fprint(writer, + tableHeader(headerBox, targetShape.Label, float64(targetShape.LabelWidth), float64(targetShape.LabelHeight), float64(targetShape.FontSize)), + ) + + fontSize := float64(targetShape.FontSize) + var longestNameWidth float64 + for _, f := range targetShape.SQLTable.Columns { + // TODO measure text + longestNameWidth = math.Max(longestNameWidth, float64(len(f.Name))*fontSize*5/9) + } + + rowBox := geo.NewBox(box.TopLeft.Copy(), box.Width, rowHeight) + rowBox.TopLeft.Y += headerBox.Height + for _, f := range targetShape.SQLTable.Columns { + fmt.Fprint(writer, + tableRow(rowBox, f.Name, f.Type, constraintAbbr(f.Constraint), fontSize, longestNameWidth), + ) + rowBox.TopLeft.Y += rowHeight + fmt.Fprintf(writer, ``, + rowBox.TopLeft.X, rowBox.TopLeft.Y, + rowBox.TopLeft.X+rowBox.Width, rowBox.TopLeft.Y, + ) + } + +} diff --git a/d2renderers/textmeasure/NOTICE.txt b/d2renderers/textmeasure/NOTICE.txt new file mode 100644 index 000000000..ecb00f22c --- /dev/null +++ b/d2renderers/textmeasure/NOTICE.txt @@ -0,0 +1,7 @@ +Parts of this package have been derived and modified from a portion of +https://github.com/faiface/pixel. + +Attribution: + +MIT License +https://github.com/faiface/pixel/blob/master/LICENSE diff --git a/d2renderers/textmeasure/atlas.go b/d2renderers/textmeasure/atlas.go new file mode 100644 index 000000000..d1d60fee9 --- /dev/null +++ b/d2renderers/textmeasure/atlas.go @@ -0,0 +1,242 @@ +package textmeasure + +import ( + "sort" + "unicode" + + "golang.org/x/image/font" + "golang.org/x/image/math/fixed" + + "oss.terrastruct.com/d2/lib/geo" +) + +// glyph describes one glyph in an atlas. +type glyph struct { + dot *geo.Point + frame *rect + advance float64 +} + +// atlas is a set of pre-drawn glyphs of a fixed set of runes. This allows for efficient text drawing. +type atlas struct { + face font.Face + mapping map[rune]glyph + ascent float64 + descent float64 + lineHeight float64 +} + +// NewAtlas creates a new atlas containing glyphs of the union of the given sets of runes (plus +// unicode.ReplacementChar) from the given font face. +// +// Creating an atlas is rather expensive, do not create a new atlas each frame. +// +// Do not destroy or close the font.Face after creating the atlas. atlas still uses it. +func NewAtlas(face font.Face, runeSets ...[]rune) *atlas { + seen := make(map[rune]bool) + runes := []rune{unicode.ReplacementChar} + for _, set := range runeSets { + for _, r := range set { + if !seen[r] { + runes = append(runes, r) + seen[r] = true + } + } + } + + fixedMapping, fixedBounds := makeSquareMapping(face, runes, fixed.I(2)) + + bounds := &rect{ + tl: geo.NewPoint( + i2f(fixedBounds.Min.X), + i2f(fixedBounds.Min.Y), + ), + br: geo.NewPoint( + i2f(fixedBounds.Max.X), + i2f(fixedBounds.Max.Y), + ), + } + + mapping := make(map[rune]glyph) + for r, fg := range fixedMapping { + mapping[r] = glyph{ + dot: geo.NewPoint( + i2f(fg.dot.X), + bounds.br.Y-(i2f(fg.dot.Y)-bounds.tl.Y), + ), + frame: rect{ + tl: geo.NewPoint( + i2f(fg.frame.Min.X), + bounds.br.Y-(i2f(fg.frame.Min.Y)-bounds.tl.Y), + ), + br: geo.NewPoint( + i2f(fg.frame.Max.X), + bounds.br.Y-(i2f(fg.frame.Max.Y)-bounds.tl.Y), + ), + }.norm(), + advance: i2f(fg.advance), + } + } + + return &atlas{ + face: face, + mapping: mapping, + ascent: i2f(face.Metrics().Ascent), + descent: i2f(face.Metrics().Descent), + lineHeight: i2f(face.Metrics().Height), + } +} + +func (a *atlas) contains(r rune) bool { + _, ok := a.mapping[r] + return ok +} + +// glyph returns the description of r within the atlas. +func (a *atlas) glyph(r rune) glyph { + return a.mapping[r] +} + +// Kern returns the kerning distance between runes r0 and r1. Positive distance means that the +// glyphs should be further apart. +func (a *atlas) Kern(r0, r1 rune) float64 { + return i2f(a.face.Kern(r0, r1)) +} + +// Ascent returns the distance from the top of the line to the baseline. +func (a *atlas) Ascent() float64 { + return a.ascent +} + +// Descent returns the distance from the baseline to the bottom of the line. +func (a *atlas) Descent() float64 { + return a.descent +} + +// DrawRune returns parameters necessary for drawing a rune glyph. +// +// Rect is a rectangle where the glyph should be positioned. frame is the glyph frame inside the +// atlas's Picture. NewDot is the new position of the dot. +func (a *atlas) DrawRune(prevR, r rune, dot *geo.Point) (rect2, frame, bounds *rect, newDot *geo.Point) { + if !a.contains(r) { + r = unicode.ReplacementChar + } + if !a.contains(unicode.ReplacementChar) { + return newRect(), newRect(), newRect(), dot + } + if !a.contains(prevR) { + prevR = unicode.ReplacementChar + } + + if prevR >= 0 { + dot.X += a.Kern(prevR, r) + } + + glyph := a.glyph(r) + + subbed := geo.NewPoint( + dot.X-glyph.dot.X, + dot.Y-glyph.dot.Y, + ) + + rect2 = &rect{ + tl: geo.NewPoint( + glyph.frame.tl.X+subbed.X, + glyph.frame.tl.Y+subbed.Y, + ), + br: geo.NewPoint( + glyph.frame.br.X+subbed.X, + glyph.frame.br.Y+subbed.Y, + ), + } + bounds = rect2 + + if bounds.w()*bounds.h() != 0 { + bounds = &rect{ + tl: geo.NewPoint( + bounds.tl.X, + dot.Y-a.Descent(), + ), + br: geo.NewPoint( + bounds.br.X, + dot.Y+a.Ascent(), + ), + } + } + + dot.X += glyph.advance + + return rect2, glyph.frame, bounds, dot +} + +type fixedGlyph struct { + dot fixed.Point26_6 + frame fixed.Rectangle26_6 + advance fixed.Int26_6 +} + +// makeSquareMapping finds an optimal glyph arrangement of the given runes, so that their common +// bounding box is as square as possible. +func makeSquareMapping(face font.Face, runes []rune, padding fixed.Int26_6) (map[rune]fixedGlyph, fixed.Rectangle26_6) { + width := sort.Search(int(fixed.I(1024*1024)), func(i int) bool { + width := fixed.Int26_6(i) + _, bounds := makeMapping(face, runes, padding, width) + return bounds.Max.X-bounds.Min.X >= bounds.Max.Y-bounds.Min.Y + }) + return makeMapping(face, runes, padding, fixed.Int26_6(width)) +} + +// makeMapping arranges glyphs of the given runes into rows in such a way, that no glyph is located +// fully to the right of the specified width. Specifically, it places glyphs in a row one by one and +// once it reaches the specified width, it starts a new row. +func makeMapping(face font.Face, runes []rune, padding, width fixed.Int26_6) (map[rune]fixedGlyph, fixed.Rectangle26_6) { + mapping := make(map[rune]fixedGlyph) + bounds := fixed.Rectangle26_6{} + + dot := fixed.P(0, 0) + + for _, r := range runes { + b, advance, ok := face.GlyphBounds(r) + if !ok { + continue + } + + // this is important for drawing, artifacts arise otherwise + frame := fixed.Rectangle26_6{ + Min: fixed.P(b.Min.X.Floor(), b.Min.Y.Floor()), + Max: fixed.P(b.Max.X.Ceil(), b.Max.Y.Ceil()), + } + + dot.X -= frame.Min.X + frame = frame.Add(dot) + + mapping[r] = fixedGlyph{ + dot: dot, + frame: frame, + advance: advance, + } + bounds = bounds.Union(frame) + + dot.X = frame.Max.X + + // padding + align to integer + dot.X += padding + dot.X = fixed.I(dot.X.Ceil()) + + // width exceeded, new row + if frame.Max.X >= width { + dot.X = 0 + dot.Y += face.Metrics().Ascent + face.Metrics().Descent + + // padding + align to integer + dot.Y += padding + dot.Y = fixed.I(dot.Y.Ceil()) + } + } + + return mapping, bounds +} + +func i2f(i fixed.Int26_6) float64 { + return float64(i) / (1 << 6) +} diff --git a/d2renderers/textmeasure/markdown.go b/d2renderers/textmeasure/markdown.go new file mode 100644 index 000000000..c25907da6 --- /dev/null +++ b/d2renderers/textmeasure/markdown.go @@ -0,0 +1,325 @@ +package textmeasure + +import ( + "bytes" + "math" + "strings" + "unicode/utf8" + + "github.com/PuerkitoBio/goquery" + "github.com/yuin/goldmark" + goldmarkHtml "github.com/yuin/goldmark/renderer/html" + "golang.org/x/net/html" + + "oss.terrastruct.com/d2/d2renderers/d2fonts" + "oss.terrastruct.com/d2/lib/go2" +) + +var markdownRenderer goldmark.Markdown + +const ( + MarkdownFontSize = d2fonts.FONT_SIZE_M + MarkdownLineHeight = 1.5 + MarkdownLineHeightPx = MarkdownFontSize * MarkdownLineHeight + + PaddingLeft_ul_ol = 32 + MarginBottom_ul = MarkdownFontSize + + MarginTop_li_p = MarkdownFontSize + MarginBottom_p = MarkdownFontSize + + LineHeight_h = 1.25 + MarginTop_h = 24 + MarginBottom_h = 16 + PaddingBottom_h1_h2_em = 0.3 + + Height_hr = 4 + MarginTopBottom_hr = 24 + + Padding_pre = 16 + MarginBottom_pre = 16 + + PaddingLR_blockquote_em = 1. + MarginBottom_blockquote = 16 + BorderLeft_blockquote_em = 0.25 + + FONT_SIZE_H1 = d2fonts.FONT_SIZE_XXXL + FONT_SIZE_H2 = d2fonts.FONT_SIZE_XL + FONT_SIZE_H3 = d2fonts.FONT_SIZE_L + FONT_SIZE_H4 = d2fonts.FONT_SIZE_M + FONT_SIZE_H5 = d2fonts.FONT_SIZE_S + FONT_SIZE_H6 = d2fonts.FONT_SIZE_XS +) + +var HeaderToFontSize = map[string]int{ + "h1": FONT_SIZE_H1, + "h2": FONT_SIZE_H2, + "h3": FONT_SIZE_H3, + "h4": FONT_SIZE_H4, + "h5": FONT_SIZE_H5, + "h6": FONT_SIZE_H6, +} + +var HeaderFonts map[string]d2fonts.Font + +func RenderMarkdown(m string) (string, error) { + var output bytes.Buffer + if err := markdownRenderer.Convert([]byte(m), &output); err != nil { + return "", err + } + return output.String(), nil +} + +func init() { + HeaderFonts = make(map[string]d2fonts.Font) + for header, fontSize := range HeaderToFontSize { + HeaderFonts[header] = d2fonts.SourceSansPro.Font(fontSize, d2fonts.FONT_STYLE_BOLD) + } + + markdownRenderer = goldmark.New( + goldmark.WithRendererOptions( + goldmarkHtml.WithUnsafe(), + ), + ) +} + +func MeasureMarkdown(mdText string, ruler *Ruler) (width, height int, err error) { + render, err := RenderMarkdown(mdText) + if err != nil { + return width, height, err + } + + doc, err := goquery.NewDocumentFromReader(strings.NewReader(render)) + if err != nil { + return width, height, err + } + + { + originalLineHeight := ruler.LineHeightFactor + ruler.LineHeightFactor = MarkdownLineHeight + defer func() { + ruler.LineHeightFactor = originalLineHeight + }() + } + + font := d2fonts.SourceSansPro.Font(MarkdownFontSize, d2fonts.FONT_STYLE_REGULAR) + + // TODO consider setting a max width + (manual) text wrapping + bodyNode := doc.Find("body").First().Nodes[0] + bodyWidth, bodyHeight, _, _ := ruler.measureNode(0, bodyNode, font) + + return int(math.Ceil(bodyWidth)), int(math.Ceil(bodyHeight)), nil +} + +func hasPrev(n *html.Node) bool { + if n.PrevSibling == nil { + return false + } + if strings.TrimSpace(n.PrevSibling.Data) == "" { + return hasPrev(n.PrevSibling) + } + return true +} + +func hasNext(n *html.Node) bool { + if n.NextSibling == nil { + return false + } + // skip over empty text nodes + if strings.TrimSpace(n.NextSibling.Data) == "" { + return hasNext(n.NextSibling) + } + return true +} + +func getPrev(n *html.Node) *html.Node { + if n == nil { + return nil + } + if strings.TrimSpace(n.Data) == "" { + if next := getNext(n.PrevSibling); next != nil { + return next + } + } + return n +} + +func getNext(n *html.Node) *html.Node { + if n == nil { + return nil + } + if strings.TrimSpace(n.Data) == "" { + if next := getNext(n.NextSibling); next != nil { + return next + } + } + return n +} + +func isBlockElement(elType string) bool { + switch elType { + case "blockquote", + "div", + "h1", "h2", "h3", "h4", "h5", "h6", + "hr", + "li", + "ol", + "p", + "pre", + "ul": + return true + default: + return false + } +} + +func hasAncestorElement(n *html.Node, elType string) bool { + if n.Parent == nil { + return false + } + if n.Parent.Type == html.ElementNode && n.Parent.Data == elType { + return true + } + return hasAncestorElement(n.Parent, elType) +} + +// measures node dimensions to match rendering with styles in github-markdown.css +func (ruler *Ruler) measureNode(depth int, n *html.Node, font d2fonts.Font) (width, height, marginTop, marginBottom float64) { + switch n.Type { + case html.TextNode: + if strings.TrimSpace(n.Data) == "" { + return + } + spaceWidths := 0. + + // consecutive leading/trailing spaces end up rendered as a single space + spaceRune, _ := utf8.DecodeRuneInString(" ") + // measure will not include leading or trailing whitespace, so we have to add in the space width + spaceWidth := ruler.atlases[font].glyph(spaceRune).advance + + str := n.Data + hasCodeParent := n.Parent != nil && n.Parent.Type == html.ElementNode && (n.Parent.Data == "pre" || n.Parent.Data == "code") + if !hasCodeParent { + str = strings.ReplaceAll(n.Data, "\n", " ") + } + if strings.HasPrefix(str, " ") { + str = strings.TrimPrefix(str, " ") + if hasPrev(n) { + spaceWidths += spaceWidth + } + } + if strings.HasSuffix(str, " ") { + str = strings.TrimSuffix(str, " ") + if hasNext(n) { + spaceWidths += spaceWidth + } + } + + w, h := ruler.MeasurePrecise(font, str) + w += spaceWidths + // fmt.Printf("%d:%s width %v height %v fontStyle %s\n", depth, n.Data, w, h, font.Style) + if h > 0 && h < MarkdownLineHeightPx { + h = MarkdownLineHeightPx + } + return w, h, 0, 0 + case html.ElementNode: + // fmt.Printf("%d: %v node\n", depth, n.Data) + switch n.Data { + case "h1", "h2", "h3", "h4", "h5", "h6": + font = HeaderFonts[n.Data] + originalLineHeight := ruler.LineHeightFactor + ruler.LineHeightFactor = LineHeight_h + defer func() { + ruler.LineHeightFactor = originalLineHeight + }() + case "em": + font.Style = d2fonts.FONT_STYLE_ITALIC + case "b", "strong": + font.Style = d2fonts.FONT_STYLE_BOLD + case "pre", "code": + // TODO monospaced font + } + + if n.FirstChild != nil { + first := getNext(n.FirstChild) + last := getPrev(n.LastChild) + + var prevMarginBottom float64 + for child := n.FirstChild; child != nil; child = child.NextSibling { + childWidth, childHeight, childMarginTop, childMarginBottom := ruler.measureNode(depth+1, child, font) + + if child.Type == html.ElementNode && isBlockElement(child.Data) { + if child == first { + if n.Data == "blockquote" { + childMarginTop = 0. + } + marginTop = go2.Max(marginTop, childMarginTop) + } else { + marginDiff := childMarginTop - prevMarginBottom + if marginDiff > 0 { + childHeight += marginDiff + } + } + if child == last { + if n.Data == "blockquote" { + childMarginBottom = 0. + } + marginBottom = go2.Max(marginBottom, childMarginBottom) + } else { + childHeight += childMarginBottom + prevMarginBottom = childMarginBottom + } + + height += childHeight + width = go2.Max(width, childWidth) + } else { + marginTop = go2.Max(marginTop, childMarginTop) + marginBottom = go2.Max(marginBottom, childMarginBottom) + + width += childWidth + height = go2.Max(height, childHeight) + } + } + } + + switch n.Data { + case "blockquote": + width += float64(font.Size) * (2*PaddingLR_blockquote_em + BorderLeft_blockquote_em) + marginBottom = go2.Max(marginBottom, MarginBottom_blockquote) + case "p": + if n.Parent != nil && n.Parent.Type == html.ElementNode && n.Parent.Data == "li" { + marginTop = go2.Max(marginTop, MarginTop_li_p) + } + marginBottom = go2.Max(marginBottom, MarginBottom_p) + case "h1", "h2", "h3", "h4", "h5", "h6": + marginTop = go2.Max(marginTop, MarginTop_h) + marginBottom = go2.Max(marginBottom, MarginBottom_h) + switch n.Data { + case "h1", "h2": + height += float64(HeaderToFontSize[n.Data]) * PaddingBottom_h1_h2_em + } + case "li": + width += PaddingLeft_ul_ol + if hasPrev(n) { + marginTop = go2.Max(marginTop, 4) + } + case "ol", "ul": + if hasAncestorElement(n, "ul") || hasAncestorElement(n, "ol") { + marginTop = 0 + marginBottom = 0 + } else { + marginBottom = go2.Max(marginBottom, MarginBottom_ul) + } + case "pre": + width += 2 * Padding_pre + height += 2 * Padding_pre + marginBottom = go2.Max(marginBottom, MarginBottom_pre) + case "hr": + height += Height_hr + marginTop = go2.Max(marginTop, MarginTopBottom_hr) + marginBottom = go2.Max(marginBottom, MarginTopBottom_hr) + } + // fmt.Printf("%d:%s width %v height %v mt %v mb %v\n", depth, n.Data, width, height, marginTop, marginBottom) + } + return width, height, marginTop, marginBottom +} diff --git a/d2renderers/textmeasure/rect.go b/d2renderers/textmeasure/rect.go new file mode 100644 index 000000000..2ee3e9dc4 --- /dev/null +++ b/d2renderers/textmeasure/rect.go @@ -0,0 +1,51 @@ +package textmeasure + +import ( + "math" + + "oss.terrastruct.com/d2/lib/geo" +) + +type rect struct { + tl *geo.Point + br *geo.Point +} + +func newRect() *rect { + return &rect{ + tl: geo.NewPoint(0, 0), + br: geo.NewPoint(0, 0), + } +} + +func (r rect) w() float64 { + return r.br.X - r.tl.X +} + +func (r rect) h() float64 { + return r.br.Y - r.tl.Y +} + +// norm returns the Rect in normal form, such that Max is component-wise greater or equal than Min. +func (r rect) norm() *rect { + return &rect{ + tl: geo.NewPoint( + math.Min(r.tl.X, r.br.X), + math.Min(r.tl.Y, r.br.Y), + ), + br: geo.NewPoint( + math.Max(r.tl.X, r.br.X), + math.Max(r.tl.Y, r.br.Y), + ), + } +} + +func (r1 *rect) union(r2 *rect) *rect { + r := newRect() + r.tl.X = math.Min(r1.tl.X, r2.tl.X) + r.tl.Y = math.Min(r1.tl.Y, r2.tl.Y) + r.br.X = math.Max(r1.br.X, r2.br.X) + r.br.Y = math.Max(r1.br.Y, r2.br.Y) + + return r +} diff --git a/d2renderers/textmeasure/textmeasure.go b/d2renderers/textmeasure/textmeasure.go new file mode 100644 index 000000000..251e51b41 --- /dev/null +++ b/d2renderers/textmeasure/textmeasure.go @@ -0,0 +1,208 @@ +// Ported from https://github.com/faiface/pixel/tree/master/text +// Trimmed down to essentials of measuring text + +package textmeasure + +import ( + "math" + "unicode" + "unicode/utf8" + + "github.com/golang/freetype/truetype" + + "oss.terrastruct.com/d2/d2renderers/d2fonts" + "oss.terrastruct.com/d2/lib/geo" +) + +// ASCII is a set of all ASCII runes. These runes are codepoints from 32 to 127 inclusive. +var ASCII []rune + +func init() { + ASCII = make([]rune, unicode.MaxASCII-32) + for i := range ASCII { + ASCII[i] = rune(32 + i) + } +} + +// Ruler allows for effiecient and convenient text drawing. +// +// To create a Ruler object, use the New constructor: +// txt := text.New(pixel.ZV, text.NewAtlas(face, text.ASCII)) +// +// As suggested by the constructor, a Ruler object is always associated with one font face and a +// fixed set of runes. For example, the Ruler we created above can draw text using the font face +// contained in the face variable and is capable of drawing ASCII characters. +// +// Here we create a Ruler object which can draw ASCII and Katakana characters: +// txt := text.New(0, text.NewAtlas(face, text.ASCII, text.RangeTable(unicode.Katakana))) +// +// Similarly to IMDraw, Ruler functions as a buffer. It implements io.Writer interface, so writing +// text to it is really simple: +// fmt.Print(txt, "Hello, world!") +// +// Newlines, tabs and carriage returns are supported. +// +// Finally, if we want the written text to show up on some other Target, we can draw it: +// txt.Draw(target) +// +// Ruler exports two important fields: Orig and Dot. Dot is the position where the next character +// will be written. Dot is automatically moved when writing to a Ruler object, but you can also +// manipulate it manually. Orig specifies the text origin, usually the top-left dot position. Dot is +// always aligned to Orig when writing newlines. The Clear method resets the Dot to Orig. +type Ruler struct { + // Orig specifies the text origin, usually the top-left dot position. Dot is always aligned + // to Orig when writing newlines. + Orig *geo.Point + + // Dot is the position where the next character will be written. Dot is automatically moved + // when writing to a Ruler object, but you can also manipulate it manually + Dot *geo.Point + + // lineHeight is the vertical distance between two lines of text. + // + // Example: + // txt.lineHeight = 1.5 * txt.atlas.lineHeight + LineHeightFactor float64 + lineHeights map[d2fonts.Font]float64 + + // tabWidth is the horizontal tab width. Tab characters will align to the multiples of this + // width. + // + // Example: + // txt.tabWidth = 8 * txt.atlas.glyph(' ').Advance + tabWidths map[d2fonts.Font]float64 + + atlases map[d2fonts.Font]*atlas + + buf []byte + prevR rune + bounds *rect +} + +// New creates a new Ruler capable of drawing runes contained in the provided atlas. Orig and Dot +// will be initially set to orig. +// +// Here we create a Ruler capable of drawing ASCII characters using the Go Regular font. +// ttf, err := truetype.Parse(goregular.TTF) +// if err != nil { +// panic(err) +// } +// face := truetype.NewFace(ttf, &truetype.Options{ +// Size: 14, +// }) +// txt := text.New(orig, text.NewAtlas(face, text.ASCII)) +func NewRuler() (*Ruler, error) { + lineHeights := make(map[d2fonts.Font]float64) + tabWidths := make(map[d2fonts.Font]float64) + atlases := make(map[d2fonts.Font]*atlas) + + for _, fontFamily := range d2fonts.FontFamilies { + for _, fontSize := range d2fonts.FontSizes { + for _, fontStyle := range d2fonts.FontStyles { + font := d2fonts.Font{ + Family: fontFamily, + Style: fontStyle, + } + if _, ok := d2fonts.FontFaces[font]; !ok { + continue + } + ttf, err := truetype.Parse(d2fonts.FontFaces[font]) + if err != nil { + return nil, err + } + // Added after, since FontFaces lookup is size-agnostic + font.Size = fontSize + face := truetype.NewFace(ttf, &truetype.Options{ + Size: float64(fontSize), + }) + atlas := NewAtlas(face, ASCII) + atlases[font] = atlas + lineHeights[font] = atlas.lineHeight + tabWidths[font] = atlas.glyph(' ').advance * 4 + } + } + } + origin := geo.NewPoint(0, 0) + txt := &Ruler{ + Orig: origin, + Dot: origin.Copy(), + LineHeightFactor: 1., + lineHeights: lineHeights, + tabWidths: tabWidths, + atlases: atlases, + } + + txt.clear() + + return txt, nil +} + +func (t *Ruler) Measure(font d2fonts.Font, s string) (width, height int) { + w, h := t.MeasurePrecise(font, s) + return int(math.Ceil(w)), int(math.Ceil(h)) +} + +func (t *Ruler) MeasurePrecise(font d2fonts.Font, s string) (width, height float64) { + t.clear() + t.buf = append(t.buf, s...) + t.drawBuf(font) + b := t.bounds + return b.w(), b.h() +} + +// clear removes all written text from the Ruler. The Dot field is reset to Orig. +func (txt *Ruler) clear() { + txt.prevR = -1 + txt.bounds = newRect() + txt.Dot = txt.Orig.Copy() +} + +// controlRune checks if r is a control rune (newline, tab, ...). If it is, a new dot position and +// true is returned. If r is not a control rune, the original dot and false is returned. +func (txt *Ruler) controlRune(r rune, dot *geo.Point, font d2fonts.Font) (newDot *geo.Point, control bool) { + switch r { + case '\n': + dot.X = txt.Orig.X + dot.Y -= txt.LineHeightFactor * txt.lineHeights[font] + case '\r': + dot.X = txt.Orig.X + case '\t': + rem := math.Mod(dot.X-txt.Orig.X, txt.tabWidths[font]) + rem = math.Mod(rem, rem+txt.tabWidths[font]) + if rem == 0 { + rem = txt.tabWidths[font] + } + dot.X += rem + default: + return dot, false + } + return dot, true +} + +func (txt *Ruler) drawBuf(font d2fonts.Font) { + if !utf8.FullRune(txt.buf) { + return + } + + for utf8.FullRune(txt.buf) { + r, l := utf8.DecodeRune(txt.buf) + txt.buf = txt.buf[l:] + + var control bool + txt.Dot, control = txt.controlRune(r, txt.Dot, font) + if control { + continue + } + + var bounds *rect + _, _, bounds, txt.Dot = txt.atlases[font].DrawRune(txt.prevR, r, txt.Dot) + + txt.prevR = r + + if txt.bounds.w()*txt.bounds.h() == 0 { + txt.bounds = bounds + } else { + txt.bounds = txt.bounds.union(bounds) + } + } +} diff --git a/d2renderers/textmeasure/textmeasure_test.go b/d2renderers/textmeasure/textmeasure_test.go new file mode 100644 index 000000000..8a8f53110 --- /dev/null +++ b/d2renderers/textmeasure/textmeasure_test.go @@ -0,0 +1,115 @@ +package textmeasure_test + +import ( + "fmt" + "strings" + "testing" + + "github.com/stretchr/testify/assert" + + "oss.terrastruct.com/d2/d2renderers/d2fonts" + "oss.terrastruct.com/d2/d2renderers/textmeasure" +) + +var txts = []string{ + "Jesus is my POSTMASTER GENERAL ...", + "Don't let go of what you've got hold of, until you have hold of something else.", + "To get something clean, one has to get something dirty.", + "The notes blatted skyward as they rose over the Canada geese, feathered", + "There is no such thing as a problem without a gift for you in its hands.", + "Baseball is a skilled game. It's America's game - it, and high taxes.", + "He is truly wise who gains wisdom from another's mishap.", + "If you have never been hated by your child, you have never been a parent.", + "Your only obligation in any lifetime is to be true to yourself. Being", + "The computing field is always in need of new cliches.", +} + +func TestTextMeasure(t *testing.T) { + ruler, err := textmeasure.NewRuler() + if err != nil { + t.Fatal(err) + } + + // For a set of random strings, test each char increases width but not height + for _, txt := range txts { + txt = strings.ReplaceAll(txt, " ", "") + for i := 1; i < len(txt)-1; i++ { + w1, h1 := ruler.Measure(d2fonts.SourceSansPro.Font(d2fonts.FONT_SIZE_M, d2fonts.FONT_STYLE_REGULAR), txt[:i]) + w2, h2 := ruler.Measure(d2fonts.SourceSansPro.Font(d2fonts.FONT_SIZE_M, d2fonts.FONT_STYLE_REGULAR), txt[:i+1]) + assert.Equal(t, h1, h2) + assert.Less(t, w1, w2, fmt.Sprintf(`"%s" vs "%s"`, txt[:i], txt[:i+1])) + } + } + + // For a set of random strings, test that adding newlines increases height each time + for _, txt := range txts { + whitespaces := strings.Count(txt, " ") + for i := 0; i < whitespaces-1; i++ { + txt1 := strings.Replace(txt, " ", "\n", i) + txt2 := strings.Replace(txt, " ", "\n", i+1) + + w1, h1 := ruler.Measure(d2fonts.SourceSansPro.Font(d2fonts.FONT_SIZE_M, d2fonts.FONT_STYLE_REGULAR), txt1) + w2, h2 := ruler.Measure(d2fonts.SourceSansPro.Font(d2fonts.FONT_SIZE_M, d2fonts.FONT_STYLE_REGULAR), txt2) + + assert.Less(t, h1, h2) + assert.Less(t, w2, w1) + } + } +} + +func TestFontMeasure(t *testing.T) { + ruler, err := textmeasure.NewRuler() + if err != nil { + t.Fatal(err) + } + + // For a set of random strings, test that font sizes are strictly increasing + for _, txt := range txts { + for i := 0; i < len(d2fonts.FontSizes)-1; i++ { + w1, h1 := ruler.Measure(d2fonts.SourceSansPro.Font(d2fonts.FontSizes[i], d2fonts.FONT_STYLE_REGULAR), txt) + w2, h2 := ruler.Measure(d2fonts.SourceSansPro.Font(d2fonts.FontSizes[i+1], d2fonts.FONT_STYLE_REGULAR), txt) + assert.Less(t, h1, h2) + assert.Less(t, w1, w2) + } + } + +} + +type dimensions struct { + width, height int +} + +var mdTexts = map[string]dimensions{ + ` +- [Overview](#overview) ok _this is all measured_ +`: {245, 24}, + ` +_italics are all measured correctly_ +`: {214, 24}, + ` +**bold is measured correctly** +`: {187, 24}, + ` +**Note:** This document +`: {141, 24}, + ` +**Note:** +`: {37, 24}, +} + +func TestTextMeasureMarkdown(t *testing.T) { + ruler, err := textmeasure.NewRuler() + if err != nil { + t.Fatal(err) + } + + for text, dims := range mdTexts { + width, height, err := textmeasure.MeasureMarkdown(text, ruler) + if err != nil { + t.Fatal(err) + } + assert.Equal(t, dims.width, width, text) + assert.Equal(t, dims.height, height, text) + } + +} diff --git a/d2target/class.go b/d2target/class.go new file mode 100644 index 000000000..8a0a7e71e --- /dev/null +++ b/d2target/class.go @@ -0,0 +1,44 @@ +package d2target + +import ( + "fmt" + + "oss.terrastruct.com/d2/d2renderers/d2fonts" +) + +type Class struct { + Fields []ClassField `json:"fields"` + Methods []ClassMethod `json:"methods"` +} + +type ClassField struct { + Name string `json:"name"` + Type string `json:"type"` + Visibility string `json:"visibility"` +} + +func (cf ClassField) Text() *MText { + return &MText{ + Text: fmt.Sprintf("%s%s", cf.Name, cf.Type), + FontSize: d2fonts.FONT_SIZE_L, + IsBold: false, + IsItalic: false, + Shape: "class", + } +} + +type ClassMethod struct { + Name string `json:"name"` + Return string `json:"return"` + Visibility string `json:"visibility"` +} + +func (cm ClassMethod) Text() *MText { + return &MText{ + Text: fmt.Sprintf("%s%s", cm.Name, cm.Return), + FontSize: d2fonts.FONT_SIZE_L, + IsBold: false, + IsItalic: false, + Shape: "class", + } +} diff --git a/d2target/d2target.go b/d2target/d2target.go new file mode 100644 index 000000000..94c630099 --- /dev/null +++ b/d2target/d2target.go @@ -0,0 +1,411 @@ +package d2target + +import ( + "math" + "net/url" + "strings" + + "oss.terrastruct.com/d2/d2themes" + "oss.terrastruct.com/d2/lib/geo" + "oss.terrastruct.com/d2/lib/go2" + "oss.terrastruct.com/d2/lib/label" + "oss.terrastruct.com/d2/lib/shape" +) + +const ( + DEFAULT_ICON_SIZE = 32 + MAX_ICON_SIZE = 64 +) + +type Diagram struct { + Name string `json:"name"` + Description string `json:"description,omitempty"` + + Shapes []Shape `json:"shapes"` + Connections []Connection `json:"connections"` +} + +func (diagram Diagram) BoundingBox() (topLeft, bottomRight Point) { + x1 := int(math.MaxInt64) + y1 := int(math.MaxInt64) + x2 := int(-math.MaxInt64) + y2 := int(-math.MaxInt64) + + for _, targetShape := range diagram.Shapes { + x1 = go2.Min(x1, targetShape.Pos.X) + y1 = go2.Min(y1, targetShape.Pos.Y) + x2 = go2.Max(x2, targetShape.Pos.X+targetShape.Width) + y2 = go2.Max(y2, targetShape.Pos.Y+targetShape.Height) + + if targetShape.Label != "" { + labelPosition := label.Position(targetShape.LabelPosition) + if !labelPosition.IsOutside() { + continue + } + + shapeType := DSL_SHAPE_TO_SHAPE_TYPE[targetShape.Type] + s := shape.NewShape(shapeType, + geo.NewBox( + geo.NewPoint(float64(targetShape.Pos.X), float64(targetShape.Pos.Y)), + float64(targetShape.Width), + float64(targetShape.Height), + ), + ) + + labelTL := labelPosition.GetPointOnBox(s.GetBox(), label.PADDING, float64(targetShape.LabelWidth), float64(targetShape.LabelHeight)) + x1 = go2.Min(x1, int(labelTL.X)) + y1 = go2.Min(y1, int(labelTL.Y)) + x2 = go2.Max(x2, int(labelTL.X)+targetShape.LabelWidth) + y2 = go2.Max(y2, int(labelTL.Y)+targetShape.LabelHeight) + } + } + + for _, connection := range diagram.Connections { + for _, point := range connection.Route { + x1 = go2.Min(x1, int(math.Floor(point.X))) + y1 = go2.Min(y1, int(math.Floor(point.Y))) + x2 = go2.Max(x2, int(math.Ceil(point.X))) + y2 = go2.Max(y2, int(math.Ceil(point.Y))) + } + + if connection.Label != "" { + labelTL := connection.GetLabelTopLeft() + x1 = go2.Min(x1, int(labelTL.X)) + y1 = go2.Min(y1, int(labelTL.Y)) + x2 = go2.Max(x2, int(labelTL.X)+connection.LabelWidth) + y2 = go2.Max(y2, int(labelTL.Y)+connection.LabelHeight) + } + } + + return Point{x1, y1}, Point{x2, y2} +} + +func NewDiagram() *Diagram { + return &Diagram{} +} + +type Shape struct { + ID string `json:"id"` + Type string `json:"type"` + + Pos Point `json:"pos"` + Width int `json:"width"` + Height int `json:"height"` + Level int `json:"level"` + + Opacity float64 `json:"opacity"` + StrokeDash float64 `json:"strokeDash"` + StrokeWidth int `json:"strokeWidth"` + + BorderRadius int `json:"borderRadius"` + + Fill string `json:"fill"` + Stroke string `json:"stroke"` + + Shadow bool `json:"shadow"` + ThreeDee bool `json:"3d"` + Multiple bool `json:"multiple"` + + Tooltip string `json:"tooltip"` + Link string `json:"link"` + Icon *url.URL `json:"icon"` + IconPosition string `json:"iconPosition"` + + Class + SQLTable + + Text + + LabelPosition string `json:"labelPosition,omitempty"` +} + +func (s *Shape) SetType(t string) { + // Some types are synonyms of other types, but with hinting for autolayout + // They should only have one representation in the final export + if strings.EqualFold(t, ShapeCircle) { + t = ShapeOval + } else if strings.EqualFold(t, ShapeSquare) { + t = ShapeRectangle + } + s.Type = strings.ToLower(t) +} + +type Text struct { + Label string `json:"label"` + FontSize int `json:"fontSize"` + FontFamily string `json:"fontFamily"` + Language string `json:"language"` + Color string `json:"color"` + + Italic bool `json:"italic"` + Bold bool `json:"bold"` + Underline bool `json:"underline"` + + LabelWidth int `json:"labelWidth"` + LabelHeight int `json:"labelHeight"` +} + +func BaseShape() *Shape { + return &Shape{ + Opacity: 1, + StrokeDash: 0, + StrokeWidth: 2, + Text: Text{ + Bold: true, + FontFamily: "DEFAULT", + }, + } +} + +type Connection struct { + ID string `json:"id"` + + Src string `json:"src"` + SrcArrow Arrowhead `json:"srcArrow"` + SrcLabel string `json:"srcLabel"` + + Dst string `json:"dst"` + DstArrow Arrowhead `json:"dstArrow"` + DstLabel string `json:"dstLabel"` + + Opacity float64 `json:"opacity"` + StrokeDash float64 `json:"strokeDash"` + StrokeWidth int `json:"strokeWidth"` + Stroke string `json:"stroke"` + + Text + LabelPosition string `json:"labelPosition"` + LabelPercentage float64 `json:"labelPercentage"` + + Route []*geo.Point `json:"route"` + IsCurve bool `json:"isCurve,omitempty"` + + Animated bool `json:"animated"` + Tooltip string `json:"tooltip"` + Icon *url.URL `json:"icon"` +} + +func BaseConnection() *Connection { + return &Connection{ + SrcArrow: NoArrowhead, + DstArrow: NoArrowhead, + Route: make([]*geo.Point, 0), + Opacity: 1, + StrokeDash: 0, + StrokeWidth: 2, + Text: Text{ + Italic: true, + FontFamily: "DEFAULT", + }, + } +} + +func (c *Connection) GetLabelTopLeft() *geo.Point { + return label.Position(c.LabelPosition).GetPointOnRoute( + c.Route, + float64(c.StrokeWidth), + c.LabelPercentage, + float64(c.LabelWidth), + float64(c.LabelHeight), + ) +} + +type Arrowhead string + +const ( + NoArrowhead Arrowhead = "none" + ArrowArrowhead Arrowhead = "arrow" + TriangleArrowhead Arrowhead = "triangle" + DiamondArrowhead Arrowhead = "diamond" + FilledDiamondArrowhead Arrowhead = "filled-diamond" + + // For fat arrows + LineArrowhead Arrowhead = "line" +) + +var Arrowheads = map[string]struct{}{ + string(NoArrowhead): {}, + string(ArrowArrowhead): {}, + string(TriangleArrowhead): {}, + string(DiamondArrowhead): {}, + string(FilledDiamondArrowhead): {}, +} + +func ToArrowhead(arrowheadType string, filled bool) Arrowhead { + switch arrowheadType { + case string(DiamondArrowhead): + if filled { + return FilledDiamondArrowhead + } + return DiamondArrowhead + case string(ArrowArrowhead): + return ArrowArrowhead + default: + return TriangleArrowhead + } +} + +type Point struct { + X int `json:"x"` + Y int `json:"y"` +} + +func NewPoint(x, y int) Point { + return Point{X: x, Y: y} +} + +const ( + ShapeRectangle = "rectangle" + ShapeSquare = "square" + ShapePage = "page" + ShapeParallelogram = "parallelogram" + ShapeDocument = "document" + ShapeCylinder = "cylinder" + ShapeQueue = "queue" + ShapePackage = "package" + ShapeStep = "step" + ShapeCallout = "callout" + ShapeStoredData = "stored_data" + ShapePerson = "person" + ShapeDiamond = "diamond" + ShapeOval = "oval" + ShapeCircle = "circle" + ShapeHexagon = "hexagon" + ShapeCloud = "cloud" + ShapeText = "text" + ShapeCode = "code" + ShapeClass = "class" + ShapeSQLTable = "sql_table" + ShapeImage = "image" +) + +var Shapes = []string{ + ShapeRectangle, + ShapeSquare, + ShapePage, + ShapeParallelogram, + ShapeDocument, + ShapeCylinder, + ShapeQueue, + ShapePackage, + ShapeStep, + ShapeCallout, + ShapeStoredData, + ShapePerson, + ShapeDiamond, + ShapeOval, + ShapeCircle, + ShapeHexagon, + ShapeCloud, + ShapeText, + ShapeCode, + ShapeClass, + ShapeSQLTable, + ShapeImage, +} + +func IsShape(s string) bool { + if s == "" { + // Default shape is rectangle. + return true + } + for _, s2 := range Shapes { + if strings.EqualFold(s, s2) { + return true + } + } + return false +} + +type MText struct { + Text string `json:"text"` + FontSize int `json:"fontSize"` + IsBold bool `json:"isBold"` + IsItalic bool `json:"isItalic"` + Language string `json:"language"` + Shape string `json:"shape"` + + Dimensions TextDimensions `json:"dimensions,omitempty"` +} + +type TextDimensions struct { + Width int `json:"width"` + Height int `json:"height"` +} + +func NewTextDimensions(w, h int) *TextDimensions { + return &TextDimensions{Width: w, Height: h} +} + +func (text MText) GetColor(theme *d2themes.Theme, isItalic bool) string { + if isItalic { + return theme.Colors.Neutrals.N2 + } + return theme.Colors.Neutrals.N1 +} + +var DSL_SHAPE_TO_SHAPE_TYPE = map[string]string{ + "": shape.SQUARE_TYPE, + ShapeRectangle: shape.SQUARE_TYPE, + ShapeSquare: shape.REAL_SQUARE_TYPE, + ShapePage: shape.PAGE_TYPE, + ShapeParallelogram: shape.PARALLELOGRAM_TYPE, + ShapeDocument: shape.DOCUMENT_TYPE, + ShapeCylinder: shape.CYLINDER_TYPE, + ShapeQueue: shape.QUEUE_TYPE, + ShapePackage: shape.PACKAGE_TYPE, + ShapeStep: shape.STEP_TYPE, + ShapeCallout: shape.CALLOUT_TYPE, + ShapeStoredData: shape.STORED_DATA_TYPE, + ShapePerson: shape.PERSON_TYPE, + ShapeDiamond: shape.DIAMOND_TYPE, + ShapeOval: shape.OVAL_TYPE, + ShapeCircle: shape.CIRCLE_TYPE, + ShapeHexagon: shape.HEXAGON_TYPE, + ShapeCloud: shape.CLOUD_TYPE, + ShapeText: shape.TEXT_TYPE, + ShapeCode: shape.CODE_TYPE, + ShapeClass: shape.CLASS_TYPE, + ShapeSQLTable: shape.TABLE_TYPE, + ShapeImage: shape.IMAGE_TYPE, +} + +var SHAPE_TYPE_TO_DSL_SHAPE map[string]string + +func init() { + SHAPE_TYPE_TO_DSL_SHAPE = make(map[string]string, len(DSL_SHAPE_TO_SHAPE_TYPE)) + for k, v := range DSL_SHAPE_TO_SHAPE_TYPE { + SHAPE_TYPE_TO_DSL_SHAPE[v] = k + } +} + +func (s *Shape) GetIconSize(box *geo.Box) int { + iconPosition := label.Position(s.IconPosition) + + minDimension := int(math.Min(box.Width, box.Height)) + halfMinDimension := int(math.Ceil(0.5 * float64(minDimension))) + + var size int + + if iconPosition == label.InsideMiddleCenter { + size = halfMinDimension + } else { + size = go2.IntMin( + minDimension, + go2.IntMax(DEFAULT_ICON_SIZE, halfMinDimension), + ) + } + + size = go2.IntMin(size, MAX_ICON_SIZE) + + if !iconPosition.IsOutside() { + size = go2.IntMin(size, + go2.IntMin( + go2.IntMax(int(box.Width)-2*label.PADDING, 0), + go2.IntMax(int(box.Height)-2*label.PADDING, 0), + ), + ) + } + + return size +} diff --git a/d2target/sqltable.go b/d2target/sqltable.go new file mode 100644 index 000000000..3007dd178 --- /dev/null +++ b/d2target/sqltable.go @@ -0,0 +1,28 @@ +package d2target + +import ( + "fmt" + + "oss.terrastruct.com/d2/d2renderers/d2fonts" +) + +type SQLTable struct { + Columns []SQLColumn `json:"columns"` +} + +type SQLColumn struct { + Name string `json:"name"` + Type string `json:"type"` + Constraint string `json:"constraint"` + Reference string `json:"reference"` +} + +func (c SQLColumn) Text() *MText { + return &MText{ + Text: fmt.Sprintf("%s%s%s%s", c.Name, c.Type, c.Constraint, c.Reference), + FontSize: d2fonts.FONT_SIZE_L, + IsBold: false, + IsItalic: false, + Shape: "sql_table", + } +} diff --git a/d2themes/README.md b/d2themes/README.md new file mode 100644 index 000000000..e402ced13 --- /dev/null +++ b/d2themes/README.md @@ -0,0 +1,18 @@ +# d2themes + +`d2themes` defines themes for D2. You can add a new one in `./d2themescatalog`, give a +unique ID, and specify it in the CLI or library to see it. + +# Color coding guide + + + +# Color coding example + + + +# Container gradients + +To distinguish container nesting, objects get progressively lighter the more nested it is. + + diff --git a/d2themes/d2themes.go b/d2themes/d2themes.go new file mode 100644 index 000000000..5ea17bd6f --- /dev/null +++ b/d2themes/d2themes.go @@ -0,0 +1,60 @@ +// d2themes defines themes to make d2 diagrams pretty +// Color codes: darkest (N1) -> lightest (N7) +package d2themes + +type Theme struct { + ID int64 `json:"id"` + Name string `json:"name"` + Colors ColorPalette `json:"colors"` +} + +type Neutral struct { + N1 string `json:"n1"` + N2 string `json:"n2"` + N3 string `json:"n3"` + N4 string `json:"n4"` + N5 string `json:"n5"` + N7 string `json:"n7"` +} + +type ColorPalette struct { + // So far the palette only contains the colors used in d2 shapes, the full theme includes more colors + // https://www.figma.com/file/n79RbPiHFUTO4PPPdpDu7w/%5BKW%5D-GUI-features?node-id=2268%3A120792 + + Neutrals Neutral `json:"neutrals"` + + // Base Colors: used for containers + B1 string `json:"b1"` + B2 string `json:"b2"` + B3 string `json:"b3"` + B4 string `json:"b4"` + B5 string `json:"b5"` + B6 string `json:"b6"` + + // Alternative colors A + AA2 string `json:"aa2"` + AA4 string `json:"aa4"` + AA5 string `json:"aa5"` + + // Alternative colors B + AB4 string `json:"ab4"` + AB5 string `json:"ab5"` +} + +var CoolNeutral = Neutral{ + N1: "#0A0F25", + N2: "#676C7E", + N3: "#9499AB", + N4: "#CFD2DD", + N5: "#F0F3F9", + N7: "#FFFFFF", +} + +var WarmNeutral = Neutral{ + N1: "#170206", + N2: "#535152", + N3: "#787777", + N4: "#CCCACA", + N5: "#DFDCDC", + N7: "#FFFFFF", +} diff --git a/d2themes/d2themescatalog/aubergine.go b/d2themes/d2themescatalog/aubergine.go new file mode 100644 index 000000000..089d5ccec --- /dev/null +++ b/d2themes/d2themescatalog/aubergine.go @@ -0,0 +1,25 @@ +package d2themescatalog + +import "oss.terrastruct.com/d2/d2themes" + +var Aubergine = d2themes.Theme{ + ID: 7, + Name: "Aubergine", + Colors: d2themes.ColorPalette{ + Neutrals: d2themes.CoolNeutral, + + B1: "#170034", + B2: "#7639C5", + B3: "#8F70D1", + B4: "#D0B9F5", + B5: "#E7DEFF", + B6: "#F4F0FF", + + AA2: "#0F66B7", + AA4: "#87BFF3", + AA5: "#BCDDFB", + + AB4: "#92E3E3", + AB5: "#D7F5F5", + }, +} diff --git a/d2themes/d2themescatalog/catalog.go b/d2themes/d2themescatalog/catalog.go new file mode 100644 index 000000000..285a3499e --- /dev/null +++ b/d2themes/d2themescatalog/catalog.go @@ -0,0 +1,41 @@ +package d2themescatalog + +import ( + "fmt" + "strings" + + "oss.terrastruct.com/d2/d2themes" +) + +var Catalog = []d2themes.Theme{ + NeutralDefault, + NeutralGrey, + FlagshipTerrastruct, + MixedBerryBlue, + CoolClassics, + GrapeSoda, + Aubergine, + ColorblindClear, + VanillaNitroCola, + OrangeCreamsicle, + ShirleyTemple, + EarthTones, +} + +func Find(id int64) d2themes.Theme { + for _, theme := range Catalog { + if theme.ID == id { + return theme + } + } + + return d2themes.Theme{} +} + +func CLIString() string { + var s strings.Builder + for _, t := range Catalog { + s.WriteString(fmt.Sprintf("- %s: %d\n", t.Name, t.ID)) + } + return s.String() +} diff --git a/d2themes/d2themescatalog/colorblind_clear.go b/d2themes/d2themescatalog/colorblind_clear.go new file mode 100644 index 000000000..398f8b9c6 --- /dev/null +++ b/d2themes/d2themescatalog/colorblind_clear.go @@ -0,0 +1,25 @@ +package d2themescatalog + +import "oss.terrastruct.com/d2/d2themes" + +var ColorblindClear = d2themes.Theme{ + ID: 8, + Name: "Colorblind clear", + Colors: d2themes.ColorPalette{ + Neutrals: d2themes.CoolNeutral, + + B1: "#010E31", + B2: "#173688", + B3: "#5679D4", + B4: "#84A1EC", + B5: "#C8D6F9", + B6: "#E5EDFF", + + AA2: "#048E63", + AA4: "#A6E2D0", + AA5: "#CAF2E6", + + AB4: "#FFDA90", + AB5: "#FFF0D1", + }, +} diff --git a/d2themes/d2themescatalog/cool_classics.go b/d2themes/d2themescatalog/cool_classics.go new file mode 100644 index 000000000..d8eb58a52 --- /dev/null +++ b/d2themes/d2themescatalog/cool_classics.go @@ -0,0 +1,25 @@ +package d2themescatalog + +import "oss.terrastruct.com/d2/d2themes" + +var CoolClassics = d2themes.Theme{ + ID: 4, + Name: "Cool classics", + Colors: d2themes.ColorPalette{ + Neutrals: d2themes.CoolNeutral, + + B1: "#000536", + B2: "#0F66B7", + B3: "#4393DD", + B4: "#87BFF3", + B5: "#BCDDFB", + B6: "#E5F3FF", + + AA2: "#076F6F", + AA4: "#77DEDE", + AA5: "#C3F8F8", + + AB4: "#C1A2F3", + AB5: "#DACEFB", + }, +} diff --git a/d2themes/d2themescatalog/default.go b/d2themes/d2themescatalog/default.go new file mode 100644 index 000000000..6fd3fb878 --- /dev/null +++ b/d2themes/d2themescatalog/default.go @@ -0,0 +1,25 @@ +package d2themescatalog + +import "oss.terrastruct.com/d2/d2themes" + +var NeutralDefault = d2themes.Theme{ + ID: 0, + Name: "Neutral default", + Colors: d2themes.ColorPalette{ + Neutrals: d2themes.CoolNeutral, + + B1: "#0D32B2", + B2: "#0D32B2", + B3: "#E3E9FD", + B4: "#E3E9FD", + B5: "#EDF0FD", + B6: "#F7F8FE", + + AA2: "#4A6FF3", + AA4: "#EDF0FD", + AA5: "#F7F8FE", + + AB4: "#EDF0FD", + AB5: "#F7F8FE", + }, +} diff --git a/d2themes/d2themescatalog/earth_tones.go b/d2themes/d2themescatalog/earth_tones.go new file mode 100644 index 000000000..fe39e4fa9 --- /dev/null +++ b/d2themes/d2themescatalog/earth_tones.go @@ -0,0 +1,25 @@ +package d2themescatalog + +import "oss.terrastruct.com/d2/d2themes" + +var EarthTones = d2themes.Theme{ + ID: 103, + Name: "Earth tones", + Colors: d2themes.ColorPalette{ + Neutrals: d2themes.WarmNeutral, + + B1: "#1E1303", + B2: "#55452F", + B3: "#9A876C", + B4: "#C9B9A1", + B5: "#E9DBCA", + B6: "#FAF1E6", + + AA2: "#D35F0A", + AA4: "#FABA8A", + AA5: "#FFE0C7", + + AB4: "#FFE767", + AB5: "#FFF2AA", + }, +} diff --git a/d2themes/d2themescatalog/flagship_terrastruct.go b/d2themes/d2themescatalog/flagship_terrastruct.go new file mode 100644 index 000000000..8fef873bc --- /dev/null +++ b/d2themes/d2themescatalog/flagship_terrastruct.go @@ -0,0 +1,25 @@ +package d2themescatalog + +import "oss.terrastruct.com/d2/d2themes" + +var FlagshipTerrastruct = d2themes.Theme{ + ID: 3, + Name: "Flagship Terrastruct", + Colors: d2themes.ColorPalette{ + Neutrals: d2themes.CoolNeutral, + + B1: "#000E3D", + B2: "#234CDA", + B3: "#6B8AFB", + B4: "#A6B8F8", + B5: "#D2DBFD", + B6: "#E7EAFF", + + AA2: "#5829DC", + AA4: "#B4AEF8", + AA5: "#E4DBFF", + + AB4: "#7FDBF8", + AB5: "#C3F0FF", + }, +} diff --git a/d2themes/d2themescatalog/grape_soda.go b/d2themes/d2themescatalog/grape_soda.go new file mode 100644 index 000000000..ef29b5fdf --- /dev/null +++ b/d2themes/d2themescatalog/grape_soda.go @@ -0,0 +1,25 @@ +package d2themescatalog + +import "oss.terrastruct.com/d2/d2themes" + +var GrapeSoda = d2themes.Theme{ + ID: 6, + Name: "Grape soda", + Colors: d2themes.ColorPalette{ + Neutrals: d2themes.CoolNeutral, + + B1: "#170034", + B2: "#7639C5", + B3: "#8F70D1", + B4: "#C1A2F3", + B5: "#DACEFB", + B6: "#F2EDFF", + + AA2: "#0F66B7", + AA4: "#87BFF3", + AA5: "#BCDDFB", + + AB4: "#EA99C6", + AB5: "#FFDAEF", + }, +} diff --git a/d2themes/d2themescatalog/mixed_berry_blue.go b/d2themes/d2themescatalog/mixed_berry_blue.go new file mode 100644 index 000000000..b5f8cc004 --- /dev/null +++ b/d2themes/d2themescatalog/mixed_berry_blue.go @@ -0,0 +1,25 @@ +package d2themescatalog + +import "oss.terrastruct.com/d2/d2themes" + +var MixedBerryBlue = d2themes.Theme{ + ID: 5, + Name: "Mixed berry blue", + Colors: d2themes.ColorPalette{ + Neutrals: d2themes.CoolNeutral, + + B1: "#000536", + B2: "#0F66B7", + B3: "#4393DD", + B4: "#87BFF3", + B5: "#BCDDFB", + B6: "#E5F3FF", + + AA2: "#7639C5", + AA4: "#C1A2F3", + AA5: "#DACEFB", + + AB4: "#EA99C6", + AB5: "#FFDEF1", + }, +} diff --git a/d2themes/d2themescatalog/neutral_grey.go b/d2themes/d2themescatalog/neutral_grey.go new file mode 100644 index 000000000..eda3e3021 --- /dev/null +++ b/d2themes/d2themescatalog/neutral_grey.go @@ -0,0 +1,25 @@ +package d2themescatalog + +import "oss.terrastruct.com/d2/d2themes" + +var NeutralGrey = d2themes.Theme{ + ID: 1, + Name: "Neutral Grey", + Colors: d2themes.ColorPalette{ + Neutrals: d2themes.CoolNeutral, + + B1: "#0A0F25", + B2: "#676C7E", + B3: "#9499AB", + B4: "#CFD2DD", + B5: "#DEE1EB", + B6: "#EEF1F8", + + AA2: "#676C7E", + AA4: "#CFD2DD", + AA5: "#DEE1EB", + + AB4: "#CFD2DD", + AB5: "#DEE1EB", + }, +} diff --git a/d2themes/d2themescatalog/orange_creamsicle.go b/d2themes/d2themescatalog/orange_creamsicle.go new file mode 100644 index 000000000..207ffa766 --- /dev/null +++ b/d2themes/d2themescatalog/orange_creamsicle.go @@ -0,0 +1,25 @@ +package d2themescatalog + +import "oss.terrastruct.com/d2/d2themes" + +var OrangeCreamsicle = d2themes.Theme{ + ID: 101, + Name: "Orange creamsicle", + Colors: d2themes.ColorPalette{ + Neutrals: d2themes.WarmNeutral, + + B1: "#311602", + B2: "#D35F0A", + B3: "#F18F47", + B4: "#FABA8A", + B5: "#FFE0C7", + B6: "#FFF6EF", + + AA2: "#13A477", + AA4: "#A6E2D0", + AA5: "#CAF2E6", + + AB4: "#FEEC8C", + AB5: "#FFF8CF", + }, +} diff --git a/d2themes/d2themescatalog/shirley_temple.go b/d2themes/d2themescatalog/shirley_temple.go new file mode 100644 index 000000000..28d31b6bd --- /dev/null +++ b/d2themes/d2themescatalog/shirley_temple.go @@ -0,0 +1,25 @@ +package d2themescatalog + +import "oss.terrastruct.com/d2/d2themes" + +var ShirleyTemple = d2themes.Theme{ + ID: 102, + Name: "Shirley temple", + Colors: d2themes.ColorPalette{ + Neutrals: d2themes.WarmNeutral, + + B1: "#31021D", + B2: "#9B1A48", + B3: "#D2517F", + B4: "#EA99B6", + B5: "#FFDAE7", + B6: "#FCEDF2", + + AA2: "#D35F0A", + AA4: "#FABA8A", + AA5: "#FFE0C7", + + AB4: "#FFE767", + AB5: "#FFF2AA", + }, +} diff --git a/d2themes/d2themescatalog/vanilla_nitro_cola.go b/d2themes/d2themescatalog/vanilla_nitro_cola.go new file mode 100644 index 000000000..246c0dc10 --- /dev/null +++ b/d2themes/d2themescatalog/vanilla_nitro_cola.go @@ -0,0 +1,25 @@ +package d2themescatalog + +import "oss.terrastruct.com/d2/d2themes" + +var VanillaNitroCola = d2themes.Theme{ + ID: 100, + Name: "Vanilla nitro cola", + Colors: d2themes.ColorPalette{ + Neutrals: d2themes.WarmNeutral, + + B1: "#1E1303", + B2: "#55452F", + B3: "#9A876C", + B4: "#C9B9A1", + B5: "#E9DBCA", + B6: "#FAF1E6", + + AA2: "#D35F0A", + AA4: "#FABA8A", + AA5: "#FFE0C7", + + AB4: "#84A1EC", + AB5: "#D5E0FD", + }, +} diff --git a/docs/CONTRIBUTING.md b/docs/CONTRIBUTING.md new file mode 100644 index 000000000..c52a45c14 --- /dev/null +++ b/docs/CONTRIBUTING.md @@ -0,0 +1,101 @@ +# Contributing + + + +- [CI](#ci) +- [Flow](#flow) +- [Logistics](#logistics) +- [Dev](#dev) + * [Content](#content) + * [Tests](#tests) + + [Running tests](#running-tests) + + [Chaos tests](#chaos-tests) + * [Documentation](#documentation) + * [Questions](#questions) + + + +## CI + +Most of D2's CI is open-sourced in its own +[repository](https://github.com/terrastruct/ci). You can find commands in the Github +workflows. E.g. run `./make.sh fmt` to run the formatter. Please make sure all CI is +passing for any PRs. + +## Flow + +The simplified D2 flow at a package level looks like: + +D2 flow + +## Logistics + +- D2 uses Issues as TODOs and discussions. No auto-closing on staleness. +- Branch off `master`. +- Prefix pull request titles with a short descriptor of the domain, e.g. `d2renderer: Add + x`. +- If there's an Issue related, include it by adding "[one-word] #[issue]", e.g. "Fixes + #123" somewhere in the description. +- Whenever possible and relevant, include a screenshot or screen-recording. + +## Dev + +### Content + +Please choose an Issue with a "TODO" label. If you'd like to propose new functionality or +change to current functionality, please create an Issue first with a proposal. When you +start work on an Issue, please leave a comment so others know that it's being worked on. + +### Tests + +All code changes must include tests. D2 mostly has functional tests, and uses +[diff](https://github.com/terrastruct/diff) as a framework that gives Git-style +comparisons of expected vs actual output for each stage. There are ample examples in each +package of this -- try changing some test and run it to see. + +With the exception of changes to the renderer, all code should include a package-specific +test. If it's a visual change, an e2e test should accompany. + +If you're testing labels and strings, it's encouraged to use 1-letter strings (`x`) in small +functional tests to minimally pinpoint issues. If you are testing something that exercises +variations in strings, or want to mimic more realistic diagram text, it's encouraged you +generate random strings and words from `fortune`. It gives a good range of the English +language. Sometimes it gives controversial sentences -- don't use those. + +Script to generate one line of random text: +``` +ipsum1() { + fortune | head -n1 | sed 's/^ *//;s/ *$//' | tr -d '\n' | pbcopy + echo "$(pbpaste -Prefer txt)" +} +``` + +#### Running tests + +Run: `./ci/test.sh` + +CI runs tests with `-race` to catch potential race conditions. It's much slower, but if +your machine can run it locally, you can do so with `./make.sh race`. + +#### Chaos tests + +D2 has [chaos tests](https://en.wikipedia.org/wiki/Chaos_engineering) which produce random +configurations of diagrams. It can be helpful to run a few iterations (N~=100) to spot +cover your manual tests. + +`D2_CHAOS_MAXI=100 D2_CHAOS_N=100 ./ci/test.sh ./d2chaos` + +### Documentation + +The code itself should be documented as appropriate with Go-style comments. No rules here, +`GetX()` doesn't need a `// GetX gets X`. + +If it's some new functionality, please submit a pull request to document it in the +language docs: +[https://github.com/terrastruct/d2-docs](https://github.com/terrastruct/d2-docs). + +### Questions + +If you have any questions or would like to get more involved, feel free to open an issue +to discuss publicly, or chat in [Discord](https://discord.gg/h9VFkAKTsT)! If you have a +private question, feel free to email us at d2@terrastruct.com. diff --git a/docs/assets/.gitignore b/docs/assets/.gitignore new file mode 100644 index 000000000..e461c585f --- /dev/null +++ b/docs/assets/.gitignore @@ -0,0 +1 @@ +!*.svg diff --git a/docs/assets/cli.gif b/docs/assets/cli.gif new file mode 100644 index 000000000..20e0e2f21 Binary files /dev/null and b/docs/assets/cli.gif differ diff --git a/docs/assets/flow.svg b/docs/assets/flow.svg new file mode 100644 index 000000000..01f73045c --- /dev/null +++ b/docs/assets/flow.svg @@ -0,0 +1,22 @@ + +inputFiled2parserd2astd2compilerd2graphd2layouts/d2dagrelayoutd2exporterd2target \ No newline at end of file diff --git a/docs/assets/logo.svg b/docs/assets/logo.svg new file mode 100644 index 000000000..c78f4988b --- /dev/null +++ b/docs/assets/logo.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/docs/assets/themes_coding.png b/docs/assets/themes_coding.png new file mode 100644 index 000000000..6a80155b1 Binary files /dev/null and b/docs/assets/themes_coding.png differ diff --git a/docs/assets/themes_coding_example.png b/docs/assets/themes_coding_example.png new file mode 100644 index 000000000..62d1ee6dd Binary files /dev/null and b/docs/assets/themes_coding_example.png differ diff --git a/docs/assets/themes_gradients.png b/docs/assets/themes_gradients.png new file mode 100644 index 000000000..f1ee3a5e7 Binary files /dev/null and b/docs/assets/themes_gradients.png differ diff --git a/docs/flow.d2 b/docs/flow.d2 new file mode 100644 index 000000000..41c60d079 --- /dev/null +++ b/docs/flow.d2 @@ -0,0 +1,8 @@ +inputFile \ + -> d2parser\ + -> d2ast\ + -> d2compiler\ + -> d2graph\ + -> d2layouts/d2dagrelayout\ + -> d2exporter\ + -> d2target diff --git a/e2etests/.gitignore b/e2etests/.gitignore new file mode 100644 index 000000000..6e0e9a3d0 --- /dev/null +++ b/e2etests/.gitignore @@ -0,0 +1,2 @@ +!*.exp.svg +out/ diff --git a/e2etests/NOTICE.txt b/e2etests/NOTICE.txt new file mode 100644 index 000000000..0dac9baef --- /dev/null +++ b/e2etests/NOTICE.txt @@ -0,0 +1,7 @@ +markdowntest.md derived and modified from +https://github.com/mxstbr/markdown-test-file. + +Attribution: + +MIT License +https://github.com/mxstbr/markdown-test-file/blob/master/LICENSE diff --git a/e2etests/README.md b/e2etests/README.md new file mode 100644 index 000000000..f6f1e8d3c --- /dev/null +++ b/e2etests/README.md @@ -0,0 +1,22 @@ +# e2etests + +`e2etests` test the end-to-end flow of turning D2 scripts into a rendered diagram + +Tests fall under 1 of 3 categories: + +1. **Stable**. Scripts which produce diagrams that never had issues this major release. +2. **Regressions**. Scripts which used to have issues but no longer do. Each one should be + linked to the PR which fixed it. +3. **Todos**. Scripts which have an issue. If the issue prevents compile, `skip: true` can + be set, otherwise the issue is visual. Each one should be linked to a Github Issue + which describes it. + +Upon a major release, Regressions are carried over to Stable. + +If a change results in test diffs, you can run this script to generate a visual HTML +report with the old vs new renders. + +``` +go run ./e2etests/report/main.go +open ./e2etests/out/e2e_report.html +``` diff --git a/e2etests/e2e_test.go b/e2etests/e2e_test.go new file mode 100644 index 000000000..90f93640d --- /dev/null +++ b/e2etests/e2e_test.go @@ -0,0 +1,126 @@ +package e2etests + +import ( + "context" + "fmt" + "io/ioutil" + "os" + "path/filepath" + "strings" + "testing" + + "cdr.dev/slog" + + "github.com/stretchr/testify/assert" + + "oss.terrastruct.com/diff" + + "oss.terrastruct.com/d2" + "oss.terrastruct.com/d2/d2layouts/d2dagrelayout" + "oss.terrastruct.com/d2/d2renderers/d2svg" + "oss.terrastruct.com/d2/d2renderers/textmeasure" + "oss.terrastruct.com/d2/d2target" + xdiff "oss.terrastruct.com/d2/lib/diff" + "oss.terrastruct.com/d2/lib/log" +) + +func TestE2E(t *testing.T) { + t.Parallel() + + t.Run("stable", testStable) + t.Run("regression", testRegression) + t.Run("todo", testTodo) +} + +type testCase struct { + name string + script string + assertions func(t *testing.T, diagram *d2target.Diagram) + skip bool +} + +func runa(t *testing.T, tcs []testCase) { + for _, tc := range tcs { + tc := tc + t.Run(tc.name, func(t *testing.T) { + if tc.skip { + t.Skip() + } + t.Parallel() + + run(t, tc) + }) + } +} + +func run(t *testing.T, tc testCase) { + ctx := context.Background() + ctx = log.WithTB(ctx, t, nil) + ctx = log.Leveled(ctx, slog.LevelDebug) + + ruler, err := textmeasure.NewRuler() + if !assert.Nil(t, err) { + return + } + + diagram, err := d2.Compile(ctx, tc.script, &d2.CompileOptions{ + UTF16: true, + Ruler: ruler, + ThemeID: 0, + Layout: d2dagrelayout.Layout, + }) + if !assert.Nil(t, err) { + return + } + + if tc.assertions != nil { + t.Run("assertions", func(t *testing.T) { + tc.assertions(t, diagram) + }) + } + + dataPath := filepath.Join("testdata", strings.TrimPrefix(t.Name(), "TestE2E/")) + pathGotSVG := filepath.Join(dataPath, "sketch.got.svg") + pathExpSVG := filepath.Join(dataPath, "sketch.exp.svg") + svgBytes, err := d2svg.Render(diagram) + if err != nil { + t.Fatal(err) + } + + err = diff.Testdata(filepath.Join(dataPath, "board"), diagram) + if err != nil { + ioutil.WriteFile(pathGotSVG, svgBytes, 0600) + t.Fatal(err) + } + if os.Getenv("SKIP_SVG_CHECK") == "" { + err = xdiff.TestdataGeneric(filepath.Join(dataPath, "sketch"), ".svg", svgBytes) + if err != nil { + ioutil.WriteFile(pathGotSVG, svgBytes, 0600) + t.Fatal(err) + } + } + err = ioutil.WriteFile(pathExpSVG, svgBytes, 0600) + if err != nil { + t.Fatal(err) + } + os.Remove(filepath.Join(dataPath, "sketch.got.svg")) +} + +func getShape(t *testing.T, diagram *d2target.Diagram, id string) d2target.Shape { + for _, shape := range diagram.Shapes { + if shape.ID == id { + return shape + } + } + t.Fatalf(`Shape "%s" not found`, id) + return d2target.Shape{} +} + +func mdTestScript(md string) string { + return fmt.Sprintf(` +md: |md +%s +| +a -> md -> b +`, md) +} diff --git a/e2etests/markdowntest.md b/e2etests/markdowntest.md new file mode 100644 index 000000000..bee4f0901 --- /dev/null +++ b/e2etests/markdowntest.md @@ -0,0 +1,278 @@ +# Markdown: Syntax + +- [Overview](#overview) + - [Philosophy](#philosophy) + - [Inline HTML](#html) + - [Automatic Escaping for Special Characters](#autoescape) +- [Block Elements](#block) + - [Paragraphs and Line Breaks](#p) + - [Headers](#header) + - [Blockquotes](#blockquote) + - [Lists](#list) + - [Code Blocks](#precode) + - [Horizontal Rules](#hr) +- [Span Elements](#span) + - [Links](#link) + - [Emphasis](#em) + - [Code](#code) + - [Images](#img) +- [Miscellaneous](#misc) + - [Backslash Escapes](#backslash) + - [Automatic Links](#autolink) + +**Note:** This document is itself written using Markdown; you +can [see the source for it by adding '.text' to the URL](/projects/markdown/syntax.text). + +--- + +## Overview + +### Philosophy + +Markdown is intended to be as easy-to-read and easy-to-write as is feasible. + +Readability, however, is emphasized above all else. A Markdown-formatted +document should be publishable as-is, as plain text, without looking +like it's been marked up with tags or formatting instructions. While +Markdown's syntax has been influenced by several existing text-to-HTML +filters -- including [Setext](http://docutils.sourceforge.net/mirror/setext.html), [atx](http://www.aaronsw.com/2002/atx/), [Textile](http://textism.com/tools/textile/), [reStructuredText](http://docutils.sourceforge.net/rst.html), +[Grutatext](http://www.triptico.com/software/grutatxt.html), and [EtText](http://ettext.taint.org/doc/) -- the single biggest source of +inspiration for Markdown's syntax is the format of plain text email. + +## Block Elements + +### Paragraphs and Line Breaks + +A paragraph is simply one or more consecutive lines of text, separated +by one or more blank lines. (A blank line is any line that looks like a +blank line -- a line containing nothing but spaces or tabs is considered +blank.) Normal paragraphs should not be indented with spaces or tabs. + +The implication of the "one or more consecutive lines of text" rule is +that Markdown supports "hard-wrapped" text paragraphs. This differs +significantly from most other text-to-HTML formatters (including Movable +Type's "Convert Line Breaks" option) which translate every line break +end a line with two or more spaces, then type return. + +### Headers + +Markdown supports two styles of headers, [Setext] [1] and [atx] [2]. + +Optionally, you may "close" atx-style headers. This is purely +cosmetic -- you can use this if you think it looks better. The +closing hashes don't even need to match the number of hashes +used to open the header. (The number of opening hashes +determines the header level.) + +### Blockquotes + +familiar with quoting passages of text in an email message, then you +know how to create a blockquote in Markdown. It looks best if you hard + +> This is a blockquote with two paragraphs. Lorem ipsum dolor sit amet, +> consectetuer adipiscing elit. Aliquam hendrerit mi posuere lectus. +> Vestibulum enim wisi, viverra nec, fringilla in, laoreet vitae, risus. +> +> Donec sit amet nisl. Aliquam semper ipsum sit amet velit. Suspendisse +> id sem consectetuer libero luctus adipiscing. + +line of a hard-wrapped paragraph: + +> This is a blockquote with two paragraphs. Lorem ipsum dolor sit amet, +> consectetuer adipiscing elit. Aliquam hendrerit mi posuere lectus. +> Vestibulum enim wisi, viverra nec, fringilla in, laoreet vitae, risus. + +> Donec sit amet nisl. Aliquam semper ipsum sit amet velit. Suspendisse +> id sem consectetuer libero luctus adipiscing. + +Blockquotes can be nested (i.e. a blockquote-in-a-blockquote) by + +> This is the first level of quoting. +> +> > This is nested blockquote. +> +> Back to the first level. + +Blockquotes can contain other Markdown elements, including headers, lists, +and code blocks: + +> ## This is a header. +> +> 1. This is the first list item. +> 2. This is the second list item. +> +> Here's some example code: +> +> return shell_exec("echo $input $markdown_script"); + +Any decent text editor should make email-style quoting easy. For +example, with BBEdit, you can make a selection and choose Increase +Quote Level from the Text menu. + +### Lists + +Markdown supports ordered (numbered) and unordered (bulleted) lists. + +Unordered lists use asterisks, pluses, and hyphens -- interchangably +-- as list markers: + +- Red +- Green +- Blue + +is equivalent to: + +- Red +- Green +- Blue + +and: + +- Red +- Green +- Blue + +Ordered lists use numbers followed by periods: + +1. Bird +2. McHale +3. Parish + +It's important to note that the actual numbers you use to mark the +list have no effect on the HTML output Markdown produces. The HTML +Markdown produces from the above list is: + +If you instead wrote the list in Markdown like this: + +1. Bird +1. McHale +1. Parish + +or even: + +3. Bird +1. McHale +1. Parish + +you'd get the exact same HTML output. The point is, if you want to, +you can use ordinal numbers in your ordered Markdown lists, so that +the numbers in your source match the numbers in your published HTML. +But if you want to be lazy, you don't have to. + +To make lists look nice, you can wrap items with hanging indents: + +- Lorem ipsum dolor sit amet, consectetuer adipiscing elit. + Aliquam hendrerit mi posuere lectus. Vestibulum enim wisi, + viverra nec, fringilla in, laoreet vitae, risus. +- Donec sit amet nisl. Aliquam semper ipsum sit amet velit. + Suspendisse id sem consectetuer libero luctus adipiscing. + +But if you want to be lazy, you don't have to: + +- Lorem ipsum dolor sit amet, consectetuer adipiscing elit. + Aliquam hendrerit mi posuere lectus. Vestibulum enim wisi, + viverra nec, fringilla in, laoreet vitae, risus. +- Donec sit amet nisl. Aliquam semper ipsum sit amet velit. + Suspendisse id sem consectetuer libero luctus adipiscing. + +List items may consist of multiple paragraphs. Each subsequent +paragraph in a list item must be indented by either 4 spaces +or one tab: + +1. This is a list item with two paragraphs. Lorem ipsum dolor + sit amet, consectetuer adipiscing elit. Aliquam hendrerit + mi posuere lectus. + + Vestibulum enim wisi, viverra nec, fringilla in, laoreet + vitae, risus. Donec sit amet nisl. Aliquam semper ipsum + sit amet velit. + +2. Suspendisse id sem consectetuer libero luctus adipiscing. + +It looks nice if you indent every line of the subsequent +paragraphs, but here again, Markdown will allow you to be +lazy: + +- This is a list item with two paragraphs. + + This is the second paragraph in the list item. You're + + only required to indent the first line. Lorem ipsum dolor + sit amet, consectetuer adipiscing elit. + +- Another item in the same list. + +delimiters need to be indented: + +- A list item with a blockquote: + + > This is a blockquote + > inside a list item. + +To put a code block within a list item, the code block needs +to be indented _twice_ -- 8 spaces or two tabs: + +- A list item with a code block: + +### Code Blocks + +Pre-formatted code blocks are used for writing about programming or +markup source code. Rather than forming normal paragraphs, the lines +of a code block are interpreted literally. Markdown wraps a code block + +To produce a code block in Markdown, simply indent every line of the +block by at least 4 spaces or 1 tab. + +This is a normal paragraph: + + This is a code block. + +Here is an example of AppleScript: + + tell application "Foo" + beep + end tell + +A code block continues until it reaches a line that is not indented +(or the end of the article). + +are automatically converted into HTML entities. This makes it very +easy to include example HTML source code using Markdown -- just paste +it and indent it, and Markdown will handle the hassle of encoding the +ampersands and angle brackets. For example, this: + +Regular Markdown syntax is not processed within code blocks. E.g., +asterisks are just literal asterisks within a code block. This means +it's also easy to use Markdown to write about Markdown's own syntax. + +## Span Elements + +### Links + +Markdown supports two style of links: _inline_ and _reference_. + +In both styles, the link text is delimited by [square brackets]. + +To create an inline link, use a set of regular parentheses immediately +after the link text's closing square bracket. Inside the parentheses, +put the URL where you want the link to point, along with an _optional_ +title for the link, surrounded in quotes. For example: + +This is [an example](http://example.com/) inline link. + +[This link](http://example.net/) has no title attribute. + +### Emphasis + +_single asterisks_ + +_single underscores_ + +**double asterisks** + +**double underscores** + +### Code + +Unlike a pre-formatted code block, a code span indicates code within a +normal paragraph. For example: diff --git a/e2etests/regression_test.go b/e2etests/regression_test.go new file mode 100644 index 000000000..d2ec37c80 --- /dev/null +++ b/e2etests/regression_test.go @@ -0,0 +1,11 @@ +package e2etests + +import ( + "testing" +) + +func testRegression(t *testing.T) { + tcs := []testCase{} + + runa(t, tcs) +} diff --git a/e2etests/report/main.go b/e2etests/report/main.go new file mode 100644 index 000000000..ee703125d --- /dev/null +++ b/e2etests/report/main.go @@ -0,0 +1,152 @@ +package main + +import ( + "context" + _ "embed" + "flag" + "fmt" + "io/ioutil" + "os" + "os/exec" + "path/filepath" + "regexp" + "strings" + "text/template" + "time" + + "oss.terrastruct.com/d2/lib/log" +) + +//go:embed template.html +var TEMPLATE_HTML string + +type TemplateData struct { + Tests []TestItem +} + +type TestItem struct { + Name string + ExpSVG *string + GotSVG string +} + +func main() { + deltaFlag := false + vFlag := false + testCaseFlag := "" + testSetFlag := "" + flag.BoolVar(&deltaFlag, "delta", false, "Generate the report only for cases that changed.") + flag.StringVar(&testSetFlag, "test-set", "", "Only run set of tests matching this string. e.g. regressions") + flag.StringVar(&testCaseFlag, "test-case", "", "Only run tests matching this string. e.g. all_shapes") + flag.BoolVar(&vFlag, "v", false, "verbose") + flag.Parse() + + vString := "" + if vFlag { + vString = "-v" + } + testMatchString := fmt.Sprintf("TestE2E/%s/%s", testSetFlag, testCaseFlag) + + testDir := os.Getenv("TEST_DIR") + if testDir == "" { + testDir = "./e2etests" + } + + ctx := log.Stderr(context.Background()) + ctx, cancel := context.WithTimeout(ctx, 2*time.Minute) + defer cancel() + cmd := exec.CommandContext(ctx, "go", "test", testDir, "-run", testMatchString, vString) + cmd.Env = os.Environ() + cmd.Env = append(cmd.Env, "FORCE_COLOR=1") + cmd.Env = append(cmd.Env, "DEBUG=1") + cmd.Env = append(cmd.Env, "TEST_MODE=on") + cmd.Stdout = os.Stdout + cmd.Stderr = os.Stderr + log.Debug(ctx, cmd.String()) + _ = cmd.Run() + + var tests []TestItem + err := filepath.Walk(filepath.Join(testDir, "testdata"), func(path string, info os.FileInfo, err error) error { + if err != nil { + return err + } + if info.IsDir() { + files, err := ioutil.ReadDir(path) + if err != nil { + panic(err) + } + + var testFile os.FileInfo + for _, f := range files { + if strings.HasSuffix(f.Name(), "exp.svg") { + testFile = f + break + } + } + + if testFile != nil { + matchTestCase := true + if testCaseFlag != "" { + matchTestCase, _ = regexp.MatchString(testCaseFlag, filepath.Base(path)) + } + matchTestSet := true + if testSetFlag != "" { + matchTestSet, _ = regexp.MatchString(testSetFlag, filepath.Base(filepath.Dir(path))) + } + + if matchTestSet && matchTestCase { + fullPath := filepath.Join(path, testFile.Name()) + hasGot := false + gotPath := strings.Replace(fullPath, "exp.svg", "got.svg", 1) + if _, err := os.Stat(gotPath); err == nil { + hasGot = true + } + if deltaFlag { + if hasGot { + tests = append(tests, TestItem{ + Name: info.Name(), + ExpSVG: &fullPath, + GotSVG: gotPath, + }) + } + } else { + test := TestItem{ + Name: info.Name(), + ExpSVG: nil, + GotSVG: fullPath, + } + if hasGot { + test.GotSVG = gotPath + } + tests = append(tests, test) + } + } + } + } + return nil + }, + ) + if err != nil { + panic(err) + } + + if len(tests) > 0 { + tmpl, err := template.New("report").Parse(TEMPLATE_HTML) + if err != nil { + panic(err) + } + + tmplData := TemplateData{ + Tests: tests, + } + + path := "e2e_report.html" + f, err := os.Create(path) + if err != nil { + panic(err) + } + if err := tmpl.Execute(f, tmplData); err != nil { + panic(err) + } + } +} diff --git a/e2etests/report/template.html b/e2etests/report/template.html new file mode 100644 index 000000000..537a035ea --- /dev/null +++ b/e2etests/report/template.html @@ -0,0 +1,37 @@ + + E2E report + +
+ {{range .Tests}} +
+

{{.Name}}

+ {{ if .ExpSVG }} +

Expected

+ +

Got

+ {{ end }} + +
+ {{end}} +
+ + + diff --git a/e2etests/stable_test.go b/e2etests/stable_test.go new file mode 100644 index 000000000..a2e90709b --- /dev/null +++ b/e2etests/stable_test.go @@ -0,0 +1,644 @@ +package e2etests + +import ( + _ "embed" + "testing" +) + +// based on https://github.com/mxstbr/markdown-test-file +//go:embed markdowntest.md +var testMarkdown string + +func testStable(t *testing.T) { + tcs := []testCase{ + { + name: "connected_container", + script: `a.b -> c.d -> f.h.g +`, + }, + { + name: "circular_dependency", + script: `a -> b -> c -> b -> a +`, + }, + { + name: "all_shapes", + script: ` +rectangle: {shape: "rectangle"} +square: {shape: "square"} +page: {shape: "page"} +parallelogram: {shape: "parallelogram"} +document: {shape: "document"} +cylinder: {shape: "cylinder"} +queue: {shape: "queue"} +package: {shape: "package"} +step: {shape: "step"} +callout: {shape: "callout"} +stored_data: {shape: "stored_data"} +person: {shape: "person"} +diamond: {shape: "diamond"} +oval: {shape: "oval"} +circle: {shape: "circle"} +hexagon: {shape: "hexagon"} +cloud: {shape: "cloud"} + +rectangle -> square -> page +parallelogram -> document -> cylinder +queue -> package -> step +callout -> stored_data -> person +diamond -> oval -> circle +hexagon -> cloud +`, + }, + { + name: "container_edges", + script: `a -> g.b -> d.h.c +d -> g.e -> f -> g -> d.h +`, + }, + { + name: "one_three_one_container", + script: `top.start -> a +top.start -> b +top.start -> c +a -> bottom.end +b -> bottom.end +c -> bottom.end +`, + }, + { + name: "straight_hierarchy_container", + script: `a +c +b + +l1: { + b + a + c +} + +b -> l1.b +a -> l1.a +c -> l1.c + +l2c1: { + a +} +l1.a -> l2c1.a + +l2c3: { + c +} +l1.c -> l2c3.c + +l2c2: { + b +} +l1.b -> l2c2.b + +l3c1: { + a + b +} +l2c1.a -> l3c1.a +l2c2.b -> l3c1.b + +l3c2: { + c +} +l2c3.c -> l3c2.c + +l4: { + c1: { + a + } + c2: { + b + } + c3: { + c + } +} +l3c1.a -> l4.c1.a +l3c1.b -> l4.c2.b +l3c2.c -> l4.c3.c`, + }, + { + name: "different_subgraphs", + script: `a -> tree +a -> and +a -> nodes +and -> some +tree -> more +tree -> many + +then -> here +here -> you +have -> hierarchy +then -> hierarchy + +finally -> another +another -> of +nesting -> trees +finally -> trees +finally: { + a -> tree + inside -> a + tree -> hierarchy + a -> root +}`, + }, + { + name: "binary_tree", + script: `a -> b +a -> c +b -> d +b -> e +c -> f +c -> g +d -> h +d -> i +e -> j +e -> k +f -> l +f -> m +g -> n +g -> o`, + }, + { + name: "dense", + script: ` +a-> b +c -> b +d-> e +f-> e +b-> f +b-> g +g-> f +b-> h +b-> i +b-> d +j-> c +j-> a +b-> j +i-> k +d-> l +l-> e +m-> l +m-> n +n-> i +d-> n +f-> n +b-> o +p-> l +e-> q`, + }, + { + name: "multiple_trees", + script: ` +a-> b +a-> c +a-> d +a-> e +a-> f +g-> a +a-> h +i-> b +j-> b +k-> g +l-> g +c-> m +c-> n +d-> o +d-> p +e-> q +e-> r +p-> s +f-> t +f-> u +v-> h +w-> h +`, + }, + { + name: "one_container_loop", + script: ` +a.b-> c +d-> c +e-> c +f-> d +a-> e +g-> f +a.h-> g +`, + }, + { + name: "large_arch", + script: ` +a +b +c +d +e +f +g +h +i +i.j +i.j.k +i.j.l +i.m +i.n +i.o +i.o.p +q +r +r.s +r.s.t +r.s.u.v +r.s.w +r.s.x +r.s.y +r.z +r.aa +r.bb +r.bb.cc +r.bb.dd +r.ee +r.ff +r.gg + +i.j.k-> i.m +i.j.l-> i.o.p +q-> i.m +i.m-> q +i.n-> q +i.m-> c +i.m-> d +i.m-> g +i.m-> f +d-> e +r.s.x-> r.s.t +r.s.x-> r.s.w +r.gg-> r.s.t +r.s.u.v-> r.z +r.aa-> r.s.t +r.s.w-> i.m +r.s.t-> g +r.s.t-> h +r.ee -> r.ff +`, + }, + { + name: "n22_e32", + script: ` +a-> b +c-> a +d-> a +d-> b +d-> e +e-> f +f-> b +c-> f +g-> c +g-> h +h-> i +i-> j +j-> k +k-> e +j-> f +l-> m +n-> l +n-> l +n-> m +n-> o +o-> p +p-> m +n-> p +q-> n +q-> r +r-> s +s-> t +t-> u +u-> o +t-> p +c-> t +s-> a +u-> a +`, + }, + { + name: "chaos1", + script: ` +aaa: { + bbb.shape: callout +} +aaa.ccc -- aaa +(aaa.ccc -- aaa)[0]: '111' +ddd.shape: cylinder +eee.shape: document +eee <- aaa.ccc +(eee <- aaa.ccc)[0]: '222' +`, + }, + { + name: "chaos2", + script: ` +aa: { + bb: { + cc: { + dd: { + shape: rectangle + ee: {shape: text} + ff + } + gg: {shape: text} + hh + dd.ee -- gg: '11' + gg -- hh: '22' + } + ii: { + shape: package + jj: {shape: diamond} + } + ii -> cc.dd + kk: {shape: circle} + } + ll + mm: {shape: cylinder} + ll <-> bb: '33' + mm -> bb.cc: '44' + mm->ll + mm <-> bb: '55' + ll <-> bb.cc.gg + mm <- bb.ii: '66' + bb.cc <- ll: '77' + nn: {shape: text} + oo + bb.ii <-> ll: '88' +} + `, + }, + { + name: "us_map", + script: ` +AL -- FL -- GA -- MS -- TN +AK +AZ -- CA -- NV -- NM -- UT +AR -- LA -- MS -- MO -- OK -- TN -- TX +CA -- NV -- OR +CO -- KS -- NE -- NM -- OK -- UT -- WY +CT -- MA -- NY -- RI +DE -- MD -- NJ -- PA +FL -- GA +GA -- NC -- SC -- TN +HI +ID -- MT -- NV -- OR -- UT -- WA -- WY +IL -- IN -- IA -- MI -- KY -- MO -- WI +IN -- KY -- MI -- OH +IA -- MN -- MO -- NE -- SD -- WI +KS -- MO -- NE -- OK +KY -- MO -- OH -- TN -- VA -- WV +LA -- MS -- TX +ME -- NH +MD -- PA -- VA -- WV +MA -- NH -- NY -- RI -- VT +MI -- MN -- OH -- WI +MN -- ND -- SD -- WI +MS -- TN +MO -- NE -- OK -- TN +MT -- ND -- SD -- WY +NE -- SD -- WY +NV -- OR -- UT +NH -- VT +NJ -- NY -- PA +NM -- OK -- TX +NY -- PA -- RI -- VT +NC -- SC -- TN -- VA +ND -- SD +OH -- PA -- WV +OK -- TX +OR -- WA +PA -- WV +SD -- WY +TN -- VA +UT -- WY +VA -- WV +`, + }, + { + name: "investigate", + script: ` +aa.shape: step +bb.shape: step +cc.shape: step +aa -- bb -- cc + +aa -> dd.ee: 1 +bb -> ff.gg: 2 +cc -> dd.hh: 3 + +dd.ee.shape: diamond +dd.ee -> ii + +ii -- jj -> kk + +ll.mm.shape: circle +ff.mm.shape: circle +kk -> ff.mm: 4 +ff.mm -> ll.mm: 5 +ll.mm -> nn.oo: 6 + +ff.gg.shape: diamond +ff.gg -> ff.pp -> ll.qq -> ll.rr + +dd.hh.shape: diamond +dd.hh -> ss.tt -> uu.vv + +kk -> ww +uu.vv -> ww +ww -> rm + +ww: { + shape: queue + icon: https://icons.terrastruct.com/essentials/time.svg +} + +rm -> nn.xx +ll.rr -> yy.zz + +rm -> yy.zz +yy.zz.shape: queue +yy.zz.icon: https://icons.terrastruct.com/essentials/time.svg + +yy.zz -> yy.ab -> nn.ac -> ad + +ad.style.fill: red +ad.shape: parallelogram + +nn.shape: cylinder + +ww -> ff.gg +`, + }, + { + name: "multiline_text", + script: `hey: this\ngoes\nmultiple lines`, + }, + { + name: "markdown", + script: `hey: |md +# Every frustum longs to be a cone + +- A continuing flow of paper is sufficient to continue the flow of paper +- Please remain calm, it's no use both of us being hysterical at the same time +- Visits always give pleasure: if not on arrival, then on the departure + +*Festivity Level 1*: Your guests are chatting amiably with each other. +| + +x -> hey -> y +`, + }, + { + name: "child_parent_edges", + script: `a.b -> a +a.b -> a.b.c +a.b.c.d -> a.b`, + }, + { + name: "lone_h1", + script: mdTestScript(` +# Markdown: Syntax +`), + }, + // newlines should be ignored here in md text measurement + { + name: "p", + script: mdTestScript(` +A paragraph is simply one or more consecutive lines of text, separated +by one or more blank lines. (A blank line is any line that looks like a +blank line -- a line containing nothing but spaces or tabs is considered +blank.) Normal paragraphs should not be indented with spaces or tabs. +`), + }, + { + name: "li1", + script: mdTestScript(` +- [Overview](#overview) + - [Philosophy](#philosophy) + - [Inline HTML](#html) + - [Automatic Escaping for Special Characters](#autoescape) +`), + }, + { + name: "li2", + script: mdTestScript(` +- [Overview](#overview) ok _this is all measured_ + - [Philosophy](#philosophy) + - [Inline HTML](#html) +`), + }, + { + name: "li3", + script: mdTestScript(` +- [Overview](#overview) + - [Philosophy](#philosophy) + - [Inline HTML](#html) + - [Automatic Escaping for Special Characters](#autoescape) +- [Block Elements](#block) + - [Paragraphs and Line Breaks](#p) + - [Headers](#header) + - [Blockquotes](#blockquote) + - [Lists](#list) + - [Code Blocks](#precode) + - [Horizontal Rules](#hr) +- [Span Elements](#span) + - [Links](#link) + - [Emphasis](#em) + - [Code](#code) + - [Images](#img) +- [Miscellaneous](#misc) + - [Backslash Escapes](#backslash) + - [Automatic Links](#autolink) +`), + }, + { + name: "li4", + script: mdTestScript(` +List items may consist of multiple paragraphs. Each subsequent +paragraph in a list item must be indented by either 4 spaces +or one tab: + +1. This is a list item with two paragraphs. Lorem ipsum dolor + sit amet, consectetuer adipiscing elit. Aliquam hendrerit + mi posuere lectus. + + Vestibulum enim wisi, viverra nec, fringilla in, laoreet + vitae, risus. Donec sit amet nisl. Aliquam semper ipsum + sit amet velit. + +2. Suspendisse id sem consectetuer libero luctus adipiscing. + +It looks nice if you indent every line of the subsequent +paragraphs, but here again, Markdown will allow you to be +lazy: + +- This is a list item with two paragraphs. + + This is the second paragraph in the list item. You're + + only required to indent the first line. Lorem ipsum dolor + sit amet, consectetuer adipiscing elit. + +- Another item in the same list. +`), + }, + { + name: "hr", + script: mdTestScript(` +**Note:** This document is itself written using Markdown; you +can [see the source for it by adding '.text' to the URL](/projects/markdown/syntax.text). + +--- + +## Overview +`), + }, + { + name: "pre", + script: mdTestScript(` +Here is an example of AppleScript: + + tell application "Foo" + beep + end tell + +A code block continues until it reaches a line that is not indented +(or the end of the article). +`), + }, + { + name: "giant_markdown_test", + script: mdTestScript(testMarkdown), + }, + { + name: "code_snippet", + script: `hey: |go +// RegisterHash registers a function that returns a new instance of the given +// hash function. This is intended to be called from the init function in +// packages that implement hash functions. +func RegisterHash(h Hash, f func() hash.Hash) { + if h >= maxHash { + panic("crypto: RegisterHash of unknown hash function") + } + hashes[h] = f +} +| +x -> hey -> y`, + }, + } + + runa(t, tcs) +} diff --git a/e2etests/testdata/stable/all_shapes/board.exp.json b/e2etests/testdata/stable/all_shapes/board.exp.json new file mode 100644 index 000000000..6f4eccd75 --- /dev/null +++ b/e2etests/testdata/stable/all_shapes/board.exp.json @@ -0,0 +1,1170 @@ +{ + "name": "", + "shapes": [ + { + "id": "rectangle", + "type": "rectangle", + "pos": { + "x": 0, + "y": 0 + }, + "width": 171, + "height": 126, + "level": 1, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#F7F8FE", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "rectangle", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 71, + "labelHeight": 26, + "labelPosition": "INSIDE_MIDDLE_CENTER" + }, + { + "id": "square", + "type": "rectangle", + "pos": { + "x": 9, + "y": 226 + }, + "width": 154, + "height": 154, + "level": 1, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#F7F8FE", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "square", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 54, + "labelHeight": 26, + "labelPosition": "INSIDE_MIDDLE_CENTER" + }, + { + "id": "page", + "type": "page", + "pos": { + "x": 16, + "y": 489 + }, + "width": 139, + "height": 126, + "level": 1, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#EDF0FD", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "page", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 39, + "labelHeight": 26, + "labelPosition": "INSIDE_MIDDLE_CENTER" + }, + { + "id": "parallelogram", + "type": "parallelogram", + "pos": { + "x": 231, + "y": 0 + }, + "width": 204, + "height": 126, + "level": 1, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#F0F3F9", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "parallelogram", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 104, + "labelHeight": 26, + "labelPosition": "INSIDE_MIDDLE_CENTER" + }, + { + "id": "document", + "type": "document", + "pos": { + "x": 245, + "y": 240 + }, + "width": 177, + "height": 126, + "level": 1, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#EDF0FD", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "document", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 77, + "labelHeight": 26, + "labelPosition": "INSIDE_MIDDLE_CENTER" + }, + { + "id": "cylinder", + "type": "cylinder", + "pos": { + "x": 251, + "y": 489 + }, + "width": 164, + "height": 126, + "level": 1, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#EDF0FD", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "cylinder", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 64, + "labelHeight": 26, + "labelPosition": "INSIDE_MIDDLE_CENTER" + }, + { + "id": "queue", + "type": "queue", + "pos": { + "x": 495, + "y": 0 + }, + "width": 149, + "height": 126, + "level": 1, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#F0F3F9", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "queue", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 49, + "labelHeight": 26, + "labelPosition": "INSIDE_MIDDLE_CENTER" + }, + { + "id": "package", + "type": "package", + "pos": { + "x": 488, + "y": 240 + }, + "width": 163, + "height": 126, + "level": 1, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#EDF0FD", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "package", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 63, + "labelHeight": 26, + "labelPosition": "INSIDE_MIDDLE_CENTER" + }, + { + "id": "step", + "type": "step", + "pos": { + "x": 502, + "y": 489 + }, + "width": 136, + "height": 126, + "level": 1, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#EDF0FD", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "step", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 36, + "labelHeight": 26, + "labelPosition": "INSIDE_MIDDLE_CENTER" + }, + { + "id": "callout", + "type": "callout", + "pos": { + "x": 729, + "y": 0 + }, + "width": 155, + "height": 126, + "level": 1, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#FFFFFF", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "callout", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 55, + "labelHeight": 26, + "labelPosition": "INSIDE_MIDDLE_CENTER" + }, + { + "id": "stored_data", + "type": "stored_data", + "pos": { + "x": 711, + "y": 240 + }, + "width": 191, + "height": 126, + "level": 1, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#EDF0FD", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "stored_data", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 91, + "labelHeight": 26, + "labelPosition": "INSIDE_MIDDLE_CENTER" + }, + { + "id": "person", + "type": "person", + "pos": { + "x": 730, + "y": 489 + }, + "width": 153, + "height": 126, + "level": 1, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#E3E9FD", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "person", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 53, + "labelHeight": 26, + "labelPosition": "INSIDE_MIDDLE_CENTER" + }, + { + "id": "diamond", + "type": "diamond", + "pos": { + "x": 946, + "y": 0 + }, + "width": 168, + "height": 126, + "level": 1, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#CFD2DD", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "diamond", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 68, + "labelHeight": 26, + "labelPosition": "INSIDE_MIDDLE_CENTER" + }, + { + "id": "oval", + "type": "oval", + "pos": { + "x": 962, + "y": 240 + }, + "width": 136, + "height": 126, + "level": 1, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#F7F8FE", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "oval", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 36, + "labelHeight": 26, + "labelPosition": "INSIDE_MIDDLE_CENTER" + }, + { + "id": "circle", + "type": "oval", + "pos": { + "x": 958, + "y": 480 + }, + "width": 144, + "height": 144, + "level": 1, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#F7F8FE", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "circle", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 44, + "labelHeight": 26, + "labelPosition": "INSIDE_MIDDLE_CENTER" + }, + { + "id": "hexagon", + "type": "hexagon", + "pos": { + "x": 1174, + "y": 0 + }, + "width": 165, + "height": 126, + "level": 1, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#F0F3F9", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "hexagon", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 65, + "labelHeight": 26, + "labelPosition": "INSIDE_MIDDLE_CENTER" + }, + { + "id": "cloud", + "type": "cloud", + "pos": { + "x": 1184, + "y": 240 + }, + "width": 145, + "height": 126, + "level": 1, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#FFFFFF", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "cloud", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 45, + "labelHeight": 26, + "labelPosition": "INSIDE_MIDDLE_CENTER" + } + ], + "connections": [ + { + "id": "(rectangle -> square)[0]", + "src": "rectangle", + "srcArrow": "none", + "srcLabel": "", + "dst": "square", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 85.5, + "y": 126 + }, + { + "x": 85.5, + "y": 166 + }, + { + "x": 85.5, + "y": 186 + }, + { + "x": 85.5, + "y": 226 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "(square -> page)[0]", + "src": "square", + "srcArrow": "none", + "srcLabel": "", + "dst": "page", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 85.5, + "y": 380 + }, + { + "x": 85.5, + "y": 420 + }, + { + "x": 85.4, + "y": 441.8 + }, + { + "x": 85, + "y": 489 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "(parallelogram -> document)[0]", + "src": "parallelogram", + "srcArrow": "none", + "srcLabel": "", + "dst": "document", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 333, + "y": 126 + }, + { + "x": 333, + "y": 166 + }, + { + "x": 333, + "y": 188.8 + }, + { + "x": 333, + "y": 240 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "(document -> cylinder)[0]", + "src": "document", + "srcArrow": "none", + "srcLabel": "", + "dst": "cylinder", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 333, + "y": 349 + }, + { + "x": 333, + "y": 413.8 + }, + { + "x": 333, + "y": 441.8 + }, + { + "x": 333, + "y": 489 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "(queue -> package)[0]", + "src": "queue", + "srcArrow": "none", + "srcLabel": "", + "dst": "package", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 569, + "y": 126 + }, + { + "x": 569.4, + "y": 166 + }, + { + "x": 569.6, + "y": 188.8 + }, + { + "x": 570, + "y": 240 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "(package -> step)[0]", + "src": "package", + "srcArrow": "none", + "srcLabel": "", + "dst": "step", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 569, + "y": 366 + }, + { + "x": 569.4, + "y": 417.2 + }, + { + "x": 569.6, + "y": 441.8 + }, + { + "x": 570, + "y": 489 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "(callout -> stored_data)[0]", + "src": "callout", + "srcArrow": "none", + "srcLabel": "", + "dst": "stored_data", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 807, + "y": 126 + }, + { + "x": 806.6, + "y": 166 + }, + { + "x": 806.6, + "y": 188.8 + }, + { + "x": 807, + "y": 240 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "(stored_data -> person)[0]", + "src": "stored_data", + "srcArrow": "none", + "srcLabel": "", + "dst": "person", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 806, + "y": 366 + }, + { + "x": 806.4, + "y": 417.2 + }, + { + "x": 806.6, + "y": 441.8 + }, + { + "x": 807, + "y": 489 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "(diamond -> oval)[0]", + "src": "diamond", + "srcArrow": "none", + "srcLabel": "", + "dst": "oval", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 1030, + "y": 126 + }, + { + "x": 1030, + "y": 166 + }, + { + "x": 1030, + "y": 188.8 + }, + { + "x": 1030, + "y": 240 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "(oval -> circle)[0]", + "src": "oval", + "srcArrow": "none", + "srcLabel": "", + "dst": "circle", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 1030, + "y": 366 + }, + { + "x": 1030, + "y": 417.2 + }, + { + "x": 1030, + "y": 440 + }, + { + "x": 1030, + "y": 480 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "(hexagon -> cloud)[0]", + "src": "hexagon", + "srcArrow": "none", + "srcLabel": "", + "dst": "cloud", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 1256, + "y": 126 + }, + { + "x": 1256.4, + "y": 166 + }, + { + "x": 1256.6, + "y": 189.2 + }, + { + "x": 1257, + "y": 242 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + } + ] +} diff --git a/e2etests/testdata/stable/all_shapes/sketch.exp.svg b/e2etests/testdata/stable/all_shapes/sketch.exp.svg new file mode 100644 index 000000000..fcf7d2fdb --- /dev/null +++ b/e2etests/testdata/stable/all_shapes/sketch.exp.svg @@ -0,0 +1,22 @@ + +rectanglesquarepageparallelogramdocumentcylinderqueuepackagestepcalloutstored_datapersondiamondovalcirclehexagoncloud \ No newline at end of file diff --git a/e2etests/testdata/stable/binary_tree/board.exp.json b/e2etests/testdata/stable/binary_tree/board.exp.json new file mode 100644 index 000000000..3a6b384e4 --- /dev/null +++ b/e2etests/testdata/stable/binary_tree/board.exp.json @@ -0,0 +1,1235 @@ +{ + "name": "", + "shapes": [ + { + "id": "a", + "type": "", + "pos": { + "x": 602, + "y": 0 + }, + "width": 113, + "height": 126, + "level": 1, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#F7F8FE", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "a", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 13, + "labelHeight": 26, + "labelPosition": "INSIDE_MIDDLE_CENTER" + }, + { + "id": "b", + "type": "", + "pos": { + "x": 256, + "y": 226 + }, + "width": 113, + "height": 126, + "level": 1, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#F7F8FE", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "b", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 13, + "labelHeight": 26, + "labelPosition": "INSIDE_MIDDLE_CENTER" + }, + { + "id": "c", + "type": "", + "pos": { + "x": 944, + "y": 226 + }, + "width": 113, + "height": 126, + "level": 1, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#F7F8FE", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "c", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 13, + "labelHeight": 26, + "labelPosition": "INSIDE_MIDDLE_CENTER" + }, + { + "id": "d", + "type": "", + "pos": { + "x": 85, + "y": 452 + }, + "width": 114, + "height": 126, + "level": 1, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#F7F8FE", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "d", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 14, + "labelHeight": 26, + "labelPosition": "INSIDE_MIDDLE_CENTER" + }, + { + "id": "e", + "type": "", + "pos": { + "x": 426, + "y": 452 + }, + "width": 113, + "height": 126, + "level": 1, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#F7F8FE", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "e", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 13, + "labelHeight": 26, + "labelPosition": "INSIDE_MIDDLE_CENTER" + }, + { + "id": "f", + "type": "", + "pos": { + "x": 771, + "y": 452 + }, + "width": 111, + "height": 126, + "level": 1, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#F7F8FE", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "f", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 11, + "labelHeight": 26, + "labelPosition": "INSIDE_MIDDLE_CENTER" + }, + { + "id": "g", + "type": "", + "pos": { + "x": 1117, + "y": 452 + }, + "width": 114, + "height": 126, + "level": 1, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#F7F8FE", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "g", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 14, + "labelHeight": 26, + "labelPosition": "INSIDE_MIDDLE_CENTER" + }, + { + "id": "h", + "type": "", + "pos": { + "x": 0, + "y": 678 + }, + "width": 113, + "height": 126, + "level": 1, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#F7F8FE", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "h", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 13, + "labelHeight": 26, + "labelPosition": "INSIDE_MIDDLE_CENTER" + }, + { + "id": "i", + "type": "", + "pos": { + "x": 173, + "y": 678 + }, + "width": 109, + "height": 126, + "level": 1, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#F7F8FE", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "i", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 9, + "labelHeight": 26, + "labelPosition": "INSIDE_MIDDLE_CENTER" + }, + { + "id": "j", + "type": "", + "pos": { + "x": 342, + "y": 678 + }, + "width": 110, + "height": 126, + "level": 1, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#F7F8FE", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "j", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 10, + "labelHeight": 26, + "labelPosition": "INSIDE_MIDDLE_CENTER" + }, + { + "id": "k", + "type": "", + "pos": { + "x": 512, + "y": 678 + }, + "width": 113, + "height": 126, + "level": 1, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#F7F8FE", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "k", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 13, + "labelHeight": 26, + "labelPosition": "INSIDE_MIDDLE_CENTER" + }, + { + "id": "l", + "type": "", + "pos": { + "x": 685, + "y": 678 + }, + "width": 109, + "height": 126, + "level": 1, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#F7F8FE", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "l", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 9, + "labelHeight": 26, + "labelPosition": "INSIDE_MIDDLE_CENTER" + }, + { + "id": "m", + "type": "", + "pos": { + "x": 854, + "y": 678 + }, + "width": 117, + "height": 126, + "level": 1, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#F7F8FE", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "m", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 17, + "labelHeight": 26, + "labelPosition": "INSIDE_MIDDLE_CENTER" + }, + { + "id": "n", + "type": "", + "pos": { + "x": 1031, + "y": 678 + }, + "width": 113, + "height": 126, + "level": 1, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#F7F8FE", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "n", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 13, + "labelHeight": 26, + "labelPosition": "INSIDE_MIDDLE_CENTER" + }, + { + "id": "o", + "type": "", + "pos": { + "x": 1204, + "y": 678 + }, + "width": 114, + "height": 126, + "level": 1, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#F7F8FE", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "o", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 14, + "labelHeight": 26, + "labelPosition": "INSIDE_MIDDLE_CENTER" + } + ], + "connections": [ + { + "id": "(a -> b)[0]", + "src": "a", + "srcArrow": "none", + "srcLabel": "", + "dst": "b", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 602.25, + "y": 81.4389891696751 + }, + { + "x": 370.45, + "y": 157.08779783393504 + }, + { + "x": 312.5, + "y": 186 + }, + { + "x": 312.5, + "y": 226 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "(a -> c)[0]", + "src": "a", + "srcArrow": "none", + "srcLabel": "", + "dst": "c", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 715.25, + "y": 81.69546120058565 + }, + { + "x": 943.25, + "y": 157.13909224011712 + }, + { + "x": 1000.25, + "y": 186 + }, + { + "x": 1000.25, + "y": 226 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "(b -> d)[0]", + "src": "b", + "srcArrow": "none", + "srcLabel": "", + "dst": "d", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 256, + "y": 326.4457478005865 + }, + { + "x": 164.8, + "y": 386.8891495601173 + }, + { + "x": 142, + "y": 412 + }, + { + "x": 142, + "y": 452 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "(b -> e)[0]", + "src": "b", + "srcArrow": "none", + "srcLabel": "", + "dst": "e", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 369, + "y": 326.5007342143906 + }, + { + "x": 460, + "y": 386.90014684287814 + }, + { + "x": 482.75, + "y": 412 + }, + { + "x": 482.75, + "y": 452 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "(c -> f)[0]", + "src": "c", + "srcArrow": "none", + "srcLabel": "", + "dst": "f", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 943.75, + "y": 325.6398852223816 + }, + { + "x": 849.55, + "y": 386.72797704447635 + }, + { + "x": 826, + "y": 412 + }, + { + "x": 826, + "y": 452 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "(c -> g)[0]", + "src": "c", + "srcArrow": "none", + "srcLabel": "", + "dst": "g", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 1056.75, + "y": 325.6925287356322 + }, + { + "x": 1150.75, + "y": 386.73850574712645 + }, + { + "x": 1174.25, + "y": 412 + }, + { + "x": 1174.25, + "y": 452 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "(d -> h)[0]", + "src": "d", + "srcArrow": "none", + "srcLabel": "", + "dst": "h", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 94.33185840707964, + "y": 578 + }, + { + "x": 64.06637168141593, + "y": 618 + }, + { + "x": 56.5, + "y": 638 + }, + { + "x": 56.5, + "y": 678 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "(d -> i)[0]", + "src": "d", + "srcArrow": "none", + "srcLabel": "", + "dst": "i", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 189.66814159292036, + "y": 578 + }, + { + "x": 219.93362831858408, + "y": 618 + }, + { + "x": 227.5, + "y": 638 + }, + { + "x": 227.5, + "y": 678 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "(e -> j)[0]", + "src": "e", + "srcArrow": "none", + "srcLabel": "", + "dst": "j", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 434.9424778761062, + "y": 578 + }, + { + "x": 404.58849557522126, + "y": 618 + }, + { + "x": 397, + "y": 638 + }, + { + "x": 397, + "y": 678 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "(e -> k)[0]", + "src": "e", + "srcArrow": "none", + "srcLabel": "", + "dst": "k", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 530.5575221238938, + "y": 578 + }, + { + "x": 560.9115044247787, + "y": 618 + }, + { + "x": 568.5, + "y": 638 + }, + { + "x": 568.5, + "y": 678 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "(f -> l)[0]", + "src": "f", + "srcArrow": "none", + "srcLabel": "", + "dst": "l", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 777.7743362831858, + "y": 578 + }, + { + "x": 747.1548672566372, + "y": 618 + }, + { + "x": 739.5, + "y": 638 + }, + { + "x": 739.5, + "y": 678 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "(f -> m)[0]", + "src": "f", + "srcArrow": "none", + "srcLabel": "", + "dst": "m", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 874.2256637168142, + "y": 578 + }, + { + "x": 904.8451327433628, + "y": 618 + }, + { + "x": 912.5, + "y": 638 + }, + { + "x": 912.5, + "y": 678 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "(g -> n)[0]", + "src": "g", + "srcArrow": "none", + "srcLabel": "", + "dst": "n", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 1125.8849557522124, + "y": 578 + }, + { + "x": 1095.1769911504425, + "y": 618 + }, + { + "x": 1087.5, + "y": 638 + }, + { + "x": 1087.5, + "y": 678 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "(g -> o)[0]", + "src": "g", + "srcArrow": "none", + "srcLabel": "", + "dst": "o", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 1222.6150442477876, + "y": 578 + }, + { + "x": 1253.3230088495575, + "y": 618 + }, + { + "x": 1261, + "y": 638 + }, + { + "x": 1261, + "y": 678 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + } + ] +} diff --git a/e2etests/testdata/stable/binary_tree/sketch.exp.svg b/e2etests/testdata/stable/binary_tree/sketch.exp.svg new file mode 100644 index 000000000..e627cc671 --- /dev/null +++ b/e2etests/testdata/stable/binary_tree/sketch.exp.svg @@ -0,0 +1,22 @@ + +abcdefghijklmno \ No newline at end of file diff --git a/e2etests/testdata/stable/chaos1/board.exp.json b/e2etests/testdata/stable/chaos1/board.exp.json new file mode 100644 index 000000000..b1b5defb8 --- /dev/null +++ b/e2etests/testdata/stable/chaos1/board.exp.json @@ -0,0 +1,291 @@ +{ + "name": "", + "shapes": [ + { + "id": "aaa", + "type": "", + "pos": { + "x": 0, + "y": 0 + }, + "width": 251, + "height": 452, + "level": 1, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#E3E9FD", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "aaa", + "fontSize": 28, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 46, + "labelHeight": 41, + "labelPosition": "INSIDE_TOP_CENTER" + }, + { + "id": "aaa.bbb", + "type": "callout", + "pos": { + "x": 50, + "y": 276 + }, + "width": 132, + "height": 126, + "level": 2, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#FFFFFF", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "bbb", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 32, + "labelHeight": 26, + "labelPosition": "INSIDE_MIDDLE_CENTER" + }, + { + "id": "ddd", + "type": "cylinder", + "pos": { + "x": 301, + "y": 50 + }, + "width": 133, + "height": 126, + "level": 1, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#EDF0FD", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "ddd", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 33, + "labelHeight": 26, + "labelPosition": "INSIDE_MIDDLE_CENTER" + }, + { + "id": "eee", + "type": "document", + "pos": { + "x": 301, + "y": 276 + }, + "width": 130, + "height": 126, + "level": 1, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#EDF0FD", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "eee", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 30, + "labelHeight": 26, + "labelPosition": "INSIDE_MIDDLE_CENTER" + }, + { + "id": "aaa.ccc", + "type": "", + "pos": { + "x": 72, + "y": 50 + }, + "width": 128, + "height": 126, + "level": 2, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#EDF0FD", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "ccc", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 28, + "labelHeight": 26, + "labelPosition": "INSIDE_MIDDLE_CENTER" + } + ], + "connections": [ + { + "id": "(aaa.ccc -- aaa)[0]", + "src": "aaa.ccc", + "srcArrow": "none", + "srcLabel": "", + "dst": "aaa", + "dstArrow": "none", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "111", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 23, + "labelHeight": 21, + "labelPosition": "INSIDE_MIDDLE_CENTER", + "labelPercentage": 0, + "route": [ + { + "x": 124.84955752212389, + "y": 176 + }, + { + "x": 117.76991150442478, + "y": 216 + }, + { + "x": 116, + "y": 236 + }, + { + "x": 116, + "y": 276 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "(eee <- aaa.ccc)[0]", + "src": "eee", + "srcArrow": "triangle", + "srcLabel": "", + "dst": "aaa.ccc", + "dstArrow": "none", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "222", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 25, + "labelHeight": 21, + "labelPosition": "INSIDE_MIDDLE_CENTER", + "labelPercentage": 0, + "route": [ + { + "x": 301, + "y": 301 + }, + { + "x": 199.39999999999998, + "y": 241 + }, + { + "x": 170.6, + "y": 216 + }, + { + "x": 157, + "y": 176 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + } + ] +} diff --git a/e2etests/testdata/stable/chaos1/sketch.exp.svg b/e2etests/testdata/stable/chaos1/sketch.exp.svg new file mode 100644 index 000000000..a4620cb39 --- /dev/null +++ b/e2etests/testdata/stable/chaos1/sketch.exp.svg @@ -0,0 +1,35 @@ + +aaadddeeebbbccc + + +111 + + +222 \ No newline at end of file diff --git a/e2etests/testdata/stable/chaos2/board.exp.json b/e2etests/testdata/stable/chaos2/board.exp.json new file mode 100644 index 000000000..9ed5f3b60 --- /dev/null +++ b/e2etests/testdata/stable/chaos2/board.exp.json @@ -0,0 +1,1211 @@ +{ + "name": "", + "shapes": [ + { + "id": "aa", + "type": "", + "pos": { + "x": 0, + "y": 0 + }, + "width": 1123, + "height": 1659, + "level": 1, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#E3E9FD", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "aa", + "fontSize": 28, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 32, + "labelHeight": 41, + "labelPosition": "INSIDE_TOP_CENTER" + }, + { + "id": "aa.bb", + "type": "", + "pos": { + "x": 40, + "y": 50 + }, + "width": 779, + "height": 1559, + "level": 2, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#EDF0FD", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "bb", + "fontSize": 24, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 31, + "labelHeight": 36, + "labelPosition": "INSIDE_TOP_CENTER" + }, + { + "id": "aa.bb.cc", + "type": "", + "pos": { + "x": 80, + "y": 878 + }, + "width": 513, + "height": 681, + "level": 3, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#F7F8FE", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "cc", + "fontSize": 20, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 24, + "labelHeight": 31, + "labelPosition": "INSIDE_TOP_CENTER" + }, + { + "id": "aa.bb.cc.dd", + "type": "rectangle", + "pos": { + "x": 120, + "y": 928 + }, + "width": 357, + "height": 226, + "level": 4, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#FFFFFF", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "dd", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 22, + "labelHeight": 26, + "labelPosition": "INSIDE_TOP_CENTER" + }, + { + "id": "aa.bb.cc.dd.ee", + "type": "text", + "pos": { + "x": 230, + "y": 1027 + }, + "width": 21, + "height": 29, + "level": 5, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#FFFFFF", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "ee", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 21, + "labelHeight": 29 + }, + { + "id": "aa.bb.cc.dd.ff", + "type": "", + "pos": { + "x": 311, + "y": 978 + }, + "width": 117, + "height": 126, + "level": 5, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#FFFFFF", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "ff", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 17, + "labelHeight": 26, + "labelPosition": "INSIDE_MIDDLE_CENTER" + }, + { + "id": "aa.bb.cc.gg", + "type": "text", + "pos": { + "x": 408, + "y": 1254 + }, + "width": 22, + "height": 29, + "level": 4, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#FFFFFF", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "gg", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 22, + "labelHeight": 29 + }, + { + "id": "aa.bb.cc.hh", + "type": "", + "pos": { + "x": 357, + "y": 1383 + }, + "width": 123, + "height": 126, + "level": 4, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#FFFFFF", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "hh", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 23, + "labelHeight": 26, + "labelPosition": "INSIDE_MIDDLE_CENTER" + }, + { + "id": "aa.bb.ii", + "type": "package", + "pos": { + "x": 106, + "y": 100 + }, + "width": 367, + "height": 226, + "level": 3, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#F7F8FE", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "ii", + "fontSize": 20, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 14, + "labelHeight": 31, + "labelPosition": "INSIDE_TOP_CENTER" + }, + { + "id": "aa.bb.ii.jj", + "type": "diamond", + "pos": { + "x": 243, + "y": 150 + }, + "width": 115, + "height": 126, + "level": 4, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#CFD2DD", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "jj", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 15, + "labelHeight": 26, + "labelPosition": "INSIDE_MIDDLE_CENTER" + }, + { + "id": "aa.bb.kk", + "type": "oval", + "pos": { + "x": 643, + "y": 1383 + }, + "width": 126, + "height": 126, + "level": 3, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#F7F8FE", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "kk", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 22, + "labelHeight": 26, + "labelPosition": "INSIDE_MIDDLE_CENTER" + }, + { + "id": "aa.ll", + "type": "", + "pos": { + "x": 919, + "y": 652 + }, + "width": 114, + "height": 126, + "level": 2, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#EDF0FD", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "ll", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 14, + "labelHeight": 26, + "labelPosition": "INSIDE_MIDDLE_CENTER" + }, + { + "id": "aa.mm", + "type": "cylinder", + "pos": { + "x": 906, + "y": 426 + }, + "width": 131, + "height": 126, + "level": 2, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#F7F8FE", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "mm", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 31, + "labelHeight": 26, + "labelPosition": "INSIDE_MIDDLE_CENTER" + }, + { + "id": "aa.nn", + "type": "text", + "pos": { + "x": 869, + "y": 1432 + }, + "width": 21, + "height": 29, + "level": 2, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#FFFFFF", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "nn", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 21, + "labelHeight": 29 + }, + { + "id": "aa.oo", + "type": "", + "pos": { + "x": 950, + "y": 1383 + }, + "width": 123, + "height": 126, + "level": 2, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#EDF0FD", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "oo", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 23, + "labelHeight": 26, + "labelPosition": "INSIDE_MIDDLE_CENTER" + } + ], + "connections": [ + { + "id": "aa.bb.cc.(dd.ee -- gg)[0]", + "src": "aa.bb.cc.dd.ee", + "srcArrow": "none", + "srcLabel": "", + "dst": "aa.bb.cc.gg", + "dstArrow": "none", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "11", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 15, + "labelHeight": 21, + "labelPosition": "INSIDE_MIDDLE_CENTER", + "labelPercentage": 0, + "route": [ + { + "x": 240, + "y": 1055.5 + }, + { + "x": 240, + "y": 1134.3 + }, + { + "x": 273.55, + "y": 1216.1061538461538 + }, + { + "x": 407.75, + "y": 1264.5307692307692 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "aa.bb.cc.(gg -- hh)[0]", + "src": "aa.bb.cc.gg", + "srcArrow": "none", + "srcLabel": "", + "dst": "aa.bb.cc.hh", + "dstArrow": "none", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "22", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 17, + "labelHeight": 21, + "labelPosition": "INSIDE_MIDDLE_CENTER", + "labelPercentage": 0, + "route": [ + { + "x": 418.75, + "y": 1283 + }, + { + "x": 418.75, + "y": 1323 + }, + { + "x": 418.75, + "y": 1343 + }, + { + "x": 418.75, + "y": 1383 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "aa.bb.(ii -> cc.dd)[0]", + "src": "aa.bb.ii", + "srcArrow": "none", + "srcLabel": "", + "dst": "aa.bb.cc.dd", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 200, + "y": 326 + }, + { + "x": 200, + "y": 366 + }, + { + "x": 200, + "y": 398.6 + }, + { + "x": 200, + "y": 432.5 + }, + { + "x": 200, + "y": 466.4 + }, + { + "x": 200, + "y": 511.6 + }, + { + "x": 200, + "y": 545.5 + }, + { + "x": 200, + "y": 579.4 + }, + { + "x": 200, + "y": 624.6 + }, + { + "x": 200, + "y": 658.5 + }, + { + "x": 200, + "y": 692.4 + }, + { + "x": 200, + "y": 737.6 + }, + { + "x": 200, + "y": 771.5 + }, + { + "x": 200, + "y": 805.4 + }, + { + "x": 200, + "y": 888 + }, + { + "x": 200, + "y": 928 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "aa.(ll <-> bb)[0]", + "src": "aa.ll", + "srcArrow": "triangle", + "srcLabel": "", + "dst": "aa.bb", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "33", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 17, + "labelHeight": 21, + "labelPosition": "INSIDE_MIDDLE_CENTER", + "labelPercentage": 0, + "route": [ + { + "x": 918.5, + "y": 723.757307953773 + }, + { + "x": 839.3, + "y": 735.757307953773 + }, + { + "x": 898.7, + "y": 726.757307953773 + }, + { + "x": 819.5, + "y": 738.757307953773 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "aa.(mm -> bb.cc)[0]", + "src": "aa.mm", + "srcArrow": "none", + "srcLabel": "", + "dst": "aa.bb.cc", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "44", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 16, + "labelHeight": 21, + "labelPosition": "INSIDE_MIDDLE_CENTER", + "labelPercentage": 0, + "route": [ + { + "x": 906, + "y": 500 + }, + { + "x": 405.2, + "y": 581.6 + }, + { + "x": 280, + "y": 624.6 + }, + { + "x": 280, + "y": 658.5 + }, + { + "x": 280, + "y": 692.4 + }, + { + "x": 280, + "y": 838 + }, + { + "x": 280, + "y": 878 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "aa.(mm -> ll)[0]", + "src": "aa.mm", + "srcArrow": "none", + "srcLabel": "", + "dst": "aa.ll", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 974, + "y": 552 + }, + { + "x": 975.2, + "y": 592 + }, + { + "x": 975.5, + "y": 612 + }, + { + "x": 975.5, + "y": 652 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "aa.(mm <-> bb)[0]", + "src": "aa.mm", + "srcArrow": "triangle", + "srcLabel": "", + "dst": "aa.bb", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "55", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 16, + "labelHeight": 21, + "labelPosition": "INSIDE_MIDDLE_CENTER", + "labelPercentage": 0, + "route": [ + { + "x": 906, + "y": 500 + }, + { + "x": 836.2, + "y": 512.2920537428023 + }, + { + "x": 888.55, + "y": 503.07301343570055 + }, + { + "x": 818.75, + "y": 515.3650671785028 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "aa.(ll <-> bb.cc.gg)[0]", + "src": "aa.ll", + "srcArrow": "triangle", + "srcLabel": "", + "dst": "aa.bb.cc.gg", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 918.5, + "y": 729.0633187772926 + }, + { + "x": 597.7, + "y": 808.2126637554585 + }, + { + "x": 517.5, + "y": 838 + }, + { + "x": 517.5, + "y": 853 + }, + { + "x": 517.5, + "y": 868 + }, + { + "x": 517.5, + "y": 888 + }, + { + "x": 517.5, + "y": 903 + }, + { + "x": 517.5, + "y": 918 + }, + { + "x": 517.5, + "y": 950.6 + }, + { + "x": 517.5, + "y": 984.5 + }, + { + "x": 517.5, + "y": 1018.4 + }, + { + "x": 517.5, + "y": 1063.6 + }, + { + "x": 517.5, + "y": 1097.5 + }, + { + "x": 517.5, + "y": 1131.4 + }, + { + "x": 499.9, + "y": 1215.4 + }, + { + "x": 429.5, + "y": 1261 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "aa.(mm <- bb.ii)[0]", + "src": "aa.mm", + "srcArrow": "triangle", + "srcLabel": "", + "dst": "aa.bb.ii", + "dstArrow": "none", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "66", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 16, + "labelHeight": 21, + "labelPosition": "INSIDE_MIDDLE_CENTER", + "labelPercentage": 0, + "route": [ + { + "x": 906, + "y": 476 + }, + { + "x": 501.2, + "y": 396 + }, + { + "x": 400, + "y": 366 + }, + { + "x": 400, + "y": 326 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "aa.(bb.cc <- ll)[0]", + "src": "aa.bb.cc", + "srcArrow": "triangle", + "srcLabel": "", + "dst": "aa.ll", + "dstArrow": "none", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "77", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 16, + "labelHeight": 21, + "labelPosition": "INSIDE_MIDDLE_CENTER", + "labelPercentage": 0, + "route": [ + { + "x": 378.75, + "y": 878 + }, + { + "x": 378.75, + "y": 838 + }, + { + "x": 486.7, + "y": 807.5586929199833 + }, + { + "x": 918.5, + "y": 725.7934645999162 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "aa.(bb.ii <-> ll)[0]", + "src": "aa.bb.ii", + "srcArrow": "triangle", + "srcLabel": "", + "dst": "aa.ll", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "88", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 16, + "labelHeight": 21, + "labelPosition": "INSIDE_MIDDLE_CENTER", + "labelPercentage": 0, + "route": [ + { + "x": 360, + "y": 326 + }, + { + "x": 360, + "y": 366 + }, + { + "x": 360, + "y": 398.6 + }, + { + "x": 360, + "y": 432.5 + }, + { + "x": 360, + "y": 466.4 + }, + { + "x": 471.7, + "y": 622.5070674248578 + }, + { + "x": 918.5, + "y": 704.5353371242892 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + } + ] +} diff --git a/e2etests/testdata/stable/chaos2/sketch.exp.svg b/e2etests/testdata/stable/chaos2/sketch.exp.svg new file mode 100644 index 000000000..9515e0878 --- /dev/null +++ b/e2etests/testdata/stable/chaos2/sketch.exp.svg @@ -0,0 +1,848 @@ + +aabbllmm

nn

+
oocciikkdd

gg

+
hhjj

ee

+
ff + + +11 + + +22 + + +33 + + +44 + + +55 + + +66 + + +77 + + +88
\ No newline at end of file diff --git a/e2etests/testdata/stable/child_parent_edges/board.exp.json b/e2etests/testdata/stable/child_parent_edges/board.exp.json new file mode 100644 index 000000000..031c791b9 --- /dev/null +++ b/e2etests/testdata/stable/child_parent_edges/board.exp.json @@ -0,0 +1,372 @@ +{ + "name": "", + "shapes": [ + { + "id": "a", + "type": "", + "pos": { + "x": 0, + "y": 0 + }, + "width": 494, + "height": 426, + "level": 1, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#E3E9FD", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "a", + "fontSize": 28, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 17, + "labelHeight": 41, + "labelPosition": "INSIDE_TOP_CENTER" + }, + { + "id": "a.b", + "type": "", + "pos": { + "x": 40, + "y": 50 + }, + "width": 414, + "height": 326, + "level": 2, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#EDF0FD", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "b", + "fontSize": 24, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 17, + "labelHeight": 36, + "labelPosition": "INSIDE_TOP_CENTER" + }, + { + "id": "a.b.c", + "type": "", + "pos": { + "x": 80, + "y": 100 + }, + "width": 334, + "height": 226, + "level": 3, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#F7F8FE", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "c", + "fontSize": 20, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 14, + "labelHeight": 31, + "labelPosition": "INSIDE_TOP_CENTER" + }, + { + "id": "a.b.c.d", + "type": "", + "pos": { + "x": 130, + "y": 150 + }, + "width": 114, + "height": 126, + "level": 4, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#FFFFFF", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "d", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 14, + "labelHeight": 26, + "labelPosition": "INSIDE_MIDDLE_CENTER" + } + ], + "connections": [ + { + "id": "(a.b -> a)[0]", + "src": "a.b", + "srcArrow": "none", + "srcLabel": "", + "dst": "a", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 244, + "y": 173.24723247232473 + }, + { + "x": 270.66666666666663, + "y": 154.64944649446494 + }, + { + "x": 279, + "y": 150 + }, + { + "x": 281.5, + "y": 150 + }, + { + "x": 284, + "y": 150 + }, + { + "x": 287.33333333333337, + "y": 162.6 + }, + { + "x": 289.83333333333337, + "y": 181.5 + }, + { + "x": 292.3333333333333, + "y": 200.4 + }, + { + "x": 292.3333333333333, + "y": 225.6 + }, + { + "x": 289.83333333333337, + "y": 244.5 + }, + { + "x": 287.33333333333337, + "y": 263.4 + }, + { + "x": 270.66666666666663, + "y": 271.35055350553506 + }, + { + "x": 244, + "y": 252.75276752767527 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "a.(b -> b.c)[0]", + "src": "a.b", + "srcArrow": "none", + "srcLabel": "", + "dst": "a.b.c", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 244, + "y": 182.30769230769232 + }, + { + "x": 292, + "y": 156.46153846153845 + }, + { + "x": 307, + "y": 150 + }, + { + "x": 311.5, + "y": 150 + }, + { + "x": 316, + "y": 150 + }, + { + "x": 322, + "y": 162.6 + }, + { + "x": 326.5, + "y": 181.5 + }, + { + "x": 331, + "y": 200.4 + }, + { + "x": 331, + "y": 225.6 + }, + { + "x": 326.5, + "y": 244.5 + }, + { + "x": 322, + "y": 263.4 + }, + { + "x": 292, + "y": 269.53846153846155 + }, + { + "x": 244, + "y": 243.69230769230768 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "a.(b.c.d -> b)[0]", + "src": "a.b.c.d", + "srcArrow": "none", + "srcLabel": "", + "dst": "a.b", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 243.66666666666669, + "y": 238 + }, + { + "x": 243.93333333333334, + "y": 237.99628770301624 + }, + { + "x": 243.73333333333335, + "y": 237.99907192575407 + }, + { + "x": 244, + "y": 237.9953596287703 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + } + ] +} diff --git a/e2etests/testdata/stable/child_parent_edges/sketch.exp.svg b/e2etests/testdata/stable/child_parent_edges/sketch.exp.svg new file mode 100644 index 000000000..2f4732b85 --- /dev/null +++ b/e2etests/testdata/stable/child_parent_edges/sketch.exp.svg @@ -0,0 +1,22 @@ + +abcd \ No newline at end of file diff --git a/e2etests/testdata/stable/circular_dependency/board.exp.json b/e2etests/testdata/stable/circular_dependency/board.exp.json new file mode 100644 index 000000000..c965af9c1 --- /dev/null +++ b/e2etests/testdata/stable/circular_dependency/board.exp.json @@ -0,0 +1,309 @@ +{ + "name": "", + "shapes": [ + { + "id": "a", + "type": "", + "pos": { + "x": 0, + "y": 0 + }, + "width": 113, + "height": 126, + "level": 1, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#F7F8FE", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "a", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 13, + "labelHeight": 26, + "labelPosition": "INSIDE_MIDDLE_CENTER" + }, + { + "id": "b", + "type": "", + "pos": { + "x": 0, + "y": 226 + }, + "width": 113, + "height": 126, + "level": 1, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#F7F8FE", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "b", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 13, + "labelHeight": 26, + "labelPosition": "INSIDE_MIDDLE_CENTER" + }, + { + "id": "c", + "type": "", + "pos": { + "x": 0, + "y": 452 + }, + "width": 113, + "height": 126, + "level": 1, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#F7F8FE", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "c", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 13, + "labelHeight": 26, + "labelPosition": "INSIDE_MIDDLE_CENTER" + } + ], + "connections": [ + { + "id": "(a -> b)[0]", + "src": "a", + "srcArrow": "none", + "srcLabel": "", + "dst": "b", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 45.349557522123895, + "y": 126 + }, + { + "x": 38.269911504424776, + "y": 166 + }, + { + "x": 38.3, + "y": 186 + }, + { + "x": 45.5, + "y": 226 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "(b -> c)[0]", + "src": "b", + "srcArrow": "none", + "srcLabel": "", + "dst": "c", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 45.349557522123895, + "y": 352 + }, + { + "x": 38.269911504424776, + "y": 392 + }, + { + "x": 38.3, + "y": 412 + }, + { + "x": 45.5, + "y": 452 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "(c -> b)[0]", + "src": "c", + "srcArrow": "none", + "srcLabel": "", + "dst": "b", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 67.65044247787611, + "y": 452 + }, + { + "x": 74.73008849557522, + "y": 412 + }, + { + "x": 74.7, + "y": 392 + }, + { + "x": 67.5, + "y": 352 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "(b -> a)[0]", + "src": "b", + "srcArrow": "none", + "srcLabel": "", + "dst": "a", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 67.65044247787611, + "y": 226 + }, + { + "x": 74.73008849557522, + "y": 186 + }, + { + "x": 74.7, + "y": 166 + }, + { + "x": 67.5, + "y": 126 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + } + ] +} diff --git a/e2etests/testdata/stable/circular_dependency/sketch.exp.svg b/e2etests/testdata/stable/circular_dependency/sketch.exp.svg new file mode 100644 index 000000000..0c5de502d --- /dev/null +++ b/e2etests/testdata/stable/circular_dependency/sketch.exp.svg @@ -0,0 +1,22 @@ + +abc \ No newline at end of file diff --git a/e2etests/testdata/stable/code_snippet/board.exp.json b/e2etests/testdata/stable/code_snippet/board.exp.json new file mode 100644 index 000000000..79b6896f4 --- /dev/null +++ b/e2etests/testdata/stable/code_snippet/board.exp.json @@ -0,0 +1,214 @@ +{ + "name": "", + "shapes": [ + { + "id": "hey", + "type": "code", + "pos": { + "x": 0, + "y": 226 + }, + "width": 755, + "height": 166, + "level": 1, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#FFFFFF", + "stroke": "#0A0F25", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "// RegisterHash registers a function that returns a new instance of the given\n// hash function. This is intended to be called from the init function in\n// packages that implement hash functions.\nfunc RegisterHash(h Hash, f func() hash.Hash) {\n\tif h >= maxHash {\n\t\tpanic(\"crypto: RegisterHash of unknown hash function\")\n\t}\n\thashes[h] = f\n}", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "golang", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 755, + "labelHeight": 166 + }, + { + "id": "x", + "type": "", + "pos": { + "x": 321, + "y": 0 + }, + "width": 113, + "height": 126, + "level": 1, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#F7F8FE", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "x", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 13, + "labelHeight": 26, + "labelPosition": "INSIDE_MIDDLE_CENTER" + }, + { + "id": "y", + "type": "", + "pos": { + "x": 321, + "y": 492 + }, + "width": 114, + "height": 126, + "level": 1, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#F7F8FE", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "y", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 14, + "labelHeight": 26, + "labelPosition": "INSIDE_MIDDLE_CENTER" + } + ], + "connections": [ + { + "id": "(x -> hey)[0]", + "src": "x", + "srcArrow": "none", + "srcLabel": "", + "dst": "hey", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 377.5, + "y": 126 + }, + { + "x": 377.5, + "y": 166 + }, + { + "x": 377.5, + "y": 186 + }, + { + "x": 377.5, + "y": 226 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "(hey -> y)[0]", + "src": "hey", + "srcArrow": "none", + "srcLabel": "", + "dst": "y", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 377.5, + "y": 392 + }, + { + "x": 377.5, + "y": 432 + }, + { + "x": 377.5, + "y": 452 + }, + { + "x": 377.5, + "y": 492 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + } + ] +} diff --git a/e2etests/testdata/stable/code_snippet/sketch.exp.svg b/e2etests/testdata/stable/code_snippet/sketch.exp.svg new file mode 100644 index 000000000..be21f5660 --- /dev/null +++ b/e2etests/testdata/stable/code_snippet/sketch.exp.svg @@ -0,0 +1,37 @@ + +// RegisterHash registers a function that returns a new instance of the given +// hash function. This is intended to be called from the init function in +// packages that implement hash functions. +func RegisterHash(h Hash, f func() hash.Hash) { +    if h >= maxHash { +        panic("crypto: RegisterHash of unknown hash function") +    } +    hashes[h] = f +}xy \ No newline at end of file diff --git a/e2etests/testdata/stable/connected_container/board.exp.json b/e2etests/testdata/stable/connected_container/board.exp.json new file mode 100644 index 000000000..33ddd4b57 --- /dev/null +++ b/e2etests/testdata/stable/connected_container/board.exp.json @@ -0,0 +1,403 @@ +{ + "name": "", + "shapes": [ + { + "id": "a", + "type": "", + "pos": { + "x": 41, + "y": 0 + }, + "width": 213, + "height": 226, + "level": 1, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#E3E9FD", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "a", + "fontSize": 28, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 17, + "labelHeight": 41, + "labelPosition": "INSIDE_TOP_CENTER" + }, + { + "id": "a.b", + "type": "", + "pos": { + "x": 91, + "y": 50 + }, + "width": 113, + "height": 126, + "level": 2, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#EDF0FD", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "b", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 13, + "labelHeight": 26, + "labelPosition": "INSIDE_MIDDLE_CENTER" + }, + { + "id": "c", + "type": "", + "pos": { + "x": 40, + "y": 326 + }, + "width": 214, + "height": 226, + "level": 1, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#E3E9FD", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "c", + "fontSize": 28, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 17, + "labelHeight": 41, + "labelPosition": "INSIDE_TOP_CENTER" + }, + { + "id": "c.d", + "type": "", + "pos": { + "x": 90, + "y": 376 + }, + "width": 114, + "height": 126, + "level": 2, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#EDF0FD", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "d", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 14, + "labelHeight": 26, + "labelPosition": "INSIDE_MIDDLE_CENTER" + }, + { + "id": "f", + "type": "", + "pos": { + "x": 0, + "y": 652 + }, + "width": 294, + "height": 326, + "level": 1, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#E3E9FD", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "f", + "fontSize": 28, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 14, + "labelHeight": 41, + "labelPosition": "INSIDE_TOP_CENTER" + }, + { + "id": "f.h", + "type": "", + "pos": { + "x": 40, + "y": 702 + }, + "width": 214, + "height": 226, + "level": 2, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#EDF0FD", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "h", + "fontSize": 24, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 16, + "labelHeight": 36, + "labelPosition": "INSIDE_TOP_CENTER" + }, + { + "id": "f.h.g", + "type": "", + "pos": { + "x": 90, + "y": 752 + }, + "width": 114, + "height": 126, + "level": 3, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#F7F8FE", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "g", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 14, + "labelHeight": 26, + "labelPosition": "INSIDE_MIDDLE_CENTER" + } + ], + "connections": [ + { + "id": "(a.b -> c.d)[0]", + "src": "a.b", + "srcArrow": "none", + "srcLabel": "", + "dst": "c.d", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 147, + "y": 176 + }, + { + "x": 147, + "y": 216 + }, + { + "x": 147, + "y": 236 + }, + { + "x": 147, + "y": 251 + }, + { + "x": 147, + "y": 266 + }, + { + "x": 147, + "y": 336 + }, + { + "x": 147, + "y": 376 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "(c.d -> f.h.g)[0]", + "src": "c.d", + "srcArrow": "none", + "srcLabel": "", + "dst": "f.h.g", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 147, + "y": 502 + }, + { + "x": 147, + "y": 542 + }, + { + "x": 147, + "y": 562 + }, + { + "x": 147, + "y": 577 + }, + { + "x": 147, + "y": 592 + }, + { + "x": 147, + "y": 612 + }, + { + "x": 147, + "y": 627 + }, + { + "x": 147, + "y": 642 + }, + { + "x": 147, + "y": 712 + }, + { + "x": 147, + "y": 752 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + } + ] +} diff --git a/e2etests/testdata/stable/connected_container/sketch.exp.svg b/e2etests/testdata/stable/connected_container/sketch.exp.svg new file mode 100644 index 000000000..02cab62fe --- /dev/null +++ b/e2etests/testdata/stable/connected_container/sketch.exp.svg @@ -0,0 +1,22 @@ + +acfbdhg \ No newline at end of file diff --git a/e2etests/testdata/stable/container_edges/board.exp.json b/e2etests/testdata/stable/container_edges/board.exp.json new file mode 100644 index 000000000..8166e4d26 --- /dev/null +++ b/e2etests/testdata/stable/container_edges/board.exp.json @@ -0,0 +1,605 @@ +{ + "name": "", + "shapes": [ + { + "id": "a", + "type": "", + "pos": { + "x": 416, + "y": 0 + }, + "width": 113, + "height": 126, + "level": 1, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#F7F8FE", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "a", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 13, + "labelHeight": 26, + "labelPosition": "INSIDE_MIDDLE_CENTER" + }, + { + "id": "g", + "type": "", + "pos": { + "x": 333, + "y": 226 + }, + "width": 253, + "height": 878, + "level": 1, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#E3E9FD", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "g", + "fontSize": 28, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 18, + "labelHeight": 41, + "labelPosition": "INSIDE_TOP_CENTER" + }, + { + "id": "g.b", + "type": "", + "pos": { + "x": 416, + "y": 276 + }, + "width": 113, + "height": 126, + "level": 2, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#EDF0FD", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "b", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 13, + "labelHeight": 26, + "labelPosition": "INSIDE_MIDDLE_CENTER" + }, + { + "id": "d", + "type": "", + "pos": { + "x": 0, + "y": 502 + }, + "width": 293, + "height": 326, + "level": 1, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#E3E9FD", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "d", + "fontSize": 28, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 18, + "labelHeight": 41, + "labelPosition": "INSIDE_TOP_CENTER" + }, + { + "id": "d.h", + "type": "", + "pos": { + "x": 40, + "y": 552 + }, + "width": 213, + "height": 226, + "level": 2, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#EDF0FD", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "h", + "fontSize": 24, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 16, + "labelHeight": 36, + "labelPosition": "INSIDE_TOP_CENTER" + }, + { + "id": "d.h.c", + "type": "", + "pos": { + "x": 90, + "y": 602 + }, + "width": 113, + "height": 126, + "level": 3, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#F7F8FE", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "c", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 13, + "labelHeight": 26, + "labelPosition": "INSIDE_MIDDLE_CENTER" + }, + { + "id": "g.e", + "type": "", + "pos": { + "x": 383, + "y": 928 + }, + "width": 113, + "height": 126, + "level": 2, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#EDF0FD", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "e", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 13, + "labelHeight": 26, + "labelPosition": "INSIDE_MIDDLE_CENTER" + }, + { + "id": "f", + "type": "", + "pos": { + "x": 404, + "y": 1204 + }, + "width": 111, + "height": 126, + "level": 1, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#F7F8FE", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "f", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 11, + "labelHeight": 26, + "labelPosition": "INSIDE_MIDDLE_CENTER" + } + ], + "connections": [ + { + "id": "(a -> g.b)[0]", + "src": "a", + "srcArrow": "none", + "srcLabel": "", + "dst": "g.b", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 472.75, + "y": 126 + }, + { + "x": 472.75, + "y": 166 + }, + { + "x": 472.75, + "y": 236 + }, + { + "x": 472.75, + "y": 276 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "(g.b -> d.h.c)[0]", + "src": "g.b", + "srcArrow": "none", + "srcLabel": "", + "dst": "d.h.c", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 435.67477876106193, + "y": 402 + }, + { + "x": 412.13495575221236, + "y": 442 + }, + { + "x": 406.25, + "y": 462 + }, + { + "x": 406.25, + "y": 477 + }, + { + "x": 406.25, + "y": 492 + }, + { + "x": 365.65, + "y": 569.6 + }, + { + "x": 203.25, + "y": 640 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "(d -> g.e)[0]", + "src": "d", + "srcArrow": "none", + "srcLabel": "", + "dst": "g.e", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 146.5, + "y": 828 + }, + { + "x": 380.9, + "y": 868 + }, + { + "x": 439.5, + "y": 888 + }, + { + "x": 439.5, + "y": 928 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "(g.e -> f)[0]", + "src": "g.e", + "srcArrow": "none", + "srcLabel": "", + "dst": "f", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 439.5, + "y": 1054 + }, + { + "x": 439.5, + "y": 1094 + }, + { + "x": 441.3, + "y": 1164 + }, + { + "x": 448.5, + "y": 1204 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "(f -> g)[0]", + "src": "f", + "srcArrow": "none", + "srcLabel": "", + "dst": "g", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 507.72566371681415, + "y": 1204 + }, + { + "x": 538.3451327433628, + "y": 1164 + }, + { + "x": 546, + "y": 1144 + }, + { + "x": 546, + "y": 1104 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "(g -> d.h)[0]", + "src": "g", + "srcArrow": "none", + "srcLabel": "", + "dst": "d.h", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 332.5, + "y": 598 + }, + { + "x": 268.5, + "y": 621.2 + }, + { + "x": 316.5, + "y": 603.8 + }, + { + "x": 252.5, + "y": 627 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + } + ] +} diff --git a/e2etests/testdata/stable/container_edges/sketch.exp.svg b/e2etests/testdata/stable/container_edges/sketch.exp.svg new file mode 100644 index 000000000..aea28eddb --- /dev/null +++ b/e2etests/testdata/stable/container_edges/sketch.exp.svg @@ -0,0 +1,22 @@ + +agdfbhec \ No newline at end of file diff --git a/e2etests/testdata/stable/dense/board.exp.json b/e2etests/testdata/stable/dense/board.exp.json new file mode 100644 index 000000000..45e6e5df1 --- /dev/null +++ b/e2etests/testdata/stable/dense/board.exp.json @@ -0,0 +1,1913 @@ +{ + "name": "", + "shapes": [ + { + "id": "a", + "type": "", + "pos": { + "x": 330, + "y": 0 + }, + "width": 113, + "height": 126, + "level": 1, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#F7F8FE", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "a", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 13, + "labelHeight": 26, + "labelPosition": "INSIDE_MIDDLE_CENTER" + }, + { + "id": "b", + "type": "", + "pos": { + "x": 457, + "y": 226 + }, + "width": 113, + "height": 126, + "level": 1, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#F7F8FE", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "b", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 13, + "labelHeight": 26, + "labelPosition": "INSIDE_MIDDLE_CENTER" + }, + { + "id": "c", + "type": "", + "pos": { + "x": 111, + "y": 678 + }, + "width": 113, + "height": 126, + "level": 1, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#F7F8FE", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "c", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 13, + "labelHeight": 26, + "labelPosition": "INSIDE_MIDDLE_CENTER" + }, + { + "id": "d", + "type": "", + "pos": { + "x": 737, + "y": 678 + }, + "width": 114, + "height": 126, + "level": 1, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#F7F8FE", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "d", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 14, + "labelHeight": 26, + "labelPosition": "INSIDE_MIDDLE_CENTER" + }, + { + "id": "e", + "type": "", + "pos": { + "x": 924, + "y": 1130 + }, + "width": 113, + "height": 126, + "level": 1, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#F7F8FE", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "e", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 13, + "labelHeight": 26, + "labelPosition": "INSIDE_MIDDLE_CENTER" + }, + { + "id": "f", + "type": "", + "pos": { + "x": 911, + "y": 678 + }, + "width": 111, + "height": 126, + "level": 1, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#F7F8FE", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "f", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 11, + "labelHeight": 26, + "labelPosition": "INSIDE_MIDDLE_CENTER" + }, + { + "id": "g", + "type": "", + "pos": { + "x": 929, + "y": 452 + }, + "width": 114, + "height": 126, + "level": 1, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#F7F8FE", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "g", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 14, + "labelHeight": 26, + "labelPosition": "INSIDE_MIDDLE_CENTER" + }, + { + "id": "h", + "type": "", + "pos": { + "x": 170, + "y": 452 + }, + "width": 113, + "height": 126, + "level": 1, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#F7F8FE", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "h", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 13, + "labelHeight": 26, + "labelPosition": "INSIDE_MIDDLE_CENTER" + }, + { + "id": "i", + "type": "", + "pos": { + "x": 519, + "y": 1130 + }, + "width": 109, + "height": 126, + "level": 1, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#F7F8FE", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "i", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 9, + "labelHeight": 26, + "labelPosition": "INSIDE_MIDDLE_CENTER" + }, + { + "id": "j", + "type": "", + "pos": { + "x": 0, + "y": 452 + }, + "width": 110, + "height": 126, + "level": 1, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#F7F8FE", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "j", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 10, + "labelHeight": 26, + "labelPosition": "INSIDE_MIDDLE_CENTER" + }, + { + "id": "k", + "type": "", + "pos": { + "x": 517, + "y": 1356 + }, + "width": 113, + "height": 126, + "level": 1, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#F7F8FE", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "k", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 13, + "labelHeight": 26, + "labelPosition": "INSIDE_MIDDLE_CENTER" + }, + { + "id": "l", + "type": "", + "pos": { + "x": 1171, + "y": 904 + }, + "width": 109, + "height": 126, + "level": 1, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#F7F8FE", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "l", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 9, + "labelHeight": 26, + "labelPosition": "INSIDE_MIDDLE_CENTER" + }, + { + "id": "m", + "type": "", + "pos": { + "x": 1082, + "y": 678 + }, + "width": 117, + "height": 126, + "level": 1, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#F7F8FE", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "m", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 17, + "labelHeight": 26, + "labelPosition": "INSIDE_MIDDLE_CENTER" + }, + { + "id": "n", + "type": "", + "pos": { + "x": 624, + "y": 904 + }, + "width": 113, + "height": 126, + "level": 1, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#F7F8FE", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "n", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 13, + "labelHeight": 26, + "labelPosition": "INSIDE_MIDDLE_CENTER" + }, + { + "id": "o", + "type": "", + "pos": { + "x": 383, + "y": 452 + }, + "width": 114, + "height": 126, + "level": 1, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#F7F8FE", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "o", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 14, + "labelHeight": 26, + "labelPosition": "INSIDE_MIDDLE_CENTER" + }, + { + "id": "p", + "type": "", + "pos": { + "x": 1277, + "y": 678 + }, + "width": 113, + "height": 126, + "level": 1, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#F7F8FE", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "p", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 13, + "labelHeight": 26, + "labelPosition": "INSIDE_MIDDLE_CENTER" + }, + { + "id": "q", + "type": "", + "pos": { + "x": 923, + "y": 1356 + }, + "width": 114, + "height": 126, + "level": 1, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#F7F8FE", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "q", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 14, + "labelHeight": 26, + "labelPosition": "INSIDE_MIDDLE_CENTER" + } + ], + "connections": [ + { + "id": "(a -> b)[0]", + "src": "a", + "srcArrow": "none", + "srcLabel": "", + "dst": "b", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 443.25, + "y": 113.37080867850099 + }, + { + "x": 499.45, + "y": 163.4741617357002 + }, + { + "x": 513.5, + "y": 186 + }, + { + "x": 513.5, + "y": 226 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "(c -> b)[0]", + "src": "c", + "srcArrow": "none", + "srcLabel": "", + "dst": "b", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 223.75, + "y": 702.4811463046757 + }, + { + "x": 311.15, + "y": 642.8962292609351 + }, + { + "x": 333, + "y": 605.4 + }, + { + "x": 333, + "y": 571.5 + }, + { + "x": 333, + "y": 537.6 + }, + { + "x": 357.8, + "y": 386.4 + }, + { + "x": 457, + "y": 324 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "(d -> e)[0]", + "src": "d", + "srcArrow": "none", + "srcLabel": "", + "dst": "e", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 793.5, + "y": 804 + }, + { + "x": 793.5, + "y": 844 + }, + { + "x": 793.5, + "y": 876.6 + }, + { + "x": 793.5, + "y": 910.5 + }, + { + "x": 793.5, + "y": 944.4 + }, + { + "x": 819.55, + "y": 1095.7625167336012 + }, + { + "x": 923.75, + "y": 1158.8125836680053 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "(f -> e)[0]", + "src": "f", + "srcArrow": "none", + "srcLabel": "", + "dst": "e", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 966, + "y": 804 + }, + { + "x": 966, + "y": 844 + }, + { + "x": 966, + "y": 876.6 + }, + { + "x": 966, + "y": 910.5 + }, + { + "x": 966, + "y": 944.4 + }, + { + "x": 967.2, + "y": 1090 + }, + { + "x": 972, + "y": 1130 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "(b -> f)[0]", + "src": "b", + "srcArrow": "none", + "srcLabel": "", + "dst": "f", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 570, + "y": 307.77794117647056 + }, + { + "x": 796.8, + "y": 383.1555882352941 + }, + { + "x": 853.5, + "y": 424.6 + }, + { + "x": 853.5, + "y": 458.5 + }, + { + "x": 853.5, + "y": 492.4 + }, + { + "x": 864.9, + "y": 639.4506666666666 + }, + { + "x": 910.5, + "y": 685.2533333333333 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "(b -> g)[0]", + "src": "b", + "srcArrow": "none", + "srcLabel": "", + "dst": "g", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 570, + "y": 302.5121693121693 + }, + { + "x": 902.8, + "y": 382.1024338624339 + }, + { + "x": 986, + "y": 412 + }, + { + "x": 986, + "y": 452 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "(g -> f)[0]", + "src": "g", + "srcArrow": "none", + "srcLabel": "", + "dst": "f", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 986, + "y": 578 + }, + { + "x": 986, + "y": 618 + }, + { + "x": 984.2, + "y": 638 + }, + { + "x": 977, + "y": 678 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "(b -> h)[0]", + "src": "b", + "srcArrow": "none", + "srcLabel": "", + "dst": "h", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 457, + "y": 311.24564459930315 + }, + { + "x": 272.6, + "y": 383.8491289198606 + }, + { + "x": 226.5, + "y": 412 + }, + { + "x": 226.5, + "y": 452 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "(b -> i)[0]", + "src": "b", + "srcArrow": "none", + "srcLabel": "", + "dst": "i", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 532.1769911504425, + "y": 352 + }, + { + "x": 544.0353982300885, + "y": 392 + }, + { + "x": 547, + "y": 424.6 + }, + { + "x": 547, + "y": 458.5 + }, + { + "x": 547, + "y": 492.4 + }, + { + "x": 547, + "y": 537.6 + }, + { + "x": 547, + "y": 571.5 + }, + { + "x": 547, + "y": 605.4 + }, + { + "x": 547, + "y": 650.6 + }, + { + "x": 547, + "y": 684.5 + }, + { + "x": 547, + "y": 718.4 + }, + { + "x": 547, + "y": 763.6 + }, + { + "x": 547, + "y": 797.5 + }, + { + "x": 547, + "y": 831.4 + }, + { + "x": 547, + "y": 876.6 + }, + { + "x": 547, + "y": 910.5 + }, + { + "x": 547, + "y": 944.4 + }, + { + "x": 549.4, + "y": 1090 + }, + { + "x": 559, + "y": 1130 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "(b -> d)[0]", + "src": "b", + "srcArrow": "none", + "srcLabel": "", + "dst": "d", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 570, + "y": 311.8017857142857 + }, + { + "x": 748.8, + "y": 383.96035714285716 + }, + { + "x": 793.5, + "y": 424.6 + }, + { + "x": 793.5, + "y": 458.5 + }, + { + "x": 793.5, + "y": 492.4 + }, + { + "x": 793.5, + "y": 638 + }, + { + "x": 793.5, + "y": 678 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "(j -> c)[0]", + "src": "j", + "srcArrow": "none", + "srcLabel": "", + "dst": "c", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 55, + "y": 578 + }, + { + "x": 55, + "y": 618 + }, + { + "x": 66.15, + "y": 639.2244988864143 + }, + { + "x": 110.75, + "y": 684.1224944320712 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "(j -> a)[0]", + "src": "j", + "srcArrow": "none", + "srcLabel": "", + "dst": "a", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 84.26991150442478, + "y": 452 + }, + { + "x": 102.85398230088495, + "y": 412 + }, + { + "x": 107.5, + "y": 379.4 + }, + { + "x": 107.5, + "y": 345.5 + }, + { + "x": 107.5, + "y": 311.6 + }, + { + "x": 152.1, + "y": 158 + }, + { + "x": 330.5, + "y": 86 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "(b -> j)[0]", + "src": "b", + "srcArrow": "none", + "srcLabel": "", + "dst": "j", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 457, + "y": 302.9247546346783 + }, + { + "x": 135.39999999999998, + "y": 382.1849509269357 + }, + { + "x": 55, + "y": 412 + }, + { + "x": 55, + "y": 452 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "(i -> k)[0]", + "src": "i", + "srcArrow": "none", + "srcLabel": "", + "dst": "k", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 573.5, + "y": 1256 + }, + { + "x": 573.5, + "y": 1296 + }, + { + "x": 573.5, + "y": 1316 + }, + { + "x": 573.5, + "y": 1356 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "(d -> l)[0]", + "src": "d", + "srcArrow": "none", + "srcLabel": "", + "dst": "l", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 851.5, + "y": 765.820809248555 + }, + { + "x": 1012.7, + "y": 836.364161849711 + }, + { + "x": 1076.6, + "y": 869.4 + }, + { + "x": 1171, + "y": 931 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "(l -> e)[0]", + "src": "l", + "srcArrow": "none", + "srcLabel": "", + "dst": "e", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 1225.75, + "y": 1030 + }, + { + "x": 1225.75, + "y": 1070 + }, + { + "x": 1187.95, + "y": 1097.4 + }, + { + "x": 1036.75, + "y": 1167 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "(m -> l)[0]", + "src": "m", + "srcArrow": "none", + "srcLabel": "", + "dst": "l", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 1151.1504424778761, + "y": 804 + }, + { + "x": 1158.2300884955753, + "y": 844 + }, + { + "x": 1165.8, + "y": 864 + }, + { + "x": 1189, + "y": 904 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "(m -> n)[0]", + "src": "m", + "srcArrow": "none", + "srcLabel": "", + "dst": "n", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 1081.5, + "y": 754.2276138069035 + }, + { + "x": 728.5, + "y": 834.0455227613807 + }, + { + "x": 643.85, + "y": 864 + }, + { + "x": 658.25, + "y": 904 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "(n -> i)[0]", + "src": "n", + "srcArrow": "none", + "srcLabel": "", + "dst": "i", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 680.25, + "y": 1030 + }, + { + "x": 680.25, + "y": 1070 + }, + { + "x": 669.85, + "y": 1091 + }, + { + "x": 628.25, + "y": 1135 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "(d -> n)[0]", + "src": "d", + "srcArrow": "none", + "srcLabel": "", + "dst": "n", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 736.5, + "y": 797.8741721854304 + }, + { + "x": 691.5, + "y": 842.774834437086 + }, + { + "x": 680.25, + "y": 864 + }, + { + "x": 680.25, + "y": 904 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "(f -> n)[0]", + "src": "f", + "srcArrow": "none", + "srcLabel": "", + "dst": "n", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 910.5, + "y": 766.5198372329603 + }, + { + "x": 758.3, + "y": 836.503967446592 + }, + { + "x": 716.65, + "y": 864 + }, + { + "x": 702.25, + "y": 904 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "(b -> o)[0]", + "src": "b", + "srcArrow": "none", + "srcLabel": "", + "dst": "o", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 472.5221238938053, + "y": 352 + }, + { + "x": 446.50442477876106, + "y": 392 + }, + { + "x": 440, + "y": 412 + }, + { + "x": 440, + "y": 452 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "(p -> l)[0]", + "src": "p", + "srcArrow": "none", + "srcLabel": "", + "dst": "l", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 1333.25, + "y": 804 + }, + { + "x": 1333.25, + "y": 844 + }, + { + "x": 1322.65, + "y": 865.1423255813953 + }, + { + "x": 1280.25, + "y": 909.7116279069768 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "(e -> q)[0]", + "src": "e", + "srcArrow": "none", + "srcLabel": "", + "dst": "q", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 980.25, + "y": 1256 + }, + { + "x": 980.25, + "y": 1296 + }, + { + "x": 980.25, + "y": 1316 + }, + { + "x": 980.25, + "y": 1356 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + } + ] +} diff --git a/e2etests/testdata/stable/dense/sketch.exp.svg b/e2etests/testdata/stable/dense/sketch.exp.svg new file mode 100644 index 000000000..cc1b7efd2 --- /dev/null +++ b/e2etests/testdata/stable/dense/sketch.exp.svg @@ -0,0 +1,22 @@ + +abcdefghijklmnopq \ No newline at end of file diff --git a/e2etests/testdata/stable/different_subgraphs/board.exp.json b/e2etests/testdata/stable/different_subgraphs/board.exp.json new file mode 100644 index 000000000..d5ef295bb --- /dev/null +++ b/e2etests/testdata/stable/different_subgraphs/board.exp.json @@ -0,0 +1,1689 @@ +{ + "name": "", + "shapes": [ + { + "id": "finally", + "type": "", + "pos": { + "x": 213, + "y": 0 + }, + "width": 465, + "height": 904, + "level": 1, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#E3E9FD", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "finally", + "fontSize": 28, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 77, + "labelHeight": 41, + "labelPosition": "INSIDE_TOP_CENTER" + }, + { + "id": "a", + "type": "", + "pos": { + "x": 1076, + "y": 50 + }, + "width": 113, + "height": 126, + "level": 1, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#F7F8FE", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "a", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 13, + "labelHeight": 26, + "labelPosition": "INSIDE_MIDDLE_CENTER" + }, + { + "id": "tree", + "type": "", + "pos": { + "x": 862, + "y": 276 + }, + "width": 134, + "height": 126, + "level": 1, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#F7F8FE", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "tree", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 34, + "labelHeight": 26, + "labelPosition": "INSIDE_MIDDLE_CENTER" + }, + { + "id": "and", + "type": "", + "pos": { + "x": 1152, + "y": 276 + }, + "width": 132, + "height": 126, + "level": 1, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#F7F8FE", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "and", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 32, + "labelHeight": 26, + "labelPosition": "INSIDE_MIDDLE_CENTER" + }, + { + "id": "nodes", + "type": "", + "pos": { + "x": 1344, + "y": 276 + }, + "width": 147, + "height": 126, + "level": 1, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#F7F8FE", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "nodes", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 47, + "labelHeight": 26, + "labelPosition": "INSIDE_MIDDLE_CENTER" + }, + { + "id": "some", + "type": "", + "pos": { + "x": 1547, + "y": 502 + }, + "width": 143, + "height": 126, + "level": 1, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#F7F8FE", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "some", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 43, + "labelHeight": 26, + "labelPosition": "INSIDE_MIDDLE_CENTER" + }, + { + "id": "more", + "type": "", + "pos": { + "x": 1141, + "y": 502 + }, + "width": 141, + "height": 126, + "level": 1, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#F7F8FE", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "more", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 41, + "labelHeight": 26, + "labelPosition": "INSIDE_MIDDLE_CENTER" + }, + { + "id": "many", + "type": "", + "pos": { + "x": 1342, + "y": 502 + }, + "width": 145, + "height": 126, + "level": 1, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#F7F8FE", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "many", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 45, + "labelHeight": 26, + "labelPosition": "INSIDE_MIDDLE_CENTER" + }, + { + "id": "then", + "type": "", + "pos": { + "x": 1988, + "y": 50 + }, + "width": 138, + "height": 126, + "level": 1, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#F7F8FE", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "then", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 38, + "labelHeight": 26, + "labelPosition": "INSIDE_MIDDLE_CENTER" + }, + { + "id": "here", + "type": "", + "pos": { + "x": 1959, + "y": 276 + }, + "width": 136, + "height": 126, + "level": 1, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#F7F8FE", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "here", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 36, + "labelHeight": 26, + "labelPosition": "INSIDE_MIDDLE_CENTER" + }, + { + "id": "you", + "type": "", + "pos": { + "x": 1961, + "y": 502 + }, + "width": 132, + "height": 126, + "level": 1, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#F7F8FE", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "you", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 32, + "labelHeight": 26, + "labelPosition": "INSIDE_MIDDLE_CENTER" + }, + { + "id": "have", + "type": "", + "pos": { + "x": 2204, + "y": 50 + }, + "width": 138, + "height": 126, + "level": 1, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#F7F8FE", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "have", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 38, + "labelHeight": 26, + "labelPosition": "INSIDE_MIDDLE_CENTER" + }, + { + "id": "hierarchy", + "type": "", + "pos": { + "x": 2168, + "y": 276 + }, + "width": 173, + "height": 126, + "level": 1, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#F7F8FE", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "hierarchy", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 73, + "labelHeight": 26, + "labelPosition": "INSIDE_MIDDLE_CENTER" + }, + { + "id": "another", + "type": "", + "pos": { + "x": 0, + "y": 502 + }, + "width": 163, + "height": 126, + "level": 1, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#F7F8FE", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "another", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 63, + "labelHeight": 26, + "labelPosition": "INSIDE_MIDDLE_CENTER" + }, + { + "id": "of", + "type": "", + "pos": { + "x": 22, + "y": 728 + }, + "width": 120, + "height": 126, + "level": 1, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#F7F8FE", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "of", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 20, + "labelHeight": 26, + "labelPosition": "INSIDE_MIDDLE_CENTER" + }, + { + "id": "nesting", + "type": "", + "pos": { + "x": 1551, + "y": 276 + }, + "width": 158, + "height": 126, + "level": 1, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#F7F8FE", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "nesting", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 58, + "labelHeight": 26, + "labelPosition": "INSIDE_MIDDLE_CENTER" + }, + { + "id": "trees", + "type": "", + "pos": { + "x": 939, + "y": 502 + }, + "width": 142, + "height": 126, + "level": 1, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#F7F8FE", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "trees", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 42, + "labelHeight": 26, + "labelPosition": "INSIDE_MIDDLE_CENTER" + }, + { + "id": "finally.a", + "type": "", + "pos": { + "x": 281, + "y": 276 + }, + "width": 113, + "height": 126, + "level": 2, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#EDF0FD", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "a", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 13, + "labelHeight": 26, + "labelPosition": "INSIDE_MIDDLE_CENTER" + }, + { + "id": "finally.tree", + "type": "", + "pos": { + "x": 296, + "y": 502 + }, + "width": 134, + "height": 126, + "level": 2, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#EDF0FD", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "tree", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 34, + "labelHeight": 26, + "labelPosition": "INSIDE_MIDDLE_CENTER" + }, + { + "id": "finally.inside", + "type": "", + "pos": { + "x": 263, + "y": 50 + }, + "width": 148, + "height": 126, + "level": 2, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#EDF0FD", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "inside", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 48, + "labelHeight": 26, + "labelPosition": "INSIDE_MIDDLE_CENTER" + }, + { + "id": "finally.hierarchy", + "type": "", + "pos": { + "x": 277, + "y": 728 + }, + "width": 173, + "height": 126, + "level": 2, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#EDF0FD", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "hierarchy", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 73, + "labelHeight": 26, + "labelPosition": "INSIDE_MIDDLE_CENTER" + }, + { + "id": "finally.root", + "type": "", + "pos": { + "x": 490, + "y": 502 + }, + "width": 135, + "height": 126, + "level": 2, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#EDF0FD", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "root", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 35, + "labelHeight": 26, + "labelPosition": "INSIDE_MIDDLE_CENTER" + } + ], + "connections": [ + { + "id": "(a -> tree)[0]", + "src": "a", + "srcArrow": "none", + "srcLabel": "", + "dst": "tree", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 1075.75, + "y": 144.37346437346437 + }, + { + "x": 958.15, + "y": 209.67469287469288 + }, + { + "x": 928.75, + "y": 236 + }, + { + "x": 928.75, + "y": 276 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "(a -> and)[0]", + "src": "a", + "srcArrow": "none", + "srcLabel": "", + "dst": "and", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 1180.1969026548672, + "y": 176 + }, + { + "x": 1210.6393805309735, + "y": 216 + }, + { + "x": 1218.25, + "y": 236 + }, + { + "x": 1218.25, + "y": 276 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "(a -> nodes)[0]", + "src": "a", + "srcArrow": "none", + "srcLabel": "", + "dst": "nodes", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 1188.75, + "y": 135.36252189141857 + }, + { + "x": 1371.95, + "y": 207.87250437828374 + }, + { + "x": 1417.75, + "y": 236 + }, + { + "x": 1417.75, + "y": 276 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "(and -> some)[0]", + "src": "and", + "srcArrow": "none", + "srcLabel": "", + "dst": "some", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 1218.25, + "y": 402 + }, + { + "x": 1218.25, + "y": 442 + }, + { + "x": 1284.05, + "y": 470.6 + }, + { + "x": 1547.25, + "y": 545 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "(tree -> more)[0]", + "src": "tree", + "srcArrow": "none", + "srcLabel": "", + "dst": "more", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 922.8960176991151, + "y": 402 + }, + { + "x": 919.179203539823, + "y": 442 + }, + { + "x": 962.85, + "y": 469.2 + }, + { + "x": 1141.25, + "y": 538 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "(tree -> many)[0]", + "src": "tree", + "srcArrow": "none", + "srcLabel": "", + "dst": "many", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 995.75, + "y": 384.2 + }, + { + "x": 1076.15, + "y": 438.44 + }, + { + "x": 1145.45, + "y": 469.4 + }, + { + "x": 1342.25, + "y": 539 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "(then -> here)[0]", + "src": "then", + "srcArrow": "none", + "srcLabel": "", + "dst": "here", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 2040.0530973451328, + "y": 176 + }, + { + "x": 2029.6106194690265, + "y": 216 + }, + { + "x": 2027, + "y": 236 + }, + { + "x": 2027, + "y": 276 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "(here -> you)[0]", + "src": "here", + "srcArrow": "none", + "srcLabel": "", + "dst": "you", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 2027, + "y": 402 + }, + { + "x": 2027, + "y": 442 + }, + { + "x": 2027, + "y": 462 + }, + { + "x": 2027, + "y": 502 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "(have -> hierarchy)[0]", + "src": "have", + "srcArrow": "none", + "srcLabel": "", + "dst": "hierarchy", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 2273.25, + "y": 176 + }, + { + "x": 2273.25, + "y": 216 + }, + { + "x": 2271.65, + "y": 236 + }, + { + "x": 2265.25, + "y": 276 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "(then -> hierarchy)[0]", + "src": "then", + "srcArrow": "none", + "srcLabel": "", + "dst": "hierarchy", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 2110.9977876106195, + "y": 176 + }, + { + "x": 2145.599557522124, + "y": 216 + }, + { + "x": 2163.05, + "y": 236 + }, + { + "x": 2198.25, + "y": 276 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "(finally -> another)[0]", + "src": "finally", + "srcArrow": "none", + "srcLabel": "", + "dst": "another", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 213, + "y": 488 + }, + { + "x": 173, + "y": 511.2 + }, + { + "x": 203, + "y": 493.8 + }, + { + "x": 163, + "y": 517 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "(another -> of)[0]", + "src": "another", + "srcArrow": "none", + "srcLabel": "", + "dst": "of", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 81.5, + "y": 628 + }, + { + "x": 81.5, + "y": 668 + }, + { + "x": 81.5, + "y": 688 + }, + { + "x": 81.5, + "y": 728 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "(nesting -> trees)[0]", + "src": "nesting", + "srcArrow": "none", + "srcLabel": "", + "dst": "trees", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 1630.25, + "y": 402 + }, + { + "x": 1630.25, + "y": 442 + }, + { + "x": 1520.45, + "y": 472.01193548387096 + }, + { + "x": 1081.25, + "y": 552.0596774193548 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "(finally -> trees)[0]", + "src": "finally", + "srcArrow": "none", + "srcLabel": "", + "dst": "trees", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 679, + "y": 511 + }, + { + "x": 887, + "y": 544.6 + }, + { + "x": 731, + "y": 519.4 + }, + { + "x": 939, + "y": 553 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "finally.(a -> tree)[0]", + "src": "finally.a", + "srcArrow": "none", + "srcLabel": "", + "dst": "finally.tree", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 351.63495575221236, + "y": 402 + }, + { + "x": 360.92699115044246, + "y": 442 + }, + { + "x": 363.25, + "y": 462 + }, + { + "x": 363.25, + "y": 502 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "finally.(inside -> a)[0]", + "src": "finally.inside", + "srcArrow": "none", + "srcLabel": "", + "dst": "finally.a", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 337, + "y": 176 + }, + { + "x": 337, + "y": 216 + }, + { + "x": 337, + "y": 236 + }, + { + "x": 337, + "y": 276 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "finally.(tree -> hierarchy)[0]", + "src": "finally.tree", + "srcArrow": "none", + "srcLabel": "", + "dst": "finally.hierarchy", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 363.25, + "y": 628 + }, + { + "x": 363.25, + "y": 668 + }, + { + "x": 363.25, + "y": 688 + }, + { + "x": 363.25, + "y": 728 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "finally.(a -> root)[0]", + "src": "finally.a", + "srcArrow": "none", + "srcLabel": "", + "dst": "finally.root", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 394.5, + "y": 367.92185730464325 + }, + { + "x": 525.1, + "y": 435.1843714609287 + }, + { + "x": 557.75, + "y": 462 + }, + { + "x": 557.75, + "y": 502 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + } + ] +} diff --git a/e2etests/testdata/stable/different_subgraphs/sketch.exp.svg b/e2etests/testdata/stable/different_subgraphs/sketch.exp.svg new file mode 100644 index 000000000..3f609b939 --- /dev/null +++ b/e2etests/testdata/stable/different_subgraphs/sketch.exp.svg @@ -0,0 +1,22 @@ + +finallyatreeandnodessomemoremanythenhereyouhavehierarchyanotherofnestingtreesatreeinsidehierarchyroot \ No newline at end of file diff --git a/e2etests/testdata/stable/giant_markdown_test/board.exp.json b/e2etests/testdata/stable/giant_markdown_test/board.exp.json new file mode 100644 index 000000000..1d7898242 --- /dev/null +++ b/e2etests/testdata/stable/giant_markdown_test/board.exp.json @@ -0,0 +1,214 @@ +{ + "name": "", + "shapes": [ + { + "id": "md", + "type": "text", + "pos": { + "x": 0, + "y": 226 + }, + "width": 3051, + "height": 4843, + "level": 1, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#FFFFFF", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "# Markdown: Syntax\n\n- [Overview](#overview)\n - [Philosophy](#philosophy)\n - [Inline HTML](#html)\n - [Automatic Escaping for Special Characters](#autoescape)\n- [Block Elements](#block)\n - [Paragraphs and Line Breaks](#p)\n - [Headers](#header)\n - [Blockquotes](#blockquote)\n - [Lists](#list)\n - [Code Blocks](#precode)\n - [Horizontal Rules](#hr)\n- [Span Elements](#span)\n - [Links](#link)\n - [Emphasis](#em)\n - [Code](#code)\n - [Images](#img)\n- [Miscellaneous](#misc)\n - [Backslash Escapes](#backslash)\n - [Automatic Links](#autolink)\n\n**Note:** This document is itself written using Markdown; you\ncan [see the source for it by adding '.text' to the URL](/projects/markdown/syntax.text).\n\n---\n\n## Overview\n\n### Philosophy\n\nMarkdown is intended to be as easy-to-read and easy-to-write as is feasible.\n\nReadability, however, is emphasized above all else. A Markdown-formatted\ndocument should be publishable as-is, as plain text, without looking\nlike it's been marked up with tags or formatting instructions. While\nMarkdown's syntax has been influenced by several existing text-to-HTML\nfilters -- including [Setext](http://docutils.sourceforge.net/mirror/setext.html), [atx](http://www.aaronsw.com/2002/atx/), [Textile](http://textism.com/tools/textile/), [reStructuredText](http://docutils.sourceforge.net/rst.html),\n[Grutatext](http://www.triptico.com/software/grutatxt.html), and [EtText](http://ettext.taint.org/doc/) -- the single biggest source of\ninspiration for Markdown's syntax is the format of plain text email.\n\n## Block Elements\n\n### Paragraphs and Line Breaks\n\nA paragraph is simply one or more consecutive lines of text, separated\nby one or more blank lines. (A blank line is any line that looks like a\nblank line -- a line containing nothing but spaces or tabs is considered\nblank.) Normal paragraphs should not be indented with spaces or tabs.\n\nThe implication of the \"one or more consecutive lines of text\" rule is\nthat Markdown supports \"hard-wrapped\" text paragraphs. This differs\nsignificantly from most other text-to-HTML formatters (including Movable\nType's \"Convert Line Breaks\" option) which translate every line break\nend a line with two or more spaces, then type return.\n\n### Headers\n\nMarkdown supports two styles of headers, [Setext] [1] and [atx] [2].\n\nOptionally, you may \"close\" atx-style headers. This is purely\ncosmetic -- you can use this if you think it looks better. The\nclosing hashes don't even need to match the number of hashes\nused to open the header. (The number of opening hashes\ndetermines the header level.)\n\n### Blockquotes\n\nfamiliar with quoting passages of text in an email message, then you\nknow how to create a blockquote in Markdown. It looks best if you hard\n\n> This is a blockquote with two paragraphs. Lorem ipsum dolor sit amet,\n> consectetuer adipiscing elit. Aliquam hendrerit mi posuere lectus.\n> Vestibulum enim wisi, viverra nec, fringilla in, laoreet vitae, risus.\n>\n> Donec sit amet nisl. Aliquam semper ipsum sit amet velit. Suspendisse\n> id sem consectetuer libero luctus adipiscing.\n\nline of a hard-wrapped paragraph:\n\n> This is a blockquote with two paragraphs. Lorem ipsum dolor sit amet,\n> consectetuer adipiscing elit. Aliquam hendrerit mi posuere lectus.\n> Vestibulum enim wisi, viverra nec, fringilla in, laoreet vitae, risus.\n\n> Donec sit amet nisl. Aliquam semper ipsum sit amet velit. Suspendisse\n> id sem consectetuer libero luctus adipiscing.\n\nBlockquotes can be nested (i.e. a blockquote-in-a-blockquote) by\n\n> This is the first level of quoting.\n>\n> > This is nested blockquote.\n>\n> Back to the first level.\n\nBlockquotes can contain other Markdown elements, including headers, lists,\nand code blocks:\n\n> ## This is a header.\n>\n> 1. This is the first list item.\n> 2. This is the second list item.\n>\n> Here's some example code:\n>\n> return shell_exec(\"echo $input $markdown_script\");\n\nAny decent text editor should make email-style quoting easy. For\nexample, with BBEdit, you can make a selection and choose Increase\nQuote Level from the Text menu.\n\n### Lists\n\nMarkdown supports ordered (numbered) and unordered (bulleted) lists.\n\nUnordered lists use asterisks, pluses, and hyphens -- interchangably\n-- as list markers:\n\n- Red\n- Green\n- Blue\n\nis equivalent to:\n\n- Red\n- Green\n- Blue\n\nand:\n\n- Red\n- Green\n- Blue\n\nOrdered lists use numbers followed by periods:\n\n1. Bird\n2. McHale\n3. Parish\n\nIt's important to note that the actual numbers you use to mark the\nlist have no effect on the HTML output Markdown produces. The HTML\nMarkdown produces from the above list is:\n\nIf you instead wrote the list in Markdown like this:\n\n1. Bird\n1. McHale\n1. Parish\n\nor even:\n\n3. Bird\n1. McHale\n1. Parish\n\nyou'd get the exact same HTML output. The point is, if you want to,\nyou can use ordinal numbers in your ordered Markdown lists, so that\nthe numbers in your source match the numbers in your published HTML.\nBut if you want to be lazy, you don't have to.\n\nTo make lists look nice, you can wrap items with hanging indents:\n\n- Lorem ipsum dolor sit amet, consectetuer adipiscing elit.\n Aliquam hendrerit mi posuere lectus. Vestibulum enim wisi,\n viverra nec, fringilla in, laoreet vitae, risus.\n- Donec sit amet nisl. Aliquam semper ipsum sit amet velit.\n Suspendisse id sem consectetuer libero luctus adipiscing.\n\nBut if you want to be lazy, you don't have to:\n\n- Lorem ipsum dolor sit amet, consectetuer adipiscing elit.\n Aliquam hendrerit mi posuere lectus. Vestibulum enim wisi,\n viverra nec, fringilla in, laoreet vitae, risus.\n- Donec sit amet nisl. Aliquam semper ipsum sit amet velit.\n Suspendisse id sem consectetuer libero luctus adipiscing.\n\nList items may consist of multiple paragraphs. Each subsequent\nparagraph in a list item must be indented by either 4 spaces\nor one tab:\n\n1. This is a list item with two paragraphs. Lorem ipsum dolor\n sit amet, consectetuer adipiscing elit. Aliquam hendrerit\n mi posuere lectus.\n\n Vestibulum enim wisi, viverra nec, fringilla in, laoreet\n vitae, risus. Donec sit amet nisl. Aliquam semper ipsum\n sit amet velit.\n\n2. Suspendisse id sem consectetuer libero luctus adipiscing.\n\nIt looks nice if you indent every line of the subsequent\nparagraphs, but here again, Markdown will allow you to be\nlazy:\n\n- This is a list item with two paragraphs.\n\n This is the second paragraph in the list item. You're\n\n only required to indent the first line. Lorem ipsum dolor\n sit amet, consectetuer adipiscing elit.\n\n- Another item in the same list.\n\ndelimiters need to be indented:\n\n- A list item with a blockquote:\n\n > This is a blockquote\n > inside a list item.\n\nTo put a code block within a list item, the code block needs\nto be indented _twice_ -- 8 spaces or two tabs:\n\n- A list item with a code block:\n\n### Code Blocks\n\nPre-formatted code blocks are used for writing about programming or\nmarkup source code. Rather than forming normal paragraphs, the lines\nof a code block are interpreted literally. Markdown wraps a code block\n\nTo produce a code block in Markdown, simply indent every line of the\nblock by at least 4 spaces or 1 tab.\n\nThis is a normal paragraph:\n\n This is a code block.\n\nHere is an example of AppleScript:\n\n tell application \"Foo\"\n beep\n end tell\n\nA code block continues until it reaches a line that is not indented\n(or the end of the article).\n\nare automatically converted into HTML entities. This makes it very\neasy to include example HTML source code using Markdown -- just paste\nit and indent it, and Markdown will handle the hassle of encoding the\nampersands and angle brackets. For example, this:\n\nRegular Markdown syntax is not processed within code blocks. E.g.,\nasterisks are just literal asterisks within a code block. This means\nit's also easy to use Markdown to write about Markdown's own syntax.\n\n## Span Elements\n\n### Links\n\nMarkdown supports two style of links: _inline_ and _reference_.\n\nIn both styles, the link text is delimited by [square brackets].\n\nTo create an inline link, use a set of regular parentheses immediately\nafter the link text's closing square bracket. Inside the parentheses,\nput the URL where you want the link to point, along with an _optional_\ntitle for the link, surrounded in quotes. For example:\n\nThis is [an example](http://example.com/) inline link.\n\n[This link](http://example.net/) has no title attribute.\n\n### Emphasis\n\n_single asterisks_\n\n_single underscores_\n\n**double asterisks**\n\n**double underscores**\n\n### Code\n\nUnlike a pre-formatted code block, a code span indicates code within a\nnormal paragraph. For example:\n", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "markdown", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 3051, + "labelHeight": 4843 + }, + { + "id": "a", + "type": "", + "pos": { + "x": 1469, + "y": 0 + }, + "width": 113, + "height": 126, + "level": 1, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#F7F8FE", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "a", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 13, + "labelHeight": 26, + "labelPosition": "INSIDE_MIDDLE_CENTER" + }, + { + "id": "b", + "type": "", + "pos": { + "x": 1469, + "y": 5169 + }, + "width": 113, + "height": 126, + "level": 1, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#F7F8FE", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "b", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 13, + "labelHeight": 26, + "labelPosition": "INSIDE_MIDDLE_CENTER" + } + ], + "connections": [ + { + "id": "(a -> md)[0]", + "src": "a", + "srcArrow": "none", + "srcLabel": "", + "dst": "md", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 1525.5, + "y": 126 + }, + { + "x": 1525.5, + "y": 166 + }, + { + "x": 1525.5, + "y": 186 + }, + { + "x": 1525.5, + "y": 226 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "(md -> b)[0]", + "src": "md", + "srcArrow": "none", + "srcLabel": "", + "dst": "b", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 1525.5, + "y": 5069 + }, + { + "x": 1525.5, + "y": 5109 + }, + { + "x": 1525.5, + "y": 5129 + }, + { + "x": 1525.5, + "y": 5169 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + } + ] +} diff --git a/e2etests/testdata/stable/giant_markdown_test/sketch.exp.svg b/e2etests/testdata/stable/giant_markdown_test/sketch.exp.svg new file mode 100644 index 000000000..107f097cb --- /dev/null +++ b/e2etests/testdata/stable/giant_markdown_test/sketch.exp.svg @@ -0,0 +1,1078 @@ + +

Markdown: Syntax

+ +

Note: This document is itself written using Markdown; you +can see the source for it by adding '.text' to the URL.

+
+

Overview

+

Philosophy

+

Markdown is intended to be as easy-to-read and easy-to-write as is feasible.

+

Readability, however, is emphasized above all else. A Markdown-formatted +document should be publishable as-is, as plain text, without looking +like it's been marked up with tags or formatting instructions. While +Markdown's syntax has been influenced by several existing text-to-HTML +filters -- including Setext, atx, Textile, reStructuredText, +Grutatext, and EtText -- the single biggest source of +inspiration for Markdown's syntax is the format of plain text email.

+

Block Elements

+

Paragraphs and Line Breaks

+

A paragraph is simply one or more consecutive lines of text, separated +by one or more blank lines. (A blank line is any line that looks like a +blank line -- a line containing nothing but spaces or tabs is considered +blank.) Normal paragraphs should not be indented with spaces or tabs.

+

The implication of the "one or more consecutive lines of text" rule is +that Markdown supports "hard-wrapped" text paragraphs. This differs +significantly from most other text-to-HTML formatters (including Movable +Type's "Convert Line Breaks" option) which translate every line break +end a line with two or more spaces, then type return.

+

Headers

+

Markdown supports two styles of headers, [Setext] [1] and [atx] [2].

+

Optionally, you may "close" atx-style headers. This is purely +cosmetic -- you can use this if you think it looks better. The +closing hashes don't even need to match the number of hashes +used to open the header. (The number of opening hashes +determines the header level.)

+

Blockquotes

+

familiar with quoting passages of text in an email message, then you +know how to create a blockquote in Markdown. It looks best if you hard

+
+

This is a blockquote with two paragraphs. Lorem ipsum dolor sit amet, +consectetuer adipiscing elit. Aliquam hendrerit mi posuere lectus. +Vestibulum enim wisi, viverra nec, fringilla in, laoreet vitae, risus.

+

Donec sit amet nisl. Aliquam semper ipsum sit amet velit. Suspendisse +id sem consectetuer libero luctus adipiscing.

+
+

line of a hard-wrapped paragraph:

+
+

This is a blockquote with two paragraphs. Lorem ipsum dolor sit amet, +consectetuer adipiscing elit. Aliquam hendrerit mi posuere lectus. +Vestibulum enim wisi, viverra nec, fringilla in, laoreet vitae, risus.

+
+
+

Donec sit amet nisl. Aliquam semper ipsum sit amet velit. Suspendisse +id sem consectetuer libero luctus adipiscing.

+
+

Blockquotes can be nested (i.e. a blockquote-in-a-blockquote) by

+
+

This is the first level of quoting.

+
+

This is nested blockquote.

+
+

Back to the first level.

+
+

Blockquotes can contain other Markdown elements, including headers, lists, +and code blocks:

+
+

This is a header.

+
    +
  1. This is the first list item.
  2. +
  3. This is the second list item.
  4. +
+

Here's some example code:

+
return shell_exec("echo $input  $markdown_script");
+
+
+

Any decent text editor should make email-style quoting easy. For +example, with BBEdit, you can make a selection and choose Increase +Quote Level from the Text menu.

+

Lists

+

Markdown supports ordered (numbered) and unordered (bulleted) lists.

+

Unordered lists use asterisks, pluses, and hyphens -- interchangably +-- as list markers:

+
    +
  • Red
  • +
  • Green
  • +
  • Blue
  • +
+

is equivalent to:

+
    +
  • Red
  • +
  • Green
  • +
  • Blue
  • +
+

and:

+
    +
  • Red
  • +
  • Green
  • +
  • Blue
  • +
+

Ordered lists use numbers followed by periods:

+
    +
  1. Bird
  2. +
  3. McHale
  4. +
  5. Parish
  6. +
+

It's important to note that the actual numbers you use to mark the +list have no effect on the HTML output Markdown produces. The HTML +Markdown produces from the above list is:

+

If you instead wrote the list in Markdown like this:

+
    +
  1. Bird
  2. +
  3. McHale
  4. +
  5. Parish
  6. +
+

or even:

+
    +
  1. Bird
  2. +
  3. McHale
  4. +
  5. Parish
  6. +
+

you'd get the exact same HTML output. The point is, if you want to, +you can use ordinal numbers in your ordered Markdown lists, so that +the numbers in your source match the numbers in your published HTML. +But if you want to be lazy, you don't have to.

+

To make lists look nice, you can wrap items with hanging indents:

+
    +
  • Lorem ipsum dolor sit amet, consectetuer adipiscing elit. +Aliquam hendrerit mi posuere lectus. Vestibulum enim wisi, +viverra nec, fringilla in, laoreet vitae, risus.
  • +
  • Donec sit amet nisl. Aliquam semper ipsum sit amet velit. +Suspendisse id sem consectetuer libero luctus adipiscing.
  • +
+

But if you want to be lazy, you don't have to:

+
    +
  • Lorem ipsum dolor sit amet, consectetuer adipiscing elit. +Aliquam hendrerit mi posuere lectus. Vestibulum enim wisi, +viverra nec, fringilla in, laoreet vitae, risus.
  • +
  • Donec sit amet nisl. Aliquam semper ipsum sit amet velit. +Suspendisse id sem consectetuer libero luctus adipiscing.
  • +
+

List items may consist of multiple paragraphs. Each subsequent +paragraph in a list item must be indented by either 4 spaces +or one tab:

+
    +
  1. +

    This is a list item with two paragraphs. Lorem ipsum dolor +sit amet, consectetuer adipiscing elit. Aliquam hendrerit +mi posuere lectus.

    +

    Vestibulum enim wisi, viverra nec, fringilla in, laoreet +vitae, risus. Donec sit amet nisl. Aliquam semper ipsum +sit amet velit.

    +
  2. +
  3. +

    Suspendisse id sem consectetuer libero luctus adipiscing.

    +
  4. +
+

It looks nice if you indent every line of the subsequent +paragraphs, but here again, Markdown will allow you to be +lazy:

+
    +
  • +

    This is a list item with two paragraphs.

    +
    This is the second paragraph in the list item. You're
    +
    +

    only required to indent the first line. Lorem ipsum dolor +sit amet, consectetuer adipiscing elit.

    +
  • +
  • +

    Another item in the same list.

    +
  • +
+

delimiters need to be indented:

+
    +
  • +

    A list item with a blockquote:

    +
    +

    This is a blockquote +inside a list item.

    +
    +
  • +
+

To put a code block within a list item, the code block needs +to be indented twice -- 8 spaces or two tabs:

+
    +
  • A list item with a code block:
  • +
+

Code Blocks

+

Pre-formatted code blocks are used for writing about programming or +markup source code. Rather than forming normal paragraphs, the lines +of a code block are interpreted literally. Markdown wraps a code block

+

To produce a code block in Markdown, simply indent every line of the +block by at least 4 spaces or 1 tab.

+

This is a normal paragraph:

+
This is a code block.
+
+

Here is an example of AppleScript:

+
tell application "Foo"
+    beep
+end tell
+
+

A code block continues until it reaches a line that is not indented +(or the end of the article).

+

are automatically converted into HTML entities. This makes it very +easy to include example HTML source code using Markdown -- just paste +it and indent it, and Markdown will handle the hassle of encoding the +ampersands and angle brackets. For example, this:

+

Regular Markdown syntax is not processed within code blocks. E.g., +asterisks are just literal asterisks within a code block. This means +it's also easy to use Markdown to write about Markdown's own syntax.

+

Span Elements

+

Links

+

Markdown supports two style of links: inline and reference.

+

In both styles, the link text is delimited by [square brackets].

+

To create an inline link, use a set of regular parentheses immediately +after the link text's closing square bracket. Inside the parentheses, +put the URL where you want the link to point, along with an optional +title for the link, surrounded in quotes. For example:

+

This is an example inline link.

+

This link has no title attribute.

+

Emphasis

+

single asterisks

+

single underscores

+

double asterisks

+

double underscores

+

Code

+

Unlike a pre-formatted code block, a code span indicates code within a +normal paragraph. For example:

+
ab
\ No newline at end of file diff --git a/e2etests/testdata/stable/hr/board.exp.json b/e2etests/testdata/stable/hr/board.exp.json new file mode 100644 index 000000000..4c71d5bdb --- /dev/null +++ b/e2etests/testdata/stable/hr/board.exp.json @@ -0,0 +1,214 @@ +{ + "name": "", + "shapes": [ + { + "id": "md", + "type": "text", + "pos": { + "x": 0, + "y": 226 + }, + "width": 738, + "height": 119, + "level": 1, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#FFFFFF", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "\n**Note:** This document is itself written using Markdown; you\ncan [see the source for it by adding '.text' to the URL](/projects/markdown/syntax.text).\n\n---\n\n## Overview\n", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "markdown", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 738, + "labelHeight": 119 + }, + { + "id": "a", + "type": "", + "pos": { + "x": 313, + "y": 0 + }, + "width": 113, + "height": 126, + "level": 1, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#F7F8FE", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "a", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 13, + "labelHeight": 26, + "labelPosition": "INSIDE_MIDDLE_CENTER" + }, + { + "id": "b", + "type": "", + "pos": { + "x": 313, + "y": 445 + }, + "width": 113, + "height": 126, + "level": 1, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#F7F8FE", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "b", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 13, + "labelHeight": 26, + "labelPosition": "INSIDE_MIDDLE_CENTER" + } + ], + "connections": [ + { + "id": "(a -> md)[0]", + "src": "a", + "srcArrow": "none", + "srcLabel": "", + "dst": "md", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 369, + "y": 126 + }, + { + "x": 369, + "y": 166 + }, + { + "x": 369, + "y": 186 + }, + { + "x": 369, + "y": 226 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "(md -> b)[0]", + "src": "md", + "srcArrow": "none", + "srcLabel": "", + "dst": "b", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 369, + "y": 345 + }, + { + "x": 369, + "y": 385 + }, + { + "x": 369, + "y": 405 + }, + { + "x": 369, + "y": 445 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + } + ] +} diff --git a/e2etests/testdata/stable/hr/sketch.exp.svg b/e2etests/testdata/stable/hr/sketch.exp.svg new file mode 100644 index 000000000..9a6ff8335 --- /dev/null +++ b/e2etests/testdata/stable/hr/sketch.exp.svg @@ -0,0 +1,818 @@ + +

Note: This document is itself written using Markdown; you +can see the source for it by adding '.text' to the URL.

+
+

Overview

+
ab
\ No newline at end of file diff --git a/e2etests/testdata/stable/investigate/board.exp.json b/e2etests/testdata/stable/investigate/board.exp.json new file mode 100644 index 000000000..4c216559b --- /dev/null +++ b/e2etests/testdata/stable/investigate/board.exp.json @@ -0,0 +1,3161 @@ +{ + "name": "", + "shapes": [ + { + "id": "aa", + "type": "step", + "pos": { + "x": 151, + "y": 0 + }, + "width": 122, + "height": 126, + "level": 1, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#EDF0FD", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "aa", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 22, + "labelHeight": 26, + "labelPosition": "INSIDE_MIDDLE_CENTER" + }, + { + "id": "bb", + "type": "step", + "pos": { + "x": 466, + "y": 226 + }, + "width": 123, + "height": 126, + "level": 1, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#EDF0FD", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "bb", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 23, + "labelHeight": 26, + "labelPosition": "INSIDE_MIDDLE_CENTER" + }, + { + "id": "cc", + "type": "step", + "pos": { + "x": 410, + "y": 452 + }, + "width": 121, + "height": 126, + "level": 1, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#EDF0FD", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "cc", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 21, + "labelHeight": 26, + "labelPosition": "INSIDE_MIDDLE_CENTER" + }, + { + "id": "dd", + "type": "", + "pos": { + "x": 5, + "y": 678 + }, + "width": 577, + "height": 226, + "level": 1, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#E3E9FD", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "dd", + "fontSize": 28, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 34, + "labelHeight": 41, + "labelPosition": "INSIDE_TOP_CENTER" + }, + { + "id": "dd.ee", + "type": "diamond", + "pos": { + "x": 55, + "y": 728 + }, + "width": 122, + "height": 126, + "level": 2, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#CFD2DD", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "ee", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 22, + "labelHeight": 26, + "labelPosition": "INSIDE_MIDDLE_CENTER" + }, + { + "id": "ll", + "type": "", + "pos": { + "x": 0, + "y": 2665 + }, + "width": 545, + "height": 457, + "level": 1, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#E3E9FD", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "ll", + "fontSize": 28, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 18, + "labelHeight": 41, + "labelPosition": "INSIDE_TOP_CENTER" + }, + { + "id": "ll.mm", + "type": "oval", + "pos": { + "x": 50, + "y": 2941 + }, + "width": 131, + "height": 131, + "level": 2, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#EDF0FD", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "mm", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 31, + "labelHeight": 26, + "labelPosition": "INSIDE_MIDDLE_CENTER" + }, + { + "id": "ff", + "type": "", + "pos": { + "x": 0, + "y": 2108 + }, + "width": 567, + "height": 457, + "level": 1, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#E3E9FD", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "ff", + "fontSize": 28, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 23, + "labelHeight": 41, + "labelPosition": "INSIDE_TOP_CENTER" + }, + { + "id": "ff.mm", + "type": "oval", + "pos": { + "x": 50, + "y": 2384 + }, + "width": 131, + "height": 131, + "level": 2, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#EDF0FD", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "mm", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 31, + "labelHeight": 26, + "labelPosition": "INSIDE_MIDDLE_CENTER" + }, + { + "id": "ff.gg", + "type": "diamond", + "pos": { + "x": 372, + "y": 2158 + }, + "width": 123, + "height": 126, + "level": 2, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#CFD2DD", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "gg", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 23, + "labelHeight": 26, + "labelPosition": "INSIDE_MIDDLE_CENTER" + }, + { + "id": "dd.hh", + "type": "diamond", + "pos": { + "x": 409, + "y": 728 + }, + "width": 123, + "height": 126, + "level": 2, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#CFD2DD", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "hh", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 23, + "labelHeight": 26, + "labelPosition": "INSIDE_MIDDLE_CENTER" + }, + { + "id": "ww", + "type": "queue", + "pos": { + "x": 553, + "y": 1882 + }, + "width": 131, + "height": 126, + "level": 1, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#F0F3F9", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": { + "Scheme": "https", + "Opaque": "", + "User": null, + "Host": "icons.terrastruct.com", + "Path": "/essentials/time.svg", + "RawPath": "", + "ForceQuery": false, + "RawQuery": "", + "Fragment": "", + "RawFragment": "" + }, + "iconPosition": "INSIDE_MIDDLE_CENTER", + "fields": null, + "methods": null, + "columns": null, + "label": "ww", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 31, + "labelHeight": 26, + "labelPosition": "INSIDE_MIDDLE_CENTER" + }, + { + "id": "yy", + "type": "", + "pos": { + "x": 465, + "y": 3222 + }, + "width": 323, + "height": 452, + "level": 1, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#E3E9FD", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "yy", + "fontSize": 28, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 32, + "labelHeight": 41, + "labelPosition": "INSIDE_TOP_CENTER" + }, + { + "id": "yy.zz", + "type": "queue", + "pos": { + "x": 602, + "y": 3272 + }, + "width": 120, + "height": 126, + "level": 2, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#F0F3F9", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": { + "Scheme": "https", + "Opaque": "", + "User": null, + "Host": "icons.terrastruct.com", + "Path": "/essentials/time.svg", + "RawPath": "", + "ForceQuery": false, + "RawQuery": "", + "Fragment": "", + "RawFragment": "" + }, + "iconPosition": "INSIDE_MIDDLE_CENTER", + "fields": null, + "methods": null, + "columns": null, + "label": "zz", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 20, + "labelHeight": 26, + "labelPosition": "INSIDE_MIDDLE_CENTER" + }, + { + "id": "ad", + "type": "parallelogram", + "pos": { + "x": 601, + "y": 4100 + }, + "width": 123, + "height": 126, + "level": 1, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "red", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "ad", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 23, + "labelHeight": 26, + "labelPosition": "INSIDE_MIDDLE_CENTER" + }, + { + "id": "nn", + "type": "cylinder", + "pos": { + "x": 4, + "y": 3774 + }, + "width": 769, + "height": 226, + "level": 1, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#EDF0FD", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "nn", + "fontSize": 28, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 33, + "labelHeight": 41, + "labelPosition": "INSIDE_TOP_CENTER" + }, + { + "id": "ii", + "type": "", + "pos": { + "x": 59, + "y": 1004 + }, + "width": 114, + "height": 126, + "level": 1, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#F7F8FE", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "ii", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 14, + "labelHeight": 26, + "labelPosition": "INSIDE_MIDDLE_CENTER" + }, + { + "id": "jj", + "type": "", + "pos": { + "x": 58, + "y": 1280 + }, + "width": 115, + "height": 126, + "level": 1, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#F7F8FE", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "jj", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 15, + "labelHeight": 26, + "labelPosition": "INSIDE_MIDDLE_CENTER" + }, + { + "id": "kk", + "type": "", + "pos": { + "x": 55, + "y": 1606 + }, + "width": 122, + "height": 126, + "level": 1, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#F7F8FE", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "kk", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 22, + "labelHeight": 26, + "labelPosition": "INSIDE_MIDDLE_CENTER" + }, + { + "id": "nn.oo", + "type": "", + "pos": { + "x": 54, + "y": 3824 + }, + "width": 123, + "height": 126, + "level": 2, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#EDF0FD", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "oo", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 23, + "labelHeight": 26, + "labelPosition": "INSIDE_MIDDLE_CENTER" + }, + { + "id": "ff.pp", + "type": "", + "pos": { + "x": 372, + "y": 2387 + }, + "width": 123, + "height": 126, + "level": 2, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#EDF0FD", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "pp", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 23, + "labelHeight": 26, + "labelPosition": "INSIDE_MIDDLE_CENTER" + }, + { + "id": "ll.qq", + "type": "", + "pos": { + "x": 372, + "y": 2715 + }, + "width": 124, + "height": 126, + "level": 2, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#EDF0FD", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "qq", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 24, + "labelHeight": 26, + "labelPosition": "INSIDE_MIDDLE_CENTER" + }, + { + "id": "ll.rr", + "type": "", + "pos": { + "x": 375, + "y": 2944 + }, + "width": 118, + "height": 126, + "level": 2, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#EDF0FD", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "rr", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 18, + "labelHeight": 26, + "labelPosition": "INSIDE_MIDDLE_CENTER" + }, + { + "id": "ss", + "type": "", + "pos": { + "x": 590, + "y": 1230 + }, + "width": 218, + "height": 226, + "level": 1, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#E3E9FD", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "ss", + "fontSize": 28, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 28, + "labelHeight": 41, + "labelPosition": "INSIDE_TOP_CENTER" + }, + { + "id": "ss.tt", + "type": "", + "pos": { + "x": 640, + "y": 1280 + }, + "width": 118, + "height": 126, + "level": 2, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#EDF0FD", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "tt", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 18, + "labelHeight": 26, + "labelPosition": "INSIDE_MIDDLE_CENTER" + }, + { + "id": "uu", + "type": "", + "pos": { + "x": 588, + "y": 1556 + }, + "width": 223, + "height": 226, + "level": 1, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#E3E9FD", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "uu", + "fontSize": 28, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 32, + "labelHeight": 41, + "labelPosition": "INSIDE_TOP_CENTER" + }, + { + "id": "uu.vv", + "type": "", + "pos": { + "x": 638, + "y": 1606 + }, + "width": 123, + "height": 126, + "level": 2, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#EDF0FD", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "vv", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 23, + "labelHeight": 26, + "labelPosition": "INSIDE_MIDDLE_CENTER" + }, + { + "id": "rm", + "type": "", + "pos": { + "x": 616, + "y": 2944 + }, + "width": 124, + "height": 126, + "level": 1, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#F7F8FE", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "rm", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 24, + "labelHeight": 26, + "labelPosition": "INSIDE_MIDDLE_CENTER" + }, + { + "id": "nn.xx", + "type": "", + "pos": { + "x": 338, + "y": 3824 + }, + "width": 122, + "height": 126, + "level": 2, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#EDF0FD", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "xx", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 22, + "labelHeight": 26, + "labelPosition": "INSIDE_MIDDLE_CENTER" + }, + { + "id": "yy.ab", + "type": "", + "pos": { + "x": 601, + "y": 3498 + }, + "width": 123, + "height": 126, + "level": 2, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#EDF0FD", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "ab", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 23, + "labelHeight": 26, + "labelPosition": "INSIDE_MIDDLE_CENTER" + }, + { + "id": "nn.ac", + "type": "", + "pos": { + "x": 601, + "y": 3824 + }, + "width": 122, + "height": 126, + "level": 2, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#EDF0FD", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "ac", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 22, + "labelHeight": 26, + "labelPosition": "INSIDE_MIDDLE_CENTER" + } + ], + "connections": [ + { + "id": "(aa -- bb)[0]", + "src": "aa", + "srcArrow": "none", + "srcLabel": "", + "dst": "bb", + "dstArrow": "none", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 263, + "y": 81 + }, + { + "x": 474.6, + "y": 157 + }, + { + "x": 527.6, + "y": 186 + }, + { + "x": 528, + "y": 226 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "(bb -- cc)[0]", + "src": "bb", + "srcArrow": "none", + "srcLabel": "", + "dst": "cc", + "dstArrow": "none", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 495, + "y": 352 + }, + { + "x": 475, + "y": 392 + }, + { + "x": 470, + "y": 412 + }, + { + "x": 470, + "y": 452 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "(aa -> dd.ee)[0]", + "src": "aa", + "srcArrow": "none", + "srcLabel": "", + "dst": "dd.ee", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "1", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 7, + "labelHeight": 21, + "labelPosition": "INSIDE_MIDDLE_CENTER", + "labelPercentage": 0, + "route": [ + { + "x": 158, + "y": 126 + }, + { + "x": 124, + "y": 166 + }, + { + "x": 115.5, + "y": 198.6 + }, + { + "x": 115.5, + "y": 232.5 + }, + { + "x": 115.5, + "y": 266.4 + }, + { + "x": 115.5, + "y": 311.6 + }, + { + "x": 115.5, + "y": 345.5 + }, + { + "x": 115.5, + "y": 379.4 + }, + { + "x": 115.5, + "y": 424.6 + }, + { + "x": 115.5, + "y": 458.5 + }, + { + "x": 115.5, + "y": 492.4 + }, + { + "x": 115.5, + "y": 537.6 + }, + { + "x": 115.5, + "y": 571.5 + }, + { + "x": 115.5, + "y": 605.4 + }, + { + "x": 115.6, + "y": 688 + }, + { + "x": 116, + "y": 728 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "(bb -> ff.gg)[0]", + "src": "bb", + "srcArrow": "none", + "srcLabel": "", + "dst": "ff.gg", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "2", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 9, + "labelHeight": 21, + "labelPosition": "INSIDE_MIDDLE_CENTER", + "labelPercentage": 0, + "route": [ + { + "x": 564, + "y": 333 + }, + { + "x": 610, + "y": 388.2 + }, + { + "x": 621.5, + "y": 424.6 + }, + { + "x": 621.5, + "y": 458.5 + }, + { + "x": 621.5, + "y": 492.4 + }, + { + "x": 621.5, + "y": 537.6 + }, + { + "x": 621.5, + "y": 571.5 + }, + { + "x": 621.5, + "y": 605.4 + }, + { + "x": 621.5, + "y": 638 + }, + { + "x": 621.5, + "y": 653 + }, + { + "x": 621.5, + "y": 668 + }, + { + "x": 621.5, + "y": 700.6 + }, + { + "x": 621.5, + "y": 734.5 + }, + { + "x": 621.5, + "y": 768.4 + }, + { + "x": 621.5, + "y": 813.6 + }, + { + "x": 621.5, + "y": 847.5 + }, + { + "x": 621.5, + "y": 881.4 + }, + { + "x": 572.95, + "y": 914 + }, + { + "x": 500.125, + "y": 929 + }, + { + "x": 427.29999999999995, + "y": 944 + }, + { + "x": 378.75, + "y": 976.6 + }, + { + "x": 378.75, + "y": 1010.5 + }, + { + "x": 378.75, + "y": 1044.4 + }, + { + "x": 378.75, + "y": 1089.6 + }, + { + "x": 378.75, + "y": 1123.5 + }, + { + "x": 378.75, + "y": 1157.4 + }, + { + "x": 378.75, + "y": 1190 + }, + { + "x": 378.75, + "y": 1205 + }, + { + "x": 378.75, + "y": 1220 + }, + { + "x": 378.75, + "y": 1252.6 + }, + { + "x": 378.75, + "y": 1286.5 + }, + { + "x": 378.75, + "y": 1320.4 + }, + { + "x": 378.75, + "y": 1365.6 + }, + { + "x": 378.75, + "y": 1399.5 + }, + { + "x": 378.75, + "y": 1433.4 + }, + { + "x": 378.75, + "y": 1466 + }, + { + "x": 378.75, + "y": 1481 + }, + { + "x": 378.75, + "y": 1496 + }, + { + "x": 378.75, + "y": 1516 + }, + { + "x": 378.75, + "y": 1531 + }, + { + "x": 378.75, + "y": 1546 + }, + { + "x": 378.75, + "y": 1578.6 + }, + { + "x": 378.75, + "y": 1612.5 + }, + { + "x": 378.75, + "y": 1646.4 + }, + { + "x": 378.75, + "y": 1691.6 + }, + { + "x": 378.75, + "y": 1725.5 + }, + { + "x": 378.75, + "y": 1759.4 + }, + { + "x": 378.75, + "y": 1792 + }, + { + "x": 378.75, + "y": 1807 + }, + { + "x": 378.75, + "y": 1822 + }, + { + "x": 378.75, + "y": 1854.6 + }, + { + "x": 378.75, + "y": 1888.5 + }, + { + "x": 378.75, + "y": 1922.4 + }, + { + "x": 378.75, + "y": 1967.6 + }, + { + "x": 378.75, + "y": 2001.5 + }, + { + "x": 378.75, + "y": 2035.4 + }, + { + "x": 385.4, + "y": 2122.2 + }, + { + "x": 412, + "y": 2179 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "(cc -> dd.hh)[0]", + "src": "cc", + "srcArrow": "none", + "srcLabel": "", + "dst": "dd.hh", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "3", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 9, + "labelHeight": 21, + "labelPosition": "INSIDE_MIDDLE_CENTER", + "labelPercentage": 0, + "route": [ + { + "x": 470, + "y": 578 + }, + { + "x": 470, + "y": 618 + }, + { + "x": 470, + "y": 688 + }, + { + "x": 470, + "y": 728 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "(dd.ee -> ii)[0]", + "src": "dd.ee", + "srcArrow": "none", + "srcLabel": "", + "dst": "ii", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 116, + "y": 854 + }, + { + "x": 115.6, + "y": 894 + }, + { + "x": 115.5, + "y": 964 + }, + { + "x": 115.5, + "y": 1004 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "(ii -- jj)[0]", + "src": "ii", + "srcArrow": "none", + "srcLabel": "", + "dst": "jj", + "dstArrow": "none", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 115.5, + "y": 1130 + }, + { + "x": 115.5, + "y": 1170 + }, + { + "x": 115.5, + "y": 1240 + }, + { + "x": 115.5, + "y": 1280 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "(jj -> kk)[0]", + "src": "jj", + "srcArrow": "none", + "srcLabel": "", + "dst": "kk", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 115.5, + "y": 1406 + }, + { + "x": 115.5, + "y": 1446 + }, + { + "x": 115.5, + "y": 1466 + }, + { + "x": 115.5, + "y": 1481 + }, + { + "x": 115.5, + "y": 1496 + }, + { + "x": 115.5, + "y": 1566 + }, + { + "x": 115.5, + "y": 1606 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "(kk -> ff.mm)[0]", + "src": "kk", + "srcArrow": "none", + "srcLabel": "", + "dst": "ff.mm", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "4", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 8, + "labelHeight": 21, + "labelPosition": "INSIDE_MIDDLE_CENTER", + "labelPercentage": 0, + "route": [ + { + "x": 115.5, + "y": 1732 + }, + { + "x": 115.5, + "y": 1772 + }, + { + "x": 115.5, + "y": 1792 + }, + { + "x": 115.5, + "y": 1807 + }, + { + "x": 115.5, + "y": 1822 + }, + { + "x": 115.5, + "y": 1854.6 + }, + { + "x": 115.5, + "y": 1888.5 + }, + { + "x": 115.5, + "y": 1922.4 + }, + { + "x": 115.5, + "y": 1967.6 + }, + { + "x": 115.5, + "y": 2001.5 + }, + { + "x": 115.5, + "y": 2035.4 + }, + { + "x": 115.5, + "y": 2068 + }, + { + "x": 115.5, + "y": 2083 + }, + { + "x": 115.5, + "y": 2098 + }, + { + "x": 115.5, + "y": 2130.6 + }, + { + "x": 115.5, + "y": 2164.5 + }, + { + "x": 115.5, + "y": 2198.4 + }, + { + "x": 115.6, + "y": 2344 + }, + { + "x": 116, + "y": 2384 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "(ff.mm -> ll.mm)[0]", + "src": "ff.mm", + "srcArrow": "none", + "srcLabel": "", + "dst": "ll.mm", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "5", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 8, + "labelHeight": 21, + "labelPosition": "INSIDE_MIDDLE_CENTER", + "labelPercentage": 0, + "route": [ + { + "x": 116, + "y": 2515 + }, + { + "x": 115.6, + "y": 2555 + }, + { + "x": 115.5, + "y": 2575 + }, + { + "x": 115.5, + "y": 2590 + }, + { + "x": 115.5, + "y": 2605 + }, + { + "x": 115.5, + "y": 2625 + }, + { + "x": 115.5, + "y": 2640 + }, + { + "x": 115.5, + "y": 2655 + }, + { + "x": 115.5, + "y": 2687.6 + }, + { + "x": 115.5, + "y": 2721.5 + }, + { + "x": 115.5, + "y": 2755.4 + }, + { + "x": 115.6, + "y": 2901 + }, + { + "x": 116, + "y": 2941 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "(ll.mm -> nn.oo)[0]", + "src": "ll.mm", + "srcArrow": "none", + "srcLabel": "", + "dst": "nn.oo", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "6", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 8, + "labelHeight": 21, + "labelPosition": "INSIDE_MIDDLE_CENTER", + "labelPercentage": 0, + "route": [ + { + "x": 116, + "y": 3072 + }, + { + "x": 115.6, + "y": 3112 + }, + { + "x": 115.5, + "y": 3132 + }, + { + "x": 115.5, + "y": 3147 + }, + { + "x": 115.5, + "y": 3162 + }, + { + "x": 115.5, + "y": 3182 + }, + { + "x": 115.5, + "y": 3197 + }, + { + "x": 115.5, + "y": 3212 + }, + { + "x": 115.5, + "y": 3244.6 + }, + { + "x": 115.5, + "y": 3278.5 + }, + { + "x": 115.5, + "y": 3312.4 + }, + { + "x": 115.5, + "y": 3357.6 + }, + { + "x": 115.5, + "y": 3391.5 + }, + { + "x": 115.5, + "y": 3425.4 + }, + { + "x": 115.5, + "y": 3470.6 + }, + { + "x": 115.5, + "y": 3504.5 + }, + { + "x": 115.5, + "y": 3538.4 + }, + { + "x": 115.5, + "y": 3583.6 + }, + { + "x": 115.5, + "y": 3617.5 + }, + { + "x": 115.5, + "y": 3651.4 + }, + { + "x": 115.5, + "y": 3684 + }, + { + "x": 115.5, + "y": 3699 + }, + { + "x": 115.5, + "y": 3714 + }, + { + "x": 115.5, + "y": 3784 + }, + { + "x": 115.5, + "y": 3824 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "ff.(gg -> pp)[0]", + "src": "ff.gg", + "srcArrow": "none", + "srcLabel": "", + "dst": "ff.pp", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 434, + "y": 2284 + }, + { + "x": 433.8, + "y": 2324 + }, + { + "x": 433.75, + "y": 2344.5 + }, + { + "x": 433.75, + "y": 2386.5 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "(ff.pp -> ll.qq)[0]", + "src": "ff.pp", + "srcArrow": "none", + "srcLabel": "", + "dst": "ll.qq", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 433.75, + "y": 2513.5 + }, + { + "x": 433.75, + "y": 2554.7 + }, + { + "x": 433.75, + "y": 2575 + }, + { + "x": 433.75, + "y": 2590 + }, + { + "x": 433.75, + "y": 2605 + }, + { + "x": 433.75, + "y": 2675 + }, + { + "x": 433.75, + "y": 2715 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "ll.(qq -> rr)[0]", + "src": "ll.qq", + "srcArrow": "none", + "srcLabel": "", + "dst": "ll.rr", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 433.75, + "y": 2841 + }, + { + "x": 433.75, + "y": 2881 + }, + { + "x": 433.75, + "y": 2901.5 + }, + { + "x": 433.75, + "y": 2943.5 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "(dd.hh -> ss.tt)[0]", + "src": "dd.hh", + "srcArrow": "none", + "srcLabel": "", + "dst": "ss.tt", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 470, + "y": 854 + }, + { + "x": 470, + "y": 894 + }, + { + "x": 515.85, + "y": 914 + }, + { + "x": 584.625, + "y": 929 + }, + { + "x": 653.4, + "y": 944 + }, + { + "x": 699.25, + "y": 976.6 + }, + { + "x": 699.25, + "y": 1010.5 + }, + { + "x": 699.25, + "y": 1044.4 + }, + { + "x": 699.25, + "y": 1089.6 + }, + { + "x": 699.25, + "y": 1123.5 + }, + { + "x": 699.25, + "y": 1157.4 + }, + { + "x": 699.25, + "y": 1240 + }, + { + "x": 699.25, + "y": 1280 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "(ss.tt -> uu.vv)[0]", + "src": "ss.tt", + "srcArrow": "none", + "srcLabel": "", + "dst": "uu.vv", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 699.25, + "y": 1406 + }, + { + "x": 699.25, + "y": 1446 + }, + { + "x": 699.25, + "y": 1466 + }, + { + "x": 699.25, + "y": 1481 + }, + { + "x": 699.25, + "y": 1496 + }, + { + "x": 699.25, + "y": 1566 + }, + { + "x": 699.25, + "y": 1606 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "(kk -> ww)[0]", + "src": "kk", + "srcArrow": "none", + "srcLabel": "", + "dst": "ww", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 177.5, + "y": 1689.2140762463343 + }, + { + "x": 400.70000000000005, + "y": 1763.442815249267 + }, + { + "x": 476.8, + "y": 1846 + }, + { + "x": 558, + "y": 1902 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "(uu.vv -> ww)[0]", + "src": "uu.vv", + "srcArrow": "none", + "srcLabel": "", + "dst": "ww", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 699.25, + "y": 1732 + }, + { + "x": 699.25, + "y": 1772 + }, + { + "x": 692, + "y": 1842 + }, + { + "x": 663, + "y": 1882 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "(ww -> rm)[0]", + "src": "ww", + "srcArrow": "none", + "srcLabel": "", + "dst": "rm", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 652, + "y": 2008 + }, + { + "x": 672.6, + "y": 2048 + }, + { + "x": 677.75, + "y": 2068 + }, + { + "x": 677.75, + "y": 2083 + }, + { + "x": 677.75, + "y": 2098 + }, + { + "x": 677.75, + "y": 2130.6 + }, + { + "x": 677.75, + "y": 2164.5 + }, + { + "x": 677.75, + "y": 2198.4 + }, + { + "x": 677.75, + "y": 2243.6 + }, + { + "x": 677.75, + "y": 2277.5 + }, + { + "x": 677.75, + "y": 2311.4 + }, + { + "x": 677.75, + "y": 2357.1 + }, + { + "x": 677.75, + "y": 2391.75 + }, + { + "x": 677.75, + "y": 2426.4 + }, + { + "x": 677.75, + "y": 2472.6 + }, + { + "x": 677.75, + "y": 2507.25 + }, + { + "x": 677.75, + "y": 2541.9 + }, + { + "x": 677.75, + "y": 2575 + }, + { + "x": 677.75, + "y": 2590 + }, + { + "x": 677.75, + "y": 2605 + }, + { + "x": 677.75, + "y": 2625 + }, + { + "x": 677.75, + "y": 2640 + }, + { + "x": 677.75, + "y": 2655 + }, + { + "x": 677.75, + "y": 2687.6 + }, + { + "x": 677.75, + "y": 2721.5 + }, + { + "x": 677.75, + "y": 2755.4 + }, + { + "x": 677.75, + "y": 2901.5 + }, + { + "x": 677.75, + "y": 2943.5 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "(rm -> nn.xx)[0]", + "src": "rm", + "srcArrow": "none", + "srcLabel": "", + "dst": "nn.xx", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 647.2045454545455, + "y": 3070.5 + }, + { + "x": 626.8409090909091, + "y": 3111.7 + }, + { + "x": 577.2, + "y": 3132 + }, + { + "x": 510.375, + "y": 3147 + }, + { + "x": 443.54999999999995, + "y": 3162 + }, + { + "x": 399, + "y": 3182 + }, + { + "x": 399, + "y": 3197 + }, + { + "x": 399, + "y": 3212 + }, + { + "x": 399, + "y": 3244.6 + }, + { + "x": 399, + "y": 3278.5 + }, + { + "x": 399, + "y": 3312.4 + }, + { + "x": 399, + "y": 3357.6 + }, + { + "x": 399, + "y": 3391.5 + }, + { + "x": 399, + "y": 3425.4 + }, + { + "x": 399, + "y": 3470.6 + }, + { + "x": 399, + "y": 3504.5 + }, + { + "x": 399, + "y": 3538.4 + }, + { + "x": 399, + "y": 3583.6 + }, + { + "x": 399, + "y": 3617.5 + }, + { + "x": 399, + "y": 3651.4 + }, + { + "x": 399, + "y": 3684 + }, + { + "x": 399, + "y": 3699 + }, + { + "x": 399, + "y": 3714 + }, + { + "x": 399, + "y": 3784 + }, + { + "x": 399, + "y": 3824 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "(ll.rr -> yy.zz)[0]", + "src": "ll.rr", + "srcArrow": "none", + "srcLabel": "", + "dst": "yy.zz", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 433.75, + "y": 3070.5 + }, + { + "x": 433.75, + "y": 3111.7 + }, + { + "x": 459.2, + "y": 3132 + }, + { + "x": 497.375, + "y": 3147 + }, + { + "x": 535.55, + "y": 3162 + }, + { + "x": 571.4, + "y": 3233.6 + }, + { + "x": 613, + "y": 3280 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "(rm -> yy.zz)[0]", + "src": "rm", + "srcArrow": "none", + "srcLabel": "", + "dst": "yy.zz", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 696.9772727272727, + "y": 3070.5 + }, + { + "x": 709.7954545454545, + "y": 3111.7 + }, + { + "x": 713, + "y": 3132 + }, + { + "x": 713, + "y": 3147 + }, + { + "x": 713, + "y": 3162 + }, + { + "x": 708.4, + "y": 3232 + }, + { + "x": 690, + "y": 3272 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "yy.(zz -> ab)[0]", + "src": "yy.zz", + "srcArrow": "none", + "srcLabel": "", + "dst": "yy.ab", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 662, + "y": 3398 + }, + { + "x": 662, + "y": 3438 + }, + { + "x": 662, + "y": 3458 + }, + { + "x": 662, + "y": 3498 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "(yy.ab -> nn.ac)[0]", + "src": "yy.ab", + "srcArrow": "none", + "srcLabel": "", + "dst": "nn.ac", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 662, + "y": 3624 + }, + { + "x": 662, + "y": 3664 + }, + { + "x": 662, + "y": 3684 + }, + { + "x": 662, + "y": 3699 + }, + { + "x": 662, + "y": 3714 + }, + { + "x": 662, + "y": 3784 + }, + { + "x": 662, + "y": 3824 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "(nn.ac -> ad)[0]", + "src": "nn.ac", + "srcArrow": "none", + "srcLabel": "", + "dst": "ad", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 662, + "y": 3950 + }, + { + "x": 662, + "y": 3990 + }, + { + "x": 662, + "y": 4060 + }, + { + "x": 662, + "y": 4100 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "(ww -> ff.gg)[0]", + "src": "ww", + "srcArrow": "none", + "srcLabel": "", + "dst": "ff.gg", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 561, + "y": 1996 + }, + { + "x": 505.4, + "y": 2045.6 + }, + { + "x": 484.2, + "y": 2122 + }, + { + "x": 455, + "y": 2178 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + } + ] +} diff --git a/e2etests/testdata/stable/investigate/sketch.exp.svg b/e2etests/testdata/stable/investigate/sketch.exp.svg new file mode 100644 index 000000000..27077e09f --- /dev/null +++ b/e2etests/testdata/stable/investigate/sketch.exp.svg @@ -0,0 +1,47 @@ + +aabbccddllffwwyyadnniijjkkssuurmeemmmmgghhzzooppqqrrttvvxxabac + + +1 + + +2 + + +3 + + +4 + + +5 + + +6 \ No newline at end of file diff --git a/e2etests/testdata/stable/large_arch/board.exp.json b/e2etests/testdata/stable/large_arch/board.exp.json new file mode 100644 index 000000000..7e21e0bfb --- /dev/null +++ b/e2etests/testdata/stable/large_arch/board.exp.json @@ -0,0 +1,2550 @@ +{ + "name": "", + "shapes": [ + { + "id": "a", + "type": "", + "pos": { + "x": 0, + "y": 150 + }, + "width": 113, + "height": 126, + "level": 1, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#F7F8FE", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "a", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 13, + "labelHeight": 26, + "labelPosition": "INSIDE_MIDDLE_CENTER" + }, + { + "id": "b", + "type": "", + "pos": { + "x": 173, + "y": 150 + }, + "width": 113, + "height": 126, + "level": 1, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#F7F8FE", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "b", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 13, + "labelHeight": 26, + "labelPosition": "INSIDE_MIDDLE_CENTER" + }, + { + "id": "c", + "type": "", + "pos": { + "x": 1397, + "y": 1228 + }, + "width": 113, + "height": 126, + "level": 1, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#F7F8FE", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "c", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 13, + "labelHeight": 26, + "labelPosition": "INSIDE_MIDDLE_CENTER" + }, + { + "id": "d", + "type": "", + "pos": { + "x": 1570, + "y": 1228 + }, + "width": 114, + "height": 126, + "level": 1, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#F7F8FE", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "d", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 14, + "labelHeight": 26, + "labelPosition": "INSIDE_MIDDLE_CENTER" + }, + { + "id": "e", + "type": "", + "pos": { + "x": 1571, + "y": 1454 + }, + "width": 113, + "height": 126, + "level": 1, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#F7F8FE", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "e", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 13, + "labelHeight": 26, + "labelPosition": "INSIDE_MIDDLE_CENTER" + }, + { + "id": "f", + "type": "", + "pos": { + "x": 1744, + "y": 1228 + }, + "width": 111, + "height": 126, + "level": 1, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#F7F8FE", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "f", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 11, + "labelHeight": 26, + "labelPosition": "INSIDE_MIDDLE_CENTER" + }, + { + "id": "g", + "type": "", + "pos": { + "x": 2599, + "y": 1228 + }, + "width": 114, + "height": 126, + "level": 1, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#F7F8FE", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "g", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 14, + "labelHeight": 26, + "labelPosition": "INSIDE_MIDDLE_CENTER" + }, + { + "id": "h", + "type": "", + "pos": { + "x": 777, + "y": 902 + }, + "width": 113, + "height": 126, + "level": 1, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#F7F8FE", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "h", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 13, + "labelHeight": 26, + "labelPosition": "INSIDE_MIDDLE_CENTER" + }, + { + "id": "i", + "type": "", + "pos": { + "x": 2263, + "y": 426 + }, + "width": 781, + "height": 702, + "level": 1, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#E3E9FD", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "i", + "fontSize": 28, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 9, + "labelHeight": 41, + "labelPosition": "INSIDE_TOP_CENTER" + }, + { + "id": "i.j", + "type": "", + "pos": { + "x": 2305, + "y": 476 + }, + "width": 578, + "height": 226, + "level": 2, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#EDF0FD", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "j", + "fontSize": 24, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 11, + "labelHeight": 36, + "labelPosition": "INSIDE_TOP_CENTER" + }, + { + "id": "i.j.k", + "type": "", + "pos": { + "x": 2721, + "y": 526 + }, + "width": 113, + "height": 126, + "level": 3, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#F7F8FE", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "k", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 13, + "labelHeight": 26, + "labelPosition": "INSIDE_MIDDLE_CENTER" + }, + { + "id": "i.j.l", + "type": "", + "pos": { + "x": 2355, + "y": 526 + }, + "width": 109, + "height": 126, + "level": 3, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#F7F8FE", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "l", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 9, + "labelHeight": 26, + "labelPosition": "INSIDE_MIDDLE_CENTER" + }, + { + "id": "i.m", + "type": "", + "pos": { + "x": 2704, + "y": 902 + }, + "width": 117, + "height": 126, + "level": 2, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#EDF0FD", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "m", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 17, + "labelHeight": 26, + "labelPosition": "INSIDE_MIDDLE_CENTER" + }, + { + "id": "i.n", + "type": "", + "pos": { + "x": 2881, + "y": 902 + }, + "width": 113, + "height": 126, + "level": 2, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#EDF0FD", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "n", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 13, + "labelHeight": 26, + "labelPosition": "INSIDE_MIDDLE_CENTER" + }, + { + "id": "i.o", + "type": "", + "pos": { + "x": 2303, + "y": 852 + }, + "width": 213, + "height": 226, + "level": 2, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#EDF0FD", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "o", + "fontSize": 24, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 16, + "labelHeight": 36, + "labelPosition": "INSIDE_TOP_CENTER" + }, + { + "id": "i.o.p", + "type": "", + "pos": { + "x": 2353, + "y": 902 + }, + "width": 113, + "height": 126, + "level": 3, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#F7F8FE", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "p", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 13, + "labelHeight": 26, + "labelPosition": "INSIDE_MIDDLE_CENTER" + }, + { + "id": "q", + "type": "", + "pos": { + "x": 2881, + "y": 1228 + }, + "width": 114, + "height": 126, + "level": 1, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#F7F8FE", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "q", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 14, + "labelHeight": 26, + "labelPosition": "INSIDE_MIDDLE_CENTER" + }, + { + "id": "r", + "type": "", + "pos": { + "x": 336, + "y": 0 + }, + "width": 1886, + "height": 752, + "level": 1, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#E3E9FD", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "r", + "fontSize": 28, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 13, + "labelHeight": 41, + "labelPosition": "INSIDE_TOP_CENTER" + }, + { + "id": "r.s", + "type": "", + "pos": { + "x": 741, + "y": 50 + }, + "width": 647, + "height": 652, + "level": 2, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#EDF0FD", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "s", + "fontSize": 24, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 15, + "labelHeight": 36, + "labelPosition": "INSIDE_TOP_CENTER" + }, + { + "id": "r.s.t", + "type": "", + "pos": { + "x": 832, + "y": 526 + }, + "width": 111, + "height": 126, + "level": 3, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#F7F8FE", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "t", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 11, + "labelHeight": 26, + "labelPosition": "INSIDE_MIDDLE_CENTER" + }, + { + "id": "r.s.u", + "type": "", + "pos": { + "x": 1135, + "y": 100 + }, + "width": 214, + "height": 226, + "level": 3, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#F7F8FE", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "u", + "fontSize": 20, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 14, + "labelHeight": 31, + "labelPosition": "INSIDE_TOP_CENTER" + }, + { + "id": "r.s.u.v", + "type": "", + "pos": { + "x": 1185, + "y": 150 + }, + "width": 114, + "height": 126, + "level": 4, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#FFFFFF", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "v", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 14, + "labelHeight": 26, + "labelPosition": "INSIDE_MIDDLE_CENTER" + }, + { + "id": "r.s.w", + "type": "", + "pos": { + "x": 1003, + "y": 526 + }, + "width": 118, + "height": 126, + "level": 3, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#F7F8FE", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "w", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 18, + "labelHeight": 26, + "labelPosition": "INSIDE_MIDDLE_CENTER" + }, + { + "id": "r.s.x", + "type": "", + "pos": { + "x": 972, + "y": 150 + }, + "width": 113, + "height": 126, + "level": 3, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#F7F8FE", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "x", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 13, + "labelHeight": 26, + "labelPosition": "INSIDE_MIDDLE_CENTER" + }, + { + "id": "r.s.y", + "type": "", + "pos": { + "x": 1186, + "y": 526 + }, + "width": 114, + "height": 126, + "level": 3, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#F7F8FE", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "y", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 14, + "labelHeight": 26, + "labelPosition": "INSIDE_MIDDLE_CENTER" + }, + { + "id": "r.z", + "type": "", + "pos": { + "x": 1439, + "y": 526 + }, + "width": 112, + "height": 126, + "level": 2, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#EDF0FD", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "z", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 12, + "labelHeight": 26, + "labelPosition": "INSIDE_MIDDLE_CENTER" + }, + { + "id": "r.aa", + "type": "", + "pos": { + "x": 386, + "y": 150 + }, + "width": 122, + "height": 126, + "level": 2, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#EDF0FD", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "aa", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 22, + "labelHeight": 26, + "labelPosition": "INSIDE_MIDDLE_CENTER" + }, + { + "id": "r.bb", + "type": "", + "pos": { + "x": 1778, + "y": 476 + }, + "width": 405, + "height": 226, + "level": 2, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#EDF0FD", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "bb", + "fontSize": 24, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 31, + "labelHeight": 36, + "labelPosition": "INSIDE_TOP_CENTER" + }, + { + "id": "r.bb.cc", + "type": "", + "pos": { + "x": 1828, + "y": 526 + }, + "width": 121, + "height": 126, + "level": 3, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#F7F8FE", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "cc", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 21, + "labelHeight": 26, + "labelPosition": "INSIDE_MIDDLE_CENTER" + }, + { + "id": "r.bb.dd", + "type": "", + "pos": { + "x": 2009, + "y": 526 + }, + "width": 124, + "height": 126, + "level": 3, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#F7F8FE", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "dd", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 24, + "labelHeight": 26, + "labelPosition": "INSIDE_MIDDLE_CENTER" + }, + { + "id": "r.ee", + "type": "", + "pos": { + "x": 1608, + "y": 150 + }, + "width": 122, + "height": 126, + "level": 2, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#EDF0FD", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "ee", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 22, + "labelHeight": 26, + "labelPosition": "INSIDE_MIDDLE_CENTER" + }, + { + "id": "r.ff", + "type": "", + "pos": { + "x": 1611, + "y": 526 + }, + "width": 117, + "height": 126, + "level": 2, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#EDF0FD", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "ff", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 17, + "labelHeight": 26, + "labelPosition": "INSIDE_MIDDLE_CENTER" + }, + { + "id": "r.gg", + "type": "", + "pos": { + "x": 568, + "y": 150 + }, + "width": 123, + "height": 126, + "level": 2, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#EDF0FD", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "gg", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 23, + "labelHeight": 26, + "labelPosition": "INSIDE_MIDDLE_CENTER" + } + ], + "connections": [ + { + "id": "i.(j.k -> m)[0]", + "src": "i.j.k", + "srcArrow": "none", + "srcLabel": "", + "dst": "i.m", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 2777, + "y": 652 + }, + { + "x": 2777, + "y": 692 + }, + { + "x": 2777, + "y": 712 + }, + { + "x": 2777, + "y": 727 + }, + { + "x": 2777, + "y": 742 + }, + { + "x": 2777, + "y": 762 + }, + { + "x": 2777, + "y": 777 + }, + { + "x": 2777, + "y": 792 + }, + { + "x": 2775.8, + "y": 862 + }, + { + "x": 2771, + "y": 902 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "i.(j.l -> o.p)[0]", + "src": "i.j.l", + "srcArrow": "none", + "srcLabel": "", + "dst": "i.o.p", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 2409.25, + "y": 652 + }, + { + "x": 2409.25, + "y": 692 + }, + { + "x": 2409.25, + "y": 712 + }, + { + "x": 2409.25, + "y": 727 + }, + { + "x": 2409.25, + "y": 742 + }, + { + "x": 2409.25, + "y": 762 + }, + { + "x": 2409.25, + "y": 777 + }, + { + "x": 2409.25, + "y": 792 + }, + { + "x": 2409.25, + "y": 862 + }, + { + "x": 2409.25, + "y": 902 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "(q -> i.m)[0]", + "src": "q", + "srcArrow": "none", + "srcLabel": "", + "dst": "i.m", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 2888.966814159292, + "y": 1228 + }, + { + "x": 2857.9933628318586, + "y": 1188 + }, + { + "x": 2850.25, + "y": 1168 + }, + { + "x": 2850.25, + "y": 1153 + }, + { + "x": 2850.25, + "y": 1138 + }, + { + "x": 2842.45, + "y": 1068 + }, + { + "x": 2811.25, + "y": 1028 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "(i.m -> q)[0]", + "src": "i.m", + "srcArrow": "none", + "srcLabel": "", + "dst": "q", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 2821.25, + "y": 993.9616648411829 + }, + { + "x": 2957.05, + "y": 1061.1923329682365 + }, + { + "x": 2991, + "y": 1088 + }, + { + "x": 2991, + "y": 1103 + }, + { + "x": 2991, + "y": 1118 + }, + { + "x": 2986.2, + "y": 1188 + }, + { + "x": 2967, + "y": 1228 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "(i.n -> q)[0]", + "src": "i.n", + "srcArrow": "none", + "srcLabel": "", + "dst": "q", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 2937.75, + "y": 1028 + }, + { + "x": 2937.75, + "y": 1068 + }, + { + "x": 2937.75, + "y": 1088 + }, + { + "x": 2937.75, + "y": 1103 + }, + { + "x": 2937.75, + "y": 1118 + }, + { + "x": 2937.75, + "y": 1188 + }, + { + "x": 2937.75, + "y": 1228 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "(i.m -> c)[0]", + "src": "i.m", + "srcArrow": "none", + "srcLabel": "", + "dst": "c", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 2704.25, + "y": 996.9347826086956 + }, + { + "x": 2585.45, + "y": 1061.786956521739 + }, + { + "x": 2555.75, + "y": 1088 + }, + { + "x": 2555.75, + "y": 1103 + }, + { + "x": 2555.75, + "y": 1118 + }, + { + "x": 1453.75, + "y": 1188 + }, + { + "x": 1453.75, + "y": 1228 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "(i.m -> d)[0]", + "src": "i.m", + "srcArrow": "none", + "srcLabel": "", + "dst": "d", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 2704.25, + "y": 1004.5838323353294 + }, + { + "x": 2617.45, + "y": 1063.316766467066 + }, + { + "x": 2595.75, + "y": 1088 + }, + { + "x": 2595.75, + "y": 1103 + }, + { + "x": 2595.75, + "y": 1118 + }, + { + "x": 1627.25, + "y": 1188 + }, + { + "x": 1627.25, + "y": 1228 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "(i.m -> g)[0]", + "src": "i.m", + "srcArrow": "none", + "srcLabel": "", + "dst": "g", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 2789.2323008849557, + "y": 1028 + }, + { + "x": 2806.0464601769913, + "y": 1068 + }, + { + "x": 2810.25, + "y": 1088 + }, + { + "x": 2810.25, + "y": 1103 + }, + { + "x": 2810.25, + "y": 1118 + }, + { + "x": 2790.85, + "y": 1192.2 + }, + { + "x": 2713.25, + "y": 1249 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "(i.m -> f)[0]", + "src": "i.m", + "srcArrow": "none", + "srcLabel": "", + "dst": "f", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 2714.663716814159, + "y": 1028 + }, + { + "x": 2684.1327433628317, + "y": 1068 + }, + { + "x": 2676.5, + "y": 1088 + }, + { + "x": 2676.5, + "y": 1103 + }, + { + "x": 2676.5, + "y": 1118 + }, + { + "x": 1799.75, + "y": 1188 + }, + { + "x": 1799.75, + "y": 1228 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "(d -> e)[0]", + "src": "d", + "srcArrow": "none", + "srcLabel": "", + "dst": "e", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 1627.25, + "y": 1354 + }, + { + "x": 1627.25, + "y": 1394 + }, + { + "x": 1627.25, + "y": 1414 + }, + { + "x": 1627.25, + "y": 1454 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "r.s.(x -> t)[0]", + "src": "r.s.x", + "srcArrow": "none", + "srcLabel": "", + "dst": "r.s.t", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 990.7566371681417, + "y": 276 + }, + { + "x": 966.9513274336283, + "y": 316 + }, + { + "x": 961, + "y": 336 + }, + { + "x": 961, + "y": 351 + }, + { + "x": 961, + "y": 366 + }, + { + "x": 961, + "y": 386 + }, + { + "x": 961, + "y": 401 + }, + { + "x": 961, + "y": 416 + }, + { + "x": 954.4, + "y": 486 + }, + { + "x": 928, + "y": 526 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "r.s.(x -> w)[0]", + "src": "r.s.x", + "srcArrow": "none", + "srcLabel": "", + "dst": "r.s.w", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 1046.787610619469, + "y": 276 + }, + { + "x": 1058.5575221238937, + "y": 316 + }, + { + "x": 1061.5, + "y": 336 + }, + { + "x": 1061.5, + "y": 351 + }, + { + "x": 1061.5, + "y": 366 + }, + { + "x": 1061.5, + "y": 386 + }, + { + "x": 1061.5, + "y": 401 + }, + { + "x": 1061.5, + "y": 416 + }, + { + "x": 1061.5, + "y": 486 + }, + { + "x": 1061.5, + "y": 526 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "r.(gg -> s.t)[0]", + "src": "r.gg", + "srcArrow": "none", + "srcLabel": "", + "dst": "r.s.t", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 691, + "y": 239.9883495145631 + }, + { + "x": 847.8, + "y": 308.7976699029126 + }, + { + "x": 887, + "y": 336 + }, + { + "x": 887, + "y": 351 + }, + { + "x": 887, + "y": 366 + }, + { + "x": 887, + "y": 386 + }, + { + "x": 887, + "y": 401 + }, + { + "x": 887, + "y": 416 + }, + { + "x": 887, + "y": 486 + }, + { + "x": 887, + "y": 526 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "r.(s.u.v -> z)[0]", + "src": "r.s.u.v", + "srcArrow": "none", + "srcLabel": "", + "dst": "r.z", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 1241.75, + "y": 276 + }, + { + "x": 1241.75, + "y": 316 + }, + { + "x": 1241.75, + "y": 336 + }, + { + "x": 1241.75, + "y": 351 + }, + { + "x": 1241.75, + "y": 366 + }, + { + "x": 1241.75, + "y": 386 + }, + { + "x": 1241.75, + "y": 401 + }, + { + "x": 1241.75, + "y": 416 + }, + { + "x": 1281.15, + "y": 493.59762845849804 + }, + { + "x": 1438.75, + "y": 563.9881422924901 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "r.(aa -> s.t)[0]", + "src": "r.aa", + "srcArrow": "none", + "srcLabel": "", + "dst": "r.s.t", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 508, + "y": 232.8788752703677 + }, + { + "x": 736.6, + "y": 307.37577505407353 + }, + { + "x": 793.75, + "y": 336 + }, + { + "x": 793.75, + "y": 351 + }, + { + "x": 793.75, + "y": 366 + }, + { + "x": 793.75, + "y": 386 + }, + { + "x": 793.75, + "y": 401 + }, + { + "x": 793.75, + "y": 416 + }, + { + "x": 801.95, + "y": 486 + }, + { + "x": 834.75, + "y": 526 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "(r.s.w -> i.m)[0]", + "src": "r.s.w", + "srcArrow": "none", + "srcLabel": "", + "dst": "i.m", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 1061.5, + "y": 652 + }, + { + "x": 1061.5, + "y": 692 + }, + { + "x": 1061.5, + "y": 712 + }, + { + "x": 1061.5, + "y": 727 + }, + { + "x": 1061.5, + "y": 742 + }, + { + "x": 1367.2, + "y": 762 + }, + { + "x": 1825.75, + "y": 777 + }, + { + "x": 2284.3, + "y": 792 + }, + { + "x": 2612.8, + "y": 867 + }, + { + "x": 2704, + "y": 927 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "(r.s.t -> g)[0]", + "src": "r.s.t", + "srcArrow": "none", + "srcLabel": "", + "dst": "g", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 924.4933628318583, + "y": 652 + }, + { + "x": 948.2986725663717, + "y": 692 + }, + { + "x": 954.25, + "y": 712 + }, + { + "x": 954.25, + "y": 727 + }, + { + "x": 954.25, + "y": 742 + }, + { + "x": 954.25, + "y": 762 + }, + { + "x": 954.25, + "y": 777 + }, + { + "x": 954.25, + "y": 792 + }, + { + "x": 954.25, + "y": 812 + }, + { + "x": 954.25, + "y": 827 + }, + { + "x": 954.25, + "y": 842 + }, + { + "x": 954.25, + "y": 874.6 + }, + { + "x": 954.25, + "y": 908.5 + }, + { + "x": 954.25, + "y": 942.4 + }, + { + "x": 954.25, + "y": 987.6 + }, + { + "x": 954.25, + "y": 1021.5 + }, + { + "x": 954.25, + "y": 1055.4 + }, + { + "x": 954.25, + "y": 1088 + }, + { + "x": 954.25, + "y": 1103 + }, + { + "x": 954.25, + "y": 1118 + }, + { + "x": 2044.55, + "y": 1198.8818272757585 + }, + { + "x": 2598.75, + "y": 1282.409136378793 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "(r.s.t -> h)[0]", + "src": "r.s.t", + "srcArrow": "none", + "srcLabel": "", + "dst": "h", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 857.3119469026549, + "y": 652 + }, + { + "x": 838.462389380531, + "y": 692 + }, + { + "x": 833.75, + "y": 712 + }, + { + "x": 833.75, + "y": 727 + }, + { + "x": 833.75, + "y": 742 + }, + { + "x": 833.75, + "y": 762 + }, + { + "x": 833.75, + "y": 777 + }, + { + "x": 833.75, + "y": 792 + }, + { + "x": 833.75, + "y": 862 + }, + { + "x": 833.75, + "y": 902 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "r.(ee -> ff)[0]", + "src": "r.ee", + "srcArrow": "none", + "srcLabel": "", + "dst": "r.ff", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 1669.25, + "y": 276 + }, + { + "x": 1669.25, + "y": 316 + }, + { + "x": 1669.25, + "y": 336 + }, + { + "x": 1669.25, + "y": 351 + }, + { + "x": 1669.25, + "y": 366 + }, + { + "x": 1669.25, + "y": 386 + }, + { + "x": 1669.25, + "y": 401 + }, + { + "x": 1669.25, + "y": 416 + }, + { + "x": 1669.25, + "y": 486 + }, + { + "x": 1669.25, + "y": 526 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + } + ] +} diff --git a/e2etests/testdata/stable/large_arch/sketch.exp.svg b/e2etests/testdata/stable/large_arch/sketch.exp.svg new file mode 100644 index 000000000..d69ac2177 --- /dev/null +++ b/e2etests/testdata/stable/large_arch/sketch.exp.svg @@ -0,0 +1,22 @@ + +abcdefghiqrjmnoszaabbeeffggklptuwxyccddv \ No newline at end of file diff --git a/e2etests/testdata/stable/li1/board.exp.json b/e2etests/testdata/stable/li1/board.exp.json new file mode 100644 index 000000000..66753fbde --- /dev/null +++ b/e2etests/testdata/stable/li1/board.exp.json @@ -0,0 +1,214 @@ +{ + "name": "", + "shapes": [ + { + "id": "md", + "type": "text", + "pos": { + "x": 0, + "y": 226 + }, + "width": 384, + "height": 105, + "level": 1, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#FFFFFF", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "\n- [Overview](#overview)\n - [Philosophy](#philosophy)\n - [Inline HTML](#html)\n - [Automatic Escaping for Special Characters](#autoescape)\n", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "markdown", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 384, + "labelHeight": 105 + }, + { + "id": "a", + "type": "", + "pos": { + "x": 136, + "y": 0 + }, + "width": 113, + "height": 126, + "level": 1, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#F7F8FE", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "a", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 13, + "labelHeight": 26, + "labelPosition": "INSIDE_MIDDLE_CENTER" + }, + { + "id": "b", + "type": "", + "pos": { + "x": 136, + "y": 431 + }, + "width": 113, + "height": 126, + "level": 1, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#F7F8FE", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "b", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 13, + "labelHeight": 26, + "labelPosition": "INSIDE_MIDDLE_CENTER" + } + ], + "connections": [ + { + "id": "(a -> md)[0]", + "src": "a", + "srcArrow": "none", + "srcLabel": "", + "dst": "md", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 192, + "y": 126 + }, + { + "x": 192, + "y": 166 + }, + { + "x": 192, + "y": 186 + }, + { + "x": 192, + "y": 226 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "(md -> b)[0]", + "src": "md", + "srcArrow": "none", + "srcLabel": "", + "dst": "b", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 192, + "y": 331 + }, + { + "x": 192, + "y": 371 + }, + { + "x": 192, + "y": 391 + }, + { + "x": 192, + "y": 431 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + } + ] +} diff --git a/e2etests/testdata/stable/li1/sketch.exp.svg b/e2etests/testdata/stable/li1/sketch.exp.svg new file mode 100644 index 000000000..9a171ad5d --- /dev/null +++ b/e2etests/testdata/stable/li1/sketch.exp.svg @@ -0,0 +1,826 @@ + +ab \ No newline at end of file diff --git a/e2etests/testdata/stable/li2/board.exp.json b/e2etests/testdata/stable/li2/board.exp.json new file mode 100644 index 000000000..959f29564 --- /dev/null +++ b/e2etests/testdata/stable/li2/board.exp.json @@ -0,0 +1,214 @@ +{ + "name": "", + "shapes": [ + { + "id": "md", + "type": "text", + "pos": { + "x": 0, + "y": 226 + }, + "width": 250, + "height": 81, + "level": 1, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#FFFFFF", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "\n- [Overview](#overview) ok _this is all measured_\n\t- [Philosophy](#philosophy)\n\t- [Inline HTML](#html)\n", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "markdown", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 250, + "labelHeight": 81 + }, + { + "id": "a", + "type": "", + "pos": { + "x": 69, + "y": 0 + }, + "width": 113, + "height": 126, + "level": 1, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#F7F8FE", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "a", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 13, + "labelHeight": 26, + "labelPosition": "INSIDE_MIDDLE_CENTER" + }, + { + "id": "b", + "type": "", + "pos": { + "x": 69, + "y": 407 + }, + "width": 113, + "height": 126, + "level": 1, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#F7F8FE", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "b", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 13, + "labelHeight": 26, + "labelPosition": "INSIDE_MIDDLE_CENTER" + } + ], + "connections": [ + { + "id": "(a -> md)[0]", + "src": "a", + "srcArrow": "none", + "srcLabel": "", + "dst": "md", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 125, + "y": 126 + }, + { + "x": 125, + "y": 166 + }, + { + "x": 125, + "y": 186 + }, + { + "x": 125, + "y": 226 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "(md -> b)[0]", + "src": "md", + "srcArrow": "none", + "srcLabel": "", + "dst": "b", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 125, + "y": 307 + }, + { + "x": 125, + "y": 347 + }, + { + "x": 125, + "y": 367 + }, + { + "x": 125, + "y": 407 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + } + ] +} diff --git a/e2etests/testdata/stable/li2/sketch.exp.svg b/e2etests/testdata/stable/li2/sketch.exp.svg new file mode 100644 index 000000000..51ec4d6a8 --- /dev/null +++ b/e2etests/testdata/stable/li2/sketch.exp.svg @@ -0,0 +1,829 @@ + +
+
ab
\ No newline at end of file diff --git a/e2etests/testdata/stable/li3/board.exp.json b/e2etests/testdata/stable/li3/board.exp.json new file mode 100644 index 000000000..0893130b1 --- /dev/null +++ b/e2etests/testdata/stable/li3/board.exp.json @@ -0,0 +1,214 @@ +{ + "name": "", + "shapes": [ + { + "id": "md", + "type": "text", + "pos": { + "x": 0, + "y": 226 + }, + "width": 352, + "height": 517, + "level": 1, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#FFFFFF", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "\n- [Overview](#overview)\n - [Philosophy](#philosophy)\n - [Inline HTML](#html)\n - [Automatic Escaping for Special Characters](#autoescape)\n- [Block Elements](#block)\n - [Paragraphs and Line Breaks](#p)\n - [Headers](#header)\n - [Blockquotes](#blockquote)\n - [Lists](#list)\n - [Code Blocks](#precode)\n - [Horizontal Rules](#hr)\n- [Span Elements](#span)\n - [Links](#link)\n - [Emphasis](#em)\n - [Code](#code)\n - [Images](#img)\n- [Miscellaneous](#misc)\n - [Backslash Escapes](#backslash)\n - [Automatic Links](#autolink)\n", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "markdown", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 352, + "labelHeight": 517 + }, + { + "id": "a", + "type": "", + "pos": { + "x": 120, + "y": 0 + }, + "width": 113, + "height": 126, + "level": 1, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#F7F8FE", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "a", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 13, + "labelHeight": 26, + "labelPosition": "INSIDE_MIDDLE_CENTER" + }, + { + "id": "b", + "type": "", + "pos": { + "x": 120, + "y": 843 + }, + "width": 113, + "height": 126, + "level": 1, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#F7F8FE", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "b", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 13, + "labelHeight": 26, + "labelPosition": "INSIDE_MIDDLE_CENTER" + } + ], + "connections": [ + { + "id": "(a -> md)[0]", + "src": "a", + "srcArrow": "none", + "srcLabel": "", + "dst": "md", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 176, + "y": 126 + }, + { + "x": 176, + "y": 166 + }, + { + "x": 176, + "y": 186 + }, + { + "x": 176, + "y": 226 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "(md -> b)[0]", + "src": "md", + "srcArrow": "none", + "srcLabel": "", + "dst": "b", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 176, + "y": 743 + }, + { + "x": 176, + "y": 783 + }, + { + "x": 176, + "y": 803 + }, + { + "x": 176, + "y": 843 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + } + ] +} diff --git a/e2etests/testdata/stable/li3/sketch.exp.svg b/e2etests/testdata/stable/li3/sketch.exp.svg new file mode 100644 index 000000000..d94229f44 --- /dev/null +++ b/e2etests/testdata/stable/li3/sketch.exp.svg @@ -0,0 +1,847 @@ + +ab \ No newline at end of file diff --git a/e2etests/testdata/stable/li4/board.exp.json b/e2etests/testdata/stable/li4/board.exp.json new file mode 100644 index 000000000..d6c318da4 --- /dev/null +++ b/e2etests/testdata/stable/li4/board.exp.json @@ -0,0 +1,214 @@ +{ + "name": "", + "shapes": [ + { + "id": "md", + "type": "text", + "pos": { + "x": 0, + "y": 226 + }, + "width": 924, + "height": 381, + "level": 1, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#FFFFFF", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "\nList items may consist of multiple paragraphs. Each subsequent\nparagraph in a list item must be indented by either 4 spaces\nor one tab:\n\n1. This is a list item with two paragraphs. Lorem ipsum dolor\n sit amet, consectetuer adipiscing elit. Aliquam hendrerit\n mi posuere lectus.\n\n Vestibulum enim wisi, viverra nec, fringilla in, laoreet\n vitae, risus. Donec sit amet nisl. Aliquam semper ipsum\n sit amet velit.\n\n2. Suspendisse id sem consectetuer libero luctus adipiscing.\n\nIt looks nice if you indent every line of the subsequent\nparagraphs, but here again, Markdown will allow you to be\nlazy:\n\n- This is a list item with two paragraphs.\n\n This is the second paragraph in the list item. You're\n\n only required to indent the first line. Lorem ipsum dolor\n sit amet, consectetuer adipiscing elit.\n\n- Another item in the same list.\n", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "markdown", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 924, + "labelHeight": 381 + }, + { + "id": "a", + "type": "", + "pos": { + "x": 406, + "y": 0 + }, + "width": 113, + "height": 126, + "level": 1, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#F7F8FE", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "a", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 13, + "labelHeight": 26, + "labelPosition": "INSIDE_MIDDLE_CENTER" + }, + { + "id": "b", + "type": "", + "pos": { + "x": 406, + "y": 707 + }, + "width": 113, + "height": 126, + "level": 1, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#F7F8FE", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "b", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 13, + "labelHeight": 26, + "labelPosition": "INSIDE_MIDDLE_CENTER" + } + ], + "connections": [ + { + "id": "(a -> md)[0]", + "src": "a", + "srcArrow": "none", + "srcLabel": "", + "dst": "md", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 462, + "y": 126 + }, + { + "x": 462, + "y": 166 + }, + { + "x": 462, + "y": 186 + }, + { + "x": 462, + "y": 226 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "(md -> b)[0]", + "src": "md", + "srcArrow": "none", + "srcLabel": "", + "dst": "b", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 462, + "y": 607 + }, + { + "x": 462, + "y": 647 + }, + { + "x": 462, + "y": 667 + }, + { + "x": 462, + "y": 707 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + } + ] +} diff --git a/e2etests/testdata/stable/li4/sketch.exp.svg b/e2etests/testdata/stable/li4/sketch.exp.svg new file mode 100644 index 000000000..7834997f6 --- /dev/null +++ b/e2etests/testdata/stable/li4/sketch.exp.svg @@ -0,0 +1,845 @@ + +

List items may consist of multiple paragraphs. Each subsequent +paragraph in a list item must be indented by either 4 spaces +or one tab:

+
    +
  1. +

    This is a list item with two paragraphs. Lorem ipsum dolor +sit amet, consectetuer adipiscing elit. Aliquam hendrerit +mi posuere lectus.

    +

    Vestibulum enim wisi, viverra nec, fringilla in, laoreet +vitae, risus. Donec sit amet nisl. Aliquam semper ipsum +sit amet velit.

    +
  2. +
  3. +

    Suspendisse id sem consectetuer libero luctus adipiscing.

    +
  4. +
+

It looks nice if you indent every line of the subsequent +paragraphs, but here again, Markdown will allow you to be +lazy:

+
    +
  • +

    This is a list item with two paragraphs.

    +
    This is the second paragraph in the list item. You're
    +
    +

    only required to indent the first line. Lorem ipsum dolor +sit amet, consectetuer adipiscing elit.

    +
  • +
  • +

    Another item in the same list.

    +
  • +
+
ab
\ No newline at end of file diff --git a/e2etests/testdata/stable/lone_h1/board.exp.json b/e2etests/testdata/stable/lone_h1/board.exp.json new file mode 100644 index 000000000..77f5683d2 --- /dev/null +++ b/e2etests/testdata/stable/lone_h1/board.exp.json @@ -0,0 +1,214 @@ +{ + "name": "", + "shapes": [ + { + "id": "md", + "type": "text", + "pos": { + "x": 0, + "y": 226 + }, + "width": 268, + "height": 55, + "level": 1, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#FFFFFF", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "\n# Markdown: Syntax\n", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "markdown", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 268, + "labelHeight": 55 + }, + { + "id": "a", + "type": "", + "pos": { + "x": 78, + "y": 0 + }, + "width": 113, + "height": 126, + "level": 1, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#F7F8FE", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "a", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 13, + "labelHeight": 26, + "labelPosition": "INSIDE_MIDDLE_CENTER" + }, + { + "id": "b", + "type": "", + "pos": { + "x": 78, + "y": 381 + }, + "width": 113, + "height": 126, + "level": 1, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#F7F8FE", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "b", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 13, + "labelHeight": 26, + "labelPosition": "INSIDE_MIDDLE_CENTER" + } + ], + "connections": [ + { + "id": "(a -> md)[0]", + "src": "a", + "srcArrow": "none", + "srcLabel": "", + "dst": "md", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 134, + "y": 126 + }, + { + "x": 134, + "y": 166 + }, + { + "x": 134, + "y": 186 + }, + { + "x": 134, + "y": 226 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "(md -> b)[0]", + "src": "md", + "srcArrow": "none", + "srcLabel": "", + "dst": "b", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 134, + "y": 281 + }, + { + "x": 134, + "y": 321 + }, + { + "x": 134, + "y": 341 + }, + { + "x": 134, + "y": 381 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + } + ] +} diff --git a/e2etests/testdata/stable/lone_h1/sketch.exp.svg b/e2etests/testdata/stable/lone_h1/sketch.exp.svg new file mode 100644 index 000000000..30a0080d7 --- /dev/null +++ b/e2etests/testdata/stable/lone_h1/sketch.exp.svg @@ -0,0 +1,815 @@ + +

Markdown: Syntax

+
ab
\ No newline at end of file diff --git a/e2etests/testdata/stable/markdown/board.exp.json b/e2etests/testdata/stable/markdown/board.exp.json new file mode 100644 index 000000000..e2a102c96 --- /dev/null +++ b/e2etests/testdata/stable/markdown/board.exp.json @@ -0,0 +1,214 @@ +{ + "name": "", + "shapes": [ + { + "id": "hey", + "type": "text", + "pos": { + "x": 0, + "y": 226 + }, + "width": 535, + "height": 191, + "level": 1, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#FFFFFF", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "# Every frustum longs to be a cone\n\n- A continuing flow of paper is sufficient to continue the flow of paper\n- Please remain calm, it's no use both of us being hysterical at the same time\n- Visits always give pleasure: if not on arrival, then on the departure\n\n*Festivity Level 1*: Your guests are chatting amiably with each other.", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "markdown", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 535, + "labelHeight": 191 + }, + { + "id": "x", + "type": "", + "pos": { + "x": 211, + "y": 0 + }, + "width": 113, + "height": 126, + "level": 1, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#F7F8FE", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "x", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 13, + "labelHeight": 26, + "labelPosition": "INSIDE_MIDDLE_CENTER" + }, + { + "id": "y", + "type": "", + "pos": { + "x": 211, + "y": 517 + }, + "width": 114, + "height": 126, + "level": 1, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#F7F8FE", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "y", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 14, + "labelHeight": 26, + "labelPosition": "INSIDE_MIDDLE_CENTER" + } + ], + "connections": [ + { + "id": "(x -> hey)[0]", + "src": "x", + "srcArrow": "none", + "srcLabel": "", + "dst": "hey", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 267.5, + "y": 126 + }, + { + "x": 267.5, + "y": 166 + }, + { + "x": 267.5, + "y": 186 + }, + { + "x": 267.5, + "y": 226 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "(hey -> y)[0]", + "src": "hey", + "srcArrow": "none", + "srcLabel": "", + "dst": "y", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 267.5, + "y": 417 + }, + { + "x": 267.5, + "y": 457 + }, + { + "x": 267.5, + "y": 477 + }, + { + "x": 267.5, + "y": 517 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + } + ] +} diff --git a/e2etests/testdata/stable/markdown/sketch.exp.svg b/e2etests/testdata/stable/markdown/sketch.exp.svg new file mode 100644 index 000000000..8e81b01e6 --- /dev/null +++ b/e2etests/testdata/stable/markdown/sketch.exp.svg @@ -0,0 +1,828 @@ + +

Every frustum longs to be a cone

+
    +
  • A continuing flow of paper is sufficient to continue the flow of paper
  • +
  • Please remain calm, it's no use both of us being hysterical at the same time
  • +
  • Visits always give pleasure: if not on arrival, then on the departure
  • +
+

Festivity Level 1: Your guests are chatting amiably with each other.

+
xy
\ No newline at end of file diff --git a/e2etests/testdata/stable/multiline_text/board.exp.json b/e2etests/testdata/stable/multiline_text/board.exp.json new file mode 100644 index 000000000..ccbb6734a --- /dev/null +++ b/e2etests/testdata/stable/multiline_text/board.exp.json @@ -0,0 +1,44 @@ +{ + "name": "", + "shapes": [ + { + "id": "hey", + "type": "", + "pos": { + "x": 0, + "y": 0 + }, + "width": 202, + "height": 158, + "level": 1, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#F7F8FE", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "this\ngoes\nmultiple lines", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 102, + "labelHeight": 58, + "labelPosition": "INSIDE_MIDDLE_CENTER" + } + ], + "connections": [] +} diff --git a/e2etests/testdata/stable/multiline_text/sketch.exp.svg b/e2etests/testdata/stable/multiline_text/sketch.exp.svg new file mode 100644 index 000000000..362c48be2 --- /dev/null +++ b/e2etests/testdata/stable/multiline_text/sketch.exp.svg @@ -0,0 +1,22 @@ + +thisgoesmultiple lines \ No newline at end of file diff --git a/e2etests/testdata/stable/multiple_trees/board.exp.json b/e2etests/testdata/stable/multiple_trees/board.exp.json new file mode 100644 index 000000000..c50cbdd26 --- /dev/null +++ b/e2etests/testdata/stable/multiple_trees/board.exp.json @@ -0,0 +1,1915 @@ +{ + "name": "", + "shapes": [ + { + "id": "a", + "type": "", + "pos": { + "x": 795, + "y": 452 + }, + "width": 113, + "height": 126, + "level": 1, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#F7F8FE", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "a", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 13, + "labelHeight": 26, + "labelPosition": "INSIDE_MIDDLE_CENTER" + }, + { + "id": "b", + "type": "", + "pos": { + "x": 83, + "y": 678 + }, + "width": 113, + "height": 126, + "level": 1, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#F7F8FE", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "b", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 13, + "labelHeight": 26, + "labelPosition": "INSIDE_MIDDLE_CENTER" + }, + { + "id": "c", + "type": "", + "pos": { + "x": 274, + "y": 678 + }, + "width": 113, + "height": 126, + "level": 1, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#F7F8FE", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "c", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 13, + "labelHeight": 26, + "labelPosition": "INSIDE_MIDDLE_CENTER" + }, + { + "id": "d", + "type": "", + "pos": { + "x": 622, + "y": 678 + }, + "width": 114, + "height": 126, + "level": 1, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#F7F8FE", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "d", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 14, + "labelHeight": 26, + "labelPosition": "INSIDE_MIDDLE_CENTER" + }, + { + "id": "e", + "type": "", + "pos": { + "x": 969, + "y": 678 + }, + "width": 113, + "height": 126, + "level": 1, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#F7F8FE", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "e", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 13, + "labelHeight": 26, + "labelPosition": "INSIDE_MIDDLE_CENTER" + }, + { + "id": "f", + "type": "", + "pos": { + "x": 1313, + "y": 678 + }, + "width": 111, + "height": 126, + "level": 1, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#F7F8FE", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "f", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 11, + "labelHeight": 26, + "labelPosition": "INSIDE_MIDDLE_CENTER" + }, + { + "id": "g", + "type": "", + "pos": { + "x": 795, + "y": 226 + }, + "width": 114, + "height": 126, + "level": 1, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#F7F8FE", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "g", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 14, + "labelHeight": 26, + "labelPosition": "INSIDE_MIDDLE_CENTER" + }, + { + "id": "h", + "type": "", + "pos": { + "x": 1545, + "y": 678 + }, + "width": 113, + "height": 126, + "level": 1, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#F7F8FE", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "h", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 13, + "labelHeight": 26, + "labelPosition": "INSIDE_MIDDLE_CENTER" + }, + { + "id": "i", + "type": "", + "pos": { + "x": 0, + "y": 452 + }, + "width": 109, + "height": 126, + "level": 1, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#F7F8FE", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "i", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 9, + "labelHeight": 26, + "labelPosition": "INSIDE_MIDDLE_CENTER" + }, + { + "id": "j", + "type": "", + "pos": { + "x": 169, + "y": 452 + }, + "width": 110, + "height": 126, + "level": 1, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#F7F8FE", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "j", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 10, + "labelHeight": 26, + "labelPosition": "INSIDE_MIDDLE_CENTER" + }, + { + "id": "k", + "type": "", + "pos": { + "x": 710, + "y": 0 + }, + "width": 113, + "height": 126, + "level": 1, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#F7F8FE", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "k", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 13, + "labelHeight": 26, + "labelPosition": "INSIDE_MIDDLE_CENTER" + }, + { + "id": "l", + "type": "", + "pos": { + "x": 883, + "y": 0 + }, + "width": 109, + "height": 126, + "level": 1, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#F7F8FE", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "l", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 9, + "labelHeight": 26, + "labelPosition": "INSIDE_MIDDLE_CENTER" + }, + { + "id": "m", + "type": "", + "pos": { + "x": 185, + "y": 904 + }, + "width": 117, + "height": 126, + "level": 1, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#F7F8FE", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "m", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 17, + "labelHeight": 26, + "labelPosition": "INSIDE_MIDDLE_CENTER" + }, + { + "id": "n", + "type": "", + "pos": { + "x": 362, + "y": 904 + }, + "width": 113, + "height": 126, + "level": 1, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#F7F8FE", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "n", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 13, + "labelHeight": 26, + "labelPosition": "INSIDE_MIDDLE_CENTER" + }, + { + "id": "o", + "type": "", + "pos": { + "x": 535, + "y": 904 + }, + "width": 114, + "height": 126, + "level": 1, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#F7F8FE", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "o", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 14, + "labelHeight": 26, + "labelPosition": "INSIDE_MIDDLE_CENTER" + }, + { + "id": "p", + "type": "", + "pos": { + "x": 709, + "y": 904 + }, + "width": 113, + "height": 126, + "level": 1, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#F7F8FE", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "p", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 13, + "labelHeight": 26, + "labelPosition": "INSIDE_MIDDLE_CENTER" + }, + { + "id": "q", + "type": "", + "pos": { + "x": 882, + "y": 904 + }, + "width": 114, + "height": 126, + "level": 1, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#F7F8FE", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "q", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 14, + "labelHeight": 26, + "labelPosition": "INSIDE_MIDDLE_CENTER" + }, + { + "id": "r", + "type": "", + "pos": { + "x": 1056, + "y": 904 + }, + "width": 111, + "height": 126, + "level": 1, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#F7F8FE", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "r", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 11, + "labelHeight": 26, + "labelPosition": "INSIDE_MIDDLE_CENTER" + }, + { + "id": "s", + "type": "", + "pos": { + "x": 709, + "y": 1130 + }, + "width": 112, + "height": 126, + "level": 1, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#F7F8FE", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "s", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 12, + "labelHeight": 26, + "labelPosition": "INSIDE_MIDDLE_CENTER" + }, + { + "id": "t", + "type": "", + "pos": { + "x": 1227, + "y": 904 + }, + "width": 111, + "height": 126, + "level": 1, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#F7F8FE", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "t", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 11, + "labelHeight": 26, + "labelPosition": "INSIDE_MIDDLE_CENTER" + }, + { + "id": "u", + "type": "", + "pos": { + "x": 1398, + "y": 904 + }, + "width": 114, + "height": 126, + "level": 1, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#F7F8FE", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "u", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 14, + "labelHeight": 26, + "labelPosition": "INSIDE_MIDDLE_CENTER" + }, + { + "id": "v", + "type": "", + "pos": { + "x": 1458, + "y": 452 + }, + "width": 114, + "height": 126, + "level": 1, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#F7F8FE", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "v", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 14, + "labelHeight": 26, + "labelPosition": "INSIDE_MIDDLE_CENTER" + }, + { + "id": "w", + "type": "", + "pos": { + "x": 1632, + "y": 452 + }, + "width": 118, + "height": 126, + "level": 1, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#F7F8FE", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "w", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 18, + "labelHeight": 26, + "labelPosition": "INSIDE_MIDDLE_CENTER" + } + ], + "connections": [ + { + "id": "(a -> b)[0]", + "src": "a", + "srcArrow": "none", + "srcLabel": "", + "dst": "b", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 795, + "y": 522.6301165222587 + }, + { + "x": 170.79999999999995, + "y": 606.9260233044517 + }, + { + "x": 28.35, + "y": 640.3437751004016 + }, + { + "x": 82.75, + "y": 689.718875502008 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "(a -> c)[0]", + "src": "a", + "srcArrow": "none", + "srcLabel": "", + "dst": "c", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 795, + "y": 527.2602016322612 + }, + { + "x": 423.59999999999997, + "y": 607.8520403264522 + }, + { + "x": 330.75, + "y": 638 + }, + { + "x": 330.75, + "y": 678 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "(a -> d)[0]", + "src": "a", + "srcArrow": "none", + "srcLabel": "", + "dst": "d", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 795, + "y": 551.9046242774566 + }, + { + "x": 701.8, + "y": 612.7809248554913 + }, + { + "x": 678.5, + "y": 638 + }, + { + "x": 678.5, + "y": 678 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "(a -> e)[0]", + "src": "a", + "srcArrow": "none", + "srcLabel": "", + "dst": "e", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 908, + "y": 551.7982708933718 + }, + { + "x": 1001.6, + "y": 612.7596541786744 + }, + { + "x": 1025, + "y": 638 + }, + { + "x": 1025, + "y": 678 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "(a -> f)[0]", + "src": "a", + "srcArrow": "none", + "srcLabel": "", + "dst": "f", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 908, + "y": 527.3491295938104 + }, + { + "x": 1276.4, + "y": 607.8698259187621 + }, + { + "x": 1368.5, + "y": 638 + }, + { + "x": 1368.5, + "y": 678 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "(g -> a)[0]", + "src": "g", + "srcArrow": "none", + "srcLabel": "", + "dst": "a", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 851.5, + "y": 352 + }, + { + "x": 851.5, + "y": 392 + }, + { + "x": 851.5, + "y": 412 + }, + { + "x": 851.5, + "y": 452 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "(a -> h)[0]", + "src": "a", + "srcArrow": "none", + "srcLabel": "", + "dst": "h", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 908, + "y": 525.2479935794543 + }, + { + "x": 1361.2, + "y": 607.4495987158908 + }, + { + "x": 1488.7, + "y": 640.6 + }, + { + "x": 1545.5, + "y": 691 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "(i -> b)[0]", + "src": "i", + "srcArrow": "none", + "srcLabel": "", + "dst": "b", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 54.639380530973455, + "y": 578 + }, + { + "x": 54.72787610619469, + "y": 618 + }, + { + "x": 62.15, + "y": 638 + }, + { + "x": 91.75, + "y": 678 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "(j -> b)[0]", + "src": "j", + "srcArrow": "none", + "srcLabel": "", + "dst": "b", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 224.13938053097345, + "y": 578 + }, + { + "x": 224.22787610619469, + "y": 618 + }, + { + "x": 216.65, + "y": 638 + }, + { + "x": 186.25, + "y": 678 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "(k -> g)[0]", + "src": "k", + "srcArrow": "none", + "srcLabel": "", + "dst": "g", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 766, + "y": 126 + }, + { + "x": 766, + "y": 166 + }, + { + "x": 773.6, + "y": 186 + }, + { + "x": 804, + "y": 226 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "(l -> g)[0]", + "src": "l", + "srcArrow": "none", + "srcLabel": "", + "dst": "g", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 937, + "y": 126 + }, + { + "x": 937, + "y": 166 + }, + { + "x": 929.4, + "y": 186 + }, + { + "x": 899, + "y": 226 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "(c -> m)[0]", + "src": "c", + "srcArrow": "none", + "srcLabel": "", + "dst": "m", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 281.966814159292, + "y": 804 + }, + { + "x": 250.9933628318584, + "y": 844 + }, + { + "x": 243.25, + "y": 864 + }, + { + "x": 243.25, + "y": 904 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "(c -> n)[0]", + "src": "c", + "srcArrow": "none", + "srcLabel": "", + "dst": "n", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 379.533185840708, + "y": 804 + }, + { + "x": 410.5066371681416, + "y": 844 + }, + { + "x": 418.25, + "y": 864 + }, + { + "x": 418.25, + "y": 904 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "(d -> o)[0]", + "src": "d", + "srcArrow": "none", + "srcLabel": "", + "dst": "o", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 630.1349557522124, + "y": 804 + }, + { + "x": 599.4269911504425, + "y": 844 + }, + { + "x": 591.75, + "y": 864 + }, + { + "x": 591.75, + "y": 904 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "(d -> p)[0]", + "src": "d", + "srcArrow": "none", + "srcLabel": "", + "dst": "p", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 726.8650442477876, + "y": 804 + }, + { + "x": 757.5730088495575, + "y": 844 + }, + { + "x": 765.25, + "y": 864 + }, + { + "x": 765.25, + "y": 904 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "(e -> q)[0]", + "src": "e", + "srcArrow": "none", + "srcLabel": "", + "dst": "q", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 976.9137168141593, + "y": 804 + }, + { + "x": 946.3827433628319, + "y": 844 + }, + { + "x": 938.75, + "y": 864 + }, + { + "x": 938.75, + "y": 904 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "(e -> r)[0]", + "src": "e", + "srcArrow": "none", + "srcLabel": "", + "dst": "r", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 1073.0862831858408, + "y": 804 + }, + { + "x": 1103.617256637168, + "y": 844 + }, + { + "x": 1111.25, + "y": 864 + }, + { + "x": 1111.25, + "y": 904 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "(p -> s)[0]", + "src": "p", + "srcArrow": "none", + "srcLabel": "", + "dst": "s", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 765.25, + "y": 1030 + }, + { + "x": 765.25, + "y": 1070 + }, + { + "x": 765.25, + "y": 1090 + }, + { + "x": 765.25, + "y": 1130 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "(f -> t)[0]", + "src": "f", + "srcArrow": "none", + "srcLabel": "", + "dst": "t", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 1320.4137168141592, + "y": 804 + }, + { + "x": 1289.882743362832, + "y": 844 + }, + { + "x": 1282.25, + "y": 864 + }, + { + "x": 1282.25, + "y": 904 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "(f -> u)[0]", + "src": "f", + "srcArrow": "none", + "srcLabel": "", + "dst": "u", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 1416.5862831858408, + "y": 804 + }, + { + "x": 1447.117256637168, + "y": 844 + }, + { + "x": 1454.75, + "y": 864 + }, + { + "x": 1454.75, + "y": 904 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "(v -> h)[0]", + "src": "v", + "srcArrow": "none", + "srcLabel": "", + "dst": "h", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 1514.5, + "y": 578 + }, + { + "x": 1514.5, + "y": 618 + }, + { + "x": 1522.3, + "y": 638 + }, + { + "x": 1553.5, + "y": 678 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "(w -> h)[0]", + "src": "w", + "srcArrow": "none", + "srcLabel": "", + "dst": "h", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 1690.5, + "y": 578 + }, + { + "x": 1690.5, + "y": 618 + }, + { + "x": 1682.7, + "y": 638 + }, + { + "x": 1651.5, + "y": 678 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + } + ] +} diff --git a/e2etests/testdata/stable/multiple_trees/sketch.exp.svg b/e2etests/testdata/stable/multiple_trees/sketch.exp.svg new file mode 100644 index 000000000..930345e76 --- /dev/null +++ b/e2etests/testdata/stable/multiple_trees/sketch.exp.svg @@ -0,0 +1,22 @@ + +abcdefghijklmnopqrstuvw \ No newline at end of file diff --git a/e2etests/testdata/stable/n22_e32/board.exp.json b/e2etests/testdata/stable/n22_e32/board.exp.json new file mode 100644 index 000000000..0a91698c3 --- /dev/null +++ b/e2etests/testdata/stable/n22_e32/board.exp.json @@ -0,0 +1,2740 @@ +{ + "name": "", + "shapes": [ + { + "id": "a", + "type": "", + "pos": { + "x": 381, + "y": 1130 + }, + "width": 113, + "height": 126, + "level": 1, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#F7F8FE", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "a", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 13, + "labelHeight": 26, + "labelPosition": "INSIDE_MIDDLE_CENTER" + }, + { + "id": "b", + "type": "", + "pos": { + "x": 299, + "y": 1582 + }, + "width": 113, + "height": 126, + "level": 1, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#F7F8FE", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "b", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 13, + "labelHeight": 26, + "labelPosition": "INSIDE_MIDDLE_CENTER" + }, + { + "id": "c", + "type": "", + "pos": { + "x": 420, + "y": 452 + }, + "width": 113, + "height": 126, + "level": 1, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#F7F8FE", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "c", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 13, + "labelHeight": 26, + "labelPosition": "INSIDE_MIDDLE_CENTER" + }, + { + "id": "d", + "type": "", + "pos": { + "x": 213, + "y": 904 + }, + "width": 114, + "height": 126, + "level": 1, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#F7F8FE", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "d", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 14, + "labelHeight": 26, + "labelPosition": "INSIDE_MIDDLE_CENTER" + }, + { + "id": "e", + "type": "", + "pos": { + "x": 80, + "y": 1130 + }, + "width": 113, + "height": 126, + "level": 1, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#F7F8FE", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "e", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 13, + "labelHeight": 26, + "labelPosition": "INSIDE_MIDDLE_CENTER" + }, + { + "id": "f", + "type": "", + "pos": { + "x": 0, + "y": 1356 + }, + "width": 111, + "height": 126, + "level": 1, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#F7F8FE", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "f", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 11, + "labelHeight": 26, + "labelPosition": "INSIDE_MIDDLE_CENTER" + }, + { + "id": "g", + "type": "", + "pos": { + "x": 220, + "y": 0 + }, + "width": 114, + "height": 126, + "level": 1, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#F7F8FE", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "g", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 14, + "labelHeight": 26, + "labelPosition": "INSIDE_MIDDLE_CENTER" + }, + { + "id": "h", + "type": "", + "pos": { + "x": 40, + "y": 226 + }, + "width": 113, + "height": 126, + "level": 1, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#F7F8FE", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "h", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 13, + "labelHeight": 26, + "labelPosition": "INSIDE_MIDDLE_CENTER" + }, + { + "id": "i", + "type": "", + "pos": { + "x": 42, + "y": 452 + }, + "width": 109, + "height": 126, + "level": 1, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#F7F8FE", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "i", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 9, + "labelHeight": 26, + "labelPosition": "INSIDE_MIDDLE_CENTER" + }, + { + "id": "j", + "type": "", + "pos": { + "x": 42, + "y": 678 + }, + "width": 110, + "height": 126, + "level": 1, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#F7F8FE", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "j", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 10, + "labelHeight": 26, + "labelPosition": "INSIDE_MIDDLE_CENTER" + }, + { + "id": "k", + "type": "", + "pos": { + "x": 40, + "y": 904 + }, + "width": 113, + "height": 126, + "level": 1, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#F7F8FE", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "k", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 13, + "labelHeight": 26, + "labelPosition": "INSIDE_MIDDLE_CENTER" + }, + { + "id": "l", + "type": "", + "pos": { + "x": 995, + "y": 1130 + }, + "width": 109, + "height": 126, + "level": 1, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#F7F8FE", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "l", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 9, + "labelHeight": 26, + "labelPosition": "INSIDE_MIDDLE_CENTER" + }, + { + "id": "m", + "type": "", + "pos": { + "x": 919, + "y": 1582 + }, + "width": 117, + "height": 126, + "level": 1, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#F7F8FE", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "m", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 17, + "labelHeight": 26, + "labelPosition": "INSIDE_MIDDLE_CENTER" + }, + { + "id": "n", + "type": "", + "pos": { + "x": 900, + "y": 904 + }, + "width": 113, + "height": 126, + "level": 1, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#F7F8FE", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "n", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 13, + "labelHeight": 26, + "labelPosition": "INSIDE_MIDDLE_CENTER" + }, + { + "id": "o", + "type": "", + "pos": { + "x": 781, + "y": 1130 + }, + "width": 114, + "height": 126, + "level": 1, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#F7F8FE", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "o", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 14, + "labelHeight": 26, + "labelPosition": "INSIDE_MIDDLE_CENTER" + }, + { + "id": "p", + "type": "", + "pos": { + "x": 708, + "y": 1356 + }, + "width": 113, + "height": 126, + "level": 1, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#F7F8FE", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "p", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 13, + "labelHeight": 26, + "labelPosition": "INSIDE_MIDDLE_CENTER" + }, + { + "id": "q", + "type": "", + "pos": { + "x": 835, + "y": 0 + }, + "width": 114, + "height": 126, + "level": 1, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#F7F8FE", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "q", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 14, + "labelHeight": 26, + "labelPosition": "INSIDE_MIDDLE_CENTER" + }, + { + "id": "r", + "type": "", + "pos": { + "x": 616, + "y": 226 + }, + "width": 111, + "height": 126, + "level": 1, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#F7F8FE", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "r", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 11, + "labelHeight": 26, + "labelPosition": "INSIDE_MIDDLE_CENTER" + }, + { + "id": "s", + "type": "", + "pos": { + "x": 615, + "y": 452 + }, + "width": 112, + "height": 126, + "level": 1, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#F7F8FE", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "s", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 12, + "labelHeight": 26, + "labelPosition": "INSIDE_MIDDLE_CENTER" + }, + { + "id": "t", + "type": "", + "pos": { + "x": 616, + "y": 678 + }, + "width": 111, + "height": 126, + "level": 1, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#F7F8FE", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "t", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 11, + "labelHeight": 26, + "labelPosition": "INSIDE_MIDDLE_CENTER" + }, + { + "id": "u", + "type": "", + "pos": { + "x": 527, + "y": 904 + }, + "width": 114, + "height": 126, + "level": 1, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#F7F8FE", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "u", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 14, + "labelHeight": 26, + "labelPosition": "INSIDE_MIDDLE_CENTER" + } + ], + "connections": [ + { + "id": "(a -> b)[0]", + "src": "a", + "srcArrow": "none", + "srcLabel": "", + "dst": "b", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 437, + "y": 1256 + }, + { + "x": 437, + "y": 1296 + }, + { + "x": 437, + "y": 1328.6 + }, + { + "x": 437, + "y": 1362.5 + }, + { + "x": 437, + "y": 1396.4 + }, + { + "x": 429.8, + "y": 1542 + }, + { + "x": 401, + "y": 1582 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "(c -> a)[0]", + "src": "c", + "srcArrow": "none", + "srcLabel": "", + "dst": "a", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 476.75, + "y": 578 + }, + { + "x": 476.75, + "y": 618 + }, + { + "x": 476.75, + "y": 650.6 + }, + { + "x": 476.75, + "y": 684.5 + }, + { + "x": 476.75, + "y": 718.4 + }, + { + "x": 476.75, + "y": 763.6 + }, + { + "x": 476.75, + "y": 797.5 + }, + { + "x": 476.75, + "y": 831.4 + }, + { + "x": 476.75, + "y": 876.6 + }, + { + "x": 476.75, + "y": 910.5 + }, + { + "x": 476.75, + "y": 944.4 + }, + { + "x": 473.15, + "y": 1090 + }, + { + "x": 458.75, + "y": 1130 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "(d -> a)[0]", + "src": "d", + "srcArrow": "none", + "srcLabel": "", + "dst": "a", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 327, + "y": 1005.6266866566716 + }, + { + "x": 414.8, + "y": 1065.1253373313343 + }, + { + "x": 436.75, + "y": 1090 + }, + { + "x": 436.75, + "y": 1130 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "(d -> b)[0]", + "src": "d", + "srcArrow": "none", + "srcLabel": "", + "dst": "b", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 270, + "y": 1030 + }, + { + "x": 270, + "y": 1070 + }, + { + "x": 270, + "y": 1102.6 + }, + { + "x": 270, + "y": 1136.5 + }, + { + "x": 270, + "y": 1170.4 + }, + { + "x": 270, + "y": 1215.6 + }, + { + "x": 270, + "y": 1249.5 + }, + { + "x": 270, + "y": 1283.4 + }, + { + "x": 270, + "y": 1328.6 + }, + { + "x": 270, + "y": 1362.5 + }, + { + "x": 270, + "y": 1396.4 + }, + { + "x": 277.6, + "y": 1542 + }, + { + "x": 308, + "y": 1582 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "(d -> e)[0]", + "src": "d", + "srcArrow": "none", + "srcLabel": "", + "dst": "e", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 221.6349557522124, + "y": 1030 + }, + { + "x": 190.92699115044246, + "y": 1070 + }, + { + "x": 179.05, + "y": 1090 + }, + { + "x": 162.25, + "y": 1130 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "(e -> f)[0]", + "src": "e", + "srcArrow": "none", + "srcLabel": "", + "dst": "f", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 136.5, + "y": 1256 + }, + { + "x": 136.5, + "y": 1296 + }, + { + "x": 129.3, + "y": 1316 + }, + { + "x": 100.5, + "y": 1356 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "(f -> b)[0]", + "src": "f", + "srcArrow": "none", + "srcLabel": "", + "dst": "b", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 55.5, + "y": 1482 + }, + { + "x": 55.5, + "y": 1522 + }, + { + "x": 104.30000000000001, + "y": 1550.4 + }, + { + "x": 299.5, + "y": 1624 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "(c -> f)[0]", + "src": "c", + "srcArrow": "none", + "srcLabel": "", + "dst": "f", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 420.25, + "y": 528.1165896250642 + }, + { + "x": 76.04999999999995, + "y": 608.0233179250129 + }, + { + "x": -10, + "y": 650.6 + }, + { + "x": -10, + "y": 684.5 + }, + { + "x": -10, + "y": 718.4 + }, + { + "x": -10, + "y": 763.6 + }, + { + "x": -10, + "y": 797.5 + }, + { + "x": -10, + "y": 831.4 + }, + { + "x": -10, + "y": 876.6 + }, + { + "x": -10, + "y": 910.5 + }, + { + "x": -10, + "y": 944.4 + }, + { + "x": -10, + "y": 989.6 + }, + { + "x": -10, + "y": 1023.5 + }, + { + "x": -10, + "y": 1057.4 + }, + { + "x": -10, + "y": 1102.6 + }, + { + "x": -10, + "y": 1136.5 + }, + { + "x": -10, + "y": 1170.4 + }, + { + "x": -4.199999999999999, + "y": 1316 + }, + { + "x": 19, + "y": 1356 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "(g -> c)[0]", + "src": "g", + "srcArrow": "none", + "srcLabel": "", + "dst": "c", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 333.75, + "y": 95.205 + }, + { + "x": 448.15, + "y": 159.841 + }, + { + "x": 476.75, + "y": 198.6 + }, + { + "x": 476.75, + "y": 232.5 + }, + { + "x": 476.75, + "y": 266.4 + }, + { + "x": 476.75, + "y": 412 + }, + { + "x": 476.75, + "y": 452 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "(g -> h)[0]", + "src": "g", + "srcArrow": "none", + "srcLabel": "", + "dst": "h", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 219.75, + "y": 98.73370319001387 + }, + { + "x": 121.14999999999999, + "y": 160.54674063800277 + }, + { + "x": 96.5, + "y": 186 + }, + { + "x": 96.5, + "y": 226 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "(h -> i)[0]", + "src": "h", + "srcArrow": "none", + "srcLabel": "", + "dst": "i", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 96.5, + "y": 352 + }, + { + "x": 96.5, + "y": 392 + }, + { + "x": 96.5, + "y": 412 + }, + { + "x": 96.5, + "y": 452 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "(i -> j)[0]", + "src": "i", + "srcArrow": "none", + "srcLabel": "", + "dst": "j", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 96.5, + "y": 578 + }, + { + "x": 96.5, + "y": 618 + }, + { + "x": 96.5, + "y": 638 + }, + { + "x": 96.5, + "y": 678 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "(j -> k)[0]", + "src": "j", + "srcArrow": "none", + "srcLabel": "", + "dst": "k", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 96.5, + "y": 804 + }, + { + "x": 96.5, + "y": 844 + }, + { + "x": 96.5, + "y": 864 + }, + { + "x": 96.5, + "y": 904 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "(k -> e)[0]", + "src": "k", + "srcArrow": "none", + "srcLabel": "", + "dst": "e", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 96.5, + "y": 1030 + }, + { + "x": 96.5, + "y": 1070 + }, + { + "x": 100.1, + "y": 1090 + }, + { + "x": 114.5, + "y": 1130 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "(j -> f)[0]", + "src": "j", + "srcArrow": "none", + "srcLabel": "", + "dst": "f", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 41.5, + "y": 783.4232081911263 + }, + { + "x": -31.700000000000003, + "y": 839.8846416382253 + }, + { + "x": -50, + "y": 876.6 + }, + { + "x": -50, + "y": 910.5 + }, + { + "x": -50, + "y": 944.4 + }, + { + "x": -50, + "y": 989.6 + }, + { + "x": -50, + "y": 1023.5 + }, + { + "x": -50, + "y": 1057.4 + }, + { + "x": -50, + "y": 1102.6 + }, + { + "x": -50, + "y": 1136.5 + }, + { + "x": -50, + "y": 1170.4 + }, + { + "x": -40, + "y": 1316.8 + }, + { + "x": 0, + "y": 1360 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "(l -> m)[0]", + "src": "l", + "srcArrow": "none", + "srcLabel": "", + "dst": "m", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 1049.25, + "y": 1256 + }, + { + "x": 1049.25, + "y": 1296 + }, + { + "x": 1049.25, + "y": 1328.6 + }, + { + "x": 1049.25, + "y": 1362.5 + }, + { + "x": 1049.25, + "y": 1396.4 + }, + { + "x": 1042.85, + "y": 1542 + }, + { + "x": 1017.25, + "y": 1582 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "(n -> l)[0]", + "src": "n", + "srcArrow": "none", + "srcLabel": "", + "dst": "l", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 1012.75, + "y": 1023.5 + }, + { + "x": 1057.95, + "y": 1068.7 + }, + { + "x": 1067.45, + "y": 1090 + }, + { + "x": 1060.25, + "y": 1130 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "(n -> l)[1]", + "src": "n", + "srcArrow": "none", + "srcLabel": "", + "dst": "l", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 990.1194690265487, + "y": 1030 + }, + { + "x": 1011.6238938053098, + "y": 1070 + }, + { + "x": 1019.8, + "y": 1090 + }, + { + "x": 1031, + "y": 1130 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "(n -> m)[0]", + "src": "n", + "srcArrow": "none", + "srcLabel": "", + "dst": "m", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 949.8384955752213, + "y": 1030 + }, + { + "x": 945.7676991150443, + "y": 1070 + }, + { + "x": 944.75, + "y": 1102.6 + }, + { + "x": 944.75, + "y": 1136.5 + }, + { + "x": 944.75, + "y": 1170.4 + }, + { + "x": 944.75, + "y": 1215.6 + }, + { + "x": 944.75, + "y": 1249.5 + }, + { + "x": 944.75, + "y": 1283.4 + }, + { + "x": 944.75, + "y": 1328.6 + }, + { + "x": 944.75, + "y": 1362.5 + }, + { + "x": 944.75, + "y": 1396.4 + }, + { + "x": 947.55, + "y": 1542 + }, + { + "x": 958.75, + "y": 1582 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "(n -> o)[0]", + "src": "n", + "srcArrow": "none", + "srcLabel": "", + "dst": "o", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 908.8606194690266, + "y": 1030 + }, + { + "x": 878.7721238938053, + "y": 1070 + }, + { + "x": 868.25, + "y": 1090 + }, + { + "x": 856.25, + "y": 1130 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "(o -> p)[0]", + "src": "o", + "srcArrow": "none", + "srcLabel": "", + "dst": "p", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 837.75, + "y": 1256 + }, + { + "x": 837.75, + "y": 1296 + }, + { + "x": 831.35, + "y": 1316 + }, + { + "x": 805.75, + "y": 1356 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "(p -> m)[0]", + "src": "p", + "srcArrow": "none", + "srcLabel": "", + "dst": "m", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 764.5, + "y": 1482 + }, + { + "x": 764.5, + "y": 1522 + }, + { + "x": 795.35, + "y": 1548.3856639247945 + }, + { + "x": 918.75, + "y": 1613.928319623972 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "(n -> p)[0]", + "src": "n", + "srcArrow": "none", + "srcLabel": "", + "dst": "p", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 899.75, + "y": 995.3126385809312 + }, + { + "x": 764.55, + "y": 1063.0625277161862 + }, + { + "x": 730.75, + "y": 1102.6 + }, + { + "x": 730.75, + "y": 1136.5 + }, + { + "x": 730.75, + "y": 1170.4 + }, + { + "x": 733.75, + "y": 1316 + }, + { + "x": 745.75, + "y": 1356 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "(q -> n)[0]", + "src": "q", + "srcArrow": "none", + "srcLabel": "", + "dst": "n", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 927.7101769911504, + "y": 126 + }, + { + "x": 950.54203539823, + "y": 166 + }, + { + "x": 956.25, + "y": 198.6 + }, + { + "x": 956.25, + "y": 232.5 + }, + { + "x": 956.25, + "y": 266.4 + }, + { + "x": 956.25, + "y": 311.6 + }, + { + "x": 956.25, + "y": 345.5 + }, + { + "x": 956.25, + "y": 379.4 + }, + { + "x": 956.25, + "y": 424.6 + }, + { + "x": 956.25, + "y": 458.5 + }, + { + "x": 956.25, + "y": 492.4 + }, + { + "x": 956.25, + "y": 537.6 + }, + { + "x": 956.25, + "y": 571.5 + }, + { + "x": 956.25, + "y": 605.4 + }, + { + "x": 956.25, + "y": 650.6 + }, + { + "x": 956.25, + "y": 684.5 + }, + { + "x": 956.25, + "y": 718.4 + }, + { + "x": 956.25, + "y": 864 + }, + { + "x": 956.25, + "y": 904 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "(q -> r)[0]", + "src": "q", + "srcArrow": "none", + "srcLabel": "", + "dst": "r", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 834.75, + "y": 92.17780294450736 + }, + { + "x": 703.75, + "y": 159.23556058890148 + }, + { + "x": 671, + "y": 186 + }, + { + "x": 671, + "y": 226 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "(r -> s)[0]", + "src": "r", + "srcArrow": "none", + "srcLabel": "", + "dst": "s", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 671, + "y": 352 + }, + { + "x": 671, + "y": 392 + }, + { + "x": 671, + "y": 412 + }, + { + "x": 671, + "y": 452 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "(s -> t)[0]", + "src": "s", + "srcArrow": "none", + "srcLabel": "", + "dst": "t", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 723.2676991150443, + "y": 578 + }, + { + "x": 756.4535398230089, + "y": 618 + }, + { + "x": 756.55, + "y": 638 + }, + { + "x": 723.75, + "y": 678 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "(t -> u)[0]", + "src": "t", + "srcArrow": "none", + "srcLabel": "", + "dst": "u", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 622.3561946902655, + "y": 804 + }, + { + "x": 591.4712389380531, + "y": 844 + }, + { + "x": 583.75, + "y": 864 + }, + { + "x": 583.75, + "y": 904 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "(u -> o)[0]", + "src": "u", + "srcArrow": "none", + "srcLabel": "", + "dst": "o", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 640.75, + "y": 996.2108843537414 + }, + { + "x": 771.55, + "y": 1063.2421768707484 + }, + { + "x": 807.25, + "y": 1090 + }, + { + "x": 819.25, + "y": 1130 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "(t -> p)[0]", + "src": "t", + "srcArrow": "none", + "srcLabel": "", + "dst": "p", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 682.0110619469026, + "y": 804 + }, + { + "x": 689.0022123893805, + "y": 844 + }, + { + "x": 690.75, + "y": 876.6 + }, + { + "x": 690.75, + "y": 910.5 + }, + { + "x": 690.75, + "y": 944.4 + }, + { + "x": 690.75, + "y": 989.6 + }, + { + "x": 690.75, + "y": 1023.5 + }, + { + "x": 690.75, + "y": 1057.4 + }, + { + "x": 690.75, + "y": 1102.6 + }, + { + "x": 690.75, + "y": 1136.5 + }, + { + "x": 690.75, + "y": 1170.4 + }, + { + "x": 697.35, + "y": 1316 + }, + { + "x": 723.75, + "y": 1356 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "(c -> t)[0]", + "src": "c", + "srcArrow": "none", + "srcLabel": "", + "dst": "t", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 517.7278761061947, + "y": 578 + }, + { + "x": 543.7455752212389, + "y": 618 + }, + { + "x": 563.3, + "y": 640.2124223602484 + }, + { + "x": 615.5, + "y": 689.0621118012423 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "(s -> a)[0]", + "src": "s", + "srcArrow": "none", + "srcLabel": "", + "dst": "a", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 615, + "y": 538.0738377392889 + }, + { + "x": 440.4, + "y": 610.0147675478578 + }, + { + "x": 396.75, + "y": 650.6 + }, + { + "x": 396.75, + "y": 684.5 + }, + { + "x": 396.75, + "y": 718.4 + }, + { + "x": 396.75, + "y": 763.6 + }, + { + "x": 396.75, + "y": 797.5 + }, + { + "x": 396.75, + "y": 831.4 + }, + { + "x": 396.75, + "y": 876.6 + }, + { + "x": 396.75, + "y": 910.5 + }, + { + "x": 396.75, + "y": 944.4 + }, + { + "x": 400.35, + "y": 1090 + }, + { + "x": 414.75, + "y": 1130 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "(u -> a)[0]", + "src": "u", + "srcArrow": "none", + "srcLabel": "", + "dst": "a", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 526.75, + "y": 993.7817047817048 + }, + { + "x": 379.95, + "y": 1062.7563409563409 + }, + { + "x": 351.45, + "y": 1090 + }, + { + "x": 384.25, + "y": 1130 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + } + ] +} diff --git a/e2etests/testdata/stable/n22_e32/sketch.exp.svg b/e2etests/testdata/stable/n22_e32/sketch.exp.svg new file mode 100644 index 000000000..f7ea61365 --- /dev/null +++ b/e2etests/testdata/stable/n22_e32/sketch.exp.svg @@ -0,0 +1,22 @@ + +abcdefghijklmnopqrstu \ No newline at end of file diff --git a/e2etests/testdata/stable/one_container_loop/board.exp.json b/e2etests/testdata/stable/one_container_loop/board.exp.json new file mode 100644 index 000000000..0b60af818 --- /dev/null +++ b/e2etests/testdata/stable/one_container_loop/board.exp.json @@ -0,0 +1,748 @@ +{ + "name": "", + "shapes": [ + { + "id": "a", + "type": "", + "pos": { + "x": 0, + "y": 0 + }, + "width": 479, + "height": 226, + "level": 1, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#E3E9FD", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "a", + "fontSize": 28, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 17, + "labelHeight": 41, + "labelPosition": "INSIDE_TOP_CENTER" + }, + { + "id": "a.b", + "type": "", + "pos": { + "x": 90, + "y": 50 + }, + "width": 113, + "height": 126, + "level": 2, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#EDF0FD", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "b", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 13, + "labelHeight": 26, + "labelPosition": "INSIDE_MIDDLE_CENTER" + }, + { + "id": "c", + "type": "", + "pos": { + "x": 143, + "y": 1004 + }, + "width": 113, + "height": 126, + "level": 1, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#F7F8FE", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "c", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 13, + "labelHeight": 26, + "labelPosition": "INSIDE_MIDDLE_CENTER" + }, + { + "id": "d", + "type": "", + "pos": { + "x": 316, + "y": 778 + }, + "width": 114, + "height": 126, + "level": 1, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#F7F8FE", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "d", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 14, + "labelHeight": 26, + "labelPosition": "INSIDE_MIDDLE_CENTER" + }, + { + "id": "e", + "type": "", + "pos": { + "x": 143, + "y": 778 + }, + "width": 113, + "height": 126, + "level": 1, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#F7F8FE", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "e", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 13, + "labelHeight": 26, + "labelPosition": "INSIDE_MIDDLE_CENTER" + }, + { + "id": "f", + "type": "", + "pos": { + "x": 318, + "y": 552 + }, + "width": 111, + "height": 126, + "level": 1, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#F7F8FE", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "f", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 11, + "labelHeight": 26, + "labelPosition": "INSIDE_MIDDLE_CENTER" + }, + { + "id": "g", + "type": "", + "pos": { + "x": 316, + "y": 326 + }, + "width": 114, + "height": 126, + "level": 1, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#F7F8FE", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "g", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 14, + "labelHeight": 26, + "labelPosition": "INSIDE_MIDDLE_CENTER" + }, + { + "id": "a.h", + "type": "", + "pos": { + "x": 317, + "y": 50 + }, + "width": 113, + "height": 126, + "level": 2, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#EDF0FD", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "h", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 13, + "labelHeight": 26, + "labelPosition": "INSIDE_MIDDLE_CENTER" + } + ], + "connections": [ + { + "id": "(a.b -> c)[0]", + "src": "a.b", + "srcArrow": "none", + "srcLabel": "", + "dst": "c", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 116.81194690265487, + "y": 176 + }, + { + "x": 97.96238938053096, + "y": 216 + }, + { + "x": 93.25, + "y": 236 + }, + { + "x": 93.25, + "y": 251 + }, + { + "x": 93.25, + "y": 266 + }, + { + "x": 93.25, + "y": 298.6 + }, + { + "x": 93.25, + "y": 332.5 + }, + { + "x": 93.25, + "y": 366.4 + }, + { + "x": 93.25, + "y": 411.6 + }, + { + "x": 93.25, + "y": 445.5 + }, + { + "x": 93.25, + "y": 479.4 + }, + { + "x": 93.25, + "y": 524.6 + }, + { + "x": 93.25, + "y": 558.5 + }, + { + "x": 93.25, + "y": 592.4 + }, + { + "x": 93.25, + "y": 637.6 + }, + { + "x": 93.25, + "y": 671.5 + }, + { + "x": 93.25, + "y": 705.4 + }, + { + "x": 93.25, + "y": 750.6 + }, + { + "x": 93.25, + "y": 784.5 + }, + { + "x": 93.25, + "y": 818.4 + }, + { + "x": 103.25, + "y": 964.6 + }, + { + "x": 143.25, + "y": 1007 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "(d -> c)[0]", + "src": "d", + "srcArrow": "none", + "srcLabel": "", + "dst": "c", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 373.25, + "y": 904 + }, + { + "x": 373.25, + "y": 944 + }, + { + "x": 349.85, + "y": 969.2403458213256 + }, + { + "x": 256.25, + "y": 1030.2017291066281 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "(e -> c)[0]", + "src": "e", + "srcArrow": "none", + "srcLabel": "", + "dst": "c", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 199.75, + "y": 904 + }, + { + "x": 199.75, + "y": 944 + }, + { + "x": 199.75, + "y": 964 + }, + { + "x": 199.75, + "y": 1004 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "(f -> d)[0]", + "src": "f", + "srcArrow": "none", + "srcLabel": "", + "dst": "d", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 373.25, + "y": 678 + }, + { + "x": 373.25, + "y": 718 + }, + { + "x": 373.25, + "y": 738 + }, + { + "x": 373.25, + "y": 778 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "(a -> e)[0]", + "src": "a", + "srcArrow": "none", + "srcLabel": "", + "dst": "e", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 199.75, + "y": 226 + }, + { + "x": 199.75, + "y": 266 + }, + { + "x": 199.75, + "y": 298.6 + }, + { + "x": 199.75, + "y": 332.5 + }, + { + "x": 199.75, + "y": 366.4 + }, + { + "x": 199.75, + "y": 411.6 + }, + { + "x": 199.75, + "y": 445.5 + }, + { + "x": 199.75, + "y": 479.4 + }, + { + "x": 199.75, + "y": 524.6 + }, + { + "x": 199.75, + "y": 558.5 + }, + { + "x": 199.75, + "y": 592.4 + }, + { + "x": 199.75, + "y": 738 + }, + { + "x": 199.75, + "y": 778 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "(g -> f)[0]", + "src": "g", + "srcArrow": "none", + "srcLabel": "", + "dst": "f", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 373.25, + "y": 452 + }, + { + "x": 373.25, + "y": 492 + }, + { + "x": 373.25, + "y": 512 + }, + { + "x": 373.25, + "y": 552 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "(a.h -> g)[0]", + "src": "a.h", + "srcArrow": "none", + "srcLabel": "", + "dst": "g", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 373.25, + "y": 176 + }, + { + "x": 373.25, + "y": 216 + }, + { + "x": 373.25, + "y": 286 + }, + { + "x": 373.25, + "y": 326 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + } + ] +} diff --git a/e2etests/testdata/stable/one_container_loop/sketch.exp.svg b/e2etests/testdata/stable/one_container_loop/sketch.exp.svg new file mode 100644 index 000000000..fd53e03f0 --- /dev/null +++ b/e2etests/testdata/stable/one_container_loop/sketch.exp.svg @@ -0,0 +1,22 @@ + +acdefgbh \ No newline at end of file diff --git a/e2etests/testdata/stable/one_three_one_container/board.exp.json b/e2etests/testdata/stable/one_three_one_container/board.exp.json new file mode 100644 index 000000000..ffc66f955 --- /dev/null +++ b/e2etests/testdata/stable/one_three_one_container/board.exp.json @@ -0,0 +1,555 @@ +{ + "name": "", + "shapes": [ + { + "id": "top", + "type": "", + "pos": { + "x": 0, + "y": 0 + }, + "width": 506, + "height": 226, + "level": 1, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#E3E9FD", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "top", + "fontSize": 28, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 45, + "labelHeight": 41, + "labelPosition": "INSIDE_TOP_CENTER" + }, + { + "id": "top.start", + "type": "", + "pos": { + "x": 183, + "y": 50 + }, + "width": 140, + "height": 126, + "level": 2, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#EDF0FD", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "start", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 40, + "labelHeight": 26, + "labelPosition": "INSIDE_MIDDLE_CENTER" + }, + { + "id": "a", + "type": "", + "pos": { + "x": 42, + "y": 326 + }, + "width": 113, + "height": 126, + "level": 1, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#F7F8FE", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "a", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 13, + "labelHeight": 26, + "labelPosition": "INSIDE_MIDDLE_CENTER" + }, + { + "id": "b", + "type": "", + "pos": { + "x": 215, + "y": 326 + }, + "width": 113, + "height": 126, + "level": 1, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#F7F8FE", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "b", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 13, + "labelHeight": 26, + "labelPosition": "INSIDE_MIDDLE_CENTER" + }, + { + "id": "c", + "type": "", + "pos": { + "x": 388, + "y": 326 + }, + "width": 113, + "height": 126, + "level": 1, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#F7F8FE", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "c", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 13, + "labelHeight": 26, + "labelPosition": "INSIDE_MIDDLE_CENTER" + }, + { + "id": "bottom", + "type": "", + "pos": { + "x": 0, + "y": 552 + }, + "width": 504, + "height": 226, + "level": 1, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#E3E9FD", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "bottom", + "fontSize": 28, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 90, + "labelHeight": 41, + "labelPosition": "INSIDE_TOP_CENTER" + }, + { + "id": "bottom.end", + "type": "", + "pos": { + "x": 207, + "y": 602 + }, + "width": 132, + "height": 126, + "level": 2, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#EDF0FD", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "end", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 32, + "labelHeight": 26, + "labelPosition": "INSIDE_MIDDLE_CENTER" + } + ], + "connections": [ + { + "id": "(top.start -> a)[0]", + "src": "top.start", + "srcArrow": "none", + "srcLabel": "", + "dst": "a", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 183, + "y": 164.03225806451613 + }, + { + "x": 115, + "y": 213.60645161290324 + }, + { + "x": 98, + "y": 286 + }, + { + "x": 98, + "y": 326 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "(top.start -> b)[0]", + "src": "top.start", + "srcArrow": "none", + "srcLabel": "", + "dst": "b", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 263.0353982300885, + "y": 176 + }, + { + "x": 269.4070796460177, + "y": 216 + }, + { + "x": 271, + "y": 286 + }, + { + "x": 271, + "y": 326 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "(top.start -> c)[0]", + "src": "top.start", + "srcArrow": "none", + "srcLabel": "", + "dst": "c", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 323, + "y": 154.41361256544502 + }, + { + "x": 419.8, + "y": 211.682722513089 + }, + { + "x": 444, + "y": 286 + }, + { + "x": 444, + "y": 326 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "(a -> bottom.end)[0]", + "src": "a", + "srcArrow": "none", + "srcLabel": "", + "dst": "bottom.end", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 98, + "y": 452 + }, + { + "x": 98, + "y": 492 + }, + { + "x": 119.8, + "y": 566 + }, + { + "x": 207, + "y": 622 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "(b -> bottom.end)[0]", + "src": "b", + "srcArrow": "none", + "srcLabel": "", + "dst": "bottom.end", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 271, + "y": 452 + }, + { + "x": 271, + "y": 492 + }, + { + "x": 271.2, + "y": 562 + }, + { + "x": 272, + "y": 602 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "(c -> bottom.end)[0]", + "src": "c", + "srcArrow": "none", + "srcLabel": "", + "dst": "bottom.end", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 444, + "y": 452 + }, + { + "x": 444, + "y": 492 + }, + { + "x": 423, + "y": 565.8 + }, + { + "x": 339, + "y": 621 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + } + ] +} diff --git a/e2etests/testdata/stable/one_three_one_container/sketch.exp.svg b/e2etests/testdata/stable/one_three_one_container/sketch.exp.svg new file mode 100644 index 000000000..dcc76f990 --- /dev/null +++ b/e2etests/testdata/stable/one_three_one_container/sketch.exp.svg @@ -0,0 +1,22 @@ + +topabcbottomstartend \ No newline at end of file diff --git a/e2etests/testdata/stable/p/board.exp.json b/e2etests/testdata/stable/p/board.exp.json new file mode 100644 index 000000000..c652c90fa --- /dev/null +++ b/e2etests/testdata/stable/p/board.exp.json @@ -0,0 +1,214 @@ +{ + "name": "", + "shapes": [ + { + "id": "md", + "type": "text", + "pos": { + "x": 0, + "y": 226 + }, + "width": 1861, + "height": 29, + "level": 1, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#FFFFFF", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "\nA paragraph is simply one or more consecutive lines of text, separated\nby one or more blank lines. (A blank line is any line that looks like a\nblank line -- a line containing nothing but spaces or tabs is considered\nblank.) Normal paragraphs should not be indented with spaces or tabs.\n", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "markdown", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 1861, + "labelHeight": 29 + }, + { + "id": "a", + "type": "", + "pos": { + "x": 874, + "y": 0 + }, + "width": 113, + "height": 126, + "level": 1, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#F7F8FE", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "a", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 13, + "labelHeight": 26, + "labelPosition": "INSIDE_MIDDLE_CENTER" + }, + { + "id": "b", + "type": "", + "pos": { + "x": 874, + "y": 355 + }, + "width": 113, + "height": 126, + "level": 1, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#F7F8FE", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "b", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 13, + "labelHeight": 26, + "labelPosition": "INSIDE_MIDDLE_CENTER" + } + ], + "connections": [ + { + "id": "(a -> md)[0]", + "src": "a", + "srcArrow": "none", + "srcLabel": "", + "dst": "md", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 930.5, + "y": 126 + }, + { + "x": 930.5, + "y": 166 + }, + { + "x": 930.5, + "y": 186 + }, + { + "x": 930.5, + "y": 226 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "(md -> b)[0]", + "src": "md", + "srcArrow": "none", + "srcLabel": "", + "dst": "b", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 930.5, + "y": 255 + }, + { + "x": 930.5, + "y": 295 + }, + { + "x": 930.5, + "y": 315 + }, + { + "x": 930.5, + "y": 355 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + } + ] +} diff --git a/e2etests/testdata/stable/p/sketch.exp.svg b/e2etests/testdata/stable/p/sketch.exp.svg new file mode 100644 index 000000000..b5956dee7 --- /dev/null +++ b/e2etests/testdata/stable/p/sketch.exp.svg @@ -0,0 +1,818 @@ + +

A paragraph is simply one or more consecutive lines of text, separated +by one or more blank lines. (A blank line is any line that looks like a +blank line -- a line containing nothing but spaces or tabs is considered +blank.) Normal paragraphs should not be indented with spaces or tabs.

+
ab
\ No newline at end of file diff --git a/e2etests/testdata/stable/pre/board.exp.json b/e2etests/testdata/stable/pre/board.exp.json new file mode 100644 index 000000000..b5c0986eb --- /dev/null +++ b/e2etests/testdata/stable/pre/board.exp.json @@ -0,0 +1,214 @@ +{ + "name": "", + "shapes": [ + { + "id": "md", + "type": "text", + "pos": { + "x": 0, + "y": 226 + }, + "width": 606, + "height": 186, + "level": 1, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#FFFFFF", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "\nHere is an example of AppleScript:\n\n tell application \"Foo\"\n beep\n end tell\n\nA code block continues until it reaches a line that is not indented\n(or the end of the article).\n", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "markdown", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 606, + "labelHeight": 186 + }, + { + "id": "a", + "type": "", + "pos": { + "x": 247, + "y": 0 + }, + "width": 113, + "height": 126, + "level": 1, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#F7F8FE", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "a", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 13, + "labelHeight": 26, + "labelPosition": "INSIDE_MIDDLE_CENTER" + }, + { + "id": "b", + "type": "", + "pos": { + "x": 247, + "y": 512 + }, + "width": 113, + "height": 126, + "level": 1, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#F7F8FE", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "b", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 13, + "labelHeight": 26, + "labelPosition": "INSIDE_MIDDLE_CENTER" + } + ], + "connections": [ + { + "id": "(a -> md)[0]", + "src": "a", + "srcArrow": "none", + "srcLabel": "", + "dst": "md", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 303, + "y": 126 + }, + { + "x": 303, + "y": 166 + }, + { + "x": 303, + "y": 186 + }, + { + "x": 303, + "y": 226 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "(md -> b)[0]", + "src": "md", + "srcArrow": "none", + "srcLabel": "", + "dst": "b", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 303, + "y": 412 + }, + { + "x": 303, + "y": 452 + }, + { + "x": 303, + "y": 472 + }, + { + "x": 303, + "y": 512 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + } + ] +} diff --git a/e2etests/testdata/stable/pre/sketch.exp.svg b/e2etests/testdata/stable/pre/sketch.exp.svg new file mode 100644 index 000000000..a876cdf75 --- /dev/null +++ b/e2etests/testdata/stable/pre/sketch.exp.svg @@ -0,0 +1,821 @@ + +

Here is an example of AppleScript:

+
tell application "Foo"
+    beep
+end tell
+
+

A code block continues until it reaches a line that is not indented +(or the end of the article).

+
ab
\ No newline at end of file diff --git a/e2etests/testdata/stable/straight_hierarchy_container/board.exp.json b/e2etests/testdata/stable/straight_hierarchy_container/board.exp.json new file mode 100644 index 000000000..ca1f3c399 --- /dev/null +++ b/e2etests/testdata/stable/straight_hierarchy_container/board.exp.json @@ -0,0 +1,1665 @@ +{ + "name": "", + "shapes": [ + { + "id": "a", + "type": "", + "pos": { + "x": 90, + "y": 0 + }, + "width": 113, + "height": 126, + "level": 1, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#F7F8FE", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "a", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 13, + "labelHeight": 26, + "labelPosition": "INSIDE_MIDDLE_CENTER" + }, + { + "id": "c", + "type": "", + "pos": { + "x": 596, + "y": 0 + }, + "width": 113, + "height": 126, + "level": 1, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#F7F8FE", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "c", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 13, + "labelHeight": 26, + "labelPosition": "INSIDE_MIDDLE_CENTER" + }, + { + "id": "b", + "type": "", + "pos": { + "x": 343, + "y": 0 + }, + "width": 113, + "height": 126, + "level": 1, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#F7F8FE", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "b", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 13, + "labelHeight": 26, + "labelPosition": "INSIDE_MIDDLE_CENTER" + }, + { + "id": "l1", + "type": "", + "pos": { + "x": 40, + "y": 226 + }, + "width": 719, + "height": 226, + "level": 1, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#E3E9FD", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "l1", + "fontSize": 28, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 24, + "labelHeight": 41, + "labelPosition": "INSIDE_TOP_CENTER" + }, + { + "id": "l1.b", + "type": "", + "pos": { + "x": 343, + "y": 276 + }, + "width": 113, + "height": 126, + "level": 2, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#EDF0FD", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "b", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 13, + "labelHeight": 26, + "labelPosition": "INSIDE_MIDDLE_CENTER" + }, + { + "id": "l1.a", + "type": "", + "pos": { + "x": 90, + "y": 276 + }, + "width": 113, + "height": 126, + "level": 2, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#EDF0FD", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "a", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 13, + "labelHeight": 26, + "labelPosition": "INSIDE_MIDDLE_CENTER" + }, + { + "id": "l1.c", + "type": "", + "pos": { + "x": 596, + "y": 276 + }, + "width": 113, + "height": 126, + "level": 2, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#EDF0FD", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "c", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 13, + "labelHeight": 26, + "labelPosition": "INSIDE_MIDDLE_CENTER" + }, + { + "id": "l2c1", + "type": "", + "pos": { + "x": 40, + "y": 552 + }, + "width": 213, + "height": 226, + "level": 1, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#E3E9FD", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "l2c1", + "fontSize": 28, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 50, + "labelHeight": 41, + "labelPosition": "INSIDE_TOP_CENTER" + }, + { + "id": "l2c1.a", + "type": "", + "pos": { + "x": 90, + "y": 602 + }, + "width": 113, + "height": 126, + "level": 2, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#EDF0FD", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "a", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 13, + "labelHeight": 26, + "labelPosition": "INSIDE_MIDDLE_CENTER" + }, + { + "id": "l2c3", + "type": "", + "pos": { + "x": 546, + "y": 552 + }, + "width": 213, + "height": 226, + "level": 1, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#E3E9FD", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "l2c3", + "fontSize": 28, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 50, + "labelHeight": 41, + "labelPosition": "INSIDE_TOP_CENTER" + }, + { + "id": "l2c3.c", + "type": "", + "pos": { + "x": 596, + "y": 602 + }, + "width": 113, + "height": 126, + "level": 2, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#EDF0FD", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "c", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 13, + "labelHeight": 26, + "labelPosition": "INSIDE_MIDDLE_CENTER" + }, + { + "id": "l2c2", + "type": "", + "pos": { + "x": 293, + "y": 552 + }, + "width": 213, + "height": 226, + "level": 1, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#E3E9FD", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "l2c2", + "fontSize": 28, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 50, + "labelHeight": 41, + "labelPosition": "INSIDE_TOP_CENTER" + }, + { + "id": "l2c2.b", + "type": "", + "pos": { + "x": 343, + "y": 602 + }, + "width": 113, + "height": 126, + "level": 2, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#EDF0FD", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "b", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 13, + "labelHeight": 26, + "labelPosition": "INSIDE_MIDDLE_CENTER" + }, + { + "id": "l3c1", + "type": "", + "pos": { + "x": 40, + "y": 878 + }, + "width": 466, + "height": 226, + "level": 1, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#E3E9FD", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "l3c1", + "fontSize": 28, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 50, + "labelHeight": 41, + "labelPosition": "INSIDE_TOP_CENTER" + }, + { + "id": "l3c1.a", + "type": "", + "pos": { + "x": 90, + "y": 928 + }, + "width": 113, + "height": 126, + "level": 2, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#EDF0FD", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "a", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 13, + "labelHeight": 26, + "labelPosition": "INSIDE_MIDDLE_CENTER" + }, + { + "id": "l3c1.b", + "type": "", + "pos": { + "x": 343, + "y": 928 + }, + "width": 113, + "height": 126, + "level": 2, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#EDF0FD", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "b", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 13, + "labelHeight": 26, + "labelPosition": "INSIDE_MIDDLE_CENTER" + }, + { + "id": "l3c2", + "type": "", + "pos": { + "x": 546, + "y": 878 + }, + "width": 213, + "height": 226, + "level": 1, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#E3E9FD", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "l3c2", + "fontSize": 28, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 50, + "labelHeight": 41, + "labelPosition": "INSIDE_TOP_CENTER" + }, + { + "id": "l3c2.c", + "type": "", + "pos": { + "x": 596, + "y": 928 + }, + "width": 113, + "height": 126, + "level": 2, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#EDF0FD", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "c", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 13, + "labelHeight": 26, + "labelPosition": "INSIDE_MIDDLE_CENTER" + }, + { + "id": "l4", + "type": "", + "pos": { + "x": 0, + "y": 1204 + }, + "width": 799, + "height": 326, + "level": 1, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#E3E9FD", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "l4", + "fontSize": 28, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 25, + "labelHeight": 41, + "labelPosition": "INSIDE_TOP_CENTER" + }, + { + "id": "l4.c1", + "type": "", + "pos": { + "x": 40, + "y": 1254 + }, + "width": 213, + "height": 226, + "level": 2, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#EDF0FD", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "c1", + "fontSize": 24, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 26, + "labelHeight": 36, + "labelPosition": "INSIDE_TOP_CENTER" + }, + { + "id": "l4.c1.a", + "type": "", + "pos": { + "x": 90, + "y": 1304 + }, + "width": 113, + "height": 126, + "level": 3, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#F7F8FE", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "a", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 13, + "labelHeight": 26, + "labelPosition": "INSIDE_MIDDLE_CENTER" + }, + { + "id": "l4.c2", + "type": "", + "pos": { + "x": 293, + "y": 1254 + }, + "width": 213, + "height": 226, + "level": 2, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#EDF0FD", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "c2", + "fontSize": 24, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 26, + "labelHeight": 36, + "labelPosition": "INSIDE_TOP_CENTER" + }, + { + "id": "l4.c2.b", + "type": "", + "pos": { + "x": 343, + "y": 1304 + }, + "width": 113, + "height": 126, + "level": 3, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#F7F8FE", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "b", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 13, + "labelHeight": 26, + "labelPosition": "INSIDE_MIDDLE_CENTER" + }, + { + "id": "l4.c3", + "type": "", + "pos": { + "x": 546, + "y": 1254 + }, + "width": 213, + "height": 226, + "level": 2, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#EDF0FD", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "c3", + "fontSize": 24, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 26, + "labelHeight": 36, + "labelPosition": "INSIDE_TOP_CENTER" + }, + { + "id": "l4.c3.c", + "type": "", + "pos": { + "x": 596, + "y": 1304 + }, + "width": 113, + "height": 126, + "level": 3, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#F7F8FE", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "c", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 13, + "labelHeight": 26, + "labelPosition": "INSIDE_MIDDLE_CENTER" + } + ], + "connections": [ + { + "id": "(b -> l1.b)[0]", + "src": "b", + "srcArrow": "none", + "srcLabel": "", + "dst": "l1.b", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 399.5, + "y": 126 + }, + { + "x": 399.5, + "y": 166 + }, + { + "x": 399.5, + "y": 236 + }, + { + "x": 399.5, + "y": 276 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "(a -> l1.a)[0]", + "src": "a", + "srcArrow": "none", + "srcLabel": "", + "dst": "l1.a", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 146.5, + "y": 126 + }, + { + "x": 146.5, + "y": 166 + }, + { + "x": 146.5, + "y": 236 + }, + { + "x": 146.5, + "y": 276 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "(c -> l1.c)[0]", + "src": "c", + "srcArrow": "none", + "srcLabel": "", + "dst": "l1.c", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 652.5, + "y": 126 + }, + { + "x": 652.5, + "y": 166 + }, + { + "x": 652.5, + "y": 236 + }, + { + "x": 652.5, + "y": 276 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "(l1.a -> l2c1.a)[0]", + "src": "l1.a", + "srcArrow": "none", + "srcLabel": "", + "dst": "l2c1.a", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 146.5, + "y": 402 + }, + { + "x": 146.5, + "y": 442 + }, + { + "x": 146.5, + "y": 462 + }, + { + "x": 146.5, + "y": 477 + }, + { + "x": 146.5, + "y": 492 + }, + { + "x": 146.5, + "y": 562 + }, + { + "x": 146.5, + "y": 602 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "(l1.c -> l2c3.c)[0]", + "src": "l1.c", + "srcArrow": "none", + "srcLabel": "", + "dst": "l2c3.c", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 652.5, + "y": 402 + }, + { + "x": 652.5, + "y": 442 + }, + { + "x": 652.5, + "y": 462 + }, + { + "x": 652.5, + "y": 477 + }, + { + "x": 652.5, + "y": 492 + }, + { + "x": 652.5, + "y": 562 + }, + { + "x": 652.5, + "y": 602 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "(l1.b -> l2c2.b)[0]", + "src": "l1.b", + "srcArrow": "none", + "srcLabel": "", + "dst": "l2c2.b", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 399.5, + "y": 402 + }, + { + "x": 399.5, + "y": 442 + }, + { + "x": 399.5, + "y": 462 + }, + { + "x": 399.5, + "y": 477 + }, + { + "x": 399.5, + "y": 492 + }, + { + "x": 399.5, + "y": 562 + }, + { + "x": 399.5, + "y": 602 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "(l2c1.a -> l3c1.a)[0]", + "src": "l2c1.a", + "srcArrow": "none", + "srcLabel": "", + "dst": "l3c1.a", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 146.5, + "y": 728 + }, + { + "x": 146.5, + "y": 768 + }, + { + "x": 146.5, + "y": 788 + }, + { + "x": 146.5, + "y": 803 + }, + { + "x": 146.5, + "y": 818 + }, + { + "x": 146.5, + "y": 888 + }, + { + "x": 146.5, + "y": 928 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "(l2c2.b -> l3c1.b)[0]", + "src": "l2c2.b", + "srcArrow": "none", + "srcLabel": "", + "dst": "l3c1.b", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 399.5, + "y": 728 + }, + { + "x": 399.5, + "y": 768 + }, + { + "x": 399.5, + "y": 788 + }, + { + "x": 399.5, + "y": 803 + }, + { + "x": 399.5, + "y": 818 + }, + { + "x": 399.5, + "y": 888 + }, + { + "x": 399.5, + "y": 928 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "(l2c3.c -> l3c2.c)[0]", + "src": "l2c3.c", + "srcArrow": "none", + "srcLabel": "", + "dst": "l3c2.c", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 652.5, + "y": 728 + }, + { + "x": 652.5, + "y": 768 + }, + { + "x": 652.5, + "y": 788 + }, + { + "x": 652.5, + "y": 803 + }, + { + "x": 652.5, + "y": 818 + }, + { + "x": 652.5, + "y": 888 + }, + { + "x": 652.5, + "y": 928 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "(l3c1.a -> l4.c1.a)[0]", + "src": "l3c1.a", + "srcArrow": "none", + "srcLabel": "", + "dst": "l4.c1.a", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 146.5, + "y": 1054 + }, + { + "x": 146.5, + "y": 1094 + }, + { + "x": 146.5, + "y": 1114 + }, + { + "x": 146.5, + "y": 1129 + }, + { + "x": 146.5, + "y": 1144 + }, + { + "x": 146.5, + "y": 1164 + }, + { + "x": 146.5, + "y": 1179 + }, + { + "x": 146.5, + "y": 1194 + }, + { + "x": 146.5, + "y": 1264 + }, + { + "x": 146.5, + "y": 1304 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "(l3c1.b -> l4.c2.b)[0]", + "src": "l3c1.b", + "srcArrow": "none", + "srcLabel": "", + "dst": "l4.c2.b", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 399.5, + "y": 1054 + }, + { + "x": 399.5, + "y": 1094 + }, + { + "x": 399.5, + "y": 1114 + }, + { + "x": 399.5, + "y": 1129 + }, + { + "x": 399.5, + "y": 1144 + }, + { + "x": 399.5, + "y": 1164 + }, + { + "x": 399.5, + "y": 1179 + }, + { + "x": 399.5, + "y": 1194 + }, + { + "x": 399.5, + "y": 1264 + }, + { + "x": 399.5, + "y": 1304 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "(l3c2.c -> l4.c3.c)[0]", + "src": "l3c2.c", + "srcArrow": "none", + "srcLabel": "", + "dst": "l4.c3.c", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 652.5, + "y": 1054 + }, + { + "x": 652.5, + "y": 1094 + }, + { + "x": 652.5, + "y": 1114 + }, + { + "x": 652.5, + "y": 1129 + }, + { + "x": 652.5, + "y": 1144 + }, + { + "x": 652.5, + "y": 1164 + }, + { + "x": 652.5, + "y": 1179 + }, + { + "x": 652.5, + "y": 1194 + }, + { + "x": 652.5, + "y": 1264 + }, + { + "x": 652.5, + "y": 1304 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + } + ] +} diff --git a/e2etests/testdata/stable/straight_hierarchy_container/sketch.exp.svg b/e2etests/testdata/stable/straight_hierarchy_container/sketch.exp.svg new file mode 100644 index 000000000..805cc0eb5 --- /dev/null +++ b/e2etests/testdata/stable/straight_hierarchy_container/sketch.exp.svg @@ -0,0 +1,22 @@ + +acbl1l2c1l2c3l2c2l3c1l3c2l4bacacbabcc1c2c3abc \ No newline at end of file diff --git a/e2etests/testdata/stable/us_map/board.exp.json b/e2etests/testdata/stable/us_map/board.exp.json new file mode 100644 index 000000000..c8701a10e --- /dev/null +++ b/e2etests/testdata/stable/us_map/board.exp.json @@ -0,0 +1,8075 @@ +{ + "name": "", + "shapes": [ + { + "id": "AK", + "type": "", + "pos": { + "x": 2525, + "y": 0 + }, + "width": 126, + "height": 126, + "level": 1, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#F7F8FE", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "AK", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 26, + "labelHeight": 26, + "labelPosition": "INSIDE_MIDDLE_CENTER" + }, + { + "id": "HI", + "type": "", + "pos": { + "x": 2711, + "y": 0 + }, + "width": 119, + "height": 126, + "level": 1, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#F7F8FE", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "HI", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 19, + "labelHeight": 26, + "labelPosition": "INSIDE_MIDDLE_CENTER" + }, + { + "id": "AL", + "type": "", + "pos": { + "x": 1, + "y": 226 + }, + "width": 124, + "height": 126, + "level": 1, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#F7F8FE", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "AL", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 24, + "labelHeight": 26, + "labelPosition": "INSIDE_MIDDLE_CENTER" + }, + { + "id": "FL", + "type": "", + "pos": { + "x": 3, + "y": 452 + }, + "width": 121, + "height": 126, + "level": 1, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#F7F8FE", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "FL", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 21, + "labelHeight": 26, + "labelPosition": "INSIDE_MIDDLE_CENTER" + }, + { + "id": "GA", + "type": "", + "pos": { + "x": 0, + "y": 678 + }, + "width": 126, + "height": 126, + "level": 1, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#F7F8FE", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "GA", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 26, + "labelHeight": 26, + "labelPosition": "INSIDE_MIDDLE_CENTER" + }, + { + "id": "MS", + "type": "", + "pos": { + "x": 1561, + "y": 904 + }, + "width": 126, + "height": 126, + "level": 1, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#F7F8FE", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "MS", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 26, + "labelHeight": 26, + "labelPosition": "INSIDE_MIDDLE_CENTER" + }, + { + "id": "TN", + "type": "", + "pos": { + "x": 1462, + "y": 2034 + }, + "width": 124, + "height": 126, + "level": 1, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#F7F8FE", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "TN", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 24, + "labelHeight": 26, + "labelPosition": "INSIDE_MIDDLE_CENTER" + }, + { + "id": "AZ", + "type": "", + "pos": { + "x": 398, + "y": 904 + }, + "width": 125, + "height": 126, + "level": 1, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#F7F8FE", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "AZ", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 25, + "labelHeight": 26, + "labelPosition": "INSIDE_MIDDLE_CENTER" + }, + { + "id": "CA", + "type": "", + "pos": { + "x": 398, + "y": 1130 + }, + "width": 125, + "height": 126, + "level": 1, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#F7F8FE", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "CA", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 25, + "labelHeight": 26, + "labelPosition": "INSIDE_MIDDLE_CENTER" + }, + { + "id": "NV", + "type": "", + "pos": { + "x": 583, + "y": 1356 + }, + "width": 125, + "height": 126, + "level": 1, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#F7F8FE", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "NV", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 25, + "labelHeight": 26, + "labelPosition": "INSIDE_MIDDLE_CENTER" + }, + { + "id": "NM", + "type": "", + "pos": { + "x": 1312, + "y": 1582 + }, + "width": 126, + "height": 126, + "level": 1, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#F7F8FE", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "NM", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 26, + "labelHeight": 26, + "labelPosition": "INSIDE_MIDDLE_CENTER" + }, + { + "id": "UT", + "type": "", + "pos": { + "x": 713, + "y": 2034 + }, + "width": 124, + "height": 126, + "level": 1, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#F7F8FE", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "UT", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 24, + "labelHeight": 26, + "labelPosition": "INSIDE_MIDDLE_CENTER" + }, + { + "id": "AR", + "type": "", + "pos": { + "x": 1581, + "y": 452 + }, + "width": 126, + "height": 126, + "level": 1, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#F7F8FE", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "AR", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 26, + "labelHeight": 26, + "labelPosition": "INSIDE_MIDDLE_CENTER" + }, + { + "id": "LA", + "type": "", + "pos": { + "x": 1583, + "y": 678 + }, + "width": 123, + "height": 126, + "level": 1, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#F7F8FE", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "LA", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 23, + "labelHeight": 26, + "labelPosition": "INSIDE_MIDDLE_CENTER" + }, + { + "id": "MO", + "type": "", + "pos": { + "x": 2285, + "y": 1130 + }, + "width": 128, + "height": 126, + "level": 1, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#F7F8FE", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "MO", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 28, + "labelHeight": 26, + "labelPosition": "INSIDE_MIDDLE_CENTER" + }, + { + "id": "OK", + "type": "", + "pos": { + "x": 2032, + "y": 1808 + }, + "width": 126, + "height": 126, + "level": 1, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#F7F8FE", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "OK", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 26, + "labelHeight": 26, + "labelPosition": "INSIDE_MIDDLE_CENTER" + }, + { + "id": "TX", + "type": "", + "pos": { + "x": 1788, + "y": 2260 + }, + "width": 123, + "height": 126, + "level": 1, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#F7F8FE", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "TX", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 23, + "labelHeight": 26, + "labelPosition": "INSIDE_MIDDLE_CENTER" + }, + { + "id": "OR", + "type": "", + "pos": { + "x": 354, + "y": 1808 + }, + "width": 126, + "height": 126, + "level": 1, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#F7F8FE", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "OR", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 26, + "labelHeight": 26, + "labelPosition": "INSIDE_MIDDLE_CENTER" + }, + { + "id": "CO", + "type": "", + "pos": { + "x": 1992, + "y": 678 + }, + "width": 126, + "height": 126, + "level": 1, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#F7F8FE", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "CO", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 26, + "labelHeight": 26, + "labelPosition": "INSIDE_MIDDLE_CENTER" + }, + { + "id": "KS", + "type": "", + "pos": { + "x": 1993, + "y": 904 + }, + "width": 123, + "height": 126, + "level": 1, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#F7F8FE", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "KS", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 23, + "labelHeight": 26, + "labelPosition": "INSIDE_MIDDLE_CENTER" + }, + { + "id": "NE", + "type": "", + "pos": { + "x": 2166, + "y": 1356 + }, + "width": 123, + "height": 126, + "level": 1, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#F7F8FE", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "NE", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 23, + "labelHeight": 26, + "labelPosition": "INSIDE_MIDDLE_CENTER" + }, + { + "id": "WY", + "type": "", + "pos": { + "x": 893, + "y": 2486 + }, + "width": 128, + "height": 126, + "level": 1, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#F7F8FE", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "WY", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 28, + "labelHeight": 26, + "labelPosition": "INSIDE_MIDDLE_CENTER" + }, + { + "id": "CT", + "type": "", + "pos": { + "x": 587, + "y": 1130 + }, + "width": 124, + "height": 126, + "level": 1, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#F7F8FE", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "CT", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 24, + "labelHeight": 26, + "labelPosition": "INSIDE_MIDDLE_CENTER" + }, + { + "id": "MA", + "type": "", + "pos": { + "x": 317, + "y": 1356 + }, + "width": 127, + "height": 126, + "level": 1, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#F7F8FE", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "MA", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 27, + "labelHeight": 26, + "labelPosition": "INSIDE_MIDDLE_CENTER" + }, + { + "id": "NY", + "type": "", + "pos": { + "x": 540, + "y": 1808 + }, + "width": 124, + "height": 126, + "level": 1, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#F7F8FE", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "NY", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 24, + "labelHeight": 26, + "labelPosition": "INSIDE_MIDDLE_CENTER" + }, + { + "id": "RI", + "type": "", + "pos": { + "x": 716, + "y": 2260 + }, + "width": 118, + "height": 126, + "level": 1, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#F7F8FE", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "RI", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 18, + "labelHeight": 26, + "labelPosition": "INSIDE_MIDDLE_CENTER" + }, + { + "id": "DE", + "type": "", + "pos": { + "x": 1148, + "y": 1130 + }, + "width": 123, + "height": 126, + "level": 1, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#F7F8FE", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "DE", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 23, + "labelHeight": 26, + "labelPosition": "INSIDE_MIDDLE_CENTER" + }, + { + "id": "MD", + "type": "", + "pos": { + "x": 1146, + "y": 1356 + }, + "width": 127, + "height": 126, + "level": 1, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#F7F8FE", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "MD", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 27, + "labelHeight": 26, + "labelPosition": "INSIDE_MIDDLE_CENTER" + }, + { + "id": "NJ", + "type": "", + "pos": { + "x": 1050, + "y": 1582 + }, + "width": 122, + "height": 126, + "level": 1, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#F7F8FE", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "NJ", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 22, + "labelHeight": 26, + "labelPosition": "INSIDE_MIDDLE_CENTER" + }, + { + "id": "PA", + "type": "", + "pos": { + "x": 1105, + "y": 2034 + }, + "width": 124, + "height": 126, + "level": 1, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#F7F8FE", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "PA", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 24, + "labelHeight": 26, + "labelPosition": "INSIDE_MIDDLE_CENTER" + }, + { + "id": "NC", + "type": "", + "pos": { + "x": 21, + "y": 1582 + }, + "width": 124, + "height": 126, + "level": 1, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#F7F8FE", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "NC", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 24, + "labelHeight": 26, + "labelPosition": "INSIDE_MIDDLE_CENTER" + }, + { + "id": "SC", + "type": "", + "pos": { + "x": 22, + "y": 1808 + }, + "width": 123, + "height": 126, + "level": 1, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#F7F8FE", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "SC", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 23, + "labelHeight": 26, + "labelPosition": "INSIDE_MIDDLE_CENTER" + }, + { + "id": "ID", + "type": "", + "pos": { + "x": 1748, + "y": 904 + }, + "width": 119, + "height": 126, + "level": 1, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#F7F8FE", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "ID", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 19, + "labelHeight": 26, + "labelPosition": "INSIDE_MIDDLE_CENTER" + }, + { + "id": "MT", + "type": "", + "pos": { + "x": 1745, + "y": 1130 + }, + "width": 126, + "height": 126, + "level": 1, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#F7F8FE", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "MT", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 26, + "labelHeight": 26, + "labelPosition": "INSIDE_MIDDLE_CENTER" + }, + { + "id": "WA", + "type": "", + "pos": { + "x": 425, + "y": 2260 + }, + "width": 129, + "height": 126, + "level": 1, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#F7F8FE", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "WA", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 29, + "labelHeight": 26, + "labelPosition": "INSIDE_MIDDLE_CENTER" + }, + { + "id": "IL", + "type": "", + "pos": { + "x": 2890, + "y": 0 + }, + "width": 117, + "height": 126, + "level": 1, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#F7F8FE", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "IL", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 17, + "labelHeight": 26, + "labelPosition": "INSIDE_MIDDLE_CENTER" + }, + { + "id": "IN", + "type": "", + "pos": { + "x": 2889, + "y": 226 + }, + "width": 119, + "height": 126, + "level": 1, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#F7F8FE", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "IN", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 19, + "labelHeight": 26, + "labelPosition": "INSIDE_MIDDLE_CENTER" + }, + { + "id": "IA", + "type": "", + "pos": { + "x": 2834, + "y": 452 + }, + "width": 119, + "height": 126, + "level": 1, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#F7F8FE", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "IA", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 19, + "labelHeight": 26, + "labelPosition": "INSIDE_MIDDLE_CENTER" + }, + { + "id": "MI", + "type": "", + "pos": { + "x": 2706, + "y": 678 + }, + "width": 121, + "height": 126, + "level": 1, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#F7F8FE", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "MI", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 21, + "labelHeight": 26, + "labelPosition": "INSIDE_MIDDLE_CENTER" + }, + { + "id": "KY", + "type": "", + "pos": { + "x": 2801, + "y": 904 + }, + "width": 123, + "height": 126, + "level": 1, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#F7F8FE", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "KY", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 23, + "labelHeight": 26, + "labelPosition": "INSIDE_MIDDLE_CENTER" + }, + { + "id": "WI", + "type": "", + "pos": { + "x": 2230, + "y": 1808 + }, + "width": 123, + "height": 126, + "level": 1, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#F7F8FE", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "WI", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 23, + "labelHeight": 26, + "labelPosition": "INSIDE_MIDDLE_CENTER" + }, + { + "id": "OH", + "type": "", + "pos": { + "x": 2815, + "y": 1582 + }, + "width": 126, + "height": 126, + "level": 1, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#F7F8FE", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "OH", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 26, + "labelHeight": 26, + "labelPosition": "INSIDE_MIDDLE_CENTER" + }, + { + "id": "MN", + "type": "", + "pos": { + "x": 2984, + "y": 904 + }, + "width": 127, + "height": 126, + "level": 1, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#F7F8FE", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "MN", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 27, + "labelHeight": 26, + "labelPosition": "INSIDE_MIDDLE_CENTER" + }, + { + "id": "SD", + "type": "", + "pos": { + "x": 2413, + "y": 1582 + }, + "width": 124, + "height": 126, + "level": 1, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#F7F8FE", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "SD", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 24, + "labelHeight": 26, + "labelPosition": "INSIDE_MIDDLE_CENTER" + }, + { + "id": "VA", + "type": "", + "pos": { + "x": 1370, + "y": 2260 + }, + "width": 125, + "height": 126, + "level": 1, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#F7F8FE", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "VA", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 25, + "labelHeight": 26, + "labelPosition": "INSIDE_MIDDLE_CENTER" + }, + { + "id": "WV", + "type": "", + "pos": { + "x": 1381, + "y": 2486 + }, + "width": 129, + "height": 126, + "level": 1, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#F7F8FE", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "WV", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 29, + "labelHeight": 26, + "labelPosition": "INSIDE_MIDDLE_CENTER" + }, + { + "id": "ME", + "type": "", + "pos": { + "x": 1349, + "y": 1356 + }, + "width": 125, + "height": 126, + "level": 1, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#F7F8FE", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "ME", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 25, + "labelHeight": 26, + "labelPosition": "INSIDE_MIDDLE_CENTER" + }, + { + "id": "NH", + "type": "", + "pos": { + "x": 792, + "y": 1582 + }, + "width": 125, + "height": 126, + "level": 1, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#F7F8FE", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "NH", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 25, + "labelHeight": 26, + "labelPosition": "INSIDE_MIDDLE_CENTER" + }, + { + "id": "VT", + "type": "", + "pos": { + "x": 591, + "y": 2486 + }, + "width": 124, + "height": 126, + "level": 1, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#F7F8FE", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "VT", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 24, + "labelHeight": 26, + "labelPosition": "INSIDE_MIDDLE_CENTER" + }, + { + "id": "ND", + "type": "", + "pos": { + "x": 2419, + "y": 1356 + }, + "width": 125, + "height": 126, + "level": 1, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#F7F8FE", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "ND", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 25, + "labelHeight": 26, + "labelPosition": "INSIDE_MIDDLE_CENTER" + } + ], + "connections": [ + { + "id": "(AL -- FL)[0]", + "src": "AL", + "srcArrow": "none", + "srcLabel": "", + "dst": "FL", + "dstArrow": "none", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 63, + "y": 352 + }, + { + "x": 63, + "y": 392 + }, + { + "x": 63, + "y": 412 + }, + { + "x": 63, + "y": 452 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "(FL -- GA)[0]", + "src": "FL", + "srcArrow": "none", + "srcLabel": "", + "dst": "GA", + "dstArrow": "none", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 51.849557522123895, + "y": 578 + }, + { + "x": 44.769911504424776, + "y": 618 + }, + { + "x": 44.8, + "y": 638 + }, + { + "x": 52, + "y": 678 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "(GA -- MS)[0]", + "src": "GA", + "srcArrow": "none", + "srcLabel": "", + "dst": "MS", + "dstArrow": "none", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 51.849557522123895, + "y": 804 + }, + { + "x": 44.769911504424776, + "y": 844 + }, + { + "x": 346.6, + "y": 875.6 + }, + { + "x": 1561, + "y": 962 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "(MS -- TN)[0]", + "src": "MS", + "srcArrow": "none", + "srcLabel": "", + "dst": "TN", + "dstArrow": "none", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 1568.2477876106195, + "y": 1030 + }, + { + "x": 1532.8495575221239, + "y": 1070 + }, + { + "x": 1524, + "y": 1102.6 + }, + { + "x": 1524, + "y": 1136.5 + }, + { + "x": 1524, + "y": 1170.4 + }, + { + "x": 1524, + "y": 1215.6 + }, + { + "x": 1524, + "y": 1249.5 + }, + { + "x": 1524, + "y": 1283.4 + }, + { + "x": 1524, + "y": 1328.6 + }, + { + "x": 1524, + "y": 1362.5 + }, + { + "x": 1524, + "y": 1396.4 + }, + { + "x": 1524, + "y": 1441.6 + }, + { + "x": 1524, + "y": 1475.5 + }, + { + "x": 1524, + "y": 1509.4 + }, + { + "x": 1524, + "y": 1554.6 + }, + { + "x": 1524, + "y": 1588.5 + }, + { + "x": 1524, + "y": 1622.4 + }, + { + "x": 1524, + "y": 1667.6 + }, + { + "x": 1524, + "y": 1701.5 + }, + { + "x": 1524, + "y": 1735.4 + }, + { + "x": 1524, + "y": 1780.6 + }, + { + "x": 1524, + "y": 1814.5 + }, + { + "x": 1524, + "y": 1848.4 + }, + { + "x": 1524, + "y": 1994 + }, + { + "x": 1524, + "y": 2034 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "(AZ -- CA)[0]", + "src": "AZ", + "srcArrow": "none", + "srcLabel": "", + "dst": "CA", + "dstArrow": "none", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 460.5, + "y": 1030 + }, + { + "x": 460.5, + "y": 1070 + }, + { + "x": 460.5, + "y": 1090 + }, + { + "x": 460.5, + "y": 1130 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "(CA -- NV)[0]", + "src": "CA", + "srcArrow": "none", + "srcLabel": "", + "dst": "NV", + "dstArrow": "none", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 398, + "y": 1216.4439834024897 + }, + { + "x": 207, + "y": 1288.088796680498 + }, + { + "x": 244.05, + "y": 1325.6 + }, + { + "x": 583.25, + "y": 1404 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "(NV -- NM)[0]", + "src": "NV", + "srcArrow": "none", + "srcLabel": "", + "dst": "NM", + "dstArrow": "none", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 583.25, + "y": 1465.2356792144026 + }, + { + "x": 511.05, + "y": 1518.6471358428805 + }, + { + "x": 656.75, + "y": 1552.9852565920046 + }, + { + "x": 1311.75, + "y": 1636.9262829600227 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "(NM -- UT)[0]", + "src": "NM", + "srcArrow": "none", + "srcLabel": "", + "dst": "UT", + "dstArrow": "none", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 1343.25, + "y": 1708 + }, + { + "x": 1323.25, + "y": 1748 + }, + { + "x": 1318.25, + "y": 1780.6 + }, + { + "x": 1318.25, + "y": 1814.5 + }, + { + "x": 1318.25, + "y": 1848.4 + }, + { + "x": 1222.05, + "y": 2004 + }, + { + "x": 837.25, + "y": 2084 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "(AR -- LA)[0]", + "src": "AR", + "srcArrow": "none", + "srcLabel": "", + "dst": "LA", + "dstArrow": "none", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 1644, + "y": 578 + }, + { + "x": 1644, + "y": 618 + }, + { + "x": 1644, + "y": 638 + }, + { + "x": 1644, + "y": 678 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "(LA -- MS)[0]", + "src": "LA", + "srcArrow": "none", + "srcLabel": "", + "dst": "MS", + "dstArrow": "none", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 1596.3318584070796, + "y": 804 + }, + { + "x": 1566.0663716814158, + "y": 844 + }, + { + "x": 1564.3, + "y": 864 + }, + { + "x": 1587.5, + "y": 904 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "(MS -- MO)[0]", + "src": "MS", + "srcArrow": "none", + "srcLabel": "", + "dst": "MO", + "dstArrow": "none", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 1601.6991150442477, + "y": 1030 + }, + { + "x": 1587.5398230088495, + "y": 1070 + }, + { + "x": 1724.15, + "y": 1100.7086629617522 + }, + { + "x": 2284.75, + "y": 1183.5433148087611 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "(MO -- OK)[0]", + "src": "MO", + "srcArrow": "none", + "srcLabel": "", + "dst": "OK", + "dstArrow": "none", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 2284.75, + "y": 1213.4293785310736 + }, + { + "x": 2052.75, + "y": 1287.4858757062148 + }, + { + "x": 1994.75, + "y": 1328.6 + }, + { + "x": 1994.75, + "y": 1362.5 + }, + { + "x": 1994.75, + "y": 1396.4 + }, + { + "x": 1994.75, + "y": 1441.6 + }, + { + "x": 1994.75, + "y": 1475.5 + }, + { + "x": 1994.75, + "y": 1509.4 + }, + { + "x": 1994.75, + "y": 1554.6 + }, + { + "x": 1994.75, + "y": 1588.5 + }, + { + "x": 1994.75, + "y": 1622.4 + }, + { + "x": 2003.55, + "y": 1768 + }, + { + "x": 2038.75, + "y": 1808 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "(OK -- TN)[0]", + "src": "OK", + "srcArrow": "none", + "srcLabel": "", + "dst": "TN", + "dstArrow": "none", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 2031.75, + "y": 1897.5882352941176 + }, + { + "x": 1867.95, + "y": 1966.7176470588236 + }, + { + "x": 1778.8, + "y": 2002 + }, + { + "x": 1586, + "y": 2074 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "(TN -- TX)[0]", + "src": "TN", + "srcArrow": "none", + "srcLabel": "", + "dst": "TX", + "dstArrow": "none", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 1462, + "y": 2151.20502901354 + }, + { + "x": 1408.2, + "y": 2198.241005802708 + }, + { + "x": 1473.35, + "y": 2229.6 + }, + { + "x": 1787.75, + "y": 2308 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "(CA -- NV)[1]", + "src": "CA", + "srcArrow": "none", + "srcLabel": "", + "dst": "NV", + "dstArrow": "none", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 523, + "y": 1252.224318658281 + }, + { + "x": 568.4, + "y": 1295.244863731656 + }, + { + "x": 585.55, + "y": 1316 + }, + { + "x": 608.75, + "y": 1356 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "(NV -- OR)[0]", + "src": "NV", + "srcArrow": "none", + "srcLabel": "", + "dst": "OR", + "dstArrow": "none", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 583.25, + "y": 1481.638580931264 + }, + { + "x": 543.05, + "y": 1521.9277161862528 + }, + { + "x": 533, + "y": 1554.6 + }, + { + "x": 533, + "y": 1588.5 + }, + { + "x": 533, + "y": 1622.4 + }, + { + "x": 522.4, + "y": 1768.4 + }, + { + "x": 480, + "y": 1810 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "(CO -- KS)[0]", + "src": "CO", + "srcArrow": "none", + "srcLabel": "", + "dst": "KS", + "dstArrow": "none", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 2054.75, + "y": 804 + }, + { + "x": 2054.75, + "y": 844 + }, + { + "x": 2054.75, + "y": 864 + }, + { + "x": 2054.75, + "y": 904 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "(KS -- NE)[0]", + "src": "KS", + "srcArrow": "none", + "srcLabel": "", + "dst": "NE", + "dstArrow": "none", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 1998.9977876106195, + "y": 1030 + }, + { + "x": 1963.5995575221239, + "y": 1070 + }, + { + "x": 1954.75, + "y": 1102.6 + }, + { + "x": 1954.75, + "y": 1136.5 + }, + { + "x": 1954.75, + "y": 1170.4 + }, + { + "x": 1996.9, + "y": 1323.4947658402205 + }, + { + "x": 2165.5, + "y": 1393.473829201102 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "(NE -- NM)[0]", + "src": "NE", + "srcArrow": "none", + "srcLabel": "", + "dst": "NM", + "dstArrow": "none", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 2182.3982300884954, + "y": 1482 + }, + { + "x": 2154.079646017699, + "y": 1522 + }, + { + "x": 2005.2, + "y": 1552.8 + }, + { + "x": 1438, + "y": 1636 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "(NM -- OK)[0]", + "src": "NM", + "srcArrow": "none", + "srcLabel": "", + "dst": "OK", + "dstArrow": "none", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 1374.75, + "y": 1708 + }, + { + "x": 1374.75, + "y": 1748 + }, + { + "x": 1506.15, + "y": 1778.6225 + }, + { + "x": 2031.75, + "y": 1861.1125 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "(OK -- UT)[0]", + "src": "OK", + "srcArrow": "none", + "srcLabel": "", + "dst": "UT", + "dstArrow": "none", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 2031.75, + "y": 1902.257958287596 + }, + { + "x": 1899.95, + "y": 1967.6515916575192 + }, + { + "x": 1661, + "y": 2005.4 + }, + { + "x": 837, + "y": 2091 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "(UT -- WY)[0]", + "src": "UT", + "srcArrow": "none", + "srcLabel": "", + "dst": "WY", + "dstArrow": "none", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 713.9800884955753, + "y": 2160 + }, + { + "x": 675.3960176991151, + "y": 2200 + }, + { + "x": 665.75, + "y": 2232.6 + }, + { + "x": 665.75, + "y": 2266.5 + }, + { + "x": 665.75, + "y": 2300.4 + }, + { + "x": 711.1, + "y": 2453.625279449699 + }, + { + "x": 892.5, + "y": 2524.1263972484953 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "(CT -- MA)[0]", + "src": "CT", + "srcArrow": "none", + "srcLabel": "", + "dst": "MA", + "dstArrow": "none", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 649, + "y": 1256 + }, + { + "x": 649, + "y": 1296 + }, + { + "x": 608, + "y": 1323.2 + }, + { + "x": 444, + "y": 1392 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "(MA -- NY)[0]", + "src": "MA", + "srcArrow": "none", + "srcLabel": "", + "dst": "NY", + "dstArrow": "none", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 328.429203539823, + "y": 1482 + }, + { + "x": 295.6858407079646, + "y": 1522 + }, + { + "x": 287.5, + "y": 1554.6 + }, + { + "x": 287.5, + "y": 1588.5 + }, + { + "x": 287.5, + "y": 1622.4 + }, + { + "x": 337.95, + "y": 1776.1411296738265 + }, + { + "x": 539.75, + "y": 1848.7056483691329 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "(NY -- RI)[0]", + "src": "NY", + "srcArrow": "none", + "srcLabel": "", + "dst": "RI", + "dstArrow": "none", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 561.3296460176991, + "y": 1934 + }, + { + "x": 535.6659292035398, + "y": 1974 + }, + { + "x": 529.25, + "y": 2006.6 + }, + { + "x": 529.25, + "y": 2040.5 + }, + { + "x": 529.25, + "y": 2074.4 + }, + { + "x": 566.55, + "y": 2227.1686354378817 + }, + { + "x": 715.75, + "y": 2295.8431771894093 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "(DE -- MD)[0]", + "src": "DE", + "srcArrow": "none", + "srcLabel": "", + "dst": "MD", + "dstArrow": "none", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 1209.5, + "y": 1256 + }, + { + "x": 1209.5, + "y": 1296 + }, + { + "x": 1209.5, + "y": 1316 + }, + { + "x": 1209.5, + "y": 1356 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "(MD -- NJ)[0]", + "src": "MD", + "srcArrow": "none", + "srcLabel": "", + "dst": "NJ", + "dstArrow": "none", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 1154.58407079646, + "y": 1482 + }, + { + "x": 1119.716814159292, + "y": 1522 + }, + { + "x": 1111, + "y": 1542 + }, + { + "x": 1111, + "y": 1582 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "(NJ -- PA)[0]", + "src": "NJ", + "srcArrow": "none", + "srcLabel": "", + "dst": "PA", + "dstArrow": "none", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 1091.2079646017698, + "y": 1708 + }, + { + "x": 1078.641592920354, + "y": 1748 + }, + { + "x": 1075.5, + "y": 1780.6 + }, + { + "x": 1075.5, + "y": 1814.5 + }, + { + "x": 1075.5, + "y": 1848.4 + }, + { + "x": 1083.5, + "y": 1994 + }, + { + "x": 1115.5, + "y": 2034 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "(FL -- GA)[1]", + "src": "FL", + "srcArrow": "none", + "srcLabel": "", + "dst": "GA", + "dstArrow": "none", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 124.5, + "y": 524.5749299719888 + }, + { + "x": 646.5, + "y": 607.3149859943978 + }, + { + "x": 646.8, + "y": 648.6 + }, + { + "x": 126, + "y": 731 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "(GA -- NC)[0]", + "src": "GA", + "srcArrow": "none", + "srcLabel": "", + "dst": "NC", + "dstArrow": "none", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 74.15044247787611, + "y": 804 + }, + { + "x": 81.23008849557522, + "y": 844 + }, + { + "x": 83, + "y": 876.6 + }, + { + "x": 83, + "y": 910.5 + }, + { + "x": 83, + "y": 944.4 + }, + { + "x": 83, + "y": 989.6 + }, + { + "x": 83, + "y": 1023.5 + }, + { + "x": 83, + "y": 1057.4 + }, + { + "x": 83, + "y": 1102.6 + }, + { + "x": 83, + "y": 1136.5 + }, + { + "x": 83, + "y": 1170.4 + }, + { + "x": 83, + "y": 1215.6 + }, + { + "x": 83, + "y": 1249.5 + }, + { + "x": 83, + "y": 1283.4 + }, + { + "x": 83, + "y": 1328.6 + }, + { + "x": 83, + "y": 1362.5 + }, + { + "x": 83, + "y": 1396.4 + }, + { + "x": 83, + "y": 1542 + }, + { + "x": 83, + "y": 1582 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "(NC -- SC)[0]", + "src": "NC", + "srcArrow": "none", + "srcLabel": "", + "dst": "SC", + "dstArrow": "none", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 71.84955752212389, + "y": 1708 + }, + { + "x": 64.76991150442478, + "y": 1748 + }, + { + "x": 64.8, + "y": 1768 + }, + { + "x": 72, + "y": 1808 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "(SC -- TN)[0]", + "src": "SC", + "srcArrow": "none", + "srcLabel": "", + "dst": "TN", + "dstArrow": "none", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 71.84955752212389, + "y": 1934 + }, + { + "x": 64.76991150442478, + "y": 1974 + }, + { + "x": 342.8, + "y": 2005.6 + }, + { + "x": 1462, + "y": 2092 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "(ID -- MT)[0]", + "src": "ID", + "srcArrow": "none", + "srcLabel": "", + "dst": "MT", + "dstArrow": "none", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 1807.75, + "y": 1030 + }, + { + "x": 1807.75, + "y": 1070 + }, + { + "x": 1807.75, + "y": 1090 + }, + { + "x": 1807.75, + "y": 1130 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "(MT -- NV)[0]", + "src": "MT", + "srcArrow": "none", + "srcLabel": "", + "dst": "NV", + "dstArrow": "none", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 1779.1769911504425, + "y": 1256 + }, + { + "x": 1761.0353982300885, + "y": 1296 + }, + { + "x": 1546.85, + "y": 1327.3283367094305 + }, + { + "x": 708.25, + "y": 1412.6416835471528 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "(NV -- OR)[1]", + "src": "NV", + "srcArrow": "none", + "srcLabel": "", + "dst": "OR", + "dstArrow": "none", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 623.5884955752213, + "y": 1482 + }, + { + "x": 609.5176991150443, + "y": 1522 + }, + { + "x": 606, + "y": 1554.6 + }, + { + "x": 606, + "y": 1588.5 + }, + { + "x": 606, + "y": 1622.4 + }, + { + "x": 580.8, + "y": 1773 + }, + { + "x": 480, + "y": 1833 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "(OR -- UT)[0]", + "src": "OR", + "srcArrow": "none", + "srcLabel": "", + "dst": "UT", + "dstArrow": "none", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 353.75, + "y": 1900.4782608695652 + }, + { + "x": 210.95, + "y": 1967.2956521739131 + }, + { + "x": 282.75, + "y": 2004.2627189324437 + }, + { + "x": 712.75, + "y": 2085.3135946622183 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "(UT -- WA)[0]", + "src": "UT", + "srcArrow": "none", + "srcLabel": "", + "dst": "WA", + "dstArrow": "none", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 774.75, + "y": 2160 + }, + { + "x": 774.75, + "y": 2200 + }, + { + "x": 730.55, + "y": 2227.4 + }, + { + "x": 553.75, + "y": 2297 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "(WA -- WY)[0]", + "src": "WA", + "srcArrow": "none", + "srcLabel": "", + "dst": "WY", + "dstArrow": "none", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 489.25, + "y": 2386 + }, + { + "x": 489.25, + "y": 2426 + }, + { + "x": 569.9, + "y": 2455.5044408774747 + }, + { + "x": 892.5, + "y": 2533.5222043873728 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "(IL -- IN)[0]", + "src": "IL", + "srcArrow": "none", + "srcLabel": "", + "dst": "IN", + "dstArrow": "none", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 2948.25, + "y": 126 + }, + { + "x": 2948.25, + "y": 166 + }, + { + "x": 2948.25, + "y": 186 + }, + { + "x": 2948.25, + "y": 226 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "(IN -- IA)[0]", + "src": "IN", + "srcArrow": "none", + "srcLabel": "", + "dst": "IA", + "dstArrow": "none", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 2917.7256637168143, + "y": 352 + }, + { + "x": 2898.3451327433627, + "y": 392 + }, + { + "x": 2893.5, + "y": 412 + }, + { + "x": 2893.5, + "y": 452 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "(IA -- MI)[0]", + "src": "IA", + "srcArrow": "none", + "srcLabel": "", + "dst": "MI", + "dstArrow": "none", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 2834, + "y": 567.9409448818898 + }, + { + "x": 2780, + "y": 615.988188976378 + }, + { + "x": 2766.5, + "y": 638 + }, + { + "x": 2766.5, + "y": 678 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "(MI -- KY)[0]", + "src": "MI", + "srcArrow": "none", + "srcLabel": "", + "dst": "KY", + "dstArrow": "none", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 2706, + "y": 762.1492652745553 + }, + { + "x": 2495.8, + "y": 835.6298530549111 + }, + { + "x": 2514.75, + "y": 873.282816229117 + }, + { + "x": 2800.75, + "y": 950.4140811455848 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "(KY -- MO)[0]", + "src": "KY", + "srcArrow": "none", + "srcLabel": "", + "dst": "MO", + "dstArrow": "none", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 2820.0176991150443, + "y": 1030 + }, + { + "x": 2793.2035398230087, + "y": 1070 + }, + { + "x": 2711.7, + "y": 1099.2 + }, + { + "x": 2412.5, + "y": 1176 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "(MO -- WI)[0]", + "src": "MO", + "srcArrow": "none", + "srcLabel": "", + "dst": "WI", + "dstArrow": "none", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 2284.75, + "y": 1222.9152016546018 + }, + { + "x": 2142.55, + "y": 1289.3830403309203 + }, + { + "x": 2107, + "y": 1328.6 + }, + { + "x": 2107, + "y": 1362.5 + }, + { + "x": 2107, + "y": 1396.4 + }, + { + "x": 2107, + "y": 1441.6 + }, + { + "x": 2107, + "y": 1475.5 + }, + { + "x": 2107, + "y": 1509.4 + }, + { + "x": 2107, + "y": 1554.6 + }, + { + "x": 2107, + "y": 1588.5 + }, + { + "x": 2107, + "y": 1622.4 + }, + { + "x": 2131.6, + "y": 1773 + }, + { + "x": 2230, + "y": 1833 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "(IN -- KY)[0]", + "src": "IN", + "srcArrow": "none", + "srcLabel": "", + "dst": "KY", + "dstArrow": "none", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 3007.75, + "y": 327.69640287769784 + }, + { + "x": 3099.15, + "y": 387.1392805755396 + }, + { + "x": 3122, + "y": 424.6 + }, + { + "x": 3122, + "y": 458.5 + }, + { + "x": 3122, + "y": 492.4 + }, + { + "x": 3122, + "y": 537.6 + }, + { + "x": 3122, + "y": 571.5 + }, + { + "x": 3122, + "y": 605.4 + }, + { + "x": 3122, + "y": 650.6 + }, + { + "x": 3122, + "y": 684.5 + }, + { + "x": 3122, + "y": 718.4 + }, + { + "x": 3082.4, + "y": 871.2 + }, + { + "x": 2924, + "y": 940 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "(KY -- MI)[0]", + "src": "KY", + "srcArrow": "none", + "srcLabel": "", + "dst": "MI", + "dstArrow": "none", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 2902.670353982301, + "y": 904 + }, + { + "x": 2928.3340707964603, + "y": 864 + }, + { + "x": 2913.15, + "y": 839.6 + }, + { + "x": 2826.75, + "y": 782 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "(MI -- OH)[0]", + "src": "MI", + "srcArrow": "none", + "srcLabel": "", + "dst": "OH", + "dstArrow": "none", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 2735.41814159292, + "y": 804 + }, + { + "x": 2715.683628318584, + "y": 844 + }, + { + "x": 2710.75, + "y": 876.6 + }, + { + "x": 2710.75, + "y": 910.5 + }, + { + "x": 2710.75, + "y": 944.4 + }, + { + "x": 2710.75, + "y": 989.6 + }, + { + "x": 2710.75, + "y": 1023.5 + }, + { + "x": 2710.75, + "y": 1057.4 + }, + { + "x": 2710.75, + "y": 1102.6 + }, + { + "x": 2710.75, + "y": 1136.5 + }, + { + "x": 2710.75, + "y": 1170.4 + }, + { + "x": 2710.75, + "y": 1215.6 + }, + { + "x": 2710.75, + "y": 1249.5 + }, + { + "x": 2710.75, + "y": 1283.4 + }, + { + "x": 2710.75, + "y": 1328.6 + }, + { + "x": 2710.75, + "y": 1362.5 + }, + { + "x": 2710.75, + "y": 1396.4 + }, + { + "x": 2731.55, + "y": 1546.074251497006 + }, + { + "x": 2814.75, + "y": 1602.37125748503 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "(IA -- MN)[0]", + "src": "IA", + "srcArrow": "none", + "srcLabel": "", + "dst": "MN", + "dstArrow": "none", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 2953, + "y": 558.730081300813 + }, + { + "x": 3028.4, + "y": 614.1460162601626 + }, + { + "x": 3047.25, + "y": 650.6 + }, + { + "x": 3047.25, + "y": 684.5 + }, + { + "x": 3047.25, + "y": 718.4 + }, + { + "x": 3047.25, + "y": 864 + }, + { + "x": 3047.25, + "y": 904 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "(MN -- MO)[0]", + "src": "MN", + "srcArrow": "none", + "srcLabel": "", + "dst": "MO", + "dstArrow": "none", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 2992.7522123893805, + "y": 1030 + }, + { + "x": 2958.150442477876, + "y": 1070 + }, + { + "x": 2842.1, + "y": 1100.2 + }, + { + "x": 2412.5, + "y": 1181 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "(MO -- NE)[0]", + "src": "MO", + "srcArrow": "none", + "srcLabel": "", + "dst": "NE", + "dstArrow": "none", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 2284.75, + "y": 1237.710973724884 + }, + { + "x": 2206.55, + "y": 1292.3421947449767 + }, + { + "x": 2190.6, + "y": 1316 + }, + { + "x": 2205, + "y": 1356 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "(NE -- SD)[0]", + "src": "NE", + "srcArrow": "none", + "srcLabel": "", + "dst": "SD", + "dstArrow": "none", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 2204.6991150442477, + "y": 1482 + }, + { + "x": 2190.5398230088495, + "y": 1522 + }, + { + "x": 2232.2, + "y": 1549.8 + }, + { + "x": 2413, + "y": 1621 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "(SD -- WI)[0]", + "src": "SD", + "srcArrow": "none", + "srcLabel": "", + "dst": "WI", + "dstArrow": "none", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 2413, + "y": 1686.702380952381 + }, + { + "x": 2328.2, + "y": 1743.740476190476 + }, + { + "x": 2305.6, + "y": 1768 + }, + { + "x": 2300, + "y": 1808 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "(KS -- MO)[0]", + "src": "KS", + "srcArrow": "none", + "srcLabel": "", + "dst": "MO", + "dstArrow": "none", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 2116.25, + "y": 1007.3454281567489 + }, + { + "x": 2204.85, + "y": 1065.4690856313498 + }, + { + "x": 2238.55, + "y": 1090.7199178644764 + }, + { + "x": 2284.75, + "y": 1133.599589322382 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "(MO -- NE)[1]", + "src": "MO", + "srcArrow": "none", + "srcLabel": "", + "dst": "NE", + "dstArrow": "none", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 2367.984513274336, + "y": 1256 + }, + { + "x": 2380.1969026548672, + "y": 1296 + }, + { + "x": 2364.45, + "y": 1319.6 + }, + { + "x": 2289.25, + "y": 1374 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "(NE -- OK)[0]", + "src": "NE", + "srcArrow": "none", + "srcLabel": "", + "dst": "OK", + "dstArrow": "none", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 2227, + "y": 1482 + }, + { + "x": 2227, + "y": 1522 + }, + { + "x": 2227, + "y": 1554.6 + }, + { + "x": 2227, + "y": 1588.5 + }, + { + "x": 2227, + "y": 1622.4 + }, + { + "x": 2213.2, + "y": 1769.8 + }, + { + "x": 2158, + "y": 1817 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "(KY -- MO)[1]", + "src": "KY", + "srcArrow": "none", + "srcLabel": "", + "dst": "MO", + "dstArrow": "none", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 2888.592920353982, + "y": 1030 + }, + { + "x": 2905.3185840707965, + "y": 1070 + }, + { + "x": 2810.1, + "y": 1100 + }, + { + "x": 2412.5, + "y": 1180 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "(MO -- OH)[0]", + "src": "MO", + "srcArrow": "none", + "srcLabel": "", + "dst": "OH", + "dstArrow": "none", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 2412.75, + "y": 1222.5183673469387 + }, + { + "x": 2557.55, + "y": 1289.3036734693878 + }, + { + "x": 2593.75, + "y": 1328.6 + }, + { + "x": 2593.75, + "y": 1362.5 + }, + { + "x": 2593.75, + "y": 1396.4 + }, + { + "x": 2637.95, + "y": 1549.5866197183097 + }, + { + "x": 2814.75, + "y": 1619.9330985915492 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "(OH -- TN)[0]", + "src": "OH", + "srcArrow": "none", + "srcLabel": "", + "dst": "TN", + "dstArrow": "none", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 2814.75, + "y": 1671.7129455909944 + }, + { + "x": 2651.95, + "y": 1740.7425891181988 + }, + { + "x": 2611.25, + "y": 1780.6 + }, + { + "x": 2611.25, + "y": 1814.5 + }, + { + "x": 2611.25, + "y": 1848.4 + }, + { + "x": 2406.25, + "y": 2005.4 + }, + { + "x": 1586.25, + "y": 2091 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "(TN -- VA)[0]", + "src": "TN", + "srcArrow": "none", + "srcLabel": "", + "dst": "VA", + "dstArrow": "none", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 1474.2411504424779, + "y": 2160 + }, + { + "x": 1442.6482300884957, + "y": 2200 + }, + { + "x": 1434.55, + "y": 2220 + }, + { + "x": 1433.75, + "y": 2260 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "(VA -- WV)[0]", + "src": "VA", + "srcArrow": "none", + "srcLabel": "", + "dst": "WV", + "dstArrow": "none", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 1369.5, + "y": 2370.319932998325 + }, + { + "x": 1300.1, + "y": 2422.863986599665 + }, + { + "x": 1302.35, + "y": 2449.6295384615387 + }, + { + "x": 1380.75, + "y": 2504.1476923076925 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "(LA -- MS)[1]", + "src": "LA", + "srcArrow": "none", + "srcLabel": "", + "dst": "MS", + "dstArrow": "none", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 1706.5, + "y": 789.5979020979021 + }, + { + "x": 1770.9, + "y": 841.1195804195804 + }, + { + "x": 1767, + "y": 867.8 + }, + { + "x": 1687, + "y": 923 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "(MS -- TX)[0]", + "src": "MS", + "srcArrow": "none", + "srcLabel": "", + "dst": "TX", + "dstArrow": "none", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 1632.9203539823009, + "y": 1030 + }, + { + "x": 1638.58407079646, + "y": 1070 + }, + { + "x": 1640, + "y": 1102.6 + }, + { + "x": 1640, + "y": 1136.5 + }, + { + "x": 1640, + "y": 1170.4 + }, + { + "x": 1640, + "y": 1215.6 + }, + { + "x": 1640, + "y": 1249.5 + }, + { + "x": 1640, + "y": 1283.4 + }, + { + "x": 1640, + "y": 1328.6 + }, + { + "x": 1640, + "y": 1362.5 + }, + { + "x": 1640, + "y": 1396.4 + }, + { + "x": 1640, + "y": 1441.6 + }, + { + "x": 1640, + "y": 1475.5 + }, + { + "x": 1640, + "y": 1509.4 + }, + { + "x": 1640, + "y": 1554.6 + }, + { + "x": 1640, + "y": 1588.5 + }, + { + "x": 1640, + "y": 1622.4 + }, + { + "x": 1640, + "y": 1667.6 + }, + { + "x": 1640, + "y": 1701.5 + }, + { + "x": 1640, + "y": 1735.4 + }, + { + "x": 1640, + "y": 1780.6 + }, + { + "x": 1640, + "y": 1814.5 + }, + { + "x": 1640, + "y": 1848.4 + }, + { + "x": 1640, + "y": 1893.6 + }, + { + "x": 1640, + "y": 1927.5 + }, + { + "x": 1640, + "y": 1961.4 + }, + { + "x": 1640, + "y": 2006.6 + }, + { + "x": 1640, + "y": 2040.5 + }, + { + "x": 1640, + "y": 2074.4 + }, + { + "x": 1669.6, + "y": 2226 + }, + { + "x": 1788, + "y": 2290 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "(ME -- NH)[0]", + "src": "ME", + "srcArrow": "none", + "srcLabel": "", + "dst": "NH", + "dstArrow": "none", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 1411.5, + "y": 1482 + }, + { + "x": 1411.5, + "y": 1522 + }, + { + "x": 1312.5, + "y": 1552 + }, + { + "x": 916.5, + "y": 1632 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "(MD -- PA)[0]", + "src": "MD", + "srcArrow": "none", + "srcLabel": "", + "dst": "PA", + "dstArrow": "none", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 1238.6305309734514, + "y": 1482 + }, + { + "x": 1257.1261061946902, + "y": 1522 + }, + { + "x": 1261.75, + "y": 1554.6 + }, + { + "x": 1261.75, + "y": 1588.5 + }, + { + "x": 1261.75, + "y": 1622.4 + }, + { + "x": 1261.75, + "y": 1667.6 + }, + { + "x": 1261.75, + "y": 1701.5 + }, + { + "x": 1261.75, + "y": 1735.4 + }, + { + "x": 1261.75, + "y": 1780.6 + }, + { + "x": 1261.75, + "y": 1814.5 + }, + { + "x": 1261.75, + "y": 1848.4 + }, + { + "x": 1253.35, + "y": 1994 + }, + { + "x": 1219.75, + "y": 2034 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "(PA -- VA)[0]", + "src": "PA", + "srcArrow": "none", + "srcLabel": "", + "dst": "VA", + "dstArrow": "none", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 1104.5, + "y": 2138.8893871449927 + }, + { + "x": 1020.3, + "y": 2195.7778774289986 + }, + { + "x": 1073.3, + "y": 2229.335990756788 + }, + { + "x": 1369.5, + "y": 2306.6799537839397 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "(VA -- WV)[1]", + "src": "VA", + "srcArrow": "none", + "srcLabel": "", + "dst": "WV", + "dstArrow": "none", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 1432, + "y": 2386 + }, + { + "x": 1432, + "y": 2426 + }, + { + "x": 1433.2, + "y": 2446 + }, + { + "x": 1438, + "y": 2486 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "(MA -- NH)[0]", + "src": "MA", + "srcArrow": "none", + "srcLabel": "", + "dst": "NH", + "dstArrow": "none", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 420.6991150442478, + "y": 1482 + }, + { + "x": 446.53982300884957, + "y": 1522 + }, + { + "x": 520.8, + "y": 1551 + }, + { + "x": 792, + "y": 1627 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "(NH -- NY)[0]", + "src": "NH", + "srcArrow": "none", + "srcLabel": "", + "dst": "NY", + "dstArrow": "none", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 807.9469026548672, + "y": 1708 + }, + { + "x": 778.3893805309734, + "y": 1748 + }, + { + "x": 749.6, + "y": 1772.2 + }, + { + "x": 664, + "y": 1829 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "(NY -- RI)[1]", + "src": "NY", + "srcArrow": "none", + "srcLabel": "", + "dst": "RI", + "dstArrow": "none", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 583.6305309734513, + "y": 1934 + }, + { + "x": 572.1261061946902, + "y": 1974 + }, + { + "x": 569.25, + "y": 2006.6 + }, + { + "x": 569.25, + "y": 2040.5 + }, + { + "x": 569.25, + "y": 2074.4 + }, + { + "x": 598.55, + "y": 2226.1114355231143 + }, + { + "x": 715.75, + "y": 2290.5571776155716 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "(RI -- VT)[0]", + "src": "RI", + "srcArrow": "none", + "srcLabel": "", + "dst": "VT", + "dstArrow": "none", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 755.5154867256637, + "y": 2386 + }, + { + "x": 743.3030973451328, + "y": 2426 + }, + { + "x": 732.45, + "y": 2446 + }, + { + "x": 701.25, + "y": 2486 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "(MI -- MN)[0]", + "src": "MI", + "srcArrow": "none", + "srcLabel": "", + "dst": "MN", + "dstArrow": "none", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 2827, + "y": 801.7688888888889 + }, + { + "x": 2868.6, + "y": 843.5537777777778 + }, + { + "x": 2899.95, + "y": 868.0704309063893 + }, + { + "x": 2983.75, + "y": 924.3521545319466 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "(MN -- OH)[0]", + "src": "MN", + "srcArrow": "none", + "srcLabel": "", + "dst": "OH", + "dstArrow": "none", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 3044.3230088495575, + "y": 1030 + }, + { + "x": 3042.4646017699115, + "y": 1070 + }, + { + "x": 3042, + "y": 1102.6 + }, + { + "x": 3042, + "y": 1136.5 + }, + { + "x": 3042, + "y": 1170.4 + }, + { + "x": 3042, + "y": 1215.6 + }, + { + "x": 3042, + "y": 1249.5 + }, + { + "x": 3042, + "y": 1283.4 + }, + { + "x": 3042, + "y": 1328.6 + }, + { + "x": 3042, + "y": 1362.5 + }, + { + "x": 3042, + "y": 1396.4 + }, + { + "x": 3021.8, + "y": 1545.8 + }, + { + "x": 2941, + "y": 1601 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "(OH -- WI)[0]", + "src": "OH", + "srcArrow": "none", + "srcLabel": "", + "dst": "WI", + "dstArrow": "none", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 2863.6725663716816, + "y": 1708 + }, + { + "x": 2854.734513274336, + "y": 1748 + }, + { + "x": 2752.65, + "y": 1778.1213553276862 + }, + { + "x": 2353.25, + "y": 1858.6067766384306 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "(MN -- ND)[0]", + "src": "MN", + "srcArrow": "none", + "srcLabel": "", + "dst": "ND", + "dstArrow": "none", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 3066.6238938053098, + "y": 1030 + }, + { + "x": 3078.924778761062, + "y": 1070 + }, + { + "x": 3082, + "y": 1102.6 + }, + { + "x": 3082, + "y": 1136.5 + }, + { + "x": 3082, + "y": 1170.4 + }, + { + "x": 2974.4, + "y": 1326.2 + }, + { + "x": 2544, + "y": 1407 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "(ND -- SD)[0]", + "src": "ND", + "srcArrow": "none", + "srcLabel": "", + "dst": "SD", + "dstArrow": "none", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 2447.798672566372, + "y": 1482 + }, + { + "x": 2426.559734513274, + "y": 1522 + }, + { + "x": 2426.05, + "y": 1542 + }, + { + "x": 2445.25, + "y": 1582 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "(SD -- WI)[1]", + "src": "SD", + "srcArrow": "none", + "srcLabel": "", + "dst": "WI", + "dstArrow": "none", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 2432.7676991150443, + "y": 1708 + }, + { + "x": 2405.9535398230087, + "y": 1748 + }, + { + "x": 2389.65, + "y": 1768 + }, + { + "x": 2351.25, + "y": 1808 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "(MS -- TN)[1]", + "src": "MS", + "srcArrow": "none", + "srcLabel": "", + "dst": "TN", + "dstArrow": "none", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 1655.2212389380531, + "y": 1030 + }, + { + "x": 1675.0442477876106, + "y": 1070 + }, + { + "x": 1680, + "y": 1102.6 + }, + { + "x": 1680, + "y": 1136.5 + }, + { + "x": 1680, + "y": 1170.4 + }, + { + "x": 1680, + "y": 1215.6 + }, + { + "x": 1680, + "y": 1249.5 + }, + { + "x": 1680, + "y": 1283.4 + }, + { + "x": 1680, + "y": 1328.6 + }, + { + "x": 1680, + "y": 1362.5 + }, + { + "x": 1680, + "y": 1396.4 + }, + { + "x": 1680, + "y": 1441.6 + }, + { + "x": 1680, + "y": 1475.5 + }, + { + "x": 1680, + "y": 1509.4 + }, + { + "x": 1680, + "y": 1554.6 + }, + { + "x": 1680, + "y": 1588.5 + }, + { + "x": 1680, + "y": 1622.4 + }, + { + "x": 1680, + "y": 1667.6 + }, + { + "x": 1680, + "y": 1701.5 + }, + { + "x": 1680, + "y": 1735.4 + }, + { + "x": 1680, + "y": 1780.6 + }, + { + "x": 1680, + "y": 1814.5 + }, + { + "x": 1680, + "y": 1848.4 + }, + { + "x": 1661.2, + "y": 1997.6 + }, + { + "x": 1586, + "y": 2052 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "(MO -- NE)[2]", + "src": "MO", + "srcArrow": "none", + "srcLabel": "", + "dst": "NE", + "dstArrow": "none", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 2412.75, + "y": 1218.3754385964912 + }, + { + "x": 2589.55, + "y": 1288.4750877192982 + }, + { + "x": 2564.75, + "y": 1325.2 + }, + { + "x": 2288.75, + "y": 1402 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "(NE -- OK)[1]", + "src": "NE", + "srcArrow": "none", + "srcLabel": "", + "dst": "OK", + "dstArrow": "none", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 2249.3008849557523, + "y": 1482 + }, + { + "x": 2263.4601769911505, + "y": 1522 + }, + { + "x": 2267, + "y": 1554.6 + }, + { + "x": 2267, + "y": 1588.5 + }, + { + "x": 2267, + "y": 1622.4 + }, + { + "x": 2245.2, + "y": 1772.4 + }, + { + "x": 2158, + "y": 1830 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "(OK -- TN)[1]", + "src": "OK", + "srcArrow": "none", + "srcLabel": "", + "dst": "TN", + "dstArrow": "none", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 2094.75, + "y": 1934 + }, + { + "x": 2094.75, + "y": 1974 + }, + { + "x": 1992.95, + "y": 2004.2 + }, + { + "x": 1585.75, + "y": 2085 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "(MT -- ND)[0]", + "src": "MT", + "srcArrow": "none", + "srcLabel": "", + "dst": "ND", + "dstArrow": "none", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 1847.0553097345132, + "y": 1256 + }, + { + "x": 1872.0110619469026, + "y": 1296 + }, + { + "x": 1986.35, + "y": 1326.2575456053069 + }, + { + "x": 2418.75, + "y": 1407.287728026534 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "(ND -- SD)[1]", + "src": "ND", + "srcArrow": "none", + "srcLabel": "", + "dst": "SD", + "dstArrow": "none", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 2470.099557522124, + "y": 1482 + }, + { + "x": 2463.0199115044247, + "y": 1522 + }, + { + "x": 2462.45, + "y": 1542 + }, + { + "x": 2467.25, + "y": 1582 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "(SD -- WY)[0]", + "src": "SD", + "srcArrow": "none", + "srcLabel": "", + "dst": "WY", + "dstArrow": "none", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 2475, + "y": 1708 + }, + { + "x": 2475, + "y": 1748 + }, + { + "x": 2475, + "y": 1780.6 + }, + { + "x": 2475, + "y": 1814.5 + }, + { + "x": 2475, + "y": 1848.4 + }, + { + "x": 2475, + "y": 1893.6 + }, + { + "x": 2475, + "y": 1927.5 + }, + { + "x": 2475, + "y": 1961.4 + }, + { + "x": 2475, + "y": 2006.6 + }, + { + "x": 2475, + "y": 2040.5 + }, + { + "x": 2475, + "y": 2074.4 + }, + { + "x": 2475, + "y": 2119.6 + }, + { + "x": 2475, + "y": 2153.5 + }, + { + "x": 2475, + "y": 2187.4 + }, + { + "x": 2475, + "y": 2232.6 + }, + { + "x": 2475, + "y": 2266.5 + }, + { + "x": 2475, + "y": 2300.4 + }, + { + "x": 2184.2, + "y": 2457.6 + }, + { + "x": 1021, + "y": 2544 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "(NE -- SD)[1]", + "src": "NE", + "srcArrow": "none", + "srcLabel": "", + "dst": "SD", + "dstArrow": "none", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 2289.5, + "y": 1476.9125 + }, + { + "x": 2335.5, + "y": 1520.9825 + }, + { + "x": 2360.2, + "y": 1543.6 + }, + { + "x": 2413, + "y": 1590 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "(SD -- WY)[1]", + "src": "SD", + "srcArrow": "none", + "srcLabel": "", + "dst": "WY", + "dstArrow": "none", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 2506.3606194690265, + "y": 1708 + }, + { + "x": 2526.272123893805, + "y": 1748 + }, + { + "x": 2531.25, + "y": 1780.6 + }, + { + "x": 2531.25, + "y": 1814.5 + }, + { + "x": 2531.25, + "y": 1848.4 + }, + { + "x": 2531.25, + "y": 1893.6 + }, + { + "x": 2531.25, + "y": 1927.5 + }, + { + "x": 2531.25, + "y": 1961.4 + }, + { + "x": 2531.25, + "y": 2006.6 + }, + { + "x": 2531.25, + "y": 2040.5 + }, + { + "x": 2531.25, + "y": 2074.4 + }, + { + "x": 2531.25, + "y": 2119.6 + }, + { + "x": 2531.25, + "y": 2153.5 + }, + { + "x": 2531.25, + "y": 2187.4 + }, + { + "x": 2531.25, + "y": 2232.6 + }, + { + "x": 2531.25, + "y": 2266.5 + }, + { + "x": 2531.25, + "y": 2300.4 + }, + { + "x": 2229.25, + "y": 2457.6 + }, + { + "x": 1021.25, + "y": 2544 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "(NV -- OR)[2]", + "src": "NV", + "srcArrow": "none", + "srcLabel": "", + "dst": "OR", + "dstArrow": "none", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 708.25, + "y": 1438.9364855328158 + }, + { + "x": 941.65, + "y": 1513.3872971065632 + }, + { + "x": 1000, + "y": 1554.6 + }, + { + "x": 1000, + "y": 1588.5 + }, + { + "x": 1000, + "y": 1622.4 + }, + { + "x": 896, + "y": 1778.2 + }, + { + "x": 480, + "y": 1859 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "(OR -- UT)[1]", + "src": "OR", + "srcArrow": "none", + "srcLabel": "", + "dst": "UT", + "dstArrow": "none", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 416.75, + "y": 1934 + }, + { + "x": 416.75, + "y": 1974 + }, + { + "x": 475.95, + "y": 2002.6860335195531 + }, + { + "x": 712.75, + "y": 2077.4301675977654 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "(NH -- VT)[0]", + "src": "NH", + "srcArrow": "none", + "srcLabel": "", + "dst": "VT", + "dstArrow": "none", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 893.108407079646, + "y": 1708 + }, + { + "x": 917.6216814159292, + "y": 1748 + }, + { + "x": 923.75, + "y": 1780.6 + }, + { + "x": 923.75, + "y": 1814.5 + }, + { + "x": 923.75, + "y": 1848.4 + }, + { + "x": 923.75, + "y": 1893.6 + }, + { + "x": 923.75, + "y": 1927.5 + }, + { + "x": 923.75, + "y": 1961.4 + }, + { + "x": 923.75, + "y": 2006.6 + }, + { + "x": 923.75, + "y": 2040.5 + }, + { + "x": 923.75, + "y": 2074.4 + }, + { + "x": 923.75, + "y": 2119.6 + }, + { + "x": 923.75, + "y": 2153.5 + }, + { + "x": 923.75, + "y": 2187.4 + }, + { + "x": 923.75, + "y": 2232.6 + }, + { + "x": 923.75, + "y": 2266.5 + }, + { + "x": 923.75, + "y": 2300.4 + }, + { + "x": 881.95, + "y": 2453.4 + }, + { + "x": 714.75, + "y": 2523 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "(NJ -- NY)[0]", + "src": "NJ", + "srcArrow": "none", + "srcLabel": "", + "dst": "NY", + "dstArrow": "none", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 1152.953539823009, + "y": 1708 + }, + { + "x": 1179.5907079646017, + "y": 1748 + }, + { + "x": 1081.85, + "y": 1778.2 + }, + { + "x": 664.25, + "y": 1859 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "(NY -- PA)[0]", + "src": "NY", + "srcArrow": "none", + "srcLabel": "", + "dst": "PA", + "dstArrow": "none", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 663.75, + "y": 1913.3323262839879 + }, + { + "x": 746.55, + "y": 1969.8664652567975 + }, + { + "x": 834.7, + "y": 2003.090419536631 + }, + { + "x": 1104.5, + "y": 2079.452097683156 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "(NM -- OK)[1]", + "src": "NM", + "srcArrow": "none", + "srcLabel": "", + "dst": "OK", + "dstArrow": "none", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 1406.25, + "y": 1708 + }, + { + "x": 1426.25, + "y": 1748 + }, + { + "x": 1551.35, + "y": 1778.4541070082894 + }, + { + "x": 2031.75, + "y": 1860.270535041447 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "(OK -- TX)[0]", + "src": "OK", + "srcArrow": "none", + "srcLabel": "", + "dst": "TX", + "dstArrow": "none", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 2157.75, + "y": 1904.5406360424029 + }, + { + "x": 2277.15, + "y": 1968.1081272084805 + }, + { + "x": 2307, + "y": 2006.6 + }, + { + "x": 2307, + "y": 2040.5 + }, + { + "x": 2307, + "y": 2074.4 + }, + { + "x": 2227.8, + "y": 2229.6 + }, + { + "x": 1911, + "y": 2308 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "(NY -- PA)[1]", + "src": "NY", + "srcArrow": "none", + "srcLabel": "", + "dst": "PA", + "dstArrow": "none", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 663.75, + "y": 1905.0924574209246 + }, + { + "x": 778.55, + "y": 1968.2184914841848 + }, + { + "x": 866.7, + "y": 2002.699652052888 + }, + { + "x": 1104.5, + "y": 2077.49826026444 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "(PA -- RI)[0]", + "src": "PA", + "srcArrow": "none", + "srcLabel": "", + "dst": "RI", + "dstArrow": "none", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 1104.5, + "y": 2152.056974459725 + }, + { + "x": 1052.3, + "y": 2198.411394891945 + }, + { + "x": 998.25, + "y": 2227.6 + }, + { + "x": 834.25, + "y": 2298 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "(RI -- VT)[1]", + "src": "RI", + "srcArrow": "none", + "srcLabel": "", + "dst": "VT", + "dstArrow": "none", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 793.9845132743363, + "y": 2386 + }, + { + "x": 806.1969026548672, + "y": 2426 + }, + { + "x": 790.45, + "y": 2449.6 + }, + { + "x": 715.25, + "y": 2504 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "(NC -- SC)[1]", + "src": "NC", + "srcArrow": "none", + "srcLabel": "", + "dst": "SC", + "dstArrow": "none", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 145, + "y": 1699.5214007782101 + }, + { + "x": 198.2, + "y": 1746.3042801556421 + }, + { + "x": 198.1, + "y": 1769.6 + }, + { + "x": 144.5, + "y": 1816 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "(SC -- TN)[1]", + "src": "SC", + "srcArrow": "none", + "srcLabel": "", + "dst": "TN", + "dstArrow": "none", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 112.13053097345133, + "y": 1934 + }, + { + "x": 130.62610619469027, + "y": 1974 + }, + { + "x": 400.65000000000003, + "y": 2005.6 + }, + { + "x": 1462.25, + "y": 2092 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "(TN -- VA)[1]", + "src": "TN", + "srcArrow": "none", + "srcLabel": "", + "dst": "VA", + "dstArrow": "none", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 1535.1504424778761, + "y": 2160 + }, + { + "x": 1542.2300884955753, + "y": 2200 + }, + { + "x": 1534, + "y": 2220 + }, + { + "x": 1494, + "y": 2260 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "(ND -- SD)[2]", + "src": "ND", + "srcArrow": "none", + "srcLabel": "", + "dst": "SD", + "dstArrow": "none", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 2520.276548672566, + "y": 1482 + }, + { + "x": 2545.0553097345132, + "y": 1522 + }, + { + "x": 2544.45, + "y": 1542 + }, + { + "x": 2517.25, + "y": 1582 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "(OH -- PA)[0]", + "src": "OH", + "srcArrow": "none", + "srcLabel": "", + "dst": "PA", + "dstArrow": "none", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 2900.0508849557523, + "y": 1708 + }, + { + "x": 2914.2101769911505, + "y": 1748 + }, + { + "x": 2917.75, + "y": 1780.6 + }, + { + "x": 2917.75, + "y": 1814.5 + }, + { + "x": 2917.75, + "y": 1848.4 + }, + { + "x": 2579.95, + "y": 2005.8 + }, + { + "x": 1228.75, + "y": 2093 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "(PA -- WV)[0]", + "src": "PA", + "srcArrow": "none", + "srcLabel": "", + "dst": "WV", + "dstArrow": "none", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 1177.6504424778761, + "y": 2160 + }, + { + "x": 1184.7300884955753, + "y": 2200 + }, + { + "x": 1186.5, + "y": 2232.6 + }, + { + "x": 1186.5, + "y": 2266.5 + }, + { + "x": 1186.5, + "y": 2300.4 + }, + { + "x": 1225.35, + "y": 2452.9663768115943 + }, + { + "x": 1380.75, + "y": 2520.831884057971 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "(OK -- TX)[1]", + "src": "OK", + "srcArrow": "none", + "srcLabel": "", + "dst": "TX", + "dstArrow": "none", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 2157.75, + "y": 1899.2220019821605 + }, + { + "x": 2309.15, + "y": 1967.0444003964321 + }, + { + "x": 2347, + "y": 2006.6 + }, + { + "x": 2347, + "y": 2040.5 + }, + { + "x": 2347, + "y": 2074.4 + }, + { + "x": 2259.8, + "y": 2229.8 + }, + { + "x": 1911, + "y": 2309 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "(OR -- WA)[0]", + "src": "OR", + "srcArrow": "none", + "srcLabel": "", + "dst": "WA", + "dstArrow": "none", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 457.17035398230087, + "y": 1934 + }, + { + "x": 482.8340707964602, + "y": 1974 + }, + { + "x": 489.25, + "y": 2006.6 + }, + { + "x": 489.25, + "y": 2040.5 + }, + { + "x": 489.25, + "y": 2074.4 + }, + { + "x": 489.25, + "y": 2220 + }, + { + "x": 489.25, + "y": 2260 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "(PA -- WV)[1]", + "src": "PA", + "srcArrow": "none", + "srcLabel": "", + "dst": "WV", + "dstArrow": "none", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 1199.9513274336284, + "y": 2160 + }, + { + "x": 1221.1902654867256, + "y": 2200 + }, + { + "x": 1226.5, + "y": 2232.6 + }, + { + "x": 1226.5, + "y": 2266.5 + }, + { + "x": 1226.5, + "y": 2300.4 + }, + { + "x": 1257.35, + "y": 2451.9362285714287 + }, + { + "x": 1380.75, + "y": 2515.6811428571427 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "(SD -- WY)[2]", + "src": "SD", + "srcArrow": "none", + "srcLabel": "", + "dst": "WY", + "dstArrow": "none", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 2528.6615044247787, + "y": 1708 + }, + { + "x": 2562.7323008849557, + "y": 1748 + }, + { + "x": 2571.25, + "y": 1780.6 + }, + { + "x": 2571.25, + "y": 1814.5 + }, + { + "x": 2571.25, + "y": 1848.4 + }, + { + "x": 2571.25, + "y": 1893.6 + }, + { + "x": 2571.25, + "y": 1927.5 + }, + { + "x": 2571.25, + "y": 1961.4 + }, + { + "x": 2571.25, + "y": 2006.6 + }, + { + "x": 2571.25, + "y": 2040.5 + }, + { + "x": 2571.25, + "y": 2074.4 + }, + { + "x": 2571.25, + "y": 2119.6 + }, + { + "x": 2571.25, + "y": 2153.5 + }, + { + "x": 2571.25, + "y": 2187.4 + }, + { + "x": 2571.25, + "y": 2232.6 + }, + { + "x": 2571.25, + "y": 2266.5 + }, + { + "x": 2571.25, + "y": 2300.4 + }, + { + "x": 2261.25, + "y": 2457.6 + }, + { + "x": 1021.25, + "y": 2544 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "(TN -- VA)[2]", + "src": "TN", + "srcArrow": "none", + "srcLabel": "", + "dst": "VA", + "dstArrow": "none", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 1557.4513274336284, + "y": 2160 + }, + { + "x": 1578.6902654867256, + "y": 2200 + }, + { + "x": 1566.2, + "y": 2223.2 + }, + { + "x": 1495, + "y": 2276 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "(UT -- WY)[1]", + "src": "UT", + "srcArrow": "none", + "srcLabel": "", + "dst": "WY", + "dstArrow": "none", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 835.5199115044247, + "y": 2160 + }, + { + "x": 874.1039823008849, + "y": 2200 + }, + { + "x": 883.75, + "y": 2232.6 + }, + { + "x": 883.75, + "y": 2266.5 + }, + { + "x": 883.75, + "y": 2300.4 + }, + { + "x": 890.15, + "y": 2446 + }, + { + "x": 915.75, + "y": 2486 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "(VA -- WV)[2]", + "src": "VA", + "srcArrow": "none", + "srcLabel": "", + "dst": "WV", + "dstArrow": "none", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 1495.5, + "y": 2334.945031712474 + }, + { + "x": 1917.7, + "y": 2415.7890063424948 + }, + { + "x": 1920.65, + "y": 2456 + }, + { + "x": 1510.25, + "y": 2536 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + } + ] +} diff --git a/e2etests/testdata/stable/us_map/sketch.exp.svg b/e2etests/testdata/stable/us_map/sketch.exp.svg new file mode 100644 index 000000000..1fa0b4a90 --- /dev/null +++ b/e2etests/testdata/stable/us_map/sketch.exp.svg @@ -0,0 +1,22 @@ + +AKHIALFLGAMSTNAZCANVNMUTARLAMOOKTXORCOKSNEWYCTMANYRIDEMDNJPANCSCIDMTWAILINIAMIKYWIOHMNSDVAWVMENHVTND \ No newline at end of file diff --git a/e2etests/todo_test.go b/e2etests/todo_test.go new file mode 100644 index 000000000..8a6adebab --- /dev/null +++ b/e2etests/todo_test.go @@ -0,0 +1,24 @@ +package e2etests + +import ( + _ "embed" + "testing" +) + +func testTodo(t *testing.T) { + tcs := []testCase{ + // https://github.com/terrastruct/d2/issues/24 + // string monstrosity from not being able to escape backticks within string literals + { + skip: true, + name: "backtick", + script: `md: |md + ` + "`" + "code`" + ` +| +a -> md -> b +`, + }, + } + + runa(t, tcs) +} diff --git a/go.mod b/go.mod new file mode 100644 index 000000000..07431f1ec --- /dev/null +++ b/go.mod @@ -0,0 +1,61 @@ +module oss.terrastruct.com/d2 + +go 1.18 + +require ( + cdr.dev/slog v1.4.2-0.20220126003130-b94a5ff54f37 + github.com/PuerkitoBio/goquery v1.8.0 + github.com/alecthomas/chroma v0.10.0 + github.com/fsnotify/fsnotify v1.6.0 + github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0 + github.com/google/go-github v17.0.0+incompatible + github.com/pkg/browser v0.0.0-20210911075715-681adbf594b8 + github.com/spf13/pflag v1.0.5 + github.com/stretchr/testify v1.7.0 + github.com/yuin/goldmark v1.5.2 + golang.org/x/exp v0.0.0-20221026004748-78e5e7837ae6 + golang.org/x/image v0.0.0-20220902085622-e7cb96979f69 + golang.org/x/net v0.0.0-20220624214902-1bab6f366d9e + golang.org/x/text v0.3.7 + gonum.org/v1/plot v0.12.0 + nhooyr.io/websocket v1.8.7 + oss.terrastruct.com/cmdlog v0.0.0-20221025194258-d3fd7e0b8950 + oss.terrastruct.com/diff v1.0.1 + oss.terrastruct.com/xcontext v0.0.0-20221018000442-50fdafb12f4f + oss.terrastruct.com/xdefer v0.0.0-20221017222355-6f3b6e4d1557 + oss.terrastruct.com/xjson v0.0.0-20221018000420-4986731c4c4a + oss.terrastruct.com/xos v0.0.0-20221018030138-c96e7ae96e5d + oss.terrastruct.com/xrand v0.0.0-20221020211818-4ac08e618333 + rogchap.com/v8go v0.7.0 +) + +require ( + cloud.google.com/go/compute v1.7.0 // indirect + github.com/andybalholm/cascadia v1.3.1 // indirect + github.com/davecgh/go-spew v1.1.1 // indirect + github.com/dlclark/regexp2 v1.4.0 // indirect + github.com/fatih/color v1.13.0 // indirect + github.com/gin-gonic/gin v1.7.7 // indirect + github.com/go-playground/validator/v10 v10.10.0 // indirect + github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect + github.com/google/go-querystring v1.1.0 // indirect + github.com/json-iterator/go v1.1.12 // indirect + github.com/klauspost/compress v1.13.6 // indirect + github.com/kr/pretty v0.3.0 // indirect + github.com/mattn/go-colorable v0.1.12 // indirect + github.com/mattn/go-isatty v0.0.14 // indirect + github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect + github.com/pmezard/go-difflib v1.0.0 // indirect + github.com/rogpeppe/go-internal v1.8.0 // indirect + github.com/ugorji/go/codec v1.2.6 // indirect + go.opencensus.io v0.23.0 // indirect + golang.org/x/crypto v0.0.0-20220112180741-5e0467b6c7ce // indirect + golang.org/x/sys v0.1.0 // indirect + golang.org/x/term v0.0.0-20221017184919-83659145692c // indirect + golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2 // indirect + google.golang.org/genproto v0.0.0-20220822174746-9e6da59bd2fc // indirect + google.golang.org/protobuf v1.28.1 // indirect + gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c // indirect + gopkg.in/yaml.v2 v2.4.0 // indirect + gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b // indirect +) diff --git a/go.sum b/go.sum new file mode 100644 index 000000000..40b407876 --- /dev/null +++ b/go.sum @@ -0,0 +1,789 @@ +cdr.dev/slog v1.4.2-0.20220126003130-b94a5ff54f37 h1:HKrgyYmZ/yMAnp3RnTIqMUXWJKChytyiMRt3EZn45g0= +cdr.dev/slog v1.4.2-0.20220126003130-b94a5ff54f37/go.mod h1:WtpxhixLjbk2XsSYR4xPIFAYhHJWQjE2qKqwWe/90Ec= +cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= +cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= +cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= +cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= +cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= +cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To= +cloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4= +cloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M= +cloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc= +cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk= +cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs= +cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc= +cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY= +cloud.google.com/go v0.72.0/go.mod h1:M+5Vjvlc2wnp6tjzE102Dw08nGShTscUx2nZMufOKPI= +cloud.google.com/go v0.74.0/go.mod h1:VV1xSbzvo+9QJOxLDaJfTjx5e+MePCpCWwvftOeQmWk= +cloud.google.com/go v0.78.0/go.mod h1:QjdrLG0uq+YwhjoVOLsS1t7TW8fs36kLs4XO5R5ECHg= +cloud.google.com/go v0.79.0/go.mod h1:3bzgcEeQlzbuEAYu4mrWhKqWjmpprinYgKJLgKHnbb8= +cloud.google.com/go v0.81.0/go.mod h1:mk/AM35KwGk/Nm2YSeZbxXdrNK3KZOYHmLkOqC2V6E0= +cloud.google.com/go v0.83.0/go.mod h1:Z7MJUsANfY0pYPdw0lbnivPx4/vhy/e2FEkSkF7vAVY= +cloud.google.com/go v0.84.0/go.mod h1:RazrYuxIK6Kb7YrzzhPoLmCVzl7Sup4NrbKPg8KHSUM= +cloud.google.com/go v0.87.0/go.mod h1:TpDYlFy7vuLzZMMZ+B6iRiELaY7z/gJPaqbMx6mlWcY= +cloud.google.com/go v0.90.0/go.mod h1:kRX0mNRHe0e2rC6oNakvwQqzyDmg57xJ+SZU1eT2aDQ= +cloud.google.com/go v0.93.3/go.mod h1:8utlLll2EF5XMAV15woO4lSbWQlk8rer9aLOfLh7+YI= +cloud.google.com/go v0.94.1/go.mod h1:qAlAugsXlC+JWO+Bke5vCtc9ONxjQT3drlTTnAplMW4= +cloud.google.com/go v0.97.0/go.mod h1:GF7l59pYBVlXQIBLx3a761cZ41F9bBH3JUlihCt2Udc= +cloud.google.com/go v0.99.0/go.mod h1:w0Xx2nLzqWJPuozYQX+hFfCSI8WioryfRDzkoI/Y2ZA= +cloud.google.com/go v0.100.2/go.mod h1:4Xra9TjzAeYHrl5+oeLlzbM2k3mjVhZh4UqTZ//w99A= +cloud.google.com/go v0.102.0/go.mod h1:oWcCzKlqJ5zgHQt9YsaeTY9KzIvjyy0ArmiBUgpQ+nc= +cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= +cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= +cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= +cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= +cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= +cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= +cloud.google.com/go/compute v0.1.0/go.mod h1:GAesmwr110a34z04OlxYkATPBEfVhkymfTBXtfbBFow= +cloud.google.com/go/compute v1.3.0/go.mod h1:cCZiE1NHEtai4wiufUhW8I8S1JKkAnhnQJWM7YD99wM= +cloud.google.com/go/compute v1.5.0/go.mod h1:9SMHyhJlzhlkJqrPAc839t2BZFTSk6Jdj6mkzQJeu0M= +cloud.google.com/go/compute v1.6.0/go.mod h1:T29tfhtVbq1wvAPo0E3+7vhgmkOYeXjhFvz/FMzPu0s= +cloud.google.com/go/compute v1.6.1/go.mod h1:g85FgpzFvNULZ+S8AYq87axRKuf2Kh7deLqV/jJ3thU= +cloud.google.com/go/compute v1.7.0 h1:v/k9Eueb8aAJ0vZuxKMrgm6kPhCLZU9HxFU+AFDs9Uk= +cloud.google.com/go/compute v1.7.0/go.mod h1:435lt8av5oL9P3fv1OEzSbSUe+ybHXGMPQHHZWZxy9U= +cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= +cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= +cloud.google.com/go/iam v0.3.0/go.mod h1:XzJPvDayI+9zsASAFO68Hk07u3z+f+JrT2xXNdp4bnY= +cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= +cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= +cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= +cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU= +cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= +cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos= +cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= +cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= +cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= +cloud.google.com/go/storage v1.22.1/go.mod h1:S8N1cAStu7BOeFfE8KAQzmyyLkK8p/vmRq6kuBTW58Y= +dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= +git.sr.ht/~sbinet/gg v0.3.1 h1:LNhjNn8DerC8f9DHLz6lS0YYul/b602DUxDgGkd/Aik= +github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= +github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= +github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= +github.com/PuerkitoBio/goquery v1.8.0 h1:PJTF7AmFCFKk1N6V6jmKfrNH9tV5pNE6lZMkG0gta/U= +github.com/PuerkitoBio/goquery v1.8.0/go.mod h1:ypIiRMtY7COPGk+I/YbZLbxsxn9g5ejnI2HSMtkjZvI= +github.com/ajstarks/svgo v0.0.0-20211024235047-1546f124cd8b h1:slYM766cy2nI3BwyRiyQj/Ud48djTMtMebDqepE95rw= +github.com/alecthomas/chroma v0.9.4/go.mod h1:jtJATyUxlIORhUOFNA9NZDWGAQ8wpxQQqNSB4rjA/1s= +github.com/alecthomas/chroma v0.10.0 h1:7XDcGkCQopCNKjZHfYrNLraA+M7e0fMiJ/Mfikbfjek= +github.com/alecthomas/chroma v0.10.0/go.mod h1:jtJATyUxlIORhUOFNA9NZDWGAQ8wpxQQqNSB4rjA/1s= +github.com/andybalholm/cascadia v1.3.1 h1:nhxRkql1kdYCc8Snf7D5/D3spOX+dBgjA6u8x004T2c= +github.com/andybalholm/cascadia v1.3.1/go.mod h1:R4bJ1UQfqADjvDa4P6HZHLh/3OxWWEqc0Sk8XGwHqvA= +github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= +github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= +github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= +github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= +github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= +github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= +github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= +github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= +github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= +github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= +github.com/cncf/udpa/go v0.0.0-20210930031921-04548b0d99d4/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= +github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20210805033703-aa0b78936158/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20211001041855-01bcc9b48dfe/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= +github.com/creack/pty v1.1.18 h1:n56/Zwd5o6whRC5PMGretI4IdRLlmBXYNjScPaBgsbY= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/dlclark/regexp2 v1.4.0 h1:F1rxgk7p4uKjwIQxBs9oAXe5CqrXlCduYEJvrF4u93E= +github.com/dlclark/regexp2 v1.4.0/go.mod h1:2pZnwuY/m+8K6iRw6wQdMtk+rH5tNGR1i55kozfMjCc= +github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= +github.com/envoyproxy/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po= +github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= +github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= +github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ= +github.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go.mod h1:AFq3mo9L8Lqqiid3OhADV3RfLJnjiw63cSpi+fDTRC0= +github.com/envoyproxy/go-control-plane v0.10.2-0.20220325020618-49ff273808a1/go.mod h1:KJwIaB5Mv44NWtYuAOFCVOjcI94vtpEz2JU/D2v6IjE= +github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= +github.com/fatih/color v1.13.0 h1:8LOYc1KYPPmyKMuN8QV2DNRWNbLo6LZ0iLs8+mlH53w= +github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= +github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY= +github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw= +github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= +github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE= +github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI= +github.com/gin-gonic/gin v1.6.3/go.mod h1:75u5sXoLsGZoRN5Sgbi1eraJ4GU3++wFwWzhwvtwp4M= +github.com/gin-gonic/gin v1.7.7 h1:3DoBmSbJbZAWqXJC3SLjAPfutPJJRN1U5pALB7EeTTs= +github.com/gin-gonic/gin v1.7.7/go.mod h1:axIBovoeJpVj8S3BwE0uPMTeReE4+AfFtqpqaZ1qq1U= +github.com/go-fonts/liberation v0.2.0 h1:jAkAWJP4S+OsrPLZM4/eC9iW7CtHy+HBXrEwZXWo5VM= +github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= +github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= +github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= +github.com/go-latex/latex v0.0.0-20210823091927-c0d11ff05a81 h1:6zl3BbBhdnMkpSj2YY30qV3gDcVBGtFgVsV3+/i+mKQ= +github.com/go-pdf/fpdf v0.6.0 h1:MlgtGIfsdMEEQJr2le6b/HNr1ZlQwxyWr77r2aj2U/8= +github.com/go-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= +github.com/go-playground/locales v0.13.0/go.mod h1:taPMhCMXrRLJO55olJkUXHZBHCxTMfnGwq/HNwmWNS8= +github.com/go-playground/locales v0.14.0 h1:u50s323jtVGugKlcYeyzC0etD1HifMjqmJqb8WugfUU= +github.com/go-playground/locales v0.14.0/go.mod h1:sawfccIbzZTqEDETgFXqTho0QybSa7l++s0DH+LDiLs= +github.com/go-playground/universal-translator v0.17.0/go.mod h1:UkSxE5sNxxRwHyU+Scu5vgOQjsIJAF8j9muTVoKLVtA= +github.com/go-playground/universal-translator v0.18.0 h1:82dyy6p4OuJq4/CByFNOn/jYrnRPArHwAcmLoJZxyho= +github.com/go-playground/universal-translator v0.18.0/go.mod h1:UvRDBj+xPUEGrFYl+lu/H90nyDXpg0fqeB/AQUGNTVA= +github.com/go-playground/validator/v10 v10.2.0/go.mod h1:uOYAAleCW8F/7oMFd6aG0GOhaH6EGOAJShg8Id5JGkI= +github.com/go-playground/validator/v10 v10.4.1/go.mod h1:nlOn6nFhuKACm19sB/8EGNn9GlaMV7XkbRSipzJ0Ii4= +github.com/go-playground/validator/v10 v10.10.0 h1:I7mrTYv78z8k8VXa/qJlOlEXn/nBh+BF8dHX5nt/dr0= +github.com/go-playground/validator/v10 v10.10.0/go.mod h1:74x4gJWsvQexRdW8Pn3dXSGrTK4nAUsbPlLADvpJkos= +github.com/gobwas/httphead v0.0.0-20180130184737-2c6c146eadee h1:s+21KNqlpePfkah2I+gwHF8xmJWRjooY+5248k6m4A0= +github.com/gobwas/httphead v0.0.0-20180130184737-2c6c146eadee/go.mod h1:L0fX3K22YWvt/FAX9NnzrNzcI4wNYi9Yku4O0LKYflo= +github.com/gobwas/pool v0.2.0 h1:QEmUOlnSjWtnpRGHF3SauEiOsy82Cup83Vf2LcMlnc8= +github.com/gobwas/pool v0.2.0/go.mod h1:q8bcK0KcYlCgd9e7WYLm9LpyS+YeLd8JVDW6WezmKEw= +github.com/gobwas/ws v1.0.2 h1:CoAavW/wd/kulfZmSIBt6p24n4j7tHgNVCjsfHVNUbo= +github.com/gobwas/ws v1.0.2/go.mod h1:szmBTxLgaFppYjEmNtny/v3w89xOydFnnZMcgRRu/EM= +github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0 h1:DACJavvAHhabrF08vX0COfcOBJRhZ8lUbR+ZWIs0Y5g= +github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k= +github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= +github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE= +github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= +github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= +github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= +github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= +github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= +github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= +github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= +github.com/golang/mock v1.5.0/go.mod h1:CWnOUgYIOo4TcNZ0wHX3YZCqsaM1I1Jvs6v3mP3KVu8= +github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= +github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= +github.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= +github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk= +github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= +github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= +github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= +github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= +github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= +github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= +github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= +github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= +github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= +github.com/golang/protobuf v1.5.1/go.mod h1:DopwsBzvsk0Fs44TXzsVbJyPhcCPeIwnvohx4u74HPM= +github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw= +github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= +github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= +github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= +github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= +github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE= +github.com/google/go-cmp v0.5.8 h1:e6P7q2lk1O+qJJb4BtCQXlK8vWEO8V1ZeuEdJNOqZyg= +github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/go-github v17.0.0+incompatible h1:N0LgJ1j65A7kfXrZnUDaYCs/Sf4rEjNlfyDHW9dolSY= +github.com/google/go-github v17.0.0+incompatible/go.mod h1:zLgOLi98H3fifZn+44m+umXrS52loVEgC2AApnigrVQ= +github.com/google/go-querystring v1.1.0 h1:AnCroh3fv4ZBgVIf1Iwtovgjaw/GiKJo8M8yD/fhyJ8= +github.com/google/go-querystring v1.1.0/go.mod h1:Kcdr2DB4koayq7X8pmAG4sNG59So17icRSOU623lUBU= +github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= +github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= +github.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= +github.com/google/martian/v3 v3.2.1/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk= +github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= +github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= +github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210122040257-d980be63207e/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210601050228-01bbb1931b22/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210609004039-a478d1d731e9/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= +github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/googleapis/enterprise-certificate-proxy v0.0.0-20220520183353-fd19c99a87aa/go.mod h1:17drOmN3MwGY7t0e+Ei9b45FFGA3fBs3x36SsCg1hq8= +github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= +github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= +github.com/googleapis/gax-go/v2 v2.1.0/go.mod h1:Q3nei7sK6ybPYH7twZdmQpAd1MKb7pfu6SK+H1/DsU0= +github.com/googleapis/gax-go/v2 v2.1.1/go.mod h1:hddJymUZASv3XPyGkUpKj8pPO47Rmb0eJc8R6ouapiM= +github.com/googleapis/gax-go/v2 v2.2.0/go.mod h1:as02EH8zWkzwUoLbBaFeQ+arQaj/OthfcblKl4IGNaM= +github.com/googleapis/gax-go/v2 v2.3.0/go.mod h1:b8LNqSzNabLiUpXKkY7HAR5jr6bIT99EXz9pXxye9YM= +github.com/googleapis/gax-go/v2 v2.4.0/go.mod h1:XOTVJ59hdnfJLIP/dh8n5CGryZR2LxK9wbMD5+iXC6c= +github.com/googleapis/go-type-adapters v1.0.0/go.mod h1:zHW75FOG2aur7gAO2B+MLby+cLsWGBF62rFAi7WjWO4= +github.com/gorilla/websocket v1.4.1 h1:q7AeDBpnBk8AogcD4DSag/Ukw/KV+YhzLj2bP5HvKCM= +github.com/gorilla/websocket v1.4.1/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= +github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= +github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= +github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= +github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= +github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= +github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= +github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= +github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= +github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= +github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/klauspost/compress v1.10.3/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= +github.com/klauspost/compress v1.13.6 h1:P76CopJELS0TiO2mebmnzgWaajssP/EszplttgQxcgc= +github.com/klauspost/compress v1.13.6/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= +github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= +github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= +github.com/kr/pretty v0.3.0 h1:WgNl7dwNpEZ6jJ9k1snq4pZsg7DOEN8hP9Xw0Tsjwk0= +github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk= +github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= +github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/leodido/go-urn v1.2.0/go.mod h1:+8+nEpDfqqsY+g338gtMEUOtuK+4dEMhiQEgxpxOKII= +github.com/leodido/go-urn v1.2.1 h1:BqpAaACuzVSgi/VLzGZIobT2z4v53pjosyNd9Yv6n/w= +github.com/leodido/go-urn v1.2.1/go.mod h1:zt4jvISO2HfUBqxjfIshjdMTYS56ZS/qv49ictyFfxY= +github.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= +github.com/mattn/go-colorable v0.1.12 h1:jF+Du6AlPIjs2BiUiQlKOX0rt3SujHxPnksPKZbaA40= +github.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= +github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= +github.com/mattn/go-isatty v0.0.14 h1:yVuAays6BHfxijgZPzw+3Zlu5yQgKGP2/hcQbHb7S9Y= +github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= +github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= +github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= +github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/pkg/browser v0.0.0-20210911075715-681adbf594b8 h1:KoWmjvw+nsYOo29YJK9vDA65RGE3NrOnUtO7a+RF9HU= +github.com/pkg/browser v0.0.0-20210911075715-681adbf594b8/go.mod h1:HKlIX3XHQyzLZPlr7++PzdhaXEj94dEiJgZDTsxEqUI= +github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= +github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= +github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= +github.com/rogpeppe/go-internal v1.8.0 h1:FCbCCtXNOY3UtUuHUYaghJg4y7Fd14rXifAYUAtL9R8= +github.com/rogpeppe/go-internal v1.8.0/go.mod h1:WmiCO8CzOY8rg0OYDC4/i/2WRWAB6poM+XZ2dLUbcbE= +github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= +github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= +github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= +github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= +github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY= +github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVMw= +github.com/ugorji/go v1.2.6/go.mod h1:anCg0y61KIhDlPZmnH+so+RQbysYVyDko0IMgJv0Nn0= +github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLYF3GoBXY= +github.com/ugorji/go/codec v1.2.6 h1:7kbGefxLoDBuYXOms4yD7223OpNMMPNPZxXk5TvFcyQ= +github.com/ugorji/go/codec v1.2.6/go.mod h1:V6TCNZ4PHqoHGFZuSG1W8nrCzzdgA2DozYxWFFpvxTw= +github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= +github.com/yuin/goldmark v1.5.2 h1:ALmeCk/px5FSm1MAcFBAsVKZjDuMVj8Tm7FFIlMJnqU= +github.com/yuin/goldmark v1.5.2/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= +go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= +go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= +go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= +go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= +go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= +go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= +go.opencensus.io v0.23.0 h1:gqCw0LfLxScz8irSi8exQc7fyQ0fKQU/qnC/X8+V/1M= +go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= +go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.0.0-20220112180741-5e0467b6c7ce h1:Roh6XWxHFKrPgC/EQhVubSAGQ6Ozk6IdxHSzt1mR0EI= +golang.org/x/crypto v0.0.0-20220112180741-5e0467b6c7ce/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= +golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= +golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= +golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= +golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= +golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= +golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= +golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= +golang.org/x/exp v0.0.0-20221026004748-78e5e7837ae6 h1:mC6uOkPi9SUk8A59jZvw7//rlyc+MlELtQUCyOUSKZQ= +golang.org/x/exp v0.0.0-20221026004748-78e5e7837ae6/go.mod h1:cyybsKvd6eL0RnXn6p/Grxp8F5bW7iYuBgsNCOHpMYE= +golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= +golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/image v0.0.0-20220902085622-e7cb96979f69 h1:Lj6HJGCSn5AjxRAH2+r35Mir4icalbqku+CLUtjnvXY= +golang.org/x/image v0.0.0-20220902085622-e7cb96979f69/go.mod h1:doUCurBvlfPMKfmIpRIywoHmhN3VyhnoFDbvIEWF4hY= +golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= +golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= +golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= +golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= +golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= +golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= +golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= +golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= +golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= +golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= +golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc= +golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= +golang.org/x/net v0.0.0-20210503060351-7fd8e65b6420/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20210916014120-12bc252f5db8/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220325170049-de3da57026de/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220412020605-290c469a71a5/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220425223048-2871e0cb64e4/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220607020251-c690dde0001d/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.0.0-20220624214902-1bab6f366d9e h1:TsQ7F31D3bUCLeqPT0u+yjp1guoArKaNKmCr22PYgTQ= +golang.org/x/net v0.0.0-20220624214902-1bab6f366d9e/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= +golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20201109201403-9fd604954f58/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210220000619-9bb904979d93/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210313182246-cd4f82c27b84/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210628180205-a41e5a781914/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210805134026-6f1e6394065a/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210819190943-2bc19b11175f/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= +golang.org/x/oauth2 v0.0.0-20220309155454-6242fa91716a/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= +golang.org/x/oauth2 v0.0.0-20220411215720-9780585627b5/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= +golang.org/x/oauth2 v0.0.0-20220608161450-d0670ef3b1eb/go.mod h1:jaDAt6Dkxork7LmZnYtzbRWj0W47D86a3TGe0YHBvmE= +golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20220601150217-0de741cfad7f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210220050731-9a76102bfb43/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210305230114-8fe3ee5dd75b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210514084401-e8d321eab015/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210603125802-9665404d3644/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210616045830-e2b7044e8c71/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210823070655-63515b42dcdf/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210908233432-aa78b53d3365/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211124211545-fe61309f8881/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211210111614-af8b64212486/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220128215802-99c3d69c2c27/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220209214540-3681064d5158/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220227234510-4e6760a101f9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220328115105-d36c6a25d886/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220502124256-b6088ccd6cba/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220503163025-988cb79eb6c6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220610221304-9f5ed59c137d/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.1.0 h1:kunALQeHf1/185U1i0GOB/fy1IPRDDpuoOOqRReG57U= +golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +golang.org/x/term v0.0.0-20221017184919-83659145692c h1:dveknrit5futqEmXAvd2I1BbZIDhxRijsyWHM86NlcA= +golang.org/x/term v0.0.0-20221017184919-83659145692c/go.mod h1:VTIZ7TEbF0BS9Sv9lPTvGbtW8i4z6GGbJBCM37uMCzY= +golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.7 h1:olpwvP2KacW1ZWvsR7uQhoyTYvKAupfQrRGBFM352Gk= +golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= +golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= +golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= +golang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= +golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= +golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE= +golang.org/x/tools v0.0.0-20201110124207-079ba7bd75cd/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20201201161351-ac6f37ff4c2a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= +golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.3/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.4/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20220411194840-2f41105eb62f/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20220517211312-f3a8303e98df/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= +golang.org/x/xerrors v0.0.0-20220609144429-65e65417b02f/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= +golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2 h1:H2TDz8ibqkAF6YGhCdN3jS9O0/s90v0rJh3X/OLHEUk= +golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= +gonum.org/v1/plot v0.12.0 h1:y1ZNmfz/xHuHvtgFe8USZVyykQo5ERXPnspQNVK15Og= +gonum.org/v1/plot v0.12.0/go.mod h1:PgiMf9+3A3PnZdJIciIXmyN1FwdAA6rXELSN761oQkw= +google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= +google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= +google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= +google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= +google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= +google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= +google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= +google.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= +google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= +google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM= +google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc= +google.golang.org/api v0.35.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg= +google.golang.org/api v0.36.0/go.mod h1:+z5ficQTmoYpPn8LCUNVpK5I7hwkpjbcgqA7I34qYtE= +google.golang.org/api v0.40.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjRCQ8= +google.golang.org/api v0.41.0/go.mod h1:RkxM5lITDfTzmyKFPt+wGrCJbVfniCr2ool8kTBzRTU= +google.golang.org/api v0.43.0/go.mod h1:nQsDGjRXMo4lvh5hP0TKqF244gqhGcr/YSIykhUk/94= +google.golang.org/api v0.47.0/go.mod h1:Wbvgpq1HddcWVtzsVLyfLp8lDg6AA241LmgIL59tHXo= +google.golang.org/api v0.48.0/go.mod h1:71Pr1vy+TAZRPkPs/xlCf5SsU8WjuAWv1Pfjbtukyy4= +google.golang.org/api v0.50.0/go.mod h1:4bNT5pAuq5ji4SRZm+5QIkjny9JAyVD/3gaSihNefaw= +google.golang.org/api v0.51.0/go.mod h1:t4HdrdoNgyN5cbEfm7Lum0lcLDLiise1F8qDKX00sOU= +google.golang.org/api v0.54.0/go.mod h1:7C4bFFOvVDGXjfDTAsgGwDgAxRDeQ4X8NvUedIt6z3k= +google.golang.org/api v0.55.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE= +google.golang.org/api v0.56.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE= +google.golang.org/api v0.57.0/go.mod h1:dVPlbZyBo2/OjBpmvNdpn2GRm6rPy75jyU7bmhdrMgI= +google.golang.org/api v0.61.0/go.mod h1:xQRti5UdCmoCEqFxcz93fTl338AVqDgyaDRuOZ3hg9I= +google.golang.org/api v0.63.0/go.mod h1:gs4ij2ffTRXwuzzgJl/56BdwJaA194ijkfn++9tDuPo= +google.golang.org/api v0.67.0/go.mod h1:ShHKP8E60yPsKNw/w8w+VYaj9H6buA5UqDp8dhbQZ6g= +google.golang.org/api v0.70.0/go.mod h1:Bs4ZM2HGifEvXwd50TtW70ovgJffJYw2oRCOFU/SkfA= +google.golang.org/api v0.71.0/go.mod h1:4PyU6e6JogV1f9eA4voyrTY2batOLdgZ5qZ5HOCc4j8= +google.golang.org/api v0.74.0/go.mod h1:ZpfMZOVRMywNyvJFeqL9HRWBgAuRfSjJFpe9QtRRyDs= +google.golang.org/api v0.75.0/go.mod h1:pU9QmyHLnzlpar1Mjt4IbapUCy8J+6HD6GeELN69ljA= +google.golang.org/api v0.78.0/go.mod h1:1Sg78yoMLOhlQTeF+ARBoytAcH1NNyyl390YMy6rKmw= +google.golang.org/api v0.80.0/go.mod h1:xY3nI94gbvBrE0J6NHXhxOmW97HG7Khjkku6AFB3Hyg= +google.golang.org/api v0.84.0/go.mod h1:NTsGnUFJMYROtiquksZHBWtHfeMC7iYthki7Eq3pa8o= +google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= +google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= +google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= +google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= +google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= +google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= +google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA= +google.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U= +google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= +google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= +google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20200904004341-0bd0a958aa1d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201109203340-2640f1f9cdfb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201201144952-b05cb90ed32e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210222152913-aa3ee6e6a81c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210303154014-9728d6b83eeb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210310155132-4ce2db91004e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210319143718-93e7006c17a6/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210329143202-679c6ae281ee/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= +google.golang.org/genproto v0.0.0-20210402141018-6c239bbf2bb1/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= +google.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A= +google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= +google.golang.org/genproto v0.0.0-20210604141403-392c879c8b08/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= +google.golang.org/genproto v0.0.0-20210608205507-b6d2f5bf0d7d/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= +google.golang.org/genproto v0.0.0-20210624195500-8bfb893ecb84/go.mod h1:SzzZ/N+nwJDaO1kznhnlzqS8ocJICar6hYhVyhi++24= +google.golang.org/genproto v0.0.0-20210713002101-d411969a0d9a/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k= +google.golang.org/genproto v0.0.0-20210716133855-ce7ef5c701ea/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k= +google.golang.org/genproto v0.0.0-20210728212813-7823e685a01f/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= +google.golang.org/genproto v0.0.0-20210805201207-89edb61ffb67/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= +google.golang.org/genproto v0.0.0-20210813162853-db860fec028c/go.mod h1:cFeNkxwySK631ADgubI+/XFU/xp8FD5KIVV4rj8UC5w= +google.golang.org/genproto v0.0.0-20210821163610-241b8fcbd6c8/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20210828152312-66f60bf46e71/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20210831024726-fe130286e0e2/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20210903162649-d08c68adba83/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20210909211513-a8c4777a87af/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20210924002016-3dee208752a0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211118181313-81c1377c94b1/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211206160659-862468c7d6e0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211208223120-3a66f561d7aa/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211221195035-429b39de9b1c/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20220126215142-9970aeb2e350/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20220207164111-0872dc986b00/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20220218161850-94dd64e39d7c/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= +google.golang.org/genproto v0.0.0-20220222213610-43724f9ea8cf/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= +google.golang.org/genproto v0.0.0-20220304144024-325a89244dc8/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= +google.golang.org/genproto v0.0.0-20220310185008-1973136f34c6/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= +google.golang.org/genproto v0.0.0-20220324131243-acbaeb5b85eb/go.mod h1:hAL49I2IFola2sVEjAn7MEwsja0xp51I0tlGAf9hz4E= +google.golang.org/genproto v0.0.0-20220407144326-9054f6ed7bac/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= +google.golang.org/genproto v0.0.0-20220413183235-5e96e2839df9/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= +google.golang.org/genproto v0.0.0-20220414192740-2d67ff6cf2b4/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= +google.golang.org/genproto v0.0.0-20220421151946-72621c1f0bd3/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= +google.golang.org/genproto v0.0.0-20220429170224-98d788798c3e/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= +google.golang.org/genproto v0.0.0-20220505152158-f39f71e6c8f3/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= +google.golang.org/genproto v0.0.0-20220518221133-4f43b3371335/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= +google.golang.org/genproto v0.0.0-20220523171625-347a074981d8/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= +google.golang.org/genproto v0.0.0-20220608133413-ed9918b62aac/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= +google.golang.org/genproto v0.0.0-20220616135557-88e70c0c3a90/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= +google.golang.org/genproto v0.0.0-20220822174746-9e6da59bd2fc h1:Nf+EdcTLHR8qDNN/KfkQL0u0ssxt9OhbaWCl5C0ucEI= +google.golang.org/genproto v0.0.0-20220822174746-9e6da59bd2fc/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= +google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= +google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= +google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= +google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= +google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= +google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60= +google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= +google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +google.golang.org/grpc v1.31.1/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0= +google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= +google.golang.org/grpc v1.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA51WJ8= +google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= +google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= +google.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= +google.golang.org/grpc v1.37.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= +google.golang.org/grpc v1.37.1/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= +google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= +google.golang.org/grpc v1.39.0/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE= +google.golang.org/grpc v1.39.1/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE= +google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= +google.golang.org/grpc v1.40.1/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= +google.golang.org/grpc v1.44.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU= +google.golang.org/grpc v1.45.0/go.mod h1:lN7owxKUQEqMfSyQikvvk5tf/6zMPsrK+ONuO11+0rQ= +google.golang.org/grpc v1.46.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= +google.golang.org/grpc v1.46.2/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= +google.golang.org/grpc v1.47.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= +google.golang.org/grpc v1.48.0 h1:rQOsyJ/8+ufEDJd/Gdsz7HG220Mh9HAhFHRGnIjda0w= +google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw= +google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= +google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= +google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= +google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= +google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= +google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4= +google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= +google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= +google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= +google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= +google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +google.golang.org/protobuf v1.28.1 h1:d0NfwRgPtno5B1Wa6L2DAG+KivqkdutMf1UhdNx175w= +google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= +gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= +gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= +gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b h1:h8qDotaEPuJATrMmW04NCwg7v22aHH28wwpauUhK9Oo= +gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= +honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= +honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= +nhooyr.io/websocket v1.8.7 h1:usjR2uOr/zjjkVMy0lW+PPohFok7PCow5sDjLgX4P4g= +nhooyr.io/websocket v1.8.7/go.mod h1:B70DZP8IakI65RVQ51MsWP/8jndNma26DVA/nFSCgW0= +oss.terrastruct.com/cmdlog v0.0.0-20221025194258-d3fd7e0b8950 h1:35gU5c1wwHKhXg58F500d6Ev8s+jqQUg4BiDbx2Zr+g= +oss.terrastruct.com/cmdlog v0.0.0-20221025194258-d3fd7e0b8950/go.mod h1:ROL3yxl2X+S3O+Rls00qdX6aMh+p1dF8IdxDRwDDpsg= +oss.terrastruct.com/diff v1.0.1 h1:WJ0LPXIgj644ne7l9CtDT9sBMDqo1B2/Ir5zdvbxYN8= +oss.terrastruct.com/diff v1.0.1/go.mod h1:cRGe5OvyjX7WWKk7CYh73SoS2tEghpTmAY1IPFWbqgE= +oss.terrastruct.com/xcontext v0.0.0-20221018000442-50fdafb12f4f h1:7voRCwKM7TZkTo9u7hj+uV/zXoVB8czWrTq6MVIh3dg= +oss.terrastruct.com/xcontext v0.0.0-20221018000442-50fdafb12f4f/go.mod h1:Y0coTLsWwX0q3a+/Ndq797t+vWyxm42T49Ik3bzaDKY= +oss.terrastruct.com/xdefer v0.0.0-20221017222355-6f3b6e4d1557 h1:rPbhJbN1q7B4tnppSPoAMwq0t6Pk5SrQDQ5S6uoNNHg= +oss.terrastruct.com/xdefer v0.0.0-20221017222355-6f3b6e4d1557/go.mod h1:plvfydF5METAlsbpeuSz44jckaOwrCWX3M0kTLoCA4I= +oss.terrastruct.com/xjson v0.0.0-20221018000420-4986731c4c4a h1:AAcupsjBwpbcyLASX0ppDlxbfHWb5Neq5gWdGpLfaSA= +oss.terrastruct.com/xjson v0.0.0-20221018000420-4986731c4c4a/go.mod h1:XJ71qiTzk/dbTWuYbuLJuRpBdKFN06Sk5FdFpq2TNmE= +oss.terrastruct.com/xos v0.0.0-20221018030138-c96e7ae96e5d h1:rrPTkbAfsRTW1WLoTzEofS9AprsHovy9bwvA/wC8Dys= +oss.terrastruct.com/xos v0.0.0-20221018030138-c96e7ae96e5d/go.mod h1:uSONPDInIwglnC+0zYs8YOjiUD8ZUSnqDTTI82j7Oro= +oss.terrastruct.com/xrand v0.0.0-20221020211818-4ac08e618333 h1:7EdxwXM75Id1VIN71QbE8bLzZRMs0qD7olnDw5gbI7w= +oss.terrastruct.com/xrand v0.0.0-20221020211818-4ac08e618333/go.mod h1:O7TAoBmlQhoi46RdgVikDcoLRb/vLflhkXCAd+nO4SM= +rogchap.com/v8go v0.7.0 h1:kgjbiO4zE5itA962ze6Hqmbs4HgZbGzmueCXsZtremg= +rogchap.com/v8go v0.7.0/go.mod h1:MxgP3pL2MW4dpme/72QRs8sgNMmM0pRc8DPhcuLWPAs= +rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= +rsc.io/pdf v0.1.1 h1:k1MczvYDUvJBe93bYd7wrZLLUEcLZAuF824/I4e5Xr4= +rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= +rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= diff --git a/lib/diff/diff.go b/lib/diff/diff.go new file mode 100644 index 000000000..43204e272 --- /dev/null +++ b/lib/diff/diff.go @@ -0,0 +1,38 @@ +package diff + +import ( + "fmt" + "io/ioutil" + "os" + "path/filepath" + + "oss.terrastruct.com/diff" +) + +// TODO refactor with diff repo +func TestdataGeneric(path, fileExtension string, got []byte) (err error) { + expPath := fmt.Sprintf("%s.exp%s", path, fileExtension) + gotPath := fmt.Sprintf("%s.got%s", path, fileExtension) + + err = os.MkdirAll(filepath.Dir(gotPath), 0755) + if err != nil { + return err + } + err = ioutil.WriteFile(gotPath, got, 0600) + if err != nil { + return err + } + + ds, err := diff.Files(expPath, gotPath) + if err != nil { + return err + } + + if ds != "" { + if os.Getenv("TESTDATA_ACCEPT") != "" { + return os.Rename(gotPath, expPath) + } + return fmt.Errorf("diff (rerun with $TESTDATA_ACCEPT=1 to accept):\n%s", ds) + } + return os.Remove(gotPath) +} diff --git a/lib/env/env.go b/lib/env/env.go new file mode 100644 index 000000000..eee0ddc65 --- /dev/null +++ b/lib/env/env.go @@ -0,0 +1,27 @@ +package env + +import ( + "os" +) + +func Test() bool { + return os.Getenv("TEST_MODE") != "" +} + +func Dev() bool { + return os.Getenv("DEV_MODE") != "" +} + +func Debug() bool { + return os.Getenv("DEBUG") != "" +} + +// People have DEV_MODE on while running tests. If that's the case, this +// function will return false. +func DevOnly() bool { + return Dev() && !Test() +} + +func SkipGraphDiffTests() bool { + return os.Getenv("SKIP_GRAPH_DIFF_TESTS") == "on" +} diff --git a/lib/geo/bezier.go b/lib/geo/bezier.go new file mode 100644 index 000000000..458ff70e0 --- /dev/null +++ b/lib/geo/bezier.go @@ -0,0 +1,254 @@ +// bezier.go is a manual translation of the code from (including some amendments in the comments section) +// https://www.particleincell.com/2013/cubic-line-intersection/ + +package geo + +import ( + "math" + + "gonum.org/v1/plot/font" + "gonum.org/v1/plot/tools/bezier" + "gonum.org/v1/plot/vg" +) + +// How precise should comparisons be, avoid being too precise due to floating point issues +const PRECISION = 0.0001 + +type BezierCurve struct { + Curve *bezier.Curve + points []*Point +} + +func NewBezierCurve(points []*Point) *BezierCurve { + internalPoints := make([]vg.Point, len(points)) + for i := 0; i < len(points); i++ { + internalPoints[i] = vg.Point{ + X: font.Length(points[i].X), + Y: font.Length(points[i].Y), + } + } + internalCurve := bezier.New(internalPoints...) + curve := &BezierCurve{ + Curve: &internalCurve, + } + curve.points = points + return curve +} + +func (bc BezierCurve) Intersections(segment Segment) []*Point { + return ComputeIntersections( + []float64{ + bc.points[0].X, + bc.points[1].X, + bc.points[2].X, + bc.points[3].X, + }, + []float64{ + bc.points[0].Y, + bc.points[1].Y, + bc.points[2].Y, + bc.points[3].Y, + }, + []float64{ + segment.Start.X, + segment.End.X, + }, + []float64{ + segment.Start.Y, + segment.End.Y, + }, + ) +} + +func (bc BezierCurve) At(point float64) *Point { + curvePoint := bc.Curve.Point(point) + return NewPoint(float64(curvePoint.X), float64(curvePoint.Y)) +} + +//nolint +func ComputeIntersections(px, py, lx, ly []float64) []*Point { + out := make([]*Point, 0) + + var A = ly[1] - ly[0] + var B = lx[0] - lx[1] + var C = lx[0]*(ly[0]-ly[1]) + ly[0]*(lx[1]-lx[0]) + + var bx = bezierCoeffs(px[0], px[1], px[2], px[3]) + var by = bezierCoeffs(py[0], py[1], py[2], py[3]) + + P := make([]float64, 4) + P[0] = A*bx[0] + B*by[0] + P[1] = A*bx[1] + B*by[1] + P[2] = A*bx[2] + B*by[2] + P[3] = A*bx[3] + B*by[3] + C + + var r = cubicRoots(P) + + for i := 0; i < 3; i++ { + t := r[i] + + point := &Point{ + X: bx[0]*t*t*t + bx[1]*t*t + bx[2]*t + bx[3], + Y: by[0]*t*t*t + by[1]*t*t + by[2]*t + by[3], + } + + var s float64 + if (lx[1] - lx[0]) != 0 { + s = (point.X - lx[0]) / (lx[1] - lx[0]) + } else { + s = (point.Y - ly[0]) / (ly[1] - ly[0]) + } + + tLT0 := PrecisionCompare(t, 0, PRECISION) < 0 + tGT1 := PrecisionCompare(t, 1, PRECISION) > 0 + sLT0 := PrecisionCompare(s, 0, PRECISION) < 0 + sGT1 := PrecisionCompare(s, 1, PRECISION) > 0 + if !(tLT0 || tGT1 || sLT0 || sGT1) { + out = append(out, point) + } + } + + return out +} + +//nolint +func cubicRoots(P []float64) []float64 { + if PrecisionCompare(P[0], 0, PRECISION) == 0 { + if PrecisionCompare(P[1], 0, PRECISION) == 0 { + t := make([]float64, 3) + t[0] = -1 * (P[3] / P[2]) + t[1] = -1 + t[2] = -1 + + for i := 0; i < 1; i++ { + tiLT0 := PrecisionCompare(t[i], 0, PRECISION) < 0 + tiGT1 := PrecisionCompare(t[i], 1, PRECISION) > 0 + if tiLT0 || tiGT1 { + t[i] = -1 + } + } + + t = sortSpecial(t) + return t + } + + var DQ = math.Pow(P[2], 2) - 4*P[1]*P[3] + if PrecisionCompare(DQ, 0, PRECISION) >= 0 { + DQ = math.Sqrt(DQ) + t := make([]float64, 3) + t[0] = -1 * ((DQ + P[2]) / (2 * P[1])) + t[1] = ((DQ - P[2]) / (2 * P[1])) + t[2] = -1 + + //lint:ignore SA4008 TODO this returns before looping? + for i := 0; i < 2; i++ { + tiLT0 := PrecisionCompare(t[i], 0, PRECISION) < 0 + tiGT1 := PrecisionCompare(t[i], 1, PRECISION) > 0 + if tiLT0 || tiGT1 { + t[i] = -1 + } + + t = sortSpecial(t) + + //lint:ignore SA4004 TODO this always returns on the first iteration + return t + } + } + } + + var a = P[0] + var b = P[1] + var c = P[2] + var d = P[3] + + var A = b / a + var B = c / a + var C = d / a + + var Q, R, D, Im float64 + + Q = (3*B - math.Pow(A, 2)) / 9 + R = (9*A*B - 27*C - 2*math.Pow(A, 3)) / 54 + D = math.Pow(Q, 3) + math.Pow(R, 2) + + t := make([]float64, 3) + + if PrecisionCompare(D, 0, PRECISION) >= 0 { + var S = sgn(R+math.Sqrt(D)) * math.Pow(math.Abs(R+math.Sqrt(D)), (1/3.0)) + var T = sgn(R-math.Sqrt(D)) * math.Pow(math.Abs(R-math.Sqrt(D)), (1/3.0)) + + t[0] = -A/3 + (S + T) + t[1] = -A/3 - (S+T)/2 + t[2] = -A/3 - (S+T)/2 + Im = math.Abs(math.Sqrt(3) * (S - T) / 2) + + if PrecisionCompare(Im, 0, PRECISION) != 0 { + t[1] = -1 + t[2] = -1 + } + + } else { + var th = math.Acos(R / math.Sqrt(-math.Pow(Q, 3))) + + t[0] = 2*math.Sqrt(-Q)*math.Cos(th/3) - A/3 + t[1] = 2*math.Sqrt(-Q)*math.Cos((th+2*math.Pi)/3) - A/3 + t[2] = 2*math.Sqrt(-Q)*math.Cos((th+4*math.Pi)/3) - A/3 + Im = 0.0 + } + + for i := 0; i < 3; i++ { + tiLT0 := PrecisionCompare(t[i], 0, PRECISION) < 0 + tiGT1 := PrecisionCompare(t[i], 1, PRECISION) > 0 + if tiLT0 || tiGT1 { + t[i] = -1 + } + } + + t = sortSpecial(t) + + return t +} + +//nolint +func sortSpecial(a []float64) []float64 { + var flip bool + var temp float64 + + for { + flip = false + for i := 0; i < len(a)-1; i++ { + ai1GTEQ0 := PrecisionCompare(a[i+1], 0, PRECISION) >= 0 + aiGTai1 := PrecisionCompare(a[i], a[i+1], PRECISION) > 0 + aiLT0 := PrecisionCompare(a[i], 0, PRECISION) < 0 + if (ai1GTEQ0 && aiGTai1) || (aiLT0 && ai1GTEQ0) { + flip = true + temp = a[i] + a[i] = a[i+1] + a[i+1] = temp + + } + } + if !flip { + break + } + } + return a +} + +//nolint +func sgn(x float64) float64 { + if x < 0.0 { + return -1 + } + return 1 +} + +//nolint +func bezierCoeffs(P0, P1, P2, P3 float64) []float64 { + Z := make([]float64, 4) + Z[0] = -P0 + 3*P1 + -3*P2 + P3 + Z[1] = 3*P0 - 6*P1 + 3*P2 + Z[2] = -3*P0 + 3*P1 + Z[3] = P0 + return Z +} diff --git a/lib/geo/box.go b/lib/geo/box.go new file mode 100644 index 000000000..24ac71c87 --- /dev/null +++ b/lib/geo/box.go @@ -0,0 +1,58 @@ +package geo + +import "fmt" + +type Box struct { + TopLeft *Point + Width float64 + Height float64 +} + +func NewBox(tl *Point, width, height float64) *Box { + return &Box{ + TopLeft: tl, + Width: width, + Height: height, + } +} + +func (b *Box) Copy() *Box { + if b == nil { + return nil + } + return NewBox(b.TopLeft.Copy(), b.Width, b.Height) +} + +func (b *Box) Center() *Point { + return NewPoint(b.TopLeft.X+b.Width/2, b.TopLeft.Y+b.Height/2) +} + +func (b *Box) Intersections(s Segment) []*Point { + pts := []*Point{} + + tl := b.TopLeft + tr := NewPoint(tl.X+b.Width, tl.Y) + br := NewPoint(tr.X, tr.Y+b.Height) + bl := NewPoint(tl.X, br.Y) + + if p := IntersectionPoint(s.Start, s.End, tl, tr); p != nil { + pts = append(pts, p) + } + if p := IntersectionPoint(s.Start, s.End, tr, br); p != nil { + pts = append(pts, p) + } + if p := IntersectionPoint(s.Start, s.End, br, bl); p != nil { + pts = append(pts, p) + } + if p := IntersectionPoint(s.Start, s.End, bl, tl); p != nil { + pts = append(pts, p) + } + return pts +} + +func (b *Box) ToString() string { + if b == nil { + return "" + } + return fmt.Sprintf("{TopLeft: %s, Width: %.0f, Height: %.0f}", b.TopLeft.ToString(), b.Width, b.Height) +} diff --git a/lib/geo/ellipse.go b/lib/geo/ellipse.go new file mode 100644 index 000000000..60b177116 --- /dev/null +++ b/lib/geo/ellipse.go @@ -0,0 +1,114 @@ +package geo + +import ( + "math" + "sort" +) + +type Ellipse struct { + Center *Point + Rx float64 + Ry float64 +} + +func NewEllipse(center *Point, rx, ry float64) *Ellipse { + return &Ellipse{ + Center: center, + Rx: rx, + Ry: ry, + } +} + +func (e Ellipse) Intersections(segment Segment) []*Point { + // we check for intersections between the ellipse and line segment in the following manner: + // 0. we compute ignoring the ellipse's position, as if it were centered at 0,0 for a simpler computation + // 1. translate the line segment variables to match the ellipse's "translation" to 0,0 + // 2. get the (infinite) line equation for the given line segment + // 3. compute the intersections between the line and ellipse + // 4. filter out intersections that are on the line but not on the line segment + // 5. apply the inverse translation to the intersection to get the result relative to where the ellipse and line actually are + intersections := []*Point{} + + // ellipse equation: (x-cx)^2/rx^2 + (y-cy)^2/ry^2 = 1 + // in the form: x^2/a^2 + y^2/b^2 = 1 + a := e.Rx + b := e.Ry + a2 := a * a + b2 := b * b + if a <= 0 || b <= 0 { + return nil + } + + // line for a line segment between (x1,y1) and (x2, y2): (see https://en.wikipedia.org/wiki/Linear_equation#Two-point_form) + // y - y1 = ((y2 - y1)/(x2 - x1))(x - x1) + x1 := segment.Start.X - e.Center.X + y1 := segment.Start.Y - e.Center.Y + x2 := segment.End.X - e.Center.X + y2 := segment.End.Y - e.Center.Y + + // Handle the edge case of a vertical line (avoiding dividing by 0) + if x1 == x2 { + // Ellipse solutions for a given x (from wolfram "(x^2)/(a^2)+(y^2)/(b^2)=1"): + // 1. y = +b*root(a^2 - x^2)/a + intersection1 := NewPoint(x1, +b*math.Sqrt(a2-x1*x1)/a) + // 2. y = -b*root(a^2 - x^2)/a + intersection2 := intersection1.Copy() + intersection2.Y *= -1 + + isPointOnLine := func(p *Point) bool { + ps := []float64{p.Y, y1, y2} + sort.Slice(ps, func(i, j int) bool { + return ps[i] < ps[j] + }) + return ps[1] == p.Y + } + + if isPointOnLine(intersection1) { + intersections = append(intersections, intersection1) + } + // when y = 0, intersection2 will be a duplicate of intersection1 + if intersection2.Y != 0.0 && isPointOnLine(intersection2) { + intersections = append(intersections, intersection2) + } + + for _, p := range intersections { + p.X += e.Center.X + p.Y += e.Center.Y + } + return intersections + } + + // converting line to form: y = mx + c + // from: y - y1 = ((y2-y1)/(x2-x1))(x - x1) + // m = (y2-y1)/(x2-x1), c = y1 - m*x1 + m := (y2 - y1) / (x2 - x1) + c := y1 - m*x1 + isPointOnLine := func(p *Point) bool { + return PrecisionCompare(p.DistanceToLine(NewPoint(x1, y1), NewPoint(x2, y2)), 0, PRECISION) == 0 + } + + // "(x^2)/(a^2)+(y^2)/(b^2) =1, y = mx + c" solutions from wolfram: + // if (a^2)(m^2) + b^2 != 0, and ab != 0 + // 2 solutions 1 with +, 1 with - + // x = ( -c m a^2 {+/-} root(a^2 b^2 (a^2 m^2 + b^2 - c^2)) ) / (a^2 m^2 + b^2) + // y = ( c b^2 {+/-} m root(a^2 b^2 (a^2 m^2 + b^2 - c^2)) ) / (a^2 m^2 + b^2) + denom := a2*m*m + b2 + // Note: we already checked a and b != 0 so denom == 0 is impossible (assuming no imaginary numbers) + root := math.Sqrt(a2 * b2 * (denom - c*c)) + + intersection1 := NewPoint((-m*c*a2+root)/denom, (c*b2+m*root)/denom) + intersection2 := NewPoint((-m*c*a2-root)/denom, (c*b2-m*root)/denom) + + if isPointOnLine(intersection1) { + intersections = append(intersections, intersection1) + } + if !intersection1.Equals(intersection2) && isPointOnLine(intersection2) { + intersections = append(intersections, intersection2) + } + + for _, p := range intersections { + p.X += e.Center.X + p.Y += e.Center.Y + } + return intersections +} diff --git a/lib/geo/ellipse_test.go b/lib/geo/ellipse_test.go new file mode 100644 index 000000000..606af689d --- /dev/null +++ b/lib/geo/ellipse_test.go @@ -0,0 +1,91 @@ +package geo + +import ( + "math" + "testing" +) + +func TestEllipseLineIntersections(t *testing.T) { + e := NewEllipse(NewPoint(0, 0), 11, 11) + + intersections := e.Intersections(Segment{ + Start: NewPoint(0, 20), + End: NewPoint(0, -20), + }) + if len(intersections) != 2 || + !intersections[0].Equals(NewPoint(0, 11)) || + !intersections[1].Equals(NewPoint(0, -11)) { + t.Fatalf("vertical intersection check failed [%v,%v]", intersections[0].ToString(), intersections[1].ToString()) + } + + intersections = e.Intersections(Segment{ + Start: NewPoint(0, 2), + End: NewPoint(0, -2), + }) + if len(intersections) != 0 { + t.Fatalf("(vertical) line intersects but segment shouldn't") + } + + intersections = e.Intersections(Segment{ + Start: NewPoint(2, 2), + End: NewPoint(5, 5), + }) + if len(intersections) != 0 { + t.Fatalf("line intersects but segment shouldn't") + } + + intersections = e.Intersections(Segment{ + Start: NewPoint(2, 2), + End: NewPoint(50, 50), + }) + x := math.Sqrt2 / 2 * 11 + expected := NewPoint(x, x) + if len(intersections) != 1 || !intersections[0].Equals(expected) { + t.Fatalf("intersection check failed with %v expected %v", intersections[0].ToString(), expected.ToString()) + } + + // test with cx,cy offset + e = NewEllipse(NewPoint(100, 200), 21, 21) + intersections = e.Intersections(Segment{ + Start: NewPoint(0, 0), + End: NewPoint(100, 150), + }) + if len(intersections) != 0 { + t.Fatalf("shouldn't intersect with offset") + } + intersections = e.Intersections(Segment{ + Start: NewPoint(50, 150), + End: NewPoint(200, 250), + }) + if len(intersections) != 2 { + t.Fatalf("should intersect with offset") + } + + // tangent + intersections = e.Intersections(Segment{ + Start: NewPoint(0, 221), + End: NewPoint(200, 221), + }) + if len(intersections) != 1 { + t.Fatalf("should intersect horizontal tangent") + } + intersections = e.Intersections(Segment{ + Start: NewPoint(121, 100), + End: NewPoint(121, 300), + }) + if len(intersections) != 1 { + t.Fatalf("should intersect vertical tangent") + } + intersections = NewEllipse( + NewPoint(1, 1), + 2/math.Sqrt2, + 2/math.Sqrt2, + ).Intersections(Segment{ + Start: NewPoint(1, 3), + End: NewPoint(3, 1), + }) + if len(intersections) == 0 { + // Note: due to floating point accuracy, there are two intersections instead of one + t.Fatalf("should intersect tangent") + } +} diff --git a/lib/geo/math.go b/lib/geo/math.go new file mode 100644 index 000000000..488ad2354 --- /dev/null +++ b/lib/geo/math.go @@ -0,0 +1,41 @@ +package geo + +import "math" + +func EuclideanDistance(x1, y1, x2, y2 float64) float64 { + if x1 == x2 { + return math.Abs(y1 - y2) + } else if y1 == y2 { + return math.Abs(x1 - x2) + } else { + return math.Sqrt((x1-x2)*(x1-x2) + (y1-y2)*(y1-y2)) + } +} + +// compare a and b and consider them equal if +// difference is less than precision e (e.g. e=0.001) +func PrecisionCompare(a, b, e float64) int { + if math.Abs(a-b) < e { + return 0 + } + if a < b { + return -1 + } + return 1 +} + +// TruncateDecimals truncates floats to keep up to 3 digits after decimal, to avoid issues with floats on different machines. +// Since we're not launching rockets, 3 decimals is enough precision for what we're doing +func TruncateDecimals(v float64) float64 { + return float64(int(v*1000)) / 1000 +} + +func Sign(i float64) int { + if i < 0 { + return -1 + } + if i > 0 { + return 1 + } + return 0 +} diff --git a/lib/geo/orientation.go b/lib/geo/orientation.go new file mode 100644 index 000000000..a6bc9bfd7 --- /dev/null +++ b/lib/geo/orientation.go @@ -0,0 +1,104 @@ +package geo + +type Orientation int + +const ( + TopLeft Orientation = iota + TopRight + BottomLeft + BottomRight + + Top + Right + Bottom + Left + + NONE +) + +func (o Orientation) ToString() string { + switch o { + case TopLeft: + return "TopLeft" + case TopRight: + return "TopRight" + case BottomLeft: + return "BottomLeft" + case BottomRight: + return "BottomRight" + + case Top: + return "Top" + case Right: + return "Right" + case Bottom: + return "Bottom" + case Left: + return "Left" + default: + return "" + } +} + +func (o1 Orientation) SameSide(o2 Orientation) bool { + sides := [][]Orientation{ + {TopLeft, Top, TopRight}, + {BottomLeft, Bottom, BottomRight}, + {Left, TopLeft, BottomLeft}, + {Right, TopRight, BottomRight}, + } + for _, sameSides := range sides { + isO1 := false + for _, side := range sameSides { + if side == o1 { + isO1 = true + break + } + } + if isO1 { + for _, side := range sameSides { + if side == o2 { + return true + } + } + } + } + return false +} + +func (o Orientation) IsDiagonal() bool { + return o == TopLeft || o == TopRight || o == BottomLeft || o == BottomRight +} + +func (o Orientation) IsHorizontal() bool { + return o == Left || o == Right +} + +func (o Orientation) IsVertical() bool { + return o == Top || o == Bottom +} + +func (o Orientation) GetOpposite() Orientation { + switch o { + case TopLeft: + return BottomRight + case TopRight: + return BottomLeft + case BottomLeft: + return TopRight + case BottomRight: + return TopLeft + + case Top: + return Bottom + case Bottom: + return Top + case Right: + return Left + case Left: + return Right + + default: + return o + } +} diff --git a/lib/geo/point.go b/lib/geo/point.go new file mode 100644 index 000000000..13275db79 --- /dev/null +++ b/lib/geo/point.go @@ -0,0 +1,275 @@ +package geo + +import ( + "fmt" + "math" + "sort" + "strings" +) + +//nolint:forbidigo + +type RelativePoint struct { + XPercentage float64 + YPercentage float64 +} + +func NewRelativePoint(xPercentage, yPercentage float64) *RelativePoint { + // 3 decimal points of precision is enough. Floating points on Bezier curves can reach the level of precision where different machines round differently. + return &RelativePoint{ + XPercentage: TruncateDecimals(xPercentage), + YPercentage: TruncateDecimals(yPercentage), + } +} + +type Point struct { + X float64 `json:"x"` + Y float64 `json:"y"` +} + +func NewPoint(x, y float64) *Point { + return &Point{X: x, Y: y} +} + +func (p1 *Point) Equals(p2 *Point) bool { + if p1 == nil { + return p2 == nil + } else if p2 == nil { + return false + } + return (p1.X == p2.X) && (p1.Y == p2.Y) +} + +func (p1 *Point) Compare(p2 *Point) int { + xCompare := Sign(p1.X - p2.X) + if xCompare == 0 { + return Sign(p1.Y - p2.Y) + } + return xCompare +} + +func (p *Point) Copy() *Point { + return &Point{X: p.X, Y: p.Y} +} + +type Points []*Point + +func (ps Points) Equals(other Points) bool { + if ps == nil { + return other == nil + } else if other == nil { + return false + } + pointsSet := make(map[Point]struct{}) + for _, p := range ps { + pointsSet[*p] = struct{}{} + } + + for _, otherPoint := range other { + if _, exists := pointsSet[*otherPoint]; !exists { + return false + } + } + return true +} + +func (ps Points) GetMedian() *Point { + xs := make([]float64, 0) + ys := make([]float64, 0) + + for _, p := range ps { + xs = append(xs, p.X) + ys = append(ys, p.Y) + } + + sort.Float64s(xs) + sort.Float64s(ys) + + middleIndex := len(xs) / 2 + + medianX := xs[middleIndex] + medianY := ys[middleIndex] + + if len(xs)%2 == 0 { + medianX += xs[middleIndex-1] + medianX /= 2 + medianY += ys[middleIndex-1] + medianY /= 2 + } + + return &Point{X: medianX, Y: medianY} +} + +// GetOrientation gets orientation of pFrom to pTo +// E.g. pFrom ---> pTo, here, pFrom is to the left of pTo, so Left would be returned +func (pFrom *Point) GetOrientation(pTo *Point) Orientation { + if pFrom.Y < pTo.Y { + if pFrom.X < pTo.X { + return TopLeft + } + if pFrom.X > pTo.X { + return TopRight + } + return Top + } + + if pFrom.Y > pTo.Y { + if pFrom.X < pTo.X { + return BottomLeft + } + if pFrom.X > pTo.X { + return BottomRight + } + return Bottom + } + + if pFrom.X < pTo.X { + return Left + } + + if pFrom.X > pTo.X { + return Right + } + + return NONE +} + +func (p *Point) ToString() string { + if p == nil { + return "" + } + return fmt.Sprintf("(%v, %v)", p.X, p.Y) +} + +func (points Points) ToString() string { + strs := make([]string, 0, len(points)) + for _, p := range points { + strs = append(strs, p.ToString()) + } + return strings.Join(strs, ", ") +} + +// https://stackoverflow.com/questions/849211/shortest-distance-between-a-point-and-a-line-segment +func (p *Point) DistanceToLine(p1, p2 *Point) float64 { + a := p.X - p1.X + b := p.Y - p1.Y + c := p2.X - p1.X + d := p2.Y - p1.Y + + dot := (a * c) + (b * d) + len_sq := (c * c) + (d * d) + + param := -1.0 + + if len_sq != 0 { + param = dot / len_sq + } + + var xx float64 + var yy float64 + + if param < 0.0 { + xx = p1.X + yy = p1.Y + } else if param > 1.0 { + xx = p2.X + yy = p2.Y + } else { + xx = p1.X + (param * c) + yy = p1.Y + (param * d) + } + + dx := p.X - xx + dy := p.Y - yy + + return math.Sqrt((dx * dx) + (dy * dy)) +} + +// Moves the given point by Vector +func (start *Point) AddVector(v Vector) *Point { + return start.toVector().Add(v).ToPoint() +} + +// Creates a Vector of the size between start and endpoint, pointing to endpoint +func (start *Point) VectorTo(endpoint *Point) Vector { + return endpoint.toVector().Minus(start.toVector()) +} + +func (p *Point) FormattedCoordinates() string { + return fmt.Sprintf("%d,%d", int(p.X), int(p.Y)) +} + +func (q *Point) OnSegment(p, r *Point) bool { + return (q.X <= math.Max(p.X, r.X)) && (q.X >= math.Min(p.X, r.X)) && + (q.Y <= math.Max(p.Y, r.Y)) && (q.Y >= math.Min(p.Y, r.Y)) +} + +// Creates a Vector pointing to point +func (endpoint *Point) toVector() Vector { + return []float64{endpoint.X, endpoint.Y} +} + +// get the point of intersection between line segments u and v (or nil if they do not intersect) +func IntersectionPoint(u0, u1, v0, v1 *Point) *Point { + // https://en.wikipedia.org/wiki/Intersection_(Euclidean_geometry) + // + // Example ('-' = 1, '|' = 1): + // v0 + // | + //u0 -+--- u1 + // | + // | + // v1 + // + // s = 0.2 (1/5 along u) + // t = 0.25 (1/4 along v) + // we compute s and t and if they are both in range [0,1], then + // they intersect and we compute the point of intersection to return + + // when s = 0, x = u.Start.X; when s = 1, x = u.End.X + // x = s * u1.X + (1 - s) * u0.X + // = u0.X + s * (u1.X - u0.X) + + // x = u0.X + s * (u1.X - u0.X) + // = v0.X + t * (v1.X - v0.X) + // y = u0.Y + s * (u1.Y - u0.Y) + // = v0.Y + t * (v1.Y - v0.Y) + + // s * (u1.X - u0.X) - t * (v1.X - v0.X) = v0.X - u0.X + // s*udx - t*vdx = uvdx + // s*udy - t*vdy = uvdy + udx := u1.X - u0.X + vdx := v1.X - v0.X + uvdx := v0.X - u0.X + udy := u1.Y - u0.Y + vdy := v1.Y - v0.Y + uvdy := v0.Y - u0.Y + + denom := (udy*vdx - udx*vdy) + if denom == 0 { + // lines are parallel + return nil + } + // Cramer's rule + s := (vdx*uvdy - vdy*uvdx) / denom + t := (udx*uvdy - udy*uvdx) / denom + + // lines don't intersect within segments + if s < 0 || s > 1 || t < 0 || t > 1 { + // if s or t is outside [0, 1], the intersection of the lines are not on the segments + return nil + } + + // use s parameter to get point along u + intersection := new(Point) + intersection.X = u0.X + math.Round(s*udx) + intersection.Y = u0.Y + math.Round(s*udy) + return intersection +} + +func (p *Point) Transpose() { + if p == nil { + return + } + p.X, p.Y = p.Y, p.X +} diff --git a/lib/geo/point_test.go b/lib/geo/point_test.go new file mode 100644 index 000000000..259975897 --- /dev/null +++ b/lib/geo/point_test.go @@ -0,0 +1,57 @@ +package geo + +import ( + "testing" +) + +func TestPointDistanceTo(t *testing.T) { + p1 := &Point{0, 0} + p2 := &Point{100, 0} + + p := &Point{50, 70} + + d := p.DistanceToLine(p1, p2) + + if d != 70.0 { + t.Fatalf("Expected 70.0 and got %v", d) + } +} + +func TestAddVector(t *testing.T) { + start := &Point{1.5, 5.3} + c := NewVector(-3.5, -2.3) + p2 := start.AddVector(c) + + if p2.X != -2 || p2.Y != 3 { + t.Fatalf("Expected resulting point to be (-2, 3), got %+v", p2) + } +} + +func TestToVector(t *testing.T) { + p := &Point{3.5, 6.7} + v := p.toVector() + + if v[0] != p.X || v[1] != p.Y { + t.Fatalf("Expected Vector (%v) coordinates to match the point (%v)", p, v) + } + + if len(v) != 2 { + t.Fatal("Expected the Vector to have 2 components") + } +} + +func TestVectorTo(t *testing.T) { + p1 := &Point{1.5, 5.3} + p2 := &Point{-2, 3} + c := p1.VectorTo(p2) + if !c.equals(NewVector(-3.5, -2.3)) { + t.Fatalf("Expected Vector to be (-3.5, -2.3), got %v", c) + } + + p1 = &Point{1.5, 5.3} + p2 = &Point{-2, 3} + c = p2.VectorTo(p1) + if !c.equals(NewVector(3.5, 2.3)) { + t.Fatalf("Expected Vector to be (3.5, 2.3), got %v", c) + } +} diff --git a/lib/geo/route.go b/lib/geo/route.go new file mode 100644 index 000000000..eb1cd1fcb --- /dev/null +++ b/lib/geo/route.go @@ -0,0 +1,62 @@ +package geo + +import ( + "math" +) + +type Route []*Point + +func (route Route) Length() float64 { + l := 0. + for i := 0; i < len(route)-1; i++ { + l += EuclideanDistance( + route[i].X, route[i].Y, + route[i+1].X, route[i+1].Y, + ) + } + return l +} + +// return the point at _distance_ along the route, and the index of the segment it's on +func (route Route) GetPointAtDistance(distance float64) (*Point, int) { + remaining := distance + for i := 0; i < len(route)-1; i++ { + curr, next := route[i], route[i+1] + length := EuclideanDistance(curr.X, curr.Y, next.X, next.Y) + + if remaining <= length { + t := remaining / length + // point t% of the way between curr and next + return NewPoint( + curr.X*(1.0-t)+next.X*t, + curr.Y*(1.0-t)+next.Y*t, + ), i + } + remaining -= length + } + + return nil, -1 +} + +func (route Route) GetBoundingBox() (tl, br *Point) { + minX := math.Inf(1) + minY := math.Inf(1) + maxX := math.Inf(-1) + maxY := math.Inf(-1) + + for _, p := range route { + if p.X < minX { + minX = p.X + } + if p.X > maxX { + maxX = p.X + } + if p.Y < minY { + minY = p.Y + } + if p.Y > maxY { + maxY = p.Y + } + } + return NewPoint(minX, minY), NewPoint(maxX, maxY) +} diff --git a/lib/geo/segment.go b/lib/geo/segment.go new file mode 100644 index 000000000..473cb12e8 --- /dev/null +++ b/lib/geo/segment.go @@ -0,0 +1,116 @@ +package geo + +import ( + "fmt" + "math" +) + +type Intersectable interface { + Intersections(segment Segment) []*Point +} + +type Segment struct { + Start *Point + End *Point +} + +func NewSegment(from, to *Point) *Segment { + return &Segment{from, to} +} + +func (s Segment) Overlaps(otherS Segment, isHorizontal bool, buffer float64) bool { + if isHorizontal { + if s.Start.Y-otherS.End.Y >= buffer { + return false + } + if otherS.Start.Y-s.End.Y >= buffer { + return false + } + return true + } else { + if s.Start.X-otherS.End.X >= buffer { + return false + } + if otherS.Start.X-s.End.X >= buffer { + return false + } + return true + } +} + +//nolint:unused +func (s Segment) ToString() string { + return fmt.Sprintf("%v -> %v", s.Start.ToString(), s.End.ToString()) +} + +func (segment Segment) Intersections(otherSegment Segment) []*Point { + point := IntersectionPoint(segment.Start, segment.End, otherSegment.Start, otherSegment.End) + if point == nil { + return nil + } + return []*Point{point} +} + +// getBounds takes a segment and returns the floor and ceil of where it can shift to +// If there is no floor or ceiling, negative or positive infinity is used, respectively +// The direction is inferred, e.g. b/c the passed in segment is vertical, it's inferred we want horizontal bounds +// buffer says how close the segment can be, on both axes, to other segments given +// │ │ +// │ │ +// │ │ +// │ │ +// │ non-overlap +// │ +// │ +// │ +// │ segment +// │ │ +// │ │ ceil +// │ │ │ +// │ │ +// floor │ │ +// │ +// │ +// │ +// │ +// NOTE: the assumption is that all segments given are orthogonal +func (segment *Segment) GetBounds(segments []*Segment, buffer float64) (float64, float64) { + ceil := math.Inf(1) + floor := math.Inf(-1) + if segment.Start.X == segment.End.X && segment.Start.Y == segment.End.Y { + // single point, no segment + return floor, ceil + } + isHorizontal := segment.Start.X == segment.End.X + for _, otherSegment := range segments { + if isHorizontal { + // Exclude segments that don't overlap (non-overlap in above diagram) + if otherSegment.End.Y < segment.Start.Y-buffer { + continue + } + if otherSegment.Start.Y > segment.End.Y+buffer { + continue + } + if otherSegment.Start.X <= segment.Start.X { + floor = math.Max(floor, otherSegment.Start.X) + } + if otherSegment.Start.X > segment.Start.X { + ceil = math.Min(ceil, otherSegment.Start.X) + } + } else { + if otherSegment.End.X < segment.Start.X-buffer { + continue + } + if otherSegment.Start.X > segment.End.X+buffer { + continue + } + if otherSegment.Start.Y <= segment.Start.Y { + floor = math.Max(floor, otherSegment.Start.Y) + } + if otherSegment.Start.Y > segment.Start.Y { + ceil = math.Min(ceil, otherSegment.Start.Y) + } + } + } + return floor, ceil +} diff --git a/lib/geo/segment_test.go b/lib/geo/segment_test.go new file mode 100644 index 000000000..979ea329d --- /dev/null +++ b/lib/geo/segment_test.go @@ -0,0 +1,33 @@ +package geo + +import ( + "testing" + + "github.com/stretchr/testify/assert" +) + +func TestSegmentIntersections(t *testing.T) { + // mid intersection + s1 := NewSegment(NewPoint(0, 0), NewPoint(10, 10)) + s2 := NewSegment(NewPoint(0, 10), NewPoint(10, 0)) + intersections := s1.Intersections(*s2) + assert.Equal(t, len(intersections), 1) + assert.True(t, intersections[0].Equals(NewPoint(5, 5))) + + // intersection at the end + s3 := NewSegment(NewPoint(10, 10), NewPoint(10, 0)) + intersections = s1.Intersections(*s3) + assert.Equal(t, len(intersections), 1) + assert.True(t, intersections[0].Equals(NewPoint(10, 10))) + + // intersection at the beginnig + s4 := NewSegment(NewPoint(0, 0), NewPoint(0, 10)) + intersections = s1.Intersections(*s4) + assert.Equal(t, len(intersections), 1) + assert.True(t, intersections[0].Equals(NewPoint(0, 0))) + + // no intersection + s5 := NewSegment(NewPoint(3, 8), NewPoint(2, 15)) + intersections = s1.Intersections(*s5) + assert.Equal(t, len(intersections), 0) +} diff --git a/lib/geo/vector.go b/lib/geo/vector.go new file mode 100644 index 000000000..199fe73db --- /dev/null +++ b/lib/geo/vector.go @@ -0,0 +1,78 @@ +package geo + +import ( + "math" +) + +// A N-Dimensional Vector with components (x, y, z, ...) based on the origin +type Vector []float64 + +// New Vector from components +func NewVector(components ...float64) Vector { + return components +} + +// New Vector of length and pointing in the direction of angle +func NewVectorFromProperties(length float64, angleInRadians float64) Vector { + return NewVector( + length*math.Sin(angleInRadians), + length*math.Cos(angleInRadians), + ) +} + +// Creates a Vector by extending the length of the current one by length +func (a Vector) AddLength(length float64) Vector { + return a.Unit().Multiply(a.Length() + length) +} + +func (a Vector) Add(b Vector) Vector { + c := []float64{} + for i := 0; i < len(a); i++ { + c = append(c, a[i]+b[i]) + } + return c +} + +func (a Vector) Minus(b Vector) Vector { + c := []float64{} + for i := 0; i < len(a); i++ { + c = append(c, a[i]-b[i]) + } + return c +} + +func (a Vector) Multiply(v float64) Vector { + c := []float64{} + for i := 0; i < len(a); i++ { + c = append(c, a[i]*v) + } + return c +} + +func (a Vector) Length() float64 { + sum := 0.0 + for _, comp := range a { + sum += comp * comp + } + return math.Sqrt(sum) +} + +// Creates an unit Vector pointing in the same direction of this Vector +func (a Vector) Unit() Vector { + return a.Multiply(1 / a.Length()) +} + +func (a Vector) ToPoint() *Point { + return &Point{a[0], a[1]} +} + +// return the line (x1,y1) -> (x2,y2) rotated 90% counter-clockwise (left) +func getNormalVector(x1, y1, x2, y2 float64) (float64, float64) { + return y1 - y2, x2 - x1 +} + +func GetUnitNormalVector(x1, y1, x2, y2 float64) (float64, float64) { + normalX, normalY := getNormalVector(x1, y1, x2, y2) + length := EuclideanDistance(x1, y1, x2, y2) + return normalX / length, normalY / length +} diff --git a/lib/geo/vector_test.go b/lib/geo/vector_test.go new file mode 100644 index 000000000..354fccc93 --- /dev/null +++ b/lib/geo/vector_test.go @@ -0,0 +1,156 @@ +package geo + +import ( + "math" + "testing" + + "github.com/stretchr/testify/assert" +) + +func TestExtendVerticalLineSegments(t *testing.T) { + p1 := &Point{0, 0} + p2 := &Point{0, 1} + + v := p1.VectorTo(p2) + v = v.Multiply(2) + p2New := p1.AddVector(v) + expected := Point{0, 2} + assert.Equal(t, expected, *p2New) + + v = p2.VectorTo(p1) + v = v.Multiply(2) + p1New := p2.AddVector(v) + expected = Point{0, -1} + assert.Equal(t, expected, *p1New) +} + +func TestExtendHorizontalLineSegment(t *testing.T) { + p1 := &Point{0, 0} + p2 := &Point{1, 0} + + v := p1.VectorTo(p2) + v = v.Multiply(1.5) + p2New := p1.AddVector(v) + expected := Point{1.5, 0} + assert.Equal(t, expected, *p2New) + + v = p2.VectorTo(p1) + v = v.Multiply(1.5) + p1New := p2.AddVector(v) + expected = Point{-0.5, 0} + assert.Equal(t, expected, *p1New) +} + +func TestExtendDiagonalLineSegment(t *testing.T) { + p1 := &Point{0, 0} + p2 := &Point{3, 1} + + v := p1.VectorTo(p2) + v = v.Multiply(2) + p2New := p1.AddVector(v) + expected := Point{6, 2} + assert.Equal(t, expected, *p2New) + + v = p2.VectorTo(p1) + v = v.Multiply(2) + p1New := p2.AddVector(v) + expected = Point{-3, -1} + assert.Equal(t, expected, *p1New) +} + +func TestVectorAdd(t *testing.T) { + a := NewVector(1, 2) + b := NewVector(3, 4) + + c := a.Add(b) + + assert.Truef(t, c.equals(NewVector(4, 6)), "Expected Vector %v to be (4, 6)", c) +} + +func TestVectorMinus(t *testing.T) { + a := NewVector(1, 2) + b := NewVector(3, 4) + + c := a.Minus(b) + + assert.Truef(t, c.equals(NewVector(-2, -2)), "Expected Vector %v to be (-2, -2)", c) +} + +func TestVectorMultiply(t *testing.T) { + a := NewVector(1, 2) + + c := a.Multiply(3) + + assert.Truef(t, c.equals(NewVector(3, 6)), "Expected Vector %v to be (3, 6)", c) +} + +func TestVectorLength(t *testing.T) { + a := NewVector(3, 4) + + assert.Equal(t, 5.0, a.Length()) +} + +func TestNewVectorFromProperties(t *testing.T) { + a := NewVectorFromProperties(3, math.Pi/3) // 60 degrees + if !a.equals(NewVector(2.59807621135, 1.5)) { + t.Errorf("expected Vector to be close to (2.59807, 1.5), got %v", a) + } + + b := NewVectorFromProperties(3, -math.Pi/3) // -60 degrees + if !b.equals(NewVector(-2.59807621135, 1.5)) { + t.Errorf("expected Vector to be close to (-2.59807, 1.5), got %v", b) + } + + c := NewVectorFromProperties(3, math.Pi*2/3) // 120 degrees + if !c.equals(NewVector(2.59807621135, -1.5)) { + t.Errorf("expected Vector to be close to (2.59807, -1.5), got %v", c) + } + + d := NewVectorFromProperties(3, -math.Pi*2/3) // -120 degrees + if !d.equals(NewVector(-2.59807621135, -1.5)) { + t.Errorf("expected Vector to be close to (-2.59807, -1.5), got %v", c) + } +} + +func TestVectorUnit(t *testing.T) { + a := NewVector(3, 4).Unit() + expected := NewVector(3.0/5, 4.0/5) + assert.Truef(t, a.equals(expected), "Expected (%f, %f) Vector, got %v", 3/5.0, 4/5.0, a) +} + +func TestVectorAddLength(t *testing.T) { + a := NewVector(3, 4) + b := a.AddLength(8) + + if PrecisionCompare(b.Length(), 13.0, PRECISION) != 0 { + t.Fatalf("Expected new Vector to have length 13, got %v", b.Length()) + } +} + +func TestVectorEquals(t *testing.T) { + a := NewVector(1, 2) + assert.True(t, a.equals(a), "Expected Vector to be equal to itself") + assert.True(t, a.equals(NewVector(1.0, 2.0)), "Expected Vector to be equal to different Vector with same components") + assert.False(t, a.equals(NewVector(1, 2, 3)), "Expected Vector to be different if different component count") + assert.False(t, a.equals(NewVector(2, 2)), "Expected Vector to be different if components are different") +} + +func TestVectorToPoint(t *testing.T) { + v := NewVector(3.789, -0.731) + p := v.ToPoint() + + assert.Equal(t, v[0], p.X) + assert.Equal(t, v[1], p.Y) +} + +func (a Vector) equals(other Vector) bool { + if len(a) != len(other) { + return false + } + for i := 0; i < len(a); i++ { + if PrecisionCompare(a[i], other[i], PRECISION) != 0 { + return false + } + } + return true +} diff --git a/lib/go2/go2.go b/lib/go2/go2.go new file mode 100644 index 000000000..20482efa2 --- /dev/null +++ b/lib/go2/go2.go @@ -0,0 +1,60 @@ +// Package go2 contains general utility helpers that should've been in Go. Maybe they'll be in Go 2.0. +package go2 + +import ( + "hash/fnv" + "math" + + "golang.org/x/exp/constraints" +) + +func Pointer[T any](v T) *T { + return &v +} + +func Min[T constraints.Ordered](a, b T) T { + if a < b { + return a + } + return b +} + +func Max[T constraints.Ordered](a, b T) T { + if a > b { + return a + } + return b +} + +func StringToIntHash(s string) int { + h := fnv.New32a() + h.Write([]byte(s)) + return int(h.Sum32()) +} + +func Contains[T comparable](els []T, el T) bool { + for _, el2 := range els { + if el2 == el { + return true + } + } + return false +} + +func Filter[T any](els []T, fn func(T) bool) []T { + out := []T{} + for _, el := range els { + if fn(el) { + out = append(out, el) + } + } + return out +} + +func IntMax(x, y int) int { + return int(math.Max(float64(x), float64(y))) +} + +func IntMin(x, y int) int { + return int(math.Min(float64(x), float64(y))) +} diff --git a/lib/label/label.go b/lib/label/label.go new file mode 100644 index 000000000..731b381b8 --- /dev/null +++ b/lib/label/label.go @@ -0,0 +1,321 @@ +package label + +import ( + "math" + + "oss.terrastruct.com/d2/lib/geo" +) + +// These are % locations where labels will be placed along the connection +const LEFT_LABEL_POSITION = 1.0 / 4.0 +const CENTER_LABEL_POSITION = 2.0 / 4.0 +const RIGHT_LABEL_POSITION = 3.0 / 4.0 + +// This is the space between a node border and its outside label +const PADDING = 5 + +type Position string + +const ( + OutsideTopLeft Position = "OUTSIDE_TOP_LEFT" + OutsideTopCenter Position = "OUTSIDE_TOP_CENTER" + OutsideTopRight Position = "OUTSIDE_TOP_RIGHT" + + OutsideLeftTop Position = "OUTSIDE_LEFT_TOP" + OutsideLeftMiddle Position = "OUTSIDE_LEFT_MIDDLE" + OutsideLeftBottom Position = "OUTSIDE_LEFT_BOTTOM" + + OutsideRightTop Position = "OUTSIDE_RIGHT_TOP" + OutsideRightMiddle Position = "OUTSIDE_RIGHT_MIDDLE" + OutsideRightBottom Position = "OUTSIDE_RIGHT_BOTTOM" + + OutsideBottomLeft Position = "OUTSIDE_BOTTOM_LEFT" + OutsideBottomCenter Position = "OUTSIDE_BOTTOM_CENTER" + OutsideBottomRight Position = "OUTSIDE_BOTTOM_RIGHT" + + InsideTopLeft Position = "INSIDE_TOP_LEFT" + InsideTopCenter Position = "INSIDE_TOP_CENTER" + InsideTopRight Position = "INSIDE_TOP_RIGHT" + + InsideMiddleLeft Position = "INSIDE_MIDDLE_LEFT" + InsideMiddleCenter Position = "INSIDE_MIDDLE_CENTER" + InsideMiddleRight Position = "INSIDE_MIDDLE_RIGHT" + + InsideBottomLeft Position = "INSIDE_BOTTOM_LEFT" + InsideBottomCenter Position = "INSIDE_BOTTOM_CENTER" + InsideBottomRight Position = "INSIDE_BOTTOM_RIGHT" + + UnlockedTop Position = "UNLOCKED_TOP" + UnlockedMiddle Position = "UNLOCKED_MIDDLE" + UnlockedBottom Position = "UNLOCKED_BOTTOM" +) + +func (position Position) IsOutside() bool { + switch position { + case OutsideTopLeft, OutsideTopCenter, OutsideTopRight, + OutsideBottomLeft, OutsideBottomCenter, OutsideBottomRight, + OutsideLeftTop, OutsideLeftMiddle, OutsideLeftBottom, + OutsideRightTop, OutsideRightMiddle, OutsideRightBottom: + return true + default: + return false + } +} + +func (position Position) IsUnlocked() bool { + switch position { + case UnlockedTop, UnlockedMiddle, UnlockedBottom: + return true + default: + return false + } +} + +func (position Position) IsOnEdge() bool { + switch position { + case InsideMiddleLeft, InsideMiddleCenter, InsideMiddleRight, UnlockedMiddle: + return true + default: + return false + } +} + +func (position Position) Mirrored() Position { + switch position { + case OutsideTopLeft: + return OutsideBottomRight + case OutsideTopCenter: + return OutsideBottomCenter + case OutsideTopRight: + return OutsideBottomLeft + + case OutsideLeftTop: + return OutsideRightBottom + case OutsideLeftMiddle: + return OutsideRightMiddle + case OutsideLeftBottom: + return OutsideRightTop + + case OutsideRightTop: + return OutsideLeftBottom + case OutsideRightMiddle: + return OutsideLeftMiddle + case OutsideRightBottom: + return OutsideLeftTop + + case OutsideBottomLeft: + return OutsideTopRight + case OutsideBottomCenter: + return OutsideTopCenter + case OutsideBottomRight: + return OutsideTopLeft + + case InsideTopLeft: + return InsideBottomRight + case InsideTopCenter: + return InsideBottomCenter + case InsideTopRight: + return InsideBottomLeft + + case InsideMiddleLeft: + return InsideMiddleRight + case InsideMiddleCenter: + return InsideMiddleCenter + case InsideMiddleRight: + return InsideMiddleLeft + + case InsideBottomLeft: + return InsideTopRight + case InsideBottomCenter: + return InsideTopCenter + case InsideBottomRight: + return InsideTopLeft + + case UnlockedTop: + return UnlockedBottom + case UnlockedBottom: + return UnlockedTop + case UnlockedMiddle: + return UnlockedMiddle + + default: + return "" + } +} + +func (labelPosition Position) GetPointOnBox(box *geo.Box, padding, width, height float64) *geo.Point { + p := box.TopLeft.Copy() + boxCenter := box.Center() + + switch labelPosition { + case OutsideTopLeft: + p.X -= padding + p.Y -= padding + height + case OutsideTopCenter: + p.X = boxCenter.X - width/2 + p.Y -= padding + height + case OutsideTopRight: + p.X += box.Width - width - padding + p.Y -= padding + height + + case OutsideLeftTop: + p.X -= padding + width + p.Y += padding + case OutsideLeftMiddle: + p.X -= padding + width + p.Y = boxCenter.Y - height/2 + case OutsideLeftBottom: + p.X -= padding + width + p.Y += box.Height - height - padding + + case OutsideRightTop: + p.X += box.Width + padding + p.Y += padding + case OutsideRightMiddle: + p.X += box.Width + padding + p.Y = boxCenter.Y - height/2 + case OutsideRightBottom: + p.X += box.Width + padding + p.Y += box.Height - height - padding + + case OutsideBottomLeft: + p.X += padding + p.Y += box.Height + padding + case OutsideBottomCenter: + p.X = boxCenter.X - width/2 + p.Y += box.Height + padding + case OutsideBottomRight: + p.X += box.Width - width - padding + p.Y += box.Height + padding + + case InsideTopLeft: + p.X += padding + p.Y += padding + case InsideTopCenter: + p.X = boxCenter.X - width/2 + p.Y += padding + case InsideTopRight: + p.X += box.Width - width - padding + p.Y += padding + + case InsideMiddleLeft: + p.X += padding + p.Y = boxCenter.Y - height/2 + case InsideMiddleCenter: + p.X = boxCenter.X - width/2 + p.Y = boxCenter.Y - height/2 + case InsideMiddleRight: + p.X += box.Width - width - padding + p.Y = boxCenter.Y - height/2 + + case InsideBottomLeft: + p.X += padding + p.Y += box.Height - height - padding + case InsideBottomCenter: + p.X = boxCenter.X - width/2 + p.Y += box.Height - height - padding + case InsideBottomRight: + p.X += box.Width - width - padding + p.Y += box.Height - height - padding + } + + return p +} + +// return the top left point of a width x height label at the given label position on the route +func (labelPosition Position) GetPointOnRoute(route geo.Route, strokeWidth, labelPercentage, width, height float64) *geo.Point { + totalLength := route.Length() + leftPosition := LEFT_LABEL_POSITION * totalLength + centerPosition := CENTER_LABEL_POSITION * totalLength + rightPosition := RIGHT_LABEL_POSITION * totalLength + unlockedPosition := labelPercentage * totalLength + + // outside labels have to be offset in the direction of the edge's normal Vector + // Note: we flip the normal for Top labels but keep it as is for Bottom labels since positive Y is below in SVG + getOffsetLabelPosition := func(basePoint, normStart, normEnd *geo.Point, flip bool) *geo.Point { + // get the normal as a unit Vector so we can multiply to project in its direction + normalX, normalY := geo.GetUnitNormalVector( + normStart.X, + normStart.Y, + normEnd.X, + normEnd.Y, + ) + if flip { + normalX *= -1 + normalY *= -1 + } + + // Horizontal Edge with Outside Label | Vertical Edge with Outside Label + // ┌────────────────────┐ ┬ | ┌─┬─┐ + // │ │ │ | │ │ │ ┌───────────┬───────────┐ + // │ │ │ | │ e │ │ │ │ + // ├────label─center────┤ ┬ ┼label height | │ d │ │ label │ + // │ │ │ │ | │ g │ │ center │ + // │ │ │ │ | │ e │ │ │ │ + // └────────────────────┘ │ ┴ ┬ | │ │ │ └───────────┴───────────┘ + // │ │ | └─┴─┘ offset + // offset│ │label padding | ├──────────────────┤ + // │ │ | + // ┌──────────────────────┐ │ ┬ ┴ | ├───────────┼───────────┤ + // │ │ │ │ | ├────┤ label width + // ├─────edge─center──────┤ ┴ ┼stroke width | label padding + // │ │ │ | ├─┼─┤ + // └──────────────────────┘ ┴ | stroke width + // + // TODO: get actual edge stroke width on edge + offsetX := strokeWidth/2 + float64(PADDING) + width/2 + offsetY := strokeWidth/2 + float64(PADDING) + height/2 + + return geo.NewPoint(chopPrecision(basePoint.X+normalX*offsetX), chopPrecision(basePoint.Y+normalY*offsetY)) + } + + var labelCenter *geo.Point + switch labelPosition { + case InsideMiddleLeft: + labelCenter, _ = route.GetPointAtDistance(leftPosition) + case InsideMiddleCenter: + labelCenter, _ = route.GetPointAtDistance(centerPosition) + case InsideMiddleRight: + labelCenter, _ = route.GetPointAtDistance(rightPosition) + + case OutsideTopLeft: + basePoint, index := route.GetPointAtDistance(leftPosition) + labelCenter = getOffsetLabelPosition(basePoint, route[index], route[index+1], true) + case OutsideTopCenter: + basePoint, index := route.GetPointAtDistance(centerPosition) + labelCenter = getOffsetLabelPosition(basePoint, route[index], route[index+1], true) + case OutsideTopRight: + basePoint, index := route.GetPointAtDistance(rightPosition) + labelCenter = getOffsetLabelPosition(basePoint, route[index], route[index+1], true) + + case OutsideBottomLeft: + basePoint, index := route.GetPointAtDistance(leftPosition) + labelCenter = getOffsetLabelPosition(basePoint, route[index], route[index+1], false) + case OutsideBottomCenter: + basePoint, index := route.GetPointAtDistance(centerPosition) + labelCenter = getOffsetLabelPosition(basePoint, route[index], route[index+1], false) + case OutsideBottomRight: + basePoint, index := route.GetPointAtDistance(rightPosition) + labelCenter = getOffsetLabelPosition(basePoint, route[index], route[index+1], false) + + case UnlockedTop: + basePoint, index := route.GetPointAtDistance(unlockedPosition) + labelCenter = getOffsetLabelPosition(basePoint, route[index], route[index+1], true) + case UnlockedMiddle: + labelCenter, _ = route.GetPointAtDistance(unlockedPosition) + case UnlockedBottom: + basePoint, index := route.GetPointAtDistance(unlockedPosition) + labelCenter = getOffsetLabelPosition(basePoint, route[index], route[index+1], false) + default: + return nil + } + // convert from center to top left + labelCenter.X -= chopPrecision(width / 2) + labelCenter.Y -= chopPrecision(height / 2) + return labelCenter +} + +// TODO probably use math.Big +func chopPrecision(f float64) float64 { + return math.Round(f*10000) / 10000 +} diff --git a/lib/log/log.go b/lib/log/log.go new file mode 100644 index 000000000..d70edf0b8 --- /dev/null +++ b/lib/log/log.go @@ -0,0 +1,114 @@ +// Package log is a context wrapper around slog.Logger +package log + +import ( + "context" + "log" + stdlog "log" + "os" + "runtime/debug" + "testing" + + "cdr.dev/slog" + "cdr.dev/slog/sloggers/sloghuman" + "cdr.dev/slog/sloggers/slogtest" + + "oss.terrastruct.com/d2/lib/env" +) + +var _default = slog.Make(sloghuman.Sink(os.Stderr)).Named("default") + +func init() { + stdlib := slog.Stdlib(context.Background(), _default, slog.LevelInfo) + log.SetOutput(stdlib.Writer()) +} + +type loggerKey struct{} + +func from(ctx context.Context) slog.Logger { + l, ok := ctx.Value(loggerKey{}).(slog.Logger) + if !ok { + _default.Warn(ctx, "missing slog.Logger in context, see lib/log.With", slog.F("stack", string(debug.Stack()))) + return _default + } + return l +} + +func With(ctx context.Context, l slog.Logger) context.Context { + return context.WithValue(ctx, loggerKey{}, l) +} + +// WithTB calls With with the result of slogtest.Make. +func WithTB(ctx context.Context, t testing.TB, opts *slogtest.Options) context.Context { + l := slogtest.Make(t, opts) + if env.Debug() { + l = l.Leveled(slog.LevelDebug) + } + return With(ctx, l) +} + +func Debug(ctx context.Context, msg string, fields ...slog.Field) { + slog.Helper() + from(ctx).Debug(ctx, msg, fields...) +} + +func Info(ctx context.Context, msg string, fields ...slog.Field) { + slog.Helper() + from(ctx).Info(ctx, msg, fields...) +} + +func Warn(ctx context.Context, msg string, fields ...slog.Field) { + slog.Helper() + from(ctx).Warn(ctx, msg, fields...) +} + +func Error(ctx context.Context, msg string, fields ...slog.Field) { + slog.Helper() + from(ctx).Error(ctx, msg, fields...) +} + +func Critical(ctx context.Context, msg string, fields ...slog.Field) { + slog.Helper() + from(ctx).Critical(ctx, msg, fields...) +} + +func Fatal(ctx context.Context, msg string, fields ...slog.Field) { + slog.Helper() + from(ctx).Fatal(ctx, msg, fields...) +} + +func Named(ctx context.Context, name string) context.Context { + return With(ctx, from(ctx).Named(name)) +} + +func Leveled(ctx context.Context, level slog.Level) context.Context { + return With(ctx, from(ctx).Leveled(level)) +} + +func AppendSinks(ctx context.Context, s ...slog.Sink) context.Context { + return With(ctx, from(ctx).AppendSinks(s...)) +} + +func Sync(ctx context.Context) { + from(ctx).Sync() +} + +func Stdlib(ctx context.Context, level slog.Level) *log.Logger { + return slog.Stdlib(ctx, from(ctx), level) +} + +func Fork(ctx, loggerCtx context.Context) context.Context { + return With(ctx, from(loggerCtx)) +} + +func Stderr(ctx context.Context) context.Context { + l := slog.Make(sloghuman.Sink(os.Stderr)) + if os.Getenv("DEBUG") == "1" { + l = l.Leveled(slog.LevelDebug) + } + + sl := slog.Stdlib(ctx, l, slog.LevelInfo) + stdlog.SetOutput(sl.Writer()) + + return With(ctx, l) +} diff --git a/lib/shape/shape.go b/lib/shape/shape.go new file mode 100644 index 000000000..6422c588f --- /dev/null +++ b/lib/shape/shape.go @@ -0,0 +1,211 @@ +package shape + +import ( + "math" + + "oss.terrastruct.com/d2/lib/geo" +) + +const ( + SQUARE_TYPE = "Square" + REAL_SQUARE_TYPE = "RealSquare" + PARALLELOGRAM_TYPE = "Parallelogram" + DOCUMENT_TYPE = "Document" + CYLINDER_TYPE = "Cylinder" + QUEUE_TYPE = "Queue" + PAGE_TYPE = "Page" + PACKAGE_TYPE = "Package" + STEP_TYPE = "Step" + CALLOUT_TYPE = "Callout" + STORED_DATA_TYPE = "StoredData" + PERSON_TYPE = "Person" + DIAMOND_TYPE = "Diamond" + OVAL_TYPE = "Oval" + CIRCLE_TYPE = "Circle" + HEXAGON_TYPE = "Hexagon" + CLOUD_TYPE = "Cloud" + + TABLE_TYPE = "Table" + CLASS_TYPE = "Class" + TEXT_TYPE = "Text" + CODE_TYPE = "Code" + IMAGE_TYPE = "Image" +) + +type Shape interface { + Is(shape string) bool + GetType() string + + AspectRatio1() bool + IsRectangular() bool + + GetBox() *geo.Box + GetInnerBox() *geo.Box + + // placing a rectangle of the given size and padding inside the shape, return the position relative to the shape's TopLeft + GetInsidePlacement(width, height, padding float64) geo.Point + + GetDimensionsToFit(width, height, padding float64) (float64, float64) + + // Perimeter returns a slice of geo.Intersectables that together constitute the shape border + Perimeter() []geo.Intersectable + + GetSVGPathData() []string +} + +type baseShape struct { + Type string + Box *geo.Box +} + +func (s baseShape) Is(shapeType string) bool { + return s.Type == shapeType +} + +func (s baseShape) GetType() string { + return s.Type +} + +func (s baseShape) AspectRatio1() bool { + return false +} + +func (s baseShape) IsRectangular() bool { + return false +} + +func (s baseShape) GetBox() *geo.Box { + return s.Box +} + +func (s baseShape) GetInnerBox() *geo.Box { + return s.Box +} + +func (s baseShape) GetInsidePlacement(_, _, padding float64) geo.Point { + return *geo.NewPoint(s.Box.TopLeft.X+padding, s.Box.TopLeft.Y+padding) +} + +func (s baseShape) GetInnerTopLeft(_, _, padding float64) geo.Point { + return *geo.NewPoint(s.Box.TopLeft.X+padding, s.Box.TopLeft.Y+padding) +} + +func (s baseShape) GetDimensionsToFit(width, height, padding float64) (float64, float64) { + return width + padding*2, height + padding*2 +} + +func (s baseShape) Perimeter() []geo.Intersectable { + return nil +} + +func (s baseShape) GetSVGPathData() []string { + return nil +} + +func NewShape(shapeType string, box *geo.Box) Shape { + switch shapeType { + case CALLOUT_TYPE: + return NewCallout(box) + case CIRCLE_TYPE: + return NewCircle(box) + case CLASS_TYPE: + return NewClass(box) + case CLOUD_TYPE: + return NewCloud(box) + case CODE_TYPE: + return NewCode(box) + case CYLINDER_TYPE: + return NewCylinder(box) + case DIAMOND_TYPE: + return NewDiamond(box) + case DOCUMENT_TYPE: + return NewDocument(box) + case HEXAGON_TYPE: + return NewHexagon(box) + case IMAGE_TYPE: + return NewImage(box) + case OVAL_TYPE: + return NewOval(box) + case PACKAGE_TYPE: + return NewPackage(box) + case PAGE_TYPE: + return NewPage(box) + case PARALLELOGRAM_TYPE: + return NewParallelogram(box) + case PERSON_TYPE: + return NewPerson(box) + case QUEUE_TYPE: + return NewQueue(box) + case REAL_SQUARE_TYPE: + return NewRealSquare(box) + case STEP_TYPE: + return NewStep(box) + case STORED_DATA_TYPE: + return NewStoredData(box) + case SQUARE_TYPE: + return NewSquare(box) + case TABLE_TYPE: + return NewTable(box) + case TEXT_TYPE: + return NewText(box) + + default: + return shapeSquare{ + baseShape: &baseShape{ + Type: shapeType, + Box: box, + }, + } + } +} + +// TraceToShapeBorder takes the point on the rectangular border +// r here is the point on rectangular border +// p is the prev point (used to calculate slope) +// s is the point on the actual shape border that'll be returned +// +// p +// │ +// │ +// ▼ +// ┌────r─────────────────────────┐ +// │ │ +// │ │ │ +// │ │ xxxxxxxx │ +// │ ▼ xxxxx xxxx │ +// │ sxxx xx │ +// │ x xx │ +// │ xx xx │ +// │ x xx │ +// │ xx xxx │ +// │ xxxx xxxx │ +// └──────xxxxxxxxxxxxxx──────────┘ +func TraceToShapeBorder(shape Shape, rectBorderPoint, prevPoint *geo.Point) *geo.Point { + if shape.Is("") || shape.IsRectangular() { + return rectBorderPoint + } + + // We want to extend the line all the way through to the other end of the shape to get the intersections + scaleSize := shape.GetBox().Width + if prevPoint.X == rectBorderPoint.X { + scaleSize = shape.GetBox().Height + } + vector := prevPoint.VectorTo(rectBorderPoint) + vector = vector.AddLength(scaleSize) + extendedSegment := geo.Segment{Start: prevPoint, End: prevPoint.AddVector(vector)} + + closestD := math.Inf(1) + closestPoint := rectBorderPoint + + for _, perimeterSegment := range shape.Perimeter() { + for _, intersectingPoint := range perimeterSegment.Intersections(extendedSegment) { + d := geo.EuclideanDistance(rectBorderPoint.X, rectBorderPoint.Y, intersectingPoint.X, intersectingPoint.Y) + if d < closestD { + closestD = d + closestPoint = intersectingPoint + } + } + } + + return geo.NewPoint(math.Round(closestPoint.X), math.Round(closestPoint.Y)) +} diff --git a/lib/shape/shape_callout.go b/lib/shape/shape_callout.go new file mode 100644 index 000000000..73cbaac58 --- /dev/null +++ b/lib/shape/shape_callout.go @@ -0,0 +1,61 @@ +package shape + +import ( + "oss.terrastruct.com/d2/lib/geo" + "oss.terrastruct.com/d2/lib/svg" +) + +type shapeCallout struct { + *baseShape +} + +func NewCallout(box *geo.Box) Shape { + return shapeCallout{ + baseShape: &baseShape{ + Type: CALLOUT_TYPE, + Box: box, + }, + } +} + +func (s shapeCallout) GetInnerBox() *geo.Box { + height := s.Box.Height + tipHeight := 45.0 + if height < tipHeight*2 { + tipHeight = height / 2.0 + } + height -= tipHeight + return geo.NewBox(s.Box.TopLeft.Copy(), s.Box.Width, height) +} + +func calloutPath(box *geo.Box) *svg.SvgPathContext { + tipWidth := 30.0 + if box.Width < tipWidth*2 { + tipWidth = box.Width / 2.0 + } + tipHeight := 45.0 + if box.Height < tipHeight*2 { + tipHeight = box.Height / 2.0 + } + pc := svg.NewSVGPathContext(box.TopLeft, 1, 1) + pc.StartAt(pc.Absolute(0, 0)) + pc.V(true, box.Height-tipHeight) + pc.H(true, box.Width/2.0) + pc.V(true, tipHeight) + pc.L(true, tipWidth, -tipHeight) + pc.H(true, box.Width/2.0-tipWidth) + pc.V(true, -(box.Height - tipHeight)) + pc.H(true, -box.Width) + pc.Z() + return pc +} + +func (s shapeCallout) Perimeter() []geo.Intersectable { + return calloutPath(s.Box).Path +} + +func (s shapeCallout) GetSVGPathData() []string { + return []string{ + calloutPath(s.Box).PathData(), + } +} diff --git a/lib/shape/shape_circle.go b/lib/shape/shape_circle.go new file mode 100644 index 000000000..50ab2cc77 --- /dev/null +++ b/lib/shape/shape_circle.go @@ -0,0 +1,37 @@ +package shape + +import ( + "math" + + "oss.terrastruct.com/d2/lib/geo" +) + +type shapeCircle struct { + *baseShape +} + +func NewCircle(box *geo.Box) Shape { + return shapeCircle{ + baseShape: &baseShape{ + Type: CIRCLE_TYPE, + Box: box, + }, + } +} + +func (s shapeCircle) AspectRatio1() bool { + return true +} + +func (s shapeCircle) GetDimensionsToFit(width, height, padding float64) (float64, float64) { + radius := math.Ceil(math.Sqrt(math.Pow(width/2, 2)+math.Pow(height/2, 2))) + padding + return radius * 2, radius * 2 +} + +func (s shapeCircle) GetInsidePlacement(width, height, padding float64) geo.Point { + return *geo.NewPoint(s.Box.TopLeft.X+math.Ceil(s.Box.Width/2-width/2), s.Box.TopLeft.Y+math.Ceil(s.Box.Height/2-height/2)) +} + +func (s shapeCircle) Perimeter() []geo.Intersectable { + return []geo.Intersectable{geo.NewEllipse(s.Box.Center(), s.Box.Width/2, s.Box.Height/2)} +} diff --git a/lib/shape/shape_class.go b/lib/shape/shape_class.go new file mode 100644 index 000000000..ac481eadb --- /dev/null +++ b/lib/shape/shape_class.go @@ -0,0 +1,21 @@ +package shape + +import ( + "oss.terrastruct.com/d2/lib/geo" +) + +// Class is basically a rectangle +type shapeClass struct { + shapeSquare +} + +func NewClass(box *geo.Box) Shape { + return shapeClass{ + shapeSquare{ + baseShape: &baseShape{ + Type: CLASS_TYPE, + Box: box, + }, + }, + } +} diff --git a/lib/shape/shape_cloud.go b/lib/shape/shape_cloud.go new file mode 100644 index 000000000..fb200feaf --- /dev/null +++ b/lib/shape/shape_cloud.go @@ -0,0 +1,100 @@ +package shape + +import ( + "math" + + "oss.terrastruct.com/d2/lib/geo" + "oss.terrastruct.com/d2/lib/svg" +) + +// The percentage values of the cloud's wide inner box +const CLOUD_WIDE_INNER_X = 0.085 +const CLOUD_WIDE_INNER_Y = 0.409 +const CLOUD_WIDE_INNER_WIDTH = 0.819 +const CLOUD_WIDE_INNER_HEIGHT = 0.548 +const CLOUD_WIDE_ASPECT_BOUNDARY = (1 + CLOUD_WIDE_INNER_WIDTH/CLOUD_WIDE_INNER_HEIGHT) / 2 + +// The percentage values of the cloud's tall inner box +const CLOUD_TALL_INNER_X = 0.228 +const CLOUD_TALL_INNER_Y = 0.179 +const CLOUD_TALL_INNER_WIDTH = 0.549 +const CLOUD_TALL_INNER_HEIGHT = 0.820 +const CLOUD_TALL_ASPECT_BOUNDARY = (1 + CLOUD_TALL_INNER_WIDTH/CLOUD_TALL_INNER_HEIGHT) / 2 + +// The percentage values of the cloud's square inner box +const CLOUD_SQUARE_INNER_X = 0.167 +const CLOUD_SQUARE_INNER_Y = 0.335 +const CLOUD_SQUARE_INNER_WIDTH = 0.663 +const CLOUD_SQUARE_INNER_HEIGHT = 0.663 + +type shapeCloud struct { + *baseShape +} + +func NewCloud(box *geo.Box) Shape { + return shapeCloud{ + baseShape: &baseShape{ + Type: CLOUD_TYPE, + Box: box, + }, + } +} + +func (s shapeCloud) GetDimensionsToFit(width, height, padding float64) (float64, float64) { + width += padding + height += padding + aspectRatio := width / height + // use the inner box with the closest aspect ratio (wide, tall, or square box) + if aspectRatio > CLOUD_WIDE_ASPECT_BOUNDARY { + return math.Ceil(width / CLOUD_WIDE_INNER_WIDTH), math.Ceil(height / CLOUD_WIDE_INNER_HEIGHT) + } else if aspectRatio < CLOUD_TALL_ASPECT_BOUNDARY { + return math.Ceil(width / CLOUD_TALL_INNER_WIDTH), math.Ceil(height / CLOUD_TALL_INNER_HEIGHT) + } else { + return math.Ceil(width / CLOUD_SQUARE_INNER_WIDTH), math.Ceil(height / CLOUD_SQUARE_INNER_HEIGHT) + } +} + +func (s shapeCloud) GetInsidePlacement(width, height, padding float64) geo.Point { + r := s.Box + // only using padding/2 since there's already quite a bit of padding away from the corners + width += padding + height += padding + aspectRatio := width / height + if aspectRatio > CLOUD_WIDE_ASPECT_BOUNDARY { + return *geo.NewPoint(r.TopLeft.X+math.Ceil(r.Width*CLOUD_WIDE_INNER_X+padding/2), r.TopLeft.Y+math.Ceil(r.Height*CLOUD_WIDE_INNER_Y+padding/2)) + } else if aspectRatio < CLOUD_TALL_ASPECT_BOUNDARY { + return *geo.NewPoint(r.TopLeft.X+math.Ceil(r.Width*CLOUD_TALL_INNER_X+padding/2), r.TopLeft.Y+math.Ceil(r.Height*CLOUD_TALL_INNER_Y+padding/2)) + } else { + return *geo.NewPoint(r.TopLeft.X+math.Ceil(r.Width*CLOUD_SQUARE_INNER_X+padding/2), r.TopLeft.Y+math.Ceil(r.Height*CLOUD_SQUARE_INNER_Y+padding/2)) + } +} + +func cloudPath(box *geo.Box) *svg.SvgPathContext { + pc := svg.NewSVGPathContext(box.TopLeft, box.Width/834, box.Height/523) + // Note: original path TopLeft=(83, 238), absolute values updated so top left is at 0,0 + pc.StartAt(pc.Absolute(137.833, 182.833)) + pc.C(true, 0, 5.556, -5.556, 11.111, -11.111, 11.111) + pc.C(true, -70.833, 6.944, -126.389, 77.778, -126.389, 163.889) + pc.C(true, 0, 91.667, 62.5, 165.278, 141.667, 165.278) + pc.H(true, 537.5) + pc.C(true, 84.723, 0, 154.167, -79.167, 154.167, -175) + pc.C(true, 0, -91.667, -63.89, -168.056, -144.444, -173.611) + pc.C(true, -5.556, 0, -11.111, -4.167, -12.5, -11.111) + pc.C(true, -18.056, -93.055, -101.39, -162.5, -198.611, -162.5) + pc.C(true, -63.889, 0, -120.834, 29.167, -156.944, 75) + pc.C(true, -4.167, 5.556, -11.111, 6.945, -15.278, 5.556) + pc.C(true, -13.889, -5.556, -29.166, -8.333, -45.833, -8.333) + pc.C(false, 196.167, 71.722, 143.389, 120.333, 137.833, 182.833) + pc.Z() + return pc +} + +func (s shapeCloud) Perimeter() []geo.Intersectable { + return cloudPath(s.Box).Path +} + +func (s shapeCloud) GetSVGPathData() []string { + return []string{ + cloudPath(s.Box).PathData(), + } +} diff --git a/lib/shape/shape_code.go b/lib/shape/shape_code.go new file mode 100644 index 000000000..83fe728e9 --- /dev/null +++ b/lib/shape/shape_code.go @@ -0,0 +1,20 @@ +package shape + +import ( + "oss.terrastruct.com/d2/lib/geo" +) + +type shapeCode struct { + shapeSquare +} + +func NewCode(box *geo.Box) Shape { + return shapeCode{ + shapeSquare: shapeSquare{ + baseShape: &baseShape{ + Type: CODE_TYPE, + Box: box, + }, + }, + } +} diff --git a/lib/shape/shape_cylinder.go b/lib/shape/shape_cylinder.go new file mode 100644 index 000000000..dfc843841 --- /dev/null +++ b/lib/shape/shape_cylinder.go @@ -0,0 +1,73 @@ +package shape + +import ( + "oss.terrastruct.com/d2/lib/geo" + "oss.terrastruct.com/d2/lib/svg" +) + +type shapeCylinder struct { + *baseShape +} + +func NewCylinder(box *geo.Box) Shape { + return shapeCylinder{ + baseShape: &baseShape{ + Type: CYLINDER_TYPE, + Box: box, + }, + } +} + +func (s shapeCylinder) GetInnerBox() *geo.Box { + height := s.Box.Height + tl := s.Box.TopLeft.Copy() + arcDepth := 24.0 + if height < arcDepth*2 { + arcDepth = height / 2.0 + } + height -= 3 * arcDepth + tl.Y += 2 * arcDepth + return geo.NewBox(tl, s.Box.Width, height) +} + +func cylinderOuterPath(box *geo.Box) *svg.SvgPathContext { + arcDepth := 24.0 + if box.Height < arcDepth*2 { + arcDepth = box.Height / 2 + } + multiplier := 0.45 + pc := svg.NewSVGPathContext(box.TopLeft, 1, 1) + pc.StartAt(pc.Absolute(0, arcDepth)) + pc.C(false, 0, 0, box.Width*multiplier, 0, box.Width/2, 0) + pc.C(false, box.Width-box.Width*multiplier, 0, box.Width, 0, box.Width, arcDepth) + pc.V(true, box.Height-arcDepth*2) + pc.C(false, box.Width, box.Height, box.Width-box.Width*multiplier, box.Height, box.Width/2, box.Height) + pc.C(false, box.Width*multiplier, box.Height, 0, box.Height, 0, box.Height-arcDepth) + pc.V(true, -(box.Height - arcDepth*2)) + pc.Z() + return pc +} + +func cylinderInnerPath(box *geo.Box) *svg.SvgPathContext { + arcDepth := 24.0 + if box.Height < arcDepth*2 { + arcDepth = box.Height / 2 + } + multiplier := 0.45 + pc := svg.NewSVGPathContext(box.TopLeft, 1, 1) + pc.StartAt(pc.Absolute(0, arcDepth)) + pc.C(false, 0, arcDepth*2, box.Width*multiplier, arcDepth*2, box.Width/2, arcDepth*2) + pc.C(false, box.Width-box.Width*multiplier, arcDepth*2, box.Width, arcDepth*2, box.Width, arcDepth) + return pc +} + +func (s shapeCylinder) Perimeter() []geo.Intersectable { + return cylinderOuterPath(s.Box).Path +} + +func (s shapeCylinder) GetSVGPathData() []string { + return []string{ + cylinderOuterPath(s.Box).PathData(), + cylinderInnerPath(s.Box).PathData(), + } +} diff --git a/lib/shape/shape_diamond.go b/lib/shape/shape_diamond.go new file mode 100644 index 000000000..9fb115194 --- /dev/null +++ b/lib/shape/shape_diamond.go @@ -0,0 +1,45 @@ +package shape + +import ( + "oss.terrastruct.com/d2/lib/geo" + "oss.terrastruct.com/d2/lib/svg" +) + +type shapeDiamond struct { + *baseShape +} + +func NewDiamond(box *geo.Box) Shape { + return shapeDiamond{ + baseShape: &baseShape{ + Type: DIAMOND_TYPE, + Box: box, + }, + } +} + +func diamondPath(box *geo.Box) *svg.SvgPathContext { + pc := svg.NewSVGPathContext(box.TopLeft, box.Width/77, box.Height/76.9) + pc.StartAt(pc.Absolute(38.5, 76.9)) + pc.C(true, -0.3, 0, -0.5, -0.1, -0.7, -0.3) + pc.L(false, 0.3, 39.2) + pc.C(true, -0.4, -0.4, -0.4, -1, 0, -1.4) + pc.L(false, 37.8, 0.3) + pc.C(true, 0.4, -0.4, 1, -0.4, 1.4, 0) + pc.L(true, 37.5, 37.5) + pc.C(true, 0.4, 0.4, 0.4, 1, 0, 1.4) + pc.L(false, 39.2, 76.6) + pc.C(false, 39, 76.8, 38.8, 76.9, 38.5, 76.9) + pc.Z() + return pc +} + +func (s shapeDiamond) Perimeter() []geo.Intersectable { + return diamondPath(s.Box).Path +} + +func (s shapeDiamond) GetSVGPathData() []string { + return []string{ + diamondPath(s.Box).PathData(), + } +} diff --git a/lib/shape/shape_document.go b/lib/shape/shape_document.go new file mode 100644 index 000000000..3cdb5d100 --- /dev/null +++ b/lib/shape/shape_document.go @@ -0,0 +1,42 @@ +package shape + +import ( + "oss.terrastruct.com/d2/lib/geo" + "oss.terrastruct.com/d2/lib/svg" +) + +type shapeDocument struct { + *baseShape +} + +func NewDocument(box *geo.Box) Shape { + return shapeDocument{ + baseShape: &baseShape{ + Type: DOCUMENT_TYPE, + Box: box, + }, + } +} + +func documentPath(box *geo.Box) *svg.SvgPathContext { + pathHeight := 18.925 + pc := svg.NewSVGPathContext(box.TopLeft, box.Width, box.Height) + pc.StartAt(pc.Absolute(0, 16.3/pathHeight)) + pc.L(false, 0, 0) + pc.L(false, 1, 0) + pc.L(false, 1, 16.3/pathHeight) + pc.C(false, 5/6.0, 12.8/pathHeight, 2/3.0, 12.8/pathHeight, 1/2.0, 16.3/pathHeight) + pc.C(false, 1/3.0, 19.8/pathHeight, 1/6.0, 19.8/pathHeight, 0, 16.3/pathHeight) + pc.Z() + return pc +} + +func (s shapeDocument) Perimeter() []geo.Intersectable { + return documentPath(s.Box).Path +} + +func (s shapeDocument) GetSVGPathData() []string { + return []string{ + documentPath(s.Box).PathData(), + } +} diff --git a/lib/shape/shape_hexagon.go b/lib/shape/shape_hexagon.go new file mode 100644 index 000000000..b726181a2 --- /dev/null +++ b/lib/shape/shape_hexagon.go @@ -0,0 +1,42 @@ +package shape + +import ( + "oss.terrastruct.com/d2/lib/geo" + "oss.terrastruct.com/d2/lib/svg" +) + +type shapeHexagon struct { + *baseShape +} + +func NewHexagon(box *geo.Box) Shape { + return shapeHexagon{ + baseShape: &baseShape{ + Type: HEXAGON_TYPE, + Box: box, + }, + } +} + +func hexagonPath(box *geo.Box) *svg.SvgPathContext { + halfYFactor := 43.6 / 87.3 + pc := svg.NewSVGPathContext(box.TopLeft, box.Width, box.Height) + pc.StartAt(pc.Absolute(0.25, 0)) + pc.L(false, 0, halfYFactor) + pc.L(false, 0.25, 1) + pc.L(false, 0.75, 1) + pc.L(false, 1, halfYFactor) + pc.L(false, 0.75, 0) + pc.Z() + return pc +} + +func (s shapeHexagon) Perimeter() []geo.Intersectable { + return hexagonPath(s.Box).Path +} + +func (s shapeHexagon) GetSVGPathData() []string { + return []string{ + hexagonPath(s.Box).PathData(), + } +} diff --git a/lib/shape/shape_image.go b/lib/shape/shape_image.go new file mode 100644 index 000000000..7ba782ae5 --- /dev/null +++ b/lib/shape/shape_image.go @@ -0,0 +1,22 @@ +package shape + +import ( + "oss.terrastruct.com/d2/lib/geo" +) + +type shapeImage struct { + *baseShape +} + +func NewImage(box *geo.Box) Shape { + return shapeImage{ + baseShape: &baseShape{ + Type: IMAGE_TYPE, + Box: box, + }, + } +} + +func (s shapeImage) IsRectangular() bool { + return true +} diff --git a/lib/shape/shape_oval.go b/lib/shape/shape_oval.go new file mode 100644 index 000000000..c0f983ad6 --- /dev/null +++ b/lib/shape/shape_oval.go @@ -0,0 +1,55 @@ +package shape + +import ( + "math" + + "oss.terrastruct.com/d2/lib/geo" +) + +type shapeOval struct { + *baseShape +} + +func NewOval(box *geo.Box) Shape { + return shapeOval{ + baseShape: &baseShape{ + Type: OVAL_TYPE, + Box: box, + }, + } +} + +func (s shapeOval) GetDimensionsToFit(width, height, padding float64) (float64, float64) { + theta := math.Atan2(height, width) + // add padding in direction of diagonal so there is padding distance between top left and border + paddedWidth := width + 2*padding*math.Cos(theta) + paddedHeight := height + 2*padding*math.Sin(theta) + // see https://stackoverflow.com/questions/433371/ellipse-bounding-a-rectangle + return math.Ceil(math.Sqrt2 * paddedWidth), math.Ceil(math.Sqrt2 * paddedHeight) +} + +func (s shapeOval) GetInsidePlacement(width, height, padding float64) geo.Point { + // showing the top left arc of the ellipse (drawn with '*') + // ┌──────────────────* ┬ + // │ * │ │ry + // │ *┌───────────┤ │ ┬ + // │ * │ │ │ │sin*r + // │* │ │ │ │ + // *──────┴───────────┼ ┴ ┴ + // ├────────rx────────┤ + // ├───cos*r───┤ + rx := s.Box.Width / 2 + ry := s.Box.Height / 2 + theta := math.Atan2(ry, rx) + sin := math.Sin(theta) + cos := math.Cos(theta) + // r is the ellipse radius on the line between node.TopLeft and the ellipse center + // see https://math.stackexchange.com/questions/432902/how-to-get-the-radius-of-an-ellipse-at-a-specific-angle-by-knowing-its-semi-majo + r := rx * ry / math.Sqrt(math.Pow(rx*sin, 2)+math.Pow(ry*cos, 2)) + // we want to offset r-padding away from the center + return *geo.NewPoint(s.Box.TopLeft.X+math.Ceil(rx-cos*(r-padding)), s.Box.TopLeft.Y+math.Ceil(ry-sin*(r-padding))) +} + +func (s shapeOval) Perimeter() []geo.Intersectable { + return []geo.Intersectable{geo.NewEllipse(s.Box.Center(), s.Box.Width/2, s.Box.Height/2)} +} diff --git a/lib/shape/shape_package.go b/lib/shape/shape_package.go new file mode 100644 index 000000000..8cdf73501 --- /dev/null +++ b/lib/shape/shape_package.go @@ -0,0 +1,59 @@ +package shape + +import ( + "math" + + "oss.terrastruct.com/d2/lib/geo" + "oss.terrastruct.com/d2/lib/svg" +) + +type shapePackage struct { + *baseShape +} + +func NewPackage(box *geo.Box) Shape { + return shapePackage{ + baseShape: &baseShape{ + Type: PACKAGE_TYPE, + Box: box, + }, + } +} + +func packagePath(box *geo.Box) *svg.SvgPathContext { + const MIN_TOP_HEIGHT = 34 + const MAX_TOP_HEIGHT = 55 + const MIN_TOP_WIDTH = 50 + const MAX_TOP_WIDTH = 150 + + const horizontalScalar = 0.5 + topWidth := box.Width * horizontalScalar + if box.Width >= 2*MIN_TOP_WIDTH { + topWidth = math.Min(MAX_TOP_WIDTH, math.Max(MIN_TOP_WIDTH, topWidth)) + } + const verticalScalar = 0.2 + topHeight := box.Height * verticalScalar + if box.Height >= 2*MIN_TOP_HEIGHT { + topHeight = math.Min(MAX_TOP_HEIGHT, math.Max(MIN_TOP_HEIGHT, topHeight)) + } + + pc := svg.NewSVGPathContext(box.TopLeft, 1, 1) + pc.StartAt(pc.Absolute(0, 0)) + pc.L(false, topWidth, 0) + pc.L(false, topWidth, topHeight) + pc.L(false, box.Width, topHeight) + pc.L(false, box.Width, box.Height) + pc.L(false, 0, box.Height) + pc.Z() + return pc +} + +func (s shapePackage) Perimeter() []geo.Intersectable { + return packagePath(s.Box).Path +} + +func (s shapePackage) GetSVGPathData() []string { + return []string{ + packagePath(s.Box).PathData(), + } +} diff --git a/lib/shape/shape_page.go b/lib/shape/shape_page.go new file mode 100644 index 000000000..79d528ed2 --- /dev/null +++ b/lib/shape/shape_page.go @@ -0,0 +1,66 @@ +package shape + +import ( + "oss.terrastruct.com/d2/lib/geo" + "oss.terrastruct.com/d2/lib/svg" +) + +type shapePage struct { + *baseShape +} + +func NewPage(box *geo.Box) Shape { + return shapePage{ + baseShape: &baseShape{ + Type: PAGE_TYPE, + Box: box, + }, + } +} + +func pageOuterPath(box *geo.Box) *svg.SvgPathContext { + pc := svg.NewSVGPathContext(box.TopLeft, box.Width/66, box.Height/79.0) + pc.StartAt(pc.Absolute(0.5, 0)) + pc.H(false, 45.1836) + pc.C(false, 46.3544, 0.0, 47.479, 0.456297, 48.3189, 1.27202) + pc.L(false, 64.6353, 17.12) + pc.C(false, 65.5077, 17.9674, 66.0, 19.1318, 66.0, 20.348) + pc.V(false, 78.5) + pc.C(false, 66.0, 78.7761, 65.7761, 79.0, 65.5, 79.0) + pc.H(false, 0.499999) + pc.C(false, 0.223857, 79.0, 0.0, 78.7761, 0.0, 78.5) + pc.V(false, 0.499999) + pc.C(false, 0.0, 0.223857, 0.223857, 0.0, 0.5, 0.0) + pc.Z() + return pc +} + +func pageInnerPath(box *geo.Box) *svg.SvgPathContext { + pc := svg.NewSVGPathContext(box.TopLeft, box.Width/30.5, box.Height/36.5) + pc.StartAt(pc.Absolute(30, 36.5)) + pc.H(false, 0.5) + pc.C(true, -0.3, 0, -0.5, -0.2, -0.5, -0.5) + pc.V(false, 0.5) + pc.C(true, 0, -0.3, 0.2, -0.5, 0.5, -0.5) + pc.H(true, 20.3) + pc.C(true, 0.3, 0, 0.5, 0.2, 0.5, 0.5) + pc.V(true, 7.9) + pc.C(true, 0, 0.6, 0.4, 1.1, 1.1, 1.1) + pc.H(false, 30) + pc.C(true, 0.3, 0, 0.5, 0.2, 0.5, 0.5) + pc.V(false, 36) + pc.C(false, 30.5, 36.3, 30.3, 36.5, 30, 36.5) + pc.Z() + return pc +} + +func (s shapePage) Perimeter() []geo.Intersectable { + return pageOuterPath(s.Box).Path +} + +func (s shapePage) GetSVGPathData() []string { + return []string{ + pageOuterPath(s.Box).PathData(), + pageInnerPath(s.Box).PathData(), + } +} diff --git a/lib/shape/shape_parallelogram.go b/lib/shape/shape_parallelogram.go new file mode 100644 index 000000000..3557579cb --- /dev/null +++ b/lib/shape/shape_parallelogram.go @@ -0,0 +1,44 @@ +package shape + +import ( + "oss.terrastruct.com/d2/lib/geo" + "oss.terrastruct.com/d2/lib/svg" +) + +type shapeParallelogram struct { + *baseShape +} + +func NewParallelogram(box *geo.Box) Shape { + return shapeParallelogram{ + baseShape: &baseShape{ + Type: PARALLELOGRAM_TYPE, + Box: box, + }, + } +} + +func parallelogramPath(box *geo.Box) *svg.SvgPathContext { + wedgeWidth := 26.0 + if box.Width <= wedgeWidth { + wedgeWidth = box.Width / 2.0 + } + pc := svg.NewSVGPathContext(box.TopLeft, 1, 1) + pc.StartAt(pc.Absolute(wedgeWidth, 0)) + pc.L(false, box.Width, 0) + pc.L(false, box.Width-wedgeWidth, box.Height) + pc.L(false, 0, box.Height) + pc.L(false, 0, box.Height) + pc.Z() + return pc +} + +func (s shapeParallelogram) Perimeter() []geo.Intersectable { + return parallelogramPath(s.Box).Path +} + +func (s shapeParallelogram) GetSVGPathData() []string { + return []string{ + parallelogramPath(s.Box).PathData(), + } +} diff --git a/lib/shape/shape_person.go b/lib/shape/shape_person.go new file mode 100644 index 000000000..f75c6c49d --- /dev/null +++ b/lib/shape/shape_person.go @@ -0,0 +1,54 @@ +package shape + +import ( + "oss.terrastruct.com/d2/lib/geo" + "oss.terrastruct.com/d2/lib/svg" +) + +type shapePerson struct { + *baseShape +} + +func NewPerson(box *geo.Box) Shape { + return shapePerson{ + baseShape: &baseShape{ + Type: PERSON_TYPE, + Box: box, + }, + } +} + +func personPath(box *geo.Box) *svg.SvgPathContext { + pc := svg.NewSVGPathContext(box.TopLeft, box.Width/68.3, box.Height/77.4) + + // Bottom side + pc.StartAt(pc.Absolute(68.3, 77.4)) + pc.H(false, 0) + pc.V(true, -1.1) + pc.C(true, 0, -13.2, 7.5, -25.1, 19.3, -30.8) + pc.C(false, 12.8, 40.9, 8.9, 33.4, 8.9, 25.2) + pc.C(false, 8.9, 11.3, 20.2, 0, 34.1, 0) + + // TODO: implement s command with mirroring last control point + // s 25.2,11.3, 25.2,25.2 + // mirroring last control point (20.2,0) -> (34.1,0) = relative(13.9,0) + pc.C(true, 13.9, 0, 25.2, 11.3, 25.2, 25.2) + + pc.C(true, 0, 8.2, -3.8, 15.6, -10.4, 20.4) + pc.C(true, 11.8, 5.7, 19.3, 17.6, 19.3, 30.8) + pc.V(true, 1) + pc.H(false, 68.3) + pc.Z() + return pc +} + +func (s shapePerson) Perimeter() []geo.Intersectable { + return personPath(s.Box).Path + +} + +func (s shapePerson) GetSVGPathData() []string { + return []string{ + personPath(s.Box).PathData(), + } +} diff --git a/lib/shape/shape_queue.go b/lib/shape/shape_queue.go new file mode 100644 index 000000000..5f40893d5 --- /dev/null +++ b/lib/shape/shape_queue.go @@ -0,0 +1,73 @@ +package shape + +import ( + "oss.terrastruct.com/d2/lib/geo" + "oss.terrastruct.com/d2/lib/svg" +) + +type shapeQueue struct { + *baseShape +} + +func NewQueue(box *geo.Box) Shape { + return shapeQueue{ + baseShape: &baseShape{ + Type: QUEUE_TYPE, + Box: box, + }, + } +} + +func (s shapeQueue) GetInnerBox() *geo.Box { + width := s.Box.Width + tl := s.Box.TopLeft.Copy() + arcDepth := 24.0 + if width < arcDepth*2 { + arcDepth = width / 2.0 + } + width -= 3 * arcDepth + tl.X += arcDepth + return geo.NewBox(tl, width, s.Box.Height) +} + +func queueOuterPath(box *geo.Box) *svg.SvgPathContext { + arcDepth := 24.0 + multiplier := 0.45 + if box.Width < arcDepth*2 { + arcDepth = box.Width / 2.0 + } + pc := svg.NewSVGPathContext(box.TopLeft, 1, 1) + pc.StartAt(pc.Absolute(arcDepth, 0)) + pc.H(true, box.Width-2*arcDepth) + pc.C(false, box.Width, 0, box.Width, box.Height*multiplier, box.Width, box.Height/2.0) + pc.C(false, box.Width, box.Height-box.Height*multiplier, box.Width, box.Height, box.Width-arcDepth, box.Height) + pc.H(true, -1*(box.Width-2*arcDepth)) + pc.C(false, 0, box.Height, 0, box.Height-box.Height*multiplier, 0, box.Height/2.0) + pc.C(false, 0, box.Height*multiplier, 0, 0, arcDepth, 0) + pc.Z() + return pc +} + +func queueInnerPath(box *geo.Box) *svg.SvgPathContext { + arcDepth := 24.0 + multiplier := 0.45 + if box.Width < arcDepth*2 { + arcDepth = box.Width / 2.0 + } + pc := svg.NewSVGPathContext(box.TopLeft, 1, 1) + pc.StartAt(pc.Absolute(box.Width-arcDepth, 0)) + pc.C(false, box.Width-2*arcDepth, 0, box.Width-2*arcDepth, box.Height*multiplier, box.Width-2*arcDepth, box.Height/2.0) + pc.C(false, box.Width-2*arcDepth, box.Height-box.Height*multiplier, box.Width-2*arcDepth, box.Height, box.Width-arcDepth, box.Height) + return pc +} + +func (s shapeQueue) Perimeter() []geo.Intersectable { + return queueOuterPath(s.Box).Path +} + +func (s shapeQueue) GetSVGPathData() []string { + return []string{ + queueOuterPath(s.Box).PathData(), + queueInnerPath(s.Box).PathData(), + } +} diff --git a/lib/shape/shape_real_square.go b/lib/shape/shape_real_square.go new file mode 100644 index 000000000..3f2ea71cb --- /dev/null +++ b/lib/shape/shape_real_square.go @@ -0,0 +1,33 @@ +package shape + +import ( + "math" + + "oss.terrastruct.com/d2/lib/geo" +) + +type shapeRealSquare struct { + *baseShape +} + +func NewRealSquare(box *geo.Box) Shape { + return shapeRealSquare{ + baseShape: &baseShape{ + Type: REAL_SQUARE_TYPE, + Box: box, + }, + } +} + +func (s shapeRealSquare) AspectRatio1() bool { + return true +} + +func (s shapeRealSquare) IsRectangular() bool { + return true +} + +func (s shapeRealSquare) GetDimensionsToFit(width, height, padding float64) (float64, float64) { + sideLength := math.Max(width+padding*2, height+padding*2) + return sideLength, sideLength +} diff --git a/lib/shape/shape_square.go b/lib/shape/shape_square.go new file mode 100644 index 000000000..ceb811e4c --- /dev/null +++ b/lib/shape/shape_square.go @@ -0,0 +1,22 @@ +package shape + +import ( + "oss.terrastruct.com/d2/lib/geo" +) + +type shapeSquare struct { + *baseShape +} + +func NewSquare(box *geo.Box) Shape { + return shapeSquare{ + baseShape: &baseShape{ + Type: SQUARE_TYPE, + Box: box, + }, + } +} + +func (s shapeSquare) IsRectangular() bool { + return true +} diff --git a/lib/shape/shape_step.go b/lib/shape/shape_step.go new file mode 100644 index 000000000..bd63fb01a --- /dev/null +++ b/lib/shape/shape_step.go @@ -0,0 +1,47 @@ +package shape + +import ( + "oss.terrastruct.com/d2/lib/geo" + "oss.terrastruct.com/d2/lib/svg" +) + +type shapeStep struct { + *baseShape +} + +func NewStep(box *geo.Box) Shape { + return shapeStep{ + baseShape: &baseShape{ + Type: STEP_TYPE, + Box: box, + }, + } +} + +const STEP_WEDGE_WIDTH = 35.0 + +func stepPath(box *geo.Box) *svg.SvgPathContext { + wedgeWidth := STEP_WEDGE_WIDTH + if box.Width <= wedgeWidth { + wedgeWidth = box.Width / 2.0 + } + pc := svg.NewSVGPathContext(box.TopLeft, 1, 1) + pc.StartAt(pc.Absolute(0, 0)) + pc.L(false, box.Width-wedgeWidth, 0) + pc.L(false, box.Width, box.Height/2) + pc.L(false, box.Width-wedgeWidth, box.Height) + pc.L(false, 0, box.Height) + pc.L(false, wedgeWidth, box.Height/2) + pc.Z() + return pc +} + +func (s shapeStep) Perimeter() []geo.Intersectable { + return stepPath(s.Box).Path +} + +func (s shapeStep) GetSVGPathData() []string { + return []string{ + stepPath(s.Box).PathData(), + } +} diff --git a/lib/shape/shape_stored_data.go b/lib/shape/shape_stored_data.go new file mode 100644 index 000000000..734037a75 --- /dev/null +++ b/lib/shape/shape_stored_data.go @@ -0,0 +1,47 @@ +package shape + +import ( + "oss.terrastruct.com/d2/lib/geo" + "oss.terrastruct.com/d2/lib/svg" +) + +type shapeStoredData struct { + *baseShape +} + +func NewStoredData(box *geo.Box) Shape { + return shapeStoredData{ + baseShape: &baseShape{ + Type: STORED_DATA_TYPE, + Box: box, + }, + } +} + +func storedDataPath(box *geo.Box) *svg.SvgPathContext { + wedgeWidth := 15.0 + multiplier := 0.27 + if box.Width < wedgeWidth*2 { + wedgeWidth = box.Width / 2.0 + } + pc := svg.NewSVGPathContext(box.TopLeft, 1, 1) + pc.StartAt(pc.Absolute(wedgeWidth, 0)) + pc.H(true, box.Width-wedgeWidth) + pc.C(false, box.Width-wedgeWidth*multiplier, 0, box.Width-wedgeWidth, box.Height*multiplier, box.Width-wedgeWidth, box.Height/2.0) + pc.C(false, box.Width-wedgeWidth, box.Height-box.Height*multiplier, box.Width-wedgeWidth*multiplier, box.Height, box.Width, box.Height) + pc.H(true, -(box.Width - wedgeWidth)) + pc.C(false, wedgeWidth-wedgeWidth*multiplier, box.Height, 0, box.Height-box.Height*multiplier, 0, box.Height/2.0) + pc.C(false, 0, box.Height*multiplier, wedgeWidth-wedgeWidth*multiplier, 0, wedgeWidth, 0) + pc.Z() + return pc +} + +func (s shapeStoredData) Perimeter() []geo.Intersectable { + return storedDataPath(s.Box).Path +} + +func (s shapeStoredData) GetSVGPathData() []string { + return []string{ + storedDataPath(s.Box).PathData(), + } +} diff --git a/lib/shape/shape_table.go b/lib/shape/shape_table.go new file mode 100644 index 000000000..6a9ad8044 --- /dev/null +++ b/lib/shape/shape_table.go @@ -0,0 +1,21 @@ +package shape + +import ( + "oss.terrastruct.com/d2/lib/geo" +) + +// Table is basically a rectangle +type shapeTable struct { + shapeSquare +} + +func NewTable(box *geo.Box) Shape { + return shapeTable{ + shapeSquare{ + baseShape: &baseShape{ + Type: TABLE_TYPE, + Box: box, + }, + }, + } +} diff --git a/lib/shape/shape_text.go b/lib/shape/shape_text.go new file mode 100644 index 000000000..18343205f --- /dev/null +++ b/lib/shape/shape_text.go @@ -0,0 +1,21 @@ +package shape + +import ( + "oss.terrastruct.com/d2/lib/geo" +) + +// Text is basically a rectangle +type shapeText struct { + shapeSquare +} + +func NewText(box *geo.Box) Shape { + return shapeText{ + shapeSquare: shapeSquare{ + baseShape: &baseShape{ + Type: TEXT_TYPE, + Box: box, + }, + }, + } +} diff --git a/lib/svg/path.go b/lib/svg/path.go new file mode 100644 index 000000000..a643479f2 --- /dev/null +++ b/lib/svg/path.go @@ -0,0 +1,107 @@ +package svg + +import ( + "fmt" + "math" + "strings" + + "oss.terrastruct.com/d2/lib/geo" +) + +type SvgPathContext struct { + Path []geo.Intersectable + Commands []string + Start *geo.Point + Current *geo.Point + TopLeft *geo.Point + ScaleX float64 + ScaleY float64 +} + +// TODO probably use math.Big +func chopPrecision(f float64) float64 { + return math.Round(f*10000) / 10000 +} + +func NewSVGPathContext(tl *geo.Point, sx, sy float64) *SvgPathContext { + return &SvgPathContext{TopLeft: tl.Copy(), ScaleX: sx, ScaleY: sy} +} + +func (c *SvgPathContext) Relative(base *geo.Point, dx, dy float64) *geo.Point { + return geo.NewPoint(chopPrecision(base.X+c.ScaleX*dx), chopPrecision(base.Y+c.ScaleY*dy)) +} +func (c *SvgPathContext) Absolute(x, y float64) *geo.Point { + return c.Relative(c.TopLeft, x, y) +} + +func (c *SvgPathContext) StartAt(p *geo.Point) { + c.Start = p + c.Commands = append(c.Commands, fmt.Sprintf("M %v %v", p.X, p.Y)) + c.Current = p.Copy() +} + +func (c *SvgPathContext) Z() { + c.Path = append(c.Path, &geo.Segment{Start: c.Current.Copy(), End: c.Start.Copy()}) + c.Commands = append(c.Commands, "Z") + c.Current = c.Start.Copy() +} + +func (c *SvgPathContext) L(isLowerCase bool, x, y float64) { + var endPoint *geo.Point + if isLowerCase { + endPoint = c.Relative(c.Current, x, y) + } else { + endPoint = c.Absolute(x, y) + } + c.Path = append(c.Path, &geo.Segment{Start: c.Current.Copy(), End: endPoint}) + c.Commands = append(c.Commands, fmt.Sprintf("L %v %v", endPoint.X, endPoint.Y)) + c.Current = endPoint.Copy() +} + +func (c *SvgPathContext) C(isLowerCase bool, x1, y1, x2, y2, x3, y3 float64) { + p := func(x, y float64) *geo.Point { + if isLowerCase { + return c.Relative(c.Current, x, y) + } + return c.Absolute(x, y) + } + points := []*geo.Point{c.Current.Copy(), p(x1, y1), p(x2, y2), p(x3, y3)} + c.Path = append(c.Path, geo.NewBezierCurve(points)) + c.Commands = append(c.Commands, fmt.Sprintf( + "C %v %v %v %v %v %v", + points[1].X, points[1].Y, + points[2].X, points[2].Y, + points[3].X, points[3].Y, + )) + c.Current = points[3].Copy() +} + +func (c *SvgPathContext) H(isLowerCase bool, x float64) { + var endPoint *geo.Point + if isLowerCase { + endPoint = c.Relative(c.Current, x, 0) + } else { + endPoint = c.Absolute(x, 0) + endPoint.Y = c.Current.Y + } + c.Path = append(c.Path, &geo.Segment{Start: c.Current.Copy(), End: endPoint.Copy()}) + c.Commands = append(c.Commands, fmt.Sprintf("H %v", endPoint.X)) + c.Current = endPoint.Copy() +} + +func (c *SvgPathContext) V(isLowerCase bool, y float64) { + var endPoint *geo.Point + if isLowerCase { + endPoint = c.Relative(c.Current, 0, y) + } else { + endPoint = c.Absolute(0, y) + endPoint.X = c.Current.X + } + c.Path = append(c.Path, &geo.Segment{Start: c.Current.Copy(), End: endPoint}) + c.Commands = append(c.Commands, fmt.Sprintf("V %v", endPoint.Y)) + c.Current = endPoint.Copy() +} + +func (c *SvgPathContext) PathData() string { + return strings.Join(c.Commands, " ") +} diff --git a/lib/xbrowser/xbrowser.go b/lib/xbrowser/xbrowser.go new file mode 100644 index 000000000..5e7341f61 --- /dev/null +++ b/lib/xbrowser/xbrowser.go @@ -0,0 +1,25 @@ +package xbrowser + +import ( + "context" + "fmt" + "os/exec" + + "github.com/pkg/browser" + + "oss.terrastruct.com/xos" +) + +func OpenURL(ctx context.Context, env *xos.Env, url string) error { + browserEnv := env.Getenv("BROWSER") + if browserEnv != "" { + browserSh := fmt.Sprintf("%s '$1'", browserEnv) + cmd := exec.CommandContext(ctx, "sh", "-c", browserSh, "--", url) + out, err := cmd.CombinedOutput() + if err != nil { + return fmt.Errorf("failed to run %v (out: %q): %w", cmd.Args, out, err) + } + return nil + } + return browser.OpenURL(url) +} diff --git a/lib/xexec/xexec.go b/lib/xexec/xexec.go new file mode 100644 index 000000000..aa93afecf --- /dev/null +++ b/lib/xexec/xexec.go @@ -0,0 +1,57 @@ +package xexec + +import ( + "errors" + "io/fs" + "os" + "path/filepath" + "strings" +) + +// findExecutable is from package exec +func findExecutable(file string) error { + d, err := os.Stat(file) + if err != nil { + return err + } + if m := d.Mode(); !m.IsDir() && m&0111 != 0 { + return nil + } + return fs.ErrPermission +} + +// SearchPath searches for all executables that have prefix in their names in +// the directories named by the PATH environment variable. +func SearchPath(prefix string) ([]string, error) { + var matches []string + envPath := os.Getenv("PATH") + dirSet := make(map[string]struct{}) + for _, dir := range filepath.SplitList(envPath) { + if dir == "" { + // From exec package: + // Unix shell semantics: path element "" means "." + dir = "." + } + if _, ok := dirSet[dir]; ok { + continue + } + dirSet[dir] = struct{}{} + files, err := os.ReadDir(dir) + if err != nil { + if errors.Is(err, fs.ErrNotExist) { + continue + } + return nil, err + } + for _, f := range files { + if strings.HasPrefix(f.Name(), prefix) { + match := filepath.Join(dir, f.Name()) + if err := findExecutable(match); err == nil { + matches = append(matches, match) + } + } + } + + } + return matches, nil +} diff --git a/lib/xhttp/err.go b/lib/xhttp/err.go new file mode 100644 index 000000000..e983f194c --- /dev/null +++ b/lib/xhttp/err.go @@ -0,0 +1,165 @@ +package xhttp + +import ( + "encoding/json" + "errors" + "fmt" + "log" + "net/http" + + "oss.terrastruct.com/cmdlog" +) + +// Error represents an HTTP error. +// It's exported only for comparison in tests. +type Error struct { + Code int + Resp interface{} + Err error +} + +var _ interface { + Is(error) bool + Unwrap() error +} = Error{} + +// Errorf creates a new error with code, resp, msg and v. +// +// When returned from an xhttp.HandlerFunc, it will be correctly logged +// and written to the connection. See xhttp.WrapHandlerFunc +func Errorf(code int, resp interface{}, msg string, v ...interface{}) error { + return errorWrap(code, resp, fmt.Errorf(msg, v...)) +} + +// ErrorWrap wraps err with the code and resp for xhttp.HandlerFunc. +// +// When returned from an xhttp.HandlerFunc, it will be correctly logged +// and written to the connection. See xhttp.WrapHandlerFunc +func ErrorWrap(code int, resp interface{}, err error) error { + return errorWrap(code, resp, err) +} + +func errorWrap(code int, resp interface{}, err error) error { + if resp == nil { + resp = http.StatusText(code) + } + return Error{code, resp, err} +} + +func (e Error) Unwrap() error { + return e.Err +} + +func (e Error) Is(err error) bool { + e2, ok := err.(Error) + if !ok { + return false + } + return e.Code == e2.Code && e.Resp == e2.Resp && errors.Is(e.Err, e2.Err) +} + +func (e Error) Error() string { + return fmt.Sprintf("http error with code %v and resp %#v: %v", e.Code, e.Resp, e.Err) +} + +// HandlerFunc is like http.HandlerFunc but returns an error. +// See Errorf and ErrorWrap. +type HandlerFunc func(w http.ResponseWriter, r *http.Request) error + +type HandlerFuncAdapter struct { + Log *cmdlog.Logger + Func HandlerFunc +} + +// ServeHTTP adapts xhttp.HandlerFunc into http.Handler for usage with standard +// HTTP routers like chi. +// +// It logs and writes any error from xhttp.HandlerFunc to the connection. +// +// If err was created with xhttp.Errorf or wrapped with xhttp.WrapError, then the error +// will be logged at the correct level for the status code and xhttp.JSON will be called +// with the code and resp. +// +// 400s are logged as warns and 500s as errors. +// +// If the error was not created with the xhttp helpers then a 500 will be written. +// +// If resp is nil, then resp is set to http.StatusText(code) +// +// If the code is not a 400 or a 500, then an error about about the unexpected error code +// will be logged and a 500 will be written. The original error will also be logged. +func (a HandlerFuncAdapter) ServeHTTP(w http.ResponseWriter, r *http.Request) { + var h http.Handler = http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + err := a.Func(w, r) + if err != nil { + handleError(a.Log, w, err) + } + }) + + h.ServeHTTP(w, r) +} + +func handleError(clog *cmdlog.Logger, w http.ResponseWriter, err error) { + var herr Error + ok := errors.As(err, &herr) + if !ok { + herr = ErrorWrap(http.StatusInternalServerError, nil, err).(Error) + } + + var logger *log.Logger + switch { + case 400 <= herr.Code && herr.Code < 500: + logger = clog.Warn + case 500 <= herr.Code && herr.Code < 600: + logger = clog.Error + default: + logger = clog.Error + + clog.Error.Printf("unexpected non error http status code %d with resp: %#v", herr.Code, herr.Resp) + + herr.Code = http.StatusInternalServerError + herr.Resp = nil + } + + if herr.Resp == nil { + herr.Resp = http.StatusText(herr.Code) + } + + logger.Printf("error handling http request: %v", err) + + ww, ok := w.(writtenResponseWriter) + if !ok { + clog.Warn.Printf("response writer does not implement Written, double write logs possible: %#v", w) + } else if ww.Written() { + // Avoid double writes if an error occurred while the response was + // being written. + return + } + + JSON(clog, w, herr.Code, map[string]interface{}{ + "error": herr.Resp, + }) +} + +type writtenResponseWriter interface { + Written() bool +} + +func JSON(clog *cmdlog.Logger, w http.ResponseWriter, code int, v interface{}) { + if v == nil { + v = map[string]interface{}{ + "status": http.StatusText(code), + } + } + + b, err := json.Marshal(v) + if err != nil { + clog.Error.Printf("json marshal error: %v", err) + http.Error(w, http.StatusText(http.StatusInternalServerError), http.StatusInternalServerError) + return + } + + w.Header().Set("Content-Type", "application/json; charset=utf-8") + w.WriteHeader(code) + _, _ = w.Write(b) +} diff --git a/lib/xhttp/log.go b/lib/xhttp/log.go new file mode 100644 index 000000000..0587cbef9 --- /dev/null +++ b/lib/xhttp/log.go @@ -0,0 +1,125 @@ +package xhttp + +import ( + "bufio" + "errors" + "fmt" + "log" + "net" + "net/http" + "runtime/debug" + "time" + + "golang.org/x/text/message" + + "oss.terrastruct.com/cmdlog" +) + +type ResponseWriter interface { + http.ResponseWriter + http.Hijacker + http.Flusher + writtenResponseWriter +} + +var _ ResponseWriter = &responseWriter{} + +type responseWriter struct { + rw http.ResponseWriter + + written bool + status int + length int +} + +func (rw *responseWriter) Header() http.Header { + return rw.rw.Header() +} + +func (rw *responseWriter) WriteHeader(statusCode int) { + if !rw.written { + rw.written = true + rw.status = statusCode + } + rw.rw.WriteHeader(statusCode) +} + +func (rw *responseWriter) Write(p []byte) (int, error) { + if !rw.written && len(p) > 0 { + rw.written = true + if rw.status == 0 { + rw.status = http.StatusOK + } + } + rw.length += len(p) + return rw.rw.Write(p) +} + +func (rw *responseWriter) Hijack() (net.Conn, *bufio.ReadWriter, error) { + hj, ok := rw.rw.(http.Hijacker) + if !ok { + return nil, nil, fmt.Errorf("underlying response writer does not implement http.Hijacker: %T", rw.rw) + } + return hj.Hijack() +} + +func (rw *responseWriter) Flush() { + f, ok := rw.rw.(http.Flusher) + if !ok { + return + } + f.Flush() +} + +func (rw *responseWriter) Written() bool { + return rw.written +} + +func Log(clog *cmdlog.Logger, next http.Handler) http.Handler { + englishPrinter := message.NewPrinter(message.MatchLanguage("en")) + return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + defer func() { + rec := recover() + if rec != nil { + clog.Error.Printf("caught panic: %#v\n%s", rec, debug.Stack()) + JSON(clog, w, http.StatusInternalServerError, map[string]interface{}{ + "error": http.StatusText(http.StatusInternalServerError), + }) + } + }() + + rw := &responseWriter{ + rw: w, + } + + start := time.Now() + next.ServeHTTP(rw, r) + dur := time.Since(start) + + if !rw.Written() { + _, err := rw.Write(nil) + if errors.Is(err, http.ErrHijacked) { + clog.Success.Printf("%s %s %v: hijacked", r.Method, r.URL, dur) + return + } + + clog.Warn.Printf("%s %s %v: no response written", r.Method, r.URL, dur) + return + } + + var statusLogger *log.Logger + switch { + case 100 <= rw.status && rw.status <= 299: + statusLogger = clog.Success + case 300 <= rw.status && rw.status <= 399: + statusLogger = clog.Info + case 400 <= rw.status && rw.status <= 499: + statusLogger = clog.Warn + case 500 <= rw.status && rw.status <= 599: + statusLogger = clog.Error + } + lengthStr := englishPrinter.Sprint(rw.length) + // TODO: make work with watch.go on hijack, not after + statusLogger.Printf("%s %s %d %sB %v", r.Method, r.URL, rw.status, lengthStr, dur) + }) +} diff --git a/lib/xhttp/serve.go b/lib/xhttp/serve.go new file mode 100644 index 000000000..e7c7c1a24 --- /dev/null +++ b/lib/xhttp/serve.go @@ -0,0 +1,44 @@ +// Package xhttp implements http helpers. +package xhttp + +import ( + "context" + "log" + "net" + "net/http" + "time" + + "oss.terrastruct.com/xcontext" +) + +func NewServer(log *log.Logger, h http.Handler) *http.Server { + return &http.Server{ + MaxHeaderBytes: 1 << 18, // 262,144B + ReadTimeout: time.Minute, + WriteTimeout: time.Minute, + IdleTimeout: time.Hour, + ErrorLog: log, + Handler: http.MaxBytesHandler(h, 1<<20), // 1,048,576B + } +} + +func Serve(ctx context.Context, shutdownTimeout time.Duration, s *http.Server, l net.Listener) error { + s.BaseContext = func(net.Listener) context.Context { + return ctx + } + + done := make(chan error, 1) + go func() { + done <- s.Serve(l) + }() + + select { + case err := <-done: + return err + case <-ctx.Done(): + ctx = xcontext.WithoutCancel(ctx) + ctx, cancel := context.WithTimeout(ctx, shutdownTimeout) + defer cancel() + return s.Shutdown(ctx) + } +} diff --git a/lib/xmain/xmain.go b/lib/xmain/xmain.go new file mode 100644 index 000000000..d71147776 --- /dev/null +++ b/lib/xmain/xmain.go @@ -0,0 +1,194 @@ +// Package xmain provides a standard stub for the main of a command handling logging, +// flags, signals and shutdown. +package xmain + +import ( + "context" + "errors" + "fmt" + "io" + "os" + "os/signal" + "strings" + "syscall" + "time" + + "cdr.dev/slog" + "cdr.dev/slog/sloggers/sloghuman" + "github.com/spf13/pflag" + + "oss.terrastruct.com/xos" + + "oss.terrastruct.com/cmdlog" + + ctxlog "oss.terrastruct.com/d2/lib/log" +) + +type RunFunc func(context.Context, *State) error + +func Main(run RunFunc) { + name := "" + args := []string(nil) + if len(os.Args) > 0 { + name = os.Args[0] + args = os.Args[1:] + } + + ms := &State{ + Name: name, + + Stdin: os.Stdin, + Stdout: os.Stdout, + Stderr: os.Stderr, + + Env: xos.NewEnv(os.Environ()), + FlagSet: pflag.NewFlagSet("", pflag.ContinueOnError), + Args: args, + } + ms.Log = cmdlog.Log(ms.Env, os.Stderr) + ms.FlagSet.SortFlags = false + ms.FlagSet.Usage = func() {} + ms.FlagSet.SetOutput(io.Discard) + + sigs := make(chan os.Signal, 1) + signal.Notify(sigs, os.Interrupt, syscall.SIGTERM) + + err := ms.Main(context.Background(), sigs, run) + if err != nil { + code := 1 + msg := "" + usage := false + + var eerr ExitError + var uerr UsageError + if errors.As(err, &eerr) { + code = eerr.Code + msg = eerr.Message + } else if errors.As(err, &uerr) { + msg = err.Error() + usage = true + } else { + msg = err.Error() + } + + if msg != "" { + if usage { + msg = fmt.Sprintf("%s\n%s", msg, "Run with --help to see usage.") + } + ms.Log.Error.Print(msg) + } + os.Exit(code) + } +} + +type State struct { + Name string + + Stdin io.Reader + Stdout io.WriteCloser + Stderr io.WriteCloser + + Log *cmdlog.Logger + Env *xos.Env + Args []string + FlagSet *pflag.FlagSet +} + +func (ms *State) Main(ctx context.Context, sigs <-chan os.Signal, run func(context.Context, *State) error) error { + ctx, cancel := context.WithCancel(ctx) + defer cancel() + + done := make(chan error, 1) + go func() { + defer close(done) + done <- run(ctx, ms) + }() + + select { + case err := <-done: + return err + case sig := <-sigs: + ms.Log.Warn.Printf("received signal %v: shutting down...", sig) + cancel() + select { + case err := <-done: + if err != nil && !errors.Is(err, context.Canceled) { + return fmt.Errorf("failed to shutdown: %w", err) + } + if sig == syscall.SIGTERM { + // We successfully shutdown. + return nil + } + return ExitError{Code: 1} + case <-time.After(time.Minute): + return ExitError{ + Code: 1, + Message: "took longer than 1 minute to shutdown: exiting forcefully", + } + } + } +} + +func (ms *State) FlagHelp() string { + b := &strings.Builder{} + ms.FlagSet.SetOutput(b) + ms.FlagSet.PrintDefaults() + return b.String() +} + +type ExitError struct { + Code int `json:"code"` + Message string `json:"message"` +} + +func ExitErrorf(code int, msg string, v ...interface{}) ExitError { + return ExitError{ + Code: code, + Message: fmt.Sprintf(msg, v...), + } +} + +func (ee ExitError) Error() string { + s := fmt.Sprintf("exiting with code %d", ee.Code) + if ee.Message != "" { + s += ": " + ee.Message + } + return s +} + +type UsageError struct { + Message string `json:"message"` +} + +func UsageErrorf(msg string, v ...interface{}) UsageError { + return UsageError{ + Message: fmt.Sprintf(msg, v...), + } +} + +func (ue UsageError) Error() string { + return fmt.Sprintf("bad usage: %s", ue.Message) +} + +func (ms *State) ReadPath(fp string) ([]byte, error) { + if fp == "-" { + return io.ReadAll(ms.Stdin) + } + return os.ReadFile(fp) +} + +func (ms *State) WritePath(fp string, p []byte) error { + if fp == "-" { + _, err := ms.Stdout.Write(p) + if err != nil { + return err + } + return ms.Stdout.Close() + } + return os.WriteFile(fp, p, 0644) +} + +// TODO: remove after removing slog +func DiscardSlog(ctx context.Context) context.Context { + return ctxlog.With(ctx, slog.Make(sloghuman.Sink(io.Discard))) +} diff --git a/make.sh b/make.sh new file mode 100755 index 000000000..29fa6689b --- /dev/null +++ b/make.sh @@ -0,0 +1,7 @@ +#!/bin/sh +set -eu +. "$(dirname "$0")/ci/sub/lib.sh" +PATH="$(cd -- "$(dirname "$0")" && pwd)/ci/sub/bin:$PATH" +cd "$(dirname "$0")" + +_make "$@" diff --git a/testdata/d2compiler/TestCompile/3d_oval.exp.json b/testdata/d2compiler/TestCompile/3d_oval.exp.json new file mode 100644 index 000000000..549165a32 --- /dev/null +++ b/testdata/d2compiler/TestCompile/3d_oval.exp.json @@ -0,0 +1,12 @@ +{ + "graph": null, + "err": { + "ioerr": null, + "errs": [ + { + "range": "d2/testdata/d2compiler/TestCompile/3d_oval.d2,1:0:23-1:19:42", + "errmsg": "d2/testdata/d2compiler/TestCompile/3d_oval.d2:2:1: key \"3d\" can only be applied to squares and rectangles" + } + ] + } +} diff --git a/testdata/d2compiler/TestCompile/basic_icon.exp.json b/testdata/d2compiler/TestCompile/basic_icon.exp.json new file mode 100644 index 000000000..400adef99 --- /dev/null +++ b/testdata/d2compiler/TestCompile/basic_icon.exp.json @@ -0,0 +1,150 @@ +{ + "graph": { + "ast": { + "range": "d2/testdata/d2compiler/TestCompile/basic_icon.d2,0:0:0-3:0:77", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2compiler/TestCompile/basic_icon.d2,0:0:0-2:1:76", + "key": { + "range": "d2/testdata/d2compiler/TestCompile/basic_icon.d2,0:0:0-0:3:3", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/basic_icon.d2,0:0:0-0:3:3", + "value": [ + { + "string": "hey", + "raw_string": "hey" + } + ] + } + } + ] + }, + "primary": { + "double_quoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/basic_icon.d2,0:5:5-0:7:7", + "value": null + } + }, + "value": { + "map": { + "range": "d2/testdata/d2compiler/TestCompile/basic_icon.d2,0:8:8-2:0:75", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2compiler/TestCompile/basic_icon.d2,1:2:12-1:64:74", + "key": { + "range": "d2/testdata/d2compiler/TestCompile/basic_icon.d2,1:2:12-1:6:16", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/basic_icon.d2,1:2:12-1:6:16", + "value": [ + { + "string": "icon", + "raw_string": "icon" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/basic_icon.d2,1:8:18-1:64:74", + "value": [ + { + "string": "https://icons.terrastruct.com/essentials/004-picture.svg", + "raw_string": "https://icons.terrastruct.com/essentials/004-picture.svg" + } + ] + } + } + } + } + ] + } + } + } + } + ] + }, + "root": { + "id": "", + "id_val": "", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + "edges": null, + "objects": [ + { + "id": "hey", + "id_val": "hey", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2compiler/TestCompile/basic_icon.d2,0:0:0-0:3:3", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/basic_icon.d2,0:0:0-0:3:3", + "value": [ + { + "string": "hey", + "raw_string": "hey" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "icon": { + "Scheme": "https", + "Opaque": "", + "User": null, + "Host": "icons.terrastruct.com", + "Path": "/essentials/004-picture.svg", + "RawPath": "", + "ForceQuery": false, + "RawQuery": "", + "Fragment": "", + "RawFragment": "" + }, + "near_key": null, + "shape": { + "value": "" + } + } + } + ] + }, + "err": null +} diff --git a/testdata/d2compiler/TestCompile/basic_shape.exp.json b/testdata/d2compiler/TestCompile/basic_shape.exp.json new file mode 100644 index 000000000..c7e4a0ac6 --- /dev/null +++ b/testdata/d2compiler/TestCompile/basic_shape.exp.json @@ -0,0 +1,133 @@ +{ + "graph": { + "ast": { + "range": "d2/testdata/d2compiler/TestCompile/basic_shape.d2,0:0:0-4:0:24", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2compiler/TestCompile/basic_shape.d2,1:0:1-3:1:23", + "key": { + "range": "d2/testdata/d2compiler/TestCompile/basic_shape.d2,1:0:1-1:1:2", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/basic_shape.d2,1:0:1-1:1:2", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "map": { + "range": "d2/testdata/d2compiler/TestCompile/basic_shape.d2,1:3:4-3:0:22", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2compiler/TestCompile/basic_shape.d2,2:2:8-2:15:21", + "key": { + "range": "d2/testdata/d2compiler/TestCompile/basic_shape.d2,2:2:8-2:7:13", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/basic_shape.d2,2:2:8-2:7:13", + "value": [ + { + "string": "shape", + "raw_string": "shape" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/basic_shape.d2,2:9:15-2:15:21", + "value": [ + { + "string": "circle", + "raw_string": "circle" + } + ] + } + } + } + } + ] + } + } + } + } + ] + }, + "root": { + "id": "", + "id_val": "", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + "edges": null, + "objects": [ + { + "id": "x", + "id_val": "x", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2compiler/TestCompile/basic_shape.d2,1:0:1-1:1:2", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/basic_shape.d2,1:0:1-1:1:2", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "x" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "circle" + } + } + } + ] + }, + "err": null +} diff --git a/testdata/d2compiler/TestCompile/basic_style.exp.json b/testdata/d2compiler/TestCompile/basic_style.exp.json new file mode 100644 index 000000000..d2a35e1a6 --- /dev/null +++ b/testdata/d2compiler/TestCompile/basic_style.exp.json @@ -0,0 +1,144 @@ +{ + "graph": { + "ast": { + "range": "d2/testdata/d2compiler/TestCompile/basic_style.d2,0:0:0-4:0:28", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2compiler/TestCompile/basic_style.d2,1:0:1-3:1:27", + "key": { + "range": "d2/testdata/d2compiler/TestCompile/basic_style.d2,1:0:1-1:1:2", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/basic_style.d2,1:0:1-1:1:2", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "map": { + "range": "d2/testdata/d2compiler/TestCompile/basic_style.d2,1:3:4-3:0:26", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2compiler/TestCompile/basic_style.d2,2:1:7-2:19:25", + "key": { + "range": "d2/testdata/d2compiler/TestCompile/basic_style.d2,2:1:7-2:14:20", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/basic_style.d2,2:1:7-2:6:12", + "value": [ + { + "string": "style", + "raw_string": "style" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/basic_style.d2,2:7:13-2:14:20", + "value": [ + { + "string": "opacity", + "raw_string": "opacity" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "number": { + "range": "d2/testdata/d2compiler/TestCompile/basic_style.d2,2:16:22-2:19:25", + "raw": "0.4", + "value": "2/5" + } + } + } + } + ] + } + } + } + } + ] + }, + "root": { + "id": "", + "id_val": "", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + "edges": [], + "objects": [ + { + "id": "x", + "id_val": "x", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2compiler/TestCompile/basic_style.d2,1:0:1-1:1:2", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/basic_style.d2,1:0:1-1:1:2", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "x" + }, + "style": { + "opacity": { + "value": "0.4" + } + }, + "near_key": null, + "shape": { + "value": "" + } + } + } + ] + }, + "err": null +} diff --git a/testdata/d2compiler/TestCompile/blank_underscore.exp.json b/testdata/d2compiler/TestCompile/blank_underscore.exp.json new file mode 100644 index 000000000..ced0c2424 --- /dev/null +++ b/testdata/d2compiler/TestCompile/blank_underscore.exp.json @@ -0,0 +1,12 @@ +{ + "graph": null, + "err": { + "ioerr": null, + "errs": [ + { + "range": "d2/testdata/d2compiler/TestCompile/blank_underscore.d2,2:2:11-2:3:12", + "errmsg": "d2/testdata/d2compiler/TestCompile/blank_underscore.d2:3:3: invalid use of parent \"_\"" + } + ] + } +} diff --git a/testdata/d2compiler/TestCompile/class_paren.exp.json b/testdata/d2compiler/TestCompile/class_paren.exp.json new file mode 100644 index 000000000..aede137ff --- /dev/null +++ b/testdata/d2compiler/TestCompile/class_paren.exp.json @@ -0,0 +1,253 @@ +{ + "graph": { + "ast": { + "range": "d2/testdata/d2compiler/TestCompile/class_paren.d2,0:0:0-6:1:81", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2compiler/TestCompile/class_paren.d2,0:0:0-6:1:81", + "key": { + "range": "d2/testdata/d2compiler/TestCompile/class_paren.d2,0:0:0-0:7:7", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/class_paren.d2,0:0:0-0:7:7", + "value": [ + { + "string": "_shape_", + "raw_string": "_shape_" + } + ] + } + } + ] + }, + "primary": { + "double_quoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/class_paren.d2,0:9:9-0:16:16", + "value": [ + { + "string": "shape", + "raw_string": "shape" + } + ] + } + }, + "value": { + "map": { + "range": "d2/testdata/d2compiler/TestCompile/class_paren.d2,0:17:17-6:0:80", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2compiler/TestCompile/class_paren.d2,1:2:21-1:14:33", + "key": { + "range": "d2/testdata/d2compiler/TestCompile/class_paren.d2,1:2:21-1:7:26", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/class_paren.d2,1:2:21-1:7:26", + "value": [ + { + "string": "shape", + "raw_string": "shape" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/class_paren.d2,1:9:28-1:14:33", + "value": [ + { + "string": "class", + "raw_string": "class" + } + ] + } + } + } + }, + { + "map_key": { + "range": "d2/testdata/d2compiler/TestCompile/class_paren.d2,3:1:36-3:11:46", + "key": { + "range": "d2/testdata/d2compiler/TestCompile/class_paren.d2,3:1:36-3:11:46", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/class_paren.d2,3:1:36-3:11:46", + "value": [ + { + "string": "field here", + "raw_string": "field here" + } + ] + } + } + ] + }, + "primary": {}, + "value": {} + } + }, + { + "map_key": { + "range": "d2/testdata/d2compiler/TestCompile/class_paren.d2,4:2:49-4:19:66", + "key": { + "range": "d2/testdata/d2compiler/TestCompile/class_paren.d2,4:2:49-4:11:58", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/class_paren.d2,4:2:49-4:11:58", + "value": [ + { + "string": "GetType()", + "raw_string": "GetType()" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/class_paren.d2,4:13:60-4:19:66", + "value": [ + { + "string": "string", + "raw_string": "string" + } + ] + } + } + } + }, + { + "map_key": { + "range": "d2/testdata/d2compiler/TestCompile/class_paren.d2,5:2:69-5:12:79", + "key": { + "range": "d2/testdata/d2compiler/TestCompile/class_paren.d2,5:2:69-5:6:73", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/class_paren.d2,5:2:69-5:6:73", + "value": [ + { + "string": "Is()", + "raw_string": "Is()" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/class_paren.d2,5:8:75-5:12:79", + "value": [ + { + "string": "bool", + "raw_string": "bool" + } + ] + } + } + } + } + ] + } + } + } + } + ] + }, + "root": { + "id": "", + "id_val": "", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + "edges": [], + "objects": [ + { + "id": "_shape_", + "id_val": "_shape_", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2compiler/TestCompile/class_paren.d2,0:0:0-0:7:7", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/class_paren.d2,0:0:0-0:7:7", + "value": [ + { + "string": "_shape_", + "raw_string": "_shape_" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "class": { + "fields": [ + { + "name": "field here", + "type": "", + "visibility": "public" + } + ], + "methods": [ + { + "name": "GetType()", + "return": "string", + "visibility": "public" + }, + { + "name": "Is()", + "return": "bool", + "visibility": "public" + } + ] + }, + "attributes": { + "label": { + "value": "shape" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "class" + } + } + } + ] + }, + "err": null +} diff --git a/testdata/d2compiler/TestCompile/class_style.exp.json b/testdata/d2compiler/TestCompile/class_style.exp.json new file mode 100644 index 000000000..070d91c08 --- /dev/null +++ b/testdata/d2compiler/TestCompile/class_style.exp.json @@ -0,0 +1,220 @@ +{ + "graph": { + "ast": { + "range": "d2/testdata/d2compiler/TestCompile/class_style.d2,0:0:0-5:0:82", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2compiler/TestCompile/class_style.d2,0:0:0-4:1:81", + "key": { + "range": "d2/testdata/d2compiler/TestCompile/class_style.d2,0:0:0-0:15:15", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/class_style.d2,0:0:0-0:15:15", + "value": [ + { + "string": "IUserProperties", + "raw_string": "IUserProperties" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "map": { + "range": "d2/testdata/d2compiler/TestCompile/class_style.d2,0:17:17-4:0:80", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2compiler/TestCompile/class_style.d2,1:2:21-1:16:35", + "key": { + "range": "d2/testdata/d2compiler/TestCompile/class_style.d2,1:2:21-1:7:26", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/class_style.d2,1:2:21-1:7:26", + "value": [ + { + "string": "shape", + "raw_string": "shape" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "double_quoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/class_style.d2,1:9:28-1:16:35", + "value": [ + { + "string": "class", + "raw_string": "class" + } + ] + } + } + } + }, + { + "map_key": { + "range": "d2/testdata/d2compiler/TestCompile/class_style.d2,2:2:38-2:22:58", + "key": { + "range": "d2/testdata/d2compiler/TestCompile/class_style.d2,2:2:38-2:12:48", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/class_style.d2,2:2:38-2:12:48", + "value": [ + { + "string": "firstName?", + "raw_string": "firstName?" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "double_quoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/class_style.d2,2:14:50-2:22:58", + "value": [ + { + "string": "string", + "raw_string": "string" + } + ] + } + } + } + }, + { + "map_key": { + "range": "d2/testdata/d2compiler/TestCompile/class_style.d2,3:2:61-3:20:79", + "key": { + "range": "d2/testdata/d2compiler/TestCompile/class_style.d2,3:2:61-3:15:74", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/class_style.d2,3:2:61-3:7:66", + "value": [ + { + "string": "style", + "raw_string": "style" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/class_style.d2,3:8:67-3:15:74", + "value": [ + { + "string": "opacity", + "raw_string": "opacity" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "number": { + "range": "d2/testdata/d2compiler/TestCompile/class_style.d2,3:17:76-3:20:79", + "raw": "0.4", + "value": "2/5" + } + } + } + } + ] + } + } + } + } + ] + }, + "root": { + "id": "", + "id_val": "", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + "edges": [], + "objects": [ + { + "id": "IUserProperties", + "id_val": "IUserProperties", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2compiler/TestCompile/class_style.d2,0:0:0-0:15:15", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/class_style.d2,0:0:0-0:15:15", + "value": [ + { + "string": "IUserProperties", + "raw_string": "IUserProperties" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "class": { + "fields": [ + { + "name": "firstName?", + "type": "string", + "visibility": "public" + } + ], + "methods": null + }, + "attributes": { + "label": { + "value": "IUserProperties" + }, + "style": { + "opacity": { + "value": "0.4" + } + }, + "near_key": null, + "shape": { + "value": "class" + } + } + } + ] + }, + "err": null +} diff --git a/testdata/d2compiler/TestCompile/dimensions_on_nonimage.exp.json b/testdata/d2compiler/TestCompile/dimensions_on_nonimage.exp.json new file mode 100644 index 000000000..405923ccf --- /dev/null +++ b/testdata/d2compiler/TestCompile/dimensions_on_nonimage.exp.json @@ -0,0 +1,16 @@ +{ + "graph": null, + "err": { + "ioerr": null, + "errs": [ + { + "range": "d2/testdata/d2compiler/TestCompile/dimensions_on_nonimage.d2,2:1:28-2:11:38", + "errmsg": "d2/testdata/d2compiler/TestCompile/dimensions_on_nonimage.d2:3:2: width is only applicable to image shapes." + }, + { + "range": "d2/testdata/d2compiler/TestCompile/dimensions_on_nonimage.d2,3:1:40-3:12:51", + "errmsg": "d2/testdata/d2compiler/TestCompile/dimensions_on_nonimage.d2:4:2: height is only applicable to image shapes." + } + ] + } +} diff --git a/testdata/d2compiler/TestCompile/edge.exp.json b/testdata/d2compiler/TestCompile/edge.exp.json new file mode 100644 index 000000000..9ca4f6511 --- /dev/null +++ b/testdata/d2compiler/TestCompile/edge.exp.json @@ -0,0 +1,185 @@ +{ + "graph": { + "ast": { + "range": "d2/testdata/d2compiler/TestCompile/edge.d2,0:0:0-2:0:8", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2compiler/TestCompile/edge.d2,1:0:1-1:6:7", + "edges": [ + { + "range": "d2/testdata/d2compiler/TestCompile/edge.d2,1:0:1-1:6:7", + "src": { + "range": "d2/testdata/d2compiler/TestCompile/edge.d2,1:0:1-1:2:3", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/edge.d2,1:0:1-1:1:2", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "src_arrow": "", + "dst": { + "range": "d2/testdata/d2compiler/TestCompile/edge.d2,1:4:5-1:6:7", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/edge.d2,1:5:6-1:6:7", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + } + ] + }, + "dst_arrow": ">" + } + ], + "primary": {}, + "value": {} + } + } + ] + }, + "root": { + "id": "", + "id_val": "", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + "edges": [ + { + "index": 0, + "minWidth": 0, + "minHeight": 0, + "label_dimensions": { + "width": 0, + "height": 0 + }, + "isCurve": false, + "src_arrow": false, + "dst_arrow": true, + "references": [ + { + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ], + "objects": [ + { + "id": "x", + "id_val": "x", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2compiler/TestCompile/edge.d2,1:0:1-1:2:3", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/edge.d2,1:0:1-1:1:2", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "x" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "y", + "id_val": "y", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2compiler/TestCompile/edge.d2,1:4:5-1:6:7", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/edge.d2,1:5:6-1:6:7", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "y" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ] + }, + "err": null +} diff --git a/testdata/d2compiler/TestCompile/edge_arrowhead_fields.exp.json b/testdata/d2compiler/TestCompile/edge_arrowhead_fields.exp.json new file mode 100644 index 000000000..3110298fc --- /dev/null +++ b/testdata/d2compiler/TestCompile/edge_arrowhead_fields.exp.json @@ -0,0 +1,388 @@ +{ + "graph": { + "ast": { + "range": "d2/testdata/d2compiler/TestCompile/edge_arrowhead_fields.d2,0:0:0-9:0:168", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2compiler/TestCompile/edge_arrowhead_fields.d2,0:0:0-8:1:167", + "edges": [ + { + "range": "d2/testdata/d2compiler/TestCompile/edge_arrowhead_fields.d2,0:0:0-0:6:6", + "src": { + "range": "d2/testdata/d2compiler/TestCompile/edge_arrowhead_fields.d2,0:0:0-0:2:2", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/edge_arrowhead_fields.d2,0:0:0-0:1:1", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "src_arrow": "", + "dst": { + "range": "d2/testdata/d2compiler/TestCompile/edge_arrowhead_fields.d2,0:4:4-0:6:6", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/edge_arrowhead_fields.d2,0:5:5-0:6:6", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + } + ] + }, + "dst_arrow": ">" + } + ], + "primary": {}, + "value": { + "map": { + "range": "d2/testdata/d2compiler/TestCompile/edge_arrowhead_fields.d2,0:8:8-8:0:166", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2compiler/TestCompile/edge_arrowhead_fields.d2,1:2:12-3:3:91", + "key": { + "range": "d2/testdata/d2compiler/TestCompile/edge_arrowhead_fields.d2,1:2:12-1:18:28", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/edge_arrowhead_fields.d2,1:2:12-1:18:28", + "value": [ + { + "string": "source-arrowhead", + "raw_string": "source-arrowhead" + } + ] + } + } + ] + }, + "primary": { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/edge_arrowhead_fields.d2,1:20:30-1:56:66", + "value": [ + { + "string": "Reisner's Rule of Conceptual Inertia", + "raw_string": "Reisner's Rule of Conceptual Inertia" + } + ] + } + }, + "value": { + "map": { + "range": "d2/testdata/d2compiler/TestCompile/edge_arrowhead_fields.d2,1:57:67-3:2:90", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2compiler/TestCompile/edge_arrowhead_fields.d2,2:4:73-2:18:87", + "key": { + "range": "d2/testdata/d2compiler/TestCompile/edge_arrowhead_fields.d2,2:4:73-2:9:78", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/edge_arrowhead_fields.d2,2:4:73-2:9:78", + "value": [ + { + "string": "shape", + "raw_string": "shape" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/edge_arrowhead_fields.d2,2:11:80-2:18:87", + "value": [ + { + "string": "diamond", + "raw_string": "diamond" + } + ] + } + } + } + } + ] + } + } + } + }, + { + "map_key": { + "range": "d2/testdata/d2compiler/TestCompile/edge_arrowhead_fields.d2,4:2:94-4:24:116", + "key": { + "range": "d2/testdata/d2compiler/TestCompile/edge_arrowhead_fields.d2,4:2:94-4:18:110", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/edge_arrowhead_fields.d2,4:2:94-4:18:110", + "value": [ + { + "string": "target-arrowhead", + "raw_string": "target-arrowhead" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/edge_arrowhead_fields.d2,4:20:112-4:24:116", + "value": [ + { + "string": "QOTD", + "raw_string": "QOTD" + } + ] + } + } + } + }, + { + "map_key": { + "range": "d2/testdata/d2compiler/TestCompile/edge_arrowhead_fields.d2,5:2:119-7:3:165", + "key": { + "range": "d2/testdata/d2compiler/TestCompile/edge_arrowhead_fields.d2,5:2:119-5:18:135", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/edge_arrowhead_fields.d2,5:2:119-5:18:135", + "value": [ + { + "string": "target-arrowhead", + "raw_string": "target-arrowhead" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "map": { + "range": "d2/testdata/d2compiler/TestCompile/edge_arrowhead_fields.d2,5:20:137-7:2:164", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2compiler/TestCompile/edge_arrowhead_fields.d2,6:4:143-6:22:161", + "key": { + "range": "d2/testdata/d2compiler/TestCompile/edge_arrowhead_fields.d2,6:4:143-6:16:155", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/edge_arrowhead_fields.d2,6:4:143-6:9:148", + "value": [ + { + "string": "style", + "raw_string": "style" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/edge_arrowhead_fields.d2,6:10:149-6:16:155", + "value": [ + { + "string": "filled", + "raw_string": "filled" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "boolean": { + "range": "d2/testdata/d2compiler/TestCompile/edge_arrowhead_fields.d2,6:18:157-6:22:161", + "value": true + } + } + } + } + ] + } + } + } + } + ] + } + } + } + } + ] + }, + "root": { + "id": "", + "id_val": "", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + "edges": [ + { + "index": 0, + "minWidth": 0, + "minHeight": 0, + "label_dimensions": { + "width": 0, + "height": 0 + }, + "isCurve": false, + "src_arrow": false, + "srcArrowhead": { + "label": { + "value": "Reisner's Rule of Conceptual Inertia" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "diamond" + } + }, + "dst_arrow": true, + "dstArrowhead": { + "label": { + "value": "QOTD" + }, + "style": { + "filled": { + "value": "true" + } + }, + "near_key": null, + "shape": { + "value": "" + } + }, + "references": [ + { + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ], + "objects": [ + { + "id": "x", + "id_val": "x", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2compiler/TestCompile/edge_arrowhead_fields.d2,0:0:0-0:2:2", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/edge_arrowhead_fields.d2,0:0:0-0:1:1", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "x" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "y", + "id_val": "y", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2compiler/TestCompile/edge_arrowhead_fields.d2,0:4:4-0:6:6", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/edge_arrowhead_fields.d2,0:5:5-0:6:6", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "y" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ] + }, + "err": null +} diff --git a/testdata/d2compiler/TestCompile/edge_chain.exp.json b/testdata/d2compiler/TestCompile/edge_chain.exp.json new file mode 100644 index 000000000..fad3904ac --- /dev/null +++ b/testdata/d2compiler/TestCompile/edge_chain.exp.json @@ -0,0 +1,319 @@ +{ + "graph": { + "ast": { + "range": "d2/testdata/d2compiler/TestCompile/edge_chain.d2,0:0:0-2:0:57", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2compiler/TestCompile/edge_chain.d2,1:0:1-1:55:56", + "edges": [ + { + "range": "d2/testdata/d2compiler/TestCompile/edge_chain.d2,1:0:1-1:7:8", + "src": { + "range": "d2/testdata/d2compiler/TestCompile/edge_chain.d2,1:0:1-1:2:3", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/edge_chain.d2,1:0:1-1:1:2", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "src_arrow": "", + "dst": { + "range": "d2/testdata/d2compiler/TestCompile/edge_chain.d2,1:4:5-1:7:8", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/edge_chain.d2,1:5:6-1:6:7", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + } + ] + }, + "dst_arrow": ">" + }, + { + "range": "d2/testdata/d2compiler/TestCompile/edge_chain.d2,1:4:5-1:11:12", + "src": { + "range": "d2/testdata/d2compiler/TestCompile/edge_chain.d2,1:4:5-1:7:8", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/edge_chain.d2,1:5:6-1:6:7", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + } + ] + }, + "src_arrow": "", + "dst": { + "range": "d2/testdata/d2compiler/TestCompile/edge_chain.d2,1:9:10-1:11:12", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/edge_chain.d2,1:10:11-1:11:12", + "value": [ + { + "string": "z", + "raw_string": "z" + } + ] + } + } + ] + }, + "dst_arrow": ">" + } + ], + "primary": {}, + "value": { + "double_quoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/edge_chain.d2,1:13:14-1:55:56", + "value": [ + { + "string": "The kids will love our inflatable slides", + "raw_string": "The kids will love our inflatable slides" + } + ] + } + } + } + } + ] + }, + "root": { + "id": "", + "id_val": "", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + "edges": [ + { + "index": 0, + "minWidth": 0, + "minHeight": 0, + "label_dimensions": { + "width": 0, + "height": 0 + }, + "isCurve": false, + "src_arrow": false, + "dst_arrow": true, + "references": [ + { + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "The kids will love our inflatable slides" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "index": 0, + "minWidth": 0, + "minHeight": 0, + "label_dimensions": { + "width": 0, + "height": 0 + }, + "isCurve": false, + "src_arrow": false, + "dst_arrow": true, + "references": [ + { + "map_key_edge_index": 1 + } + ], + "attributes": { + "label": { + "value": "The kids will love our inflatable slides" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ], + "objects": [ + { + "id": "x", + "id_val": "x", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2compiler/TestCompile/edge_chain.d2,1:0:1-1:2:3", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/edge_chain.d2,1:0:1-1:1:2", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "x" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "y", + "id_val": "y", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2compiler/TestCompile/edge_chain.d2,1:4:5-1:7:8", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/edge_chain.d2,1:5:6-1:6:7", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + }, + { + "key": { + "range": "d2/testdata/d2compiler/TestCompile/edge_chain.d2,1:4:5-1:7:8", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/edge_chain.d2,1:5:6-1:6:7", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 1 + } + ], + "attributes": { + "label": { + "value": "y" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "z", + "id_val": "z", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2compiler/TestCompile/edge_chain.d2,1:9:10-1:11:12", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/edge_chain.d2,1:10:11-1:11:12", + "value": [ + { + "string": "z", + "raw_string": "z" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 1 + } + ], + "attributes": { + "label": { + "value": "z" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ] + }, + "err": null +} diff --git a/testdata/d2compiler/TestCompile/edge_chain_map.exp.json b/testdata/d2compiler/TestCompile/edge_chain_map.exp.json new file mode 100644 index 000000000..df003d462 --- /dev/null +++ b/testdata/d2compiler/TestCompile/edge_chain_map.exp.json @@ -0,0 +1,348 @@ +{ + "graph": { + "ast": { + "range": "d2/testdata/d2compiler/TestCompile/edge_chain_map.d2,0:0:0-4:0:107", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2compiler/TestCompile/edge_chain_map.d2,1:0:1-3:1:106", + "edges": [ + { + "range": "d2/testdata/d2compiler/TestCompile/edge_chain_map.d2,1:0:1-1:7:8", + "src": { + "range": "d2/testdata/d2compiler/TestCompile/edge_chain_map.d2,1:0:1-1:2:3", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/edge_chain_map.d2,1:0:1-1:1:2", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "src_arrow": "", + "dst": { + "range": "d2/testdata/d2compiler/TestCompile/edge_chain_map.d2,1:4:5-1:7:8", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/edge_chain_map.d2,1:5:6-1:6:7", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + } + ] + }, + "dst_arrow": ">" + }, + { + "range": "d2/testdata/d2compiler/TestCompile/edge_chain_map.d2,1:4:5-1:11:12", + "src": { + "range": "d2/testdata/d2compiler/TestCompile/edge_chain_map.d2,1:4:5-1:7:8", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/edge_chain_map.d2,1:5:6-1:6:7", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + } + ] + }, + "src_arrow": "", + "dst": { + "range": "d2/testdata/d2compiler/TestCompile/edge_chain_map.d2,1:9:10-1:11:12", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/edge_chain_map.d2,1:10:11-1:11:12", + "value": [ + { + "string": "z", + "raw_string": "z" + } + ] + } + } + ] + }, + "dst_arrow": ">" + } + ], + "primary": {}, + "value": { + "map": { + "range": "d2/testdata/d2compiler/TestCompile/edge_chain_map.d2,1:13:14-3:0:105", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2compiler/TestCompile/edge_chain_map.d2,2:2:18-2:88:104", + "key": { + "range": "d2/testdata/d2compiler/TestCompile/edge_chain_map.d2,2:2:18-2:7:23", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/edge_chain_map.d2,2:2:18-2:7:23", + "value": [ + { + "string": "label", + "raw_string": "label" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "double_quoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/edge_chain_map.d2,2:9:25-2:88:104", + "value": [ + { + "string": "Space: the final frontier. These are the voyages of the starship Enterprise.", + "raw_string": "Space: the final frontier. These are the voyages of the starship Enterprise." + } + ] + } + } + } + } + ] + } + } + } + } + ] + }, + "root": { + "id": "", + "id_val": "", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + "edges": [ + { + "index": 0, + "minWidth": 0, + "minHeight": 0, + "label_dimensions": { + "width": 0, + "height": 0 + }, + "isCurve": false, + "src_arrow": false, + "dst_arrow": true, + "references": [ + { + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "Space: the final frontier. These are the voyages of the starship Enterprise." + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "index": 0, + "minWidth": 0, + "minHeight": 0, + "label_dimensions": { + "width": 0, + "height": 0 + }, + "isCurve": false, + "src_arrow": false, + "dst_arrow": true, + "references": [ + { + "map_key_edge_index": 1 + } + ], + "attributes": { + "label": { + "value": "Space: the final frontier. These are the voyages of the starship Enterprise." + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ], + "objects": [ + { + "id": "x", + "id_val": "x", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2compiler/TestCompile/edge_chain_map.d2,1:0:1-1:2:3", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/edge_chain_map.d2,1:0:1-1:1:2", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "x" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "y", + "id_val": "y", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2compiler/TestCompile/edge_chain_map.d2,1:4:5-1:7:8", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/edge_chain_map.d2,1:5:6-1:6:7", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + }, + { + "key": { + "range": "d2/testdata/d2compiler/TestCompile/edge_chain_map.d2,1:4:5-1:7:8", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/edge_chain_map.d2,1:5:6-1:6:7", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 1 + } + ], + "attributes": { + "label": { + "value": "y" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "z", + "id_val": "z", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2compiler/TestCompile/edge_chain_map.d2,1:9:10-1:11:12", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/edge_chain_map.d2,1:10:11-1:11:12", + "value": [ + { + "string": "z", + "raw_string": "z" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 1 + } + ], + "attributes": { + "label": { + "value": "z" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ] + }, + "err": null +} diff --git a/testdata/d2compiler/TestCompile/edge_exclusive_style.exp.json b/testdata/d2compiler/TestCompile/edge_exclusive_style.exp.json new file mode 100644 index 000000000..47a51ab19 --- /dev/null +++ b/testdata/d2compiler/TestCompile/edge_exclusive_style.exp.json @@ -0,0 +1,234 @@ +{ + "graph": { + "ast": { + "range": "d2/testdata/d2compiler/TestCompile/edge_exclusive_style.d2,0:0:0-4:0:35", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2compiler/TestCompile/edge_exclusive_style.d2,1:0:1-3:1:34", + "edges": [ + { + "range": "d2/testdata/d2compiler/TestCompile/edge_exclusive_style.d2,1:0:1-1:6:7", + "src": { + "range": "d2/testdata/d2compiler/TestCompile/edge_exclusive_style.d2,1:0:1-1:2:3", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/edge_exclusive_style.d2,1:0:1-1:1:2", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "src_arrow": "", + "dst": { + "range": "d2/testdata/d2compiler/TestCompile/edge_exclusive_style.d2,1:4:5-1:6:7", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/edge_exclusive_style.d2,1:5:6-1:6:7", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + } + ] + }, + "dst_arrow": ">" + } + ], + "primary": {}, + "value": { + "map": { + "range": "d2/testdata/d2compiler/TestCompile/edge_exclusive_style.d2,1:8:9-3:0:33", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2compiler/TestCompile/edge_exclusive_style.d2,2:1:12-2:21:32", + "key": { + "range": "d2/testdata/d2compiler/TestCompile/edge_exclusive_style.d2,2:1:12-2:15:26", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/edge_exclusive_style.d2,2:1:12-2:6:17", + "value": [ + { + "string": "style", + "raw_string": "style" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/edge_exclusive_style.d2,2:7:18-2:15:26", + "value": [ + { + "string": "animated", + "raw_string": "animated" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "boolean": { + "range": "d2/testdata/d2compiler/TestCompile/edge_exclusive_style.d2,2:17:28-2:21:32", + "value": true + } + } + } + } + ] + } + } + } + } + ] + }, + "root": { + "id": "", + "id_val": "", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + "edges": [ + { + "index": 0, + "minWidth": 0, + "minHeight": 0, + "label_dimensions": { + "width": 0, + "height": 0 + }, + "isCurve": false, + "src_arrow": false, + "dst_arrow": true, + "references": [ + { + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "" + }, + "style": { + "animated": { + "value": "true" + } + }, + "near_key": null, + "shape": { + "value": "" + } + } + } + ], + "objects": [ + { + "id": "x", + "id_val": "x", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2compiler/TestCompile/edge_exclusive_style.d2,1:0:1-1:2:3", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/edge_exclusive_style.d2,1:0:1-1:1:2", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "x" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "y", + "id_val": "y", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2compiler/TestCompile/edge_exclusive_style.d2,1:4:5-1:6:7", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/edge_exclusive_style.d2,1:5:6-1:6:7", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "y" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ] + }, + "err": null +} diff --git a/testdata/d2compiler/TestCompile/edge_flat_arrowhead.exp.json b/testdata/d2compiler/TestCompile/edge_flat_arrowhead.exp.json new file mode 100644 index 000000000..5655158a5 --- /dev/null +++ b/testdata/d2compiler/TestCompile/edge_flat_arrowhead.exp.json @@ -0,0 +1,326 @@ +{ + "graph": { + "ast": { + "range": "d2/testdata/d2compiler/TestCompile/edge_flat_arrowhead.d2,0:0:0-2:0:51", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2compiler/TestCompile/edge_flat_arrowhead.d2,0:0:0-0:6:6", + "edges": [ + { + "range": "d2/testdata/d2compiler/TestCompile/edge_flat_arrowhead.d2,0:0:0-0:6:6", + "src": { + "range": "d2/testdata/d2compiler/TestCompile/edge_flat_arrowhead.d2,0:0:0-0:2:2", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/edge_flat_arrowhead.d2,0:0:0-0:1:1", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "src_arrow": "", + "dst": { + "range": "d2/testdata/d2compiler/TestCompile/edge_flat_arrowhead.d2,0:4:4-0:6:6", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/edge_flat_arrowhead.d2,0:5:5-0:6:6", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + } + ] + }, + "dst_arrow": ">" + } + ], + "primary": {}, + "value": {} + } + }, + { + "map_key": { + "range": "d2/testdata/d2compiler/TestCompile/edge_flat_arrowhead.d2,1:0:7-1:43:50", + "edges": [ + { + "range": "d2/testdata/d2compiler/TestCompile/edge_flat_arrowhead.d2,1:1:8-1:7:14", + "src": { + "range": "d2/testdata/d2compiler/TestCompile/edge_flat_arrowhead.d2,1:1:8-1:3:10", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/edge_flat_arrowhead.d2,1:1:8-1:2:9", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "src_arrow": "", + "dst": { + "range": "d2/testdata/d2compiler/TestCompile/edge_flat_arrowhead.d2,1:5:12-1:7:14", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/edge_flat_arrowhead.d2,1:6:13-1:7:14", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + } + ] + }, + "dst_arrow": ">" + } + ], + "edge_index": { + "range": "d2/testdata/d2compiler/TestCompile/edge_flat_arrowhead.d2,1:8:15-1:11:18", + "int": 0, + "glob": false + }, + "edge_key": { + "range": "d2/testdata/d2compiler/TestCompile/edge_flat_arrowhead.d2,1:12:19-1:34:41", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/edge_flat_arrowhead.d2,1:12:19-1:28:35", + "value": [ + { + "string": "source-arrowhead", + "raw_string": "source-arrowhead" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/edge_flat_arrowhead.d2,1:29:36-1:34:41", + "value": [ + { + "string": "shape", + "raw_string": "shape" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/edge_flat_arrowhead.d2,1:36:43-1:43:50", + "value": [ + { + "string": "diamond", + "raw_string": "diamond" + } + ] + } + } + } + } + ] + }, + "root": { + "id": "", + "id_val": "", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + "edges": [ + { + "index": 0, + "minWidth": 0, + "minHeight": 0, + "label_dimensions": { + "width": 0, + "height": 0 + }, + "isCurve": false, + "src_arrow": false, + "srcArrowhead": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "diamond" + } + }, + "dst_arrow": true, + "references": [ + { + "map_key_edge_index": 0 + }, + { + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ], + "objects": [ + { + "id": "x", + "id_val": "x", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2compiler/TestCompile/edge_flat_arrowhead.d2,0:0:0-0:2:2", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/edge_flat_arrowhead.d2,0:0:0-0:1:1", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + }, + { + "key": { + "range": "d2/testdata/d2compiler/TestCompile/edge_flat_arrowhead.d2,1:1:8-1:3:10", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/edge_flat_arrowhead.d2,1:1:8-1:2:9", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "x" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "y", + "id_val": "y", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2compiler/TestCompile/edge_flat_arrowhead.d2,0:4:4-0:6:6", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/edge_flat_arrowhead.d2,0:5:5-0:6:6", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + }, + { + "key": { + "range": "d2/testdata/d2compiler/TestCompile/edge_flat_arrowhead.d2,1:5:12-1:7:14", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/edge_flat_arrowhead.d2,1:6:13-1:7:14", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "y" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ] + }, + "err": null +} diff --git a/testdata/d2compiler/TestCompile/edge_flat_label_arrowhead.exp.json b/testdata/d2compiler/TestCompile/edge_flat_label_arrowhead.exp.json new file mode 100644 index 000000000..cb91401f8 --- /dev/null +++ b/testdata/d2compiler/TestCompile/edge_flat_label_arrowhead.exp.json @@ -0,0 +1,251 @@ +{ + "graph": { + "ast": { + "range": "d2/testdata/d2compiler/TestCompile/edge_flat_label_arrowhead.d2,0:0:0-4:0:53", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2compiler/TestCompile/edge_flat_label_arrowhead.d2,0:0:0-3:1:52", + "edges": [ + { + "range": "d2/testdata/d2compiler/TestCompile/edge_flat_label_arrowhead.d2,0:0:0-0:6:6", + "src": { + "range": "d2/testdata/d2compiler/TestCompile/edge_flat_label_arrowhead.d2,0:0:0-0:2:2", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/edge_flat_label_arrowhead.d2,0:0:0-0:1:1", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "src_arrow": "", + "dst": { + "range": "d2/testdata/d2compiler/TestCompile/edge_flat_label_arrowhead.d2,0:4:4-0:6:6", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/edge_flat_label_arrowhead.d2,0:5:5-0:6:6", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + } + ] + }, + "dst_arrow": ">" + } + ], + "primary": {}, + "value": { + "map": { + "range": "d2/testdata/d2compiler/TestCompile/edge_flat_label_arrowhead.d2,0:8:8-3:0:51", + "nodes": [ + { + "comment": { + "range": "d2/testdata/d2compiler/TestCompile/edge_flat_label_arrowhead.d2,1:2:12-1:11:21", + "value": "comment" + } + }, + { + "map_key": { + "range": "d2/testdata/d2compiler/TestCompile/edge_flat_label_arrowhead.d2,2:2:24-2:28:50", + "key": { + "range": "d2/testdata/d2compiler/TestCompile/edge_flat_label_arrowhead.d2,2:2:24-2:24:46", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/edge_flat_label_arrowhead.d2,2:2:24-2:18:40", + "value": [ + { + "string": "source-arrowhead", + "raw_string": "source-arrowhead" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/edge_flat_label_arrowhead.d2,2:19:41-2:24:46", + "value": [ + { + "string": "label", + "raw_string": "label" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/edge_flat_label_arrowhead.d2,2:26:48-2:28:50", + "value": [ + { + "string": "yo", + "raw_string": "yo" + } + ] + } + } + } + } + ] + } + } + } + } + ] + }, + "root": { + "id": "", + "id_val": "", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + "edges": [ + { + "index": 0, + "minWidth": 0, + "minHeight": 0, + "label_dimensions": { + "width": 0, + "height": 0 + }, + "isCurve": false, + "src_arrow": false, + "srcArrowhead": { + "label": { + "value": "yo" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + }, + "dst_arrow": true, + "references": [ + { + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ], + "objects": [ + { + "id": "x", + "id_val": "x", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2compiler/TestCompile/edge_flat_label_arrowhead.d2,0:0:0-0:2:2", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/edge_flat_label_arrowhead.d2,0:0:0-0:1:1", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "x" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "y", + "id_val": "y", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2compiler/TestCompile/edge_flat_label_arrowhead.d2,0:4:4-0:6:6", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/edge_flat_label_arrowhead.d2,0:5:5-0:6:6", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "y" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ] + }, + "err": null +} diff --git a/testdata/d2compiler/TestCompile/edge_in_column.exp.json b/testdata/d2compiler/TestCompile/edge_in_column.exp.json new file mode 100644 index 000000000..76b269f31 --- /dev/null +++ b/testdata/d2compiler/TestCompile/edge_in_column.exp.json @@ -0,0 +1,218 @@ +{ + "graph": { + "ast": { + "range": "d2/testdata/d2compiler/TestCompile/edge_in_column.d2,0:0:0-3:1:39", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2compiler/TestCompile/edge_in_column.d2,0:0:0-3:1:39", + "key": { + "range": "d2/testdata/d2compiler/TestCompile/edge_in_column.d2,0:0:0-0:1:1", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/edge_in_column.d2,0:0:0-0:1:1", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "map": { + "range": "d2/testdata/d2compiler/TestCompile/edge_in_column.d2,0:3:3-3:0:38", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2compiler/TestCompile/edge_in_column.d2,1:2:7-1:18:23", + "key": { + "range": "d2/testdata/d2compiler/TestCompile/edge_in_column.d2,1:2:7-1:7:12", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/edge_in_column.d2,1:2:7-1:7:12", + "value": [ + { + "string": "shape", + "raw_string": "shape" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/edge_in_column.d2,1:9:14-1:18:23", + "value": [ + { + "string": "sql_table", + "raw_string": "sql_table" + } + ] + } + } + } + }, + { + "map_key": { + "range": "d2/testdata/d2compiler/TestCompile/edge_in_column.d2,2:2:26-2:13:37", + "key": { + "range": "d2/testdata/d2compiler/TestCompile/edge_in_column.d2,2:2:26-2:3:27", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/edge_in_column.d2,2:2:26-2:3:27", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "map": { + "range": "d2/testdata/d2compiler/TestCompile/edge_in_column.d2,2:5:29-2:12:36", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2compiler/TestCompile/edge_in_column.d2,2:6:30-2:12:36", + "edges": [ + { + "range": "d2/testdata/d2compiler/TestCompile/edge_in_column.d2,2:6:30-2:12:36", + "src": { + "range": "d2/testdata/d2compiler/TestCompile/edge_in_column.d2,2:6:30-2:8:32", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/edge_in_column.d2,2:6:30-2:7:31", + "value": [ + { + "string": "p", + "raw_string": "p" + } + ] + } + } + ] + }, + "src_arrow": "", + "dst": { + "range": "d2/testdata/d2compiler/TestCompile/edge_in_column.d2,2:10:34-2:12:36", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/edge_in_column.d2,2:11:35-2:12:36", + "value": [ + { + "string": "q", + "raw_string": "q" + } + ] + } + } + ] + }, + "dst_arrow": ">" + } + ], + "primary": {}, + "value": {} + } + } + ] + } + } + } + } + ] + } + } + } + } + ] + }, + "root": { + "id": "", + "id_val": "", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + "edges": [], + "objects": [ + { + "id": "x", + "id_val": "x", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2compiler/TestCompile/edge_in_column.d2,0:0:0-0:1:1", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/edge_in_column.d2,0:0:0-0:1:1", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "sql_table": { + "columns": [ + { + "name": "x", + "type": "", + "constraint": "", + "reference": "" + } + ] + }, + "attributes": { + "label": { + "value": "x" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "sql_table" + } + } + } + ] + }, + "err": null +} diff --git a/testdata/d2compiler/TestCompile/edge_index.exp.json b/testdata/d2compiler/TestCompile/edge_index.exp.json new file mode 100644 index 000000000..4ac3a630e --- /dev/null +++ b/testdata/d2compiler/TestCompile/edge_index.exp.json @@ -0,0 +1,299 @@ +{ + "graph": { + "ast": { + "range": "d2/testdata/d2compiler/TestCompile/edge_index.d2,0:0:0-3:0:30", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2compiler/TestCompile/edge_index.d2,1:0:1-1:11:12", + "edges": [ + { + "range": "d2/testdata/d2compiler/TestCompile/edge_index.d2,1:0:1-1:6:7", + "src": { + "range": "d2/testdata/d2compiler/TestCompile/edge_index.d2,1:0:1-1:2:3", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/edge_index.d2,1:0:1-1:1:2", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "src_arrow": "", + "dst": { + "range": "d2/testdata/d2compiler/TestCompile/edge_index.d2,1:4:5-1:6:7", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/edge_index.d2,1:5:6-1:6:7", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + } + ] + }, + "dst_arrow": ">" + } + ], + "primary": {}, + "value": { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/edge_index.d2,1:8:9-1:11:12", + "value": [ + { + "string": "one", + "raw_string": "one" + } + ] + } + } + } + }, + { + "map_key": { + "range": "d2/testdata/d2compiler/TestCompile/edge_index.d2,2:0:13-2:16:29", + "edges": [ + { + "range": "d2/testdata/d2compiler/TestCompile/edge_index.d2,2:1:14-2:7:20", + "src": { + "range": "d2/testdata/d2compiler/TestCompile/edge_index.d2,2:1:14-2:3:16", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/edge_index.d2,2:1:14-2:2:15", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "src_arrow": "", + "dst": { + "range": "d2/testdata/d2compiler/TestCompile/edge_index.d2,2:5:18-2:7:20", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/edge_index.d2,2:6:19-2:7:20", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + } + ] + }, + "dst_arrow": ">" + } + ], + "edge_index": { + "range": "d2/testdata/d2compiler/TestCompile/edge_index.d2,2:8:21-2:11:24", + "int": 0, + "glob": false + }, + "primary": {}, + "value": { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/edge_index.d2,2:13:26-2:16:29", + "value": [ + { + "string": "two", + "raw_string": "two" + } + ] + } + } + } + } + ] + }, + "root": { + "id": "", + "id_val": "", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + "edges": [ + { + "index": 0, + "minWidth": 0, + "minHeight": 0, + "label_dimensions": { + "width": 0, + "height": 0 + }, + "isCurve": false, + "src_arrow": false, + "dst_arrow": true, + "references": [ + { + "map_key_edge_index": 0 + }, + { + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "two" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ], + "objects": [ + { + "id": "x", + "id_val": "x", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2compiler/TestCompile/edge_index.d2,1:0:1-1:2:3", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/edge_index.d2,1:0:1-1:1:2", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + }, + { + "key": { + "range": "d2/testdata/d2compiler/TestCompile/edge_index.d2,2:1:14-2:3:16", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/edge_index.d2,2:1:14-2:2:15", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "x" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "y", + "id_val": "y", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2compiler/TestCompile/edge_index.d2,1:4:5-1:6:7", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/edge_index.d2,1:5:6-1:6:7", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + }, + { + "key": { + "range": "d2/testdata/d2compiler/TestCompile/edge_index.d2,2:5:18-2:7:20", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/edge_index.d2,2:6:19-2:7:20", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "y" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ] + }, + "err": null +} diff --git a/testdata/d2compiler/TestCompile/edge_index_map.exp.json b/testdata/d2compiler/TestCompile/edge_index_map.exp.json new file mode 100644 index 000000000..35a310c17 --- /dev/null +++ b/testdata/d2compiler/TestCompile/edge_index_map.exp.json @@ -0,0 +1,318 @@ +{ + "graph": { + "ast": { + "range": "d2/testdata/d2compiler/TestCompile/edge_index_map.d2,0:0:0-5:0:114", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2compiler/TestCompile/edge_index_map.d2,1:0:1-1:6:7", + "edges": [ + { + "range": "d2/testdata/d2compiler/TestCompile/edge_index_map.d2,1:0:1-1:6:7", + "src": { + "range": "d2/testdata/d2compiler/TestCompile/edge_index_map.d2,1:0:1-1:2:3", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/edge_index_map.d2,1:0:1-1:1:2", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "src_arrow": "", + "dst": { + "range": "d2/testdata/d2compiler/TestCompile/edge_index_map.d2,1:4:5-1:6:7", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/edge_index_map.d2,1:5:6-1:6:7", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + } + ] + }, + "dst_arrow": ">" + } + ], + "primary": {}, + "value": {} + } + }, + { + "map_key": { + "range": "d2/testdata/d2compiler/TestCompile/edge_index_map.d2,2:0:8-4:1:113", + "edges": [ + { + "range": "d2/testdata/d2compiler/TestCompile/edge_index_map.d2,2:1:9-2:7:15", + "src": { + "range": "d2/testdata/d2compiler/TestCompile/edge_index_map.d2,2:1:9-2:3:11", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/edge_index_map.d2,2:1:9-2:2:10", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "src_arrow": "", + "dst": { + "range": "d2/testdata/d2compiler/TestCompile/edge_index_map.d2,2:5:13-2:7:15", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/edge_index_map.d2,2:6:14-2:7:15", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + } + ] + }, + "dst_arrow": ">" + } + ], + "edge_index": { + "range": "d2/testdata/d2compiler/TestCompile/edge_index_map.d2,2:8:16-2:11:19", + "int": 0, + "glob": false + }, + "primary": {}, + "value": { + "map": { + "range": "d2/testdata/d2compiler/TestCompile/edge_index_map.d2,2:13:21-4:0:112", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2compiler/TestCompile/edge_index_map.d2,3:2:25-3:88:111", + "key": { + "range": "d2/testdata/d2compiler/TestCompile/edge_index_map.d2,3:2:25-3:7:30", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/edge_index_map.d2,3:2:25-3:7:30", + "value": [ + { + "string": "label", + "raw_string": "label" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "double_quoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/edge_index_map.d2,3:9:32-3:88:111", + "value": [ + { + "string": "Space: the final frontier. These are the voyages of the starship Enterprise.", + "raw_string": "Space: the final frontier. These are the voyages of the starship Enterprise." + } + ] + } + } + } + } + ] + } + } + } + } + ] + }, + "root": { + "id": "", + "id_val": "", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + "edges": [ + { + "index": 0, + "minWidth": 0, + "minHeight": 0, + "label_dimensions": { + "width": 0, + "height": 0 + }, + "isCurve": false, + "src_arrow": false, + "dst_arrow": true, + "references": [ + { + "map_key_edge_index": 0 + }, + { + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "Space: the final frontier. These are the voyages of the starship Enterprise." + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ], + "objects": [ + { + "id": "x", + "id_val": "x", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2compiler/TestCompile/edge_index_map.d2,1:0:1-1:2:3", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/edge_index_map.d2,1:0:1-1:1:2", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + }, + { + "key": { + "range": "d2/testdata/d2compiler/TestCompile/edge_index_map.d2,2:1:9-2:3:11", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/edge_index_map.d2,2:1:9-2:2:10", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "x" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "y", + "id_val": "y", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2compiler/TestCompile/edge_index_map.d2,1:4:5-1:6:7", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/edge_index_map.d2,1:5:6-1:6:7", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + }, + { + "key": { + "range": "d2/testdata/d2compiler/TestCompile/edge_index_map.d2,2:5:13-2:7:15", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/edge_index_map.d2,2:6:14-2:7:15", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "y" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ] + }, + "err": null +} diff --git a/testdata/d2compiler/TestCompile/edge_index_nested.exp.json b/testdata/d2compiler/TestCompile/edge_index_nested.exp.json new file mode 100644 index 000000000..b27801d49 --- /dev/null +++ b/testdata/d2compiler/TestCompile/edge_index_nested.exp.json @@ -0,0 +1,368 @@ +{ + "graph": { + "ast": { + "range": "d2/testdata/d2compiler/TestCompile/edge_index_nested.d2,0:0:0-5:0:39", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2compiler/TestCompile/edge_index_nested.d2,1:0:1-4:1:38", + "key": { + "range": "d2/testdata/d2compiler/TestCompile/edge_index_nested.d2,1:0:1-1:1:2", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/edge_index_nested.d2,1:0:1-1:1:2", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "map": { + "range": "d2/testdata/d2compiler/TestCompile/edge_index_nested.d2,1:3:4-4:0:37", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2compiler/TestCompile/edge_index_nested.d2,2:1:7-2:12:18", + "edges": [ + { + "range": "d2/testdata/d2compiler/TestCompile/edge_index_nested.d2,2:1:7-2:7:13", + "src": { + "range": "d2/testdata/d2compiler/TestCompile/edge_index_nested.d2,2:1:7-2:3:9", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/edge_index_nested.d2,2:1:7-2:2:8", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "src_arrow": "", + "dst": { + "range": "d2/testdata/d2compiler/TestCompile/edge_index_nested.d2,2:5:11-2:7:13", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/edge_index_nested.d2,2:6:12-2:7:13", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + } + ] + }, + "dst_arrow": ">" + } + ], + "primary": {}, + "value": { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/edge_index_nested.d2,2:9:15-2:12:18", + "value": [ + { + "string": "one", + "raw_string": "one" + } + ] + } + } + } + }, + { + "map_key": { + "range": "d2/testdata/d2compiler/TestCompile/edge_index_nested.d2,3:1:20-3:17:36", + "edges": [ + { + "range": "d2/testdata/d2compiler/TestCompile/edge_index_nested.d2,3:2:21-3:8:27", + "src": { + "range": "d2/testdata/d2compiler/TestCompile/edge_index_nested.d2,3:2:21-3:4:23", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/edge_index_nested.d2,3:2:21-3:3:22", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "src_arrow": "", + "dst": { + "range": "d2/testdata/d2compiler/TestCompile/edge_index_nested.d2,3:6:25-3:8:27", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/edge_index_nested.d2,3:7:26-3:8:27", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + } + ] + }, + "dst_arrow": ">" + } + ], + "edge_index": { + "range": "d2/testdata/d2compiler/TestCompile/edge_index_nested.d2,3:9:28-3:12:31", + "int": 0, + "glob": false + }, + "primary": {}, + "value": { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/edge_index_nested.d2,3:14:33-3:17:36", + "value": [ + { + "string": "two", + "raw_string": "two" + } + ] + } + } + } + } + ] + } + } + } + } + ] + }, + "root": { + "id": "", + "id_val": "", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + "edges": [ + { + "index": 0, + "minWidth": 0, + "minHeight": 0, + "label_dimensions": { + "width": 0, + "height": 0 + }, + "isCurve": false, + "src_arrow": false, + "dst_arrow": true, + "references": [ + { + "map_key_edge_index": 0 + }, + { + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "two" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ], + "objects": [ + { + "id": "b", + "id_val": "b", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2compiler/TestCompile/edge_index_nested.d2,1:0:1-1:1:2", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/edge_index_nested.d2,1:0:1-1:1:2", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "b" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "x", + "id_val": "x", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2compiler/TestCompile/edge_index_nested.d2,2:1:7-2:3:9", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/edge_index_nested.d2,2:1:7-2:2:8", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + }, + { + "key": { + "range": "d2/testdata/d2compiler/TestCompile/edge_index_nested.d2,3:2:21-3:4:23", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/edge_index_nested.d2,3:2:21-3:3:22", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "x" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "y", + "id_val": "y", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2compiler/TestCompile/edge_index_nested.d2,2:5:11-2:7:13", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/edge_index_nested.d2,2:6:12-2:7:13", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + }, + { + "key": { + "range": "d2/testdata/d2compiler/TestCompile/edge_index_nested.d2,3:6:25-3:8:27", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/edge_index_nested.d2,3:7:26-3:8:27", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "y" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ] + }, + "err": null +} diff --git a/testdata/d2compiler/TestCompile/edge_index_nested_cross_scope.exp.json b/testdata/d2compiler/TestCompile/edge_index_nested_cross_scope.exp.json new file mode 100644 index 000000000..87518a63e --- /dev/null +++ b/testdata/d2compiler/TestCompile/edge_index_nested_cross_scope.exp.json @@ -0,0 +1,404 @@ +{ + "graph": { + "ast": { + "range": "d2/testdata/d2compiler/TestCompile/edge_index_nested_cross_scope.d2,0:0:0-5:0:40", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2compiler/TestCompile/edge_index_nested_cross_scope.d2,1:0:1-3:1:20", + "key": { + "range": "d2/testdata/d2compiler/TestCompile/edge_index_nested_cross_scope.d2,1:0:1-1:1:2", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/edge_index_nested_cross_scope.d2,1:0:1-1:1:2", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "map": { + "range": "d2/testdata/d2compiler/TestCompile/edge_index_nested_cross_scope.d2,1:3:4-3:0:19", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2compiler/TestCompile/edge_index_nested_cross_scope.d2,2:1:7-2:12:18", + "edges": [ + { + "range": "d2/testdata/d2compiler/TestCompile/edge_index_nested_cross_scope.d2,2:1:7-2:7:13", + "src": { + "range": "d2/testdata/d2compiler/TestCompile/edge_index_nested_cross_scope.d2,2:1:7-2:3:9", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/edge_index_nested_cross_scope.d2,2:1:7-2:2:8", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "src_arrow": "", + "dst": { + "range": "d2/testdata/d2compiler/TestCompile/edge_index_nested_cross_scope.d2,2:5:11-2:7:13", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/edge_index_nested_cross_scope.d2,2:6:12-2:7:13", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + } + ] + }, + "dst_arrow": ">" + } + ], + "primary": {}, + "value": { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/edge_index_nested_cross_scope.d2,2:9:15-2:12:18", + "value": [ + { + "string": "one", + "raw_string": "one" + } + ] + } + } + } + } + ] + } + } + } + }, + { + "map_key": { + "range": "d2/testdata/d2compiler/TestCompile/edge_index_nested_cross_scope.d2,4:0:21-4:18:39", + "key": { + "range": "d2/testdata/d2compiler/TestCompile/edge_index_nested_cross_scope.d2,4:0:21-4:2:23", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/edge_index_nested_cross_scope.d2,4:0:21-4:1:22", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + } + ] + }, + "edges": [ + { + "range": "d2/testdata/d2compiler/TestCompile/edge_index_nested_cross_scope.d2,4:3:24-4:9:30", + "src": { + "range": "d2/testdata/d2compiler/TestCompile/edge_index_nested_cross_scope.d2,4:3:24-4:5:26", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/edge_index_nested_cross_scope.d2,4:3:24-4:4:25", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "src_arrow": "", + "dst": { + "range": "d2/testdata/d2compiler/TestCompile/edge_index_nested_cross_scope.d2,4:7:28-4:9:30", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/edge_index_nested_cross_scope.d2,4:8:29-4:9:30", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + } + ] + }, + "dst_arrow": ">" + } + ], + "edge_index": { + "range": "d2/testdata/d2compiler/TestCompile/edge_index_nested_cross_scope.d2,4:10:31-4:13:34", + "int": 0, + "glob": false + }, + "primary": {}, + "value": { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/edge_index_nested_cross_scope.d2,4:15:36-4:18:39", + "value": [ + { + "string": "two", + "raw_string": "two" + } + ] + } + } + } + } + ] + }, + "root": { + "id": "", + "id_val": "", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + "edges": [ + { + "index": 0, + "minWidth": 0, + "minHeight": 0, + "label_dimensions": { + "width": 0, + "height": 0 + }, + "isCurve": false, + "src_arrow": false, + "dst_arrow": true, + "references": [ + { + "map_key_edge_index": 0 + }, + { + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "two" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ], + "objects": [ + { + "id": "b", + "id_val": "b", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2compiler/TestCompile/edge_index_nested_cross_scope.d2,1:0:1-1:1:2", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/edge_index_nested_cross_scope.d2,1:0:1-1:1:2", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + }, + { + "key": { + "range": "d2/testdata/d2compiler/TestCompile/edge_index_nested_cross_scope.d2,4:0:21-4:2:23", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/edge_index_nested_cross_scope.d2,4:0:21-4:1:22", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "b" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "x", + "id_val": "x", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2compiler/TestCompile/edge_index_nested_cross_scope.d2,2:1:7-2:3:9", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/edge_index_nested_cross_scope.d2,2:1:7-2:2:8", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + }, + { + "key": { + "range": "d2/testdata/d2compiler/TestCompile/edge_index_nested_cross_scope.d2,4:3:24-4:5:26", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/edge_index_nested_cross_scope.d2,4:3:24-4:4:25", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "x" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "y", + "id_val": "y", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2compiler/TestCompile/edge_index_nested_cross_scope.d2,2:5:11-2:7:13", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/edge_index_nested_cross_scope.d2,2:6:12-2:7:13", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + }, + { + "key": { + "range": "d2/testdata/d2compiler/TestCompile/edge_index_nested_cross_scope.d2,4:7:28-4:9:30", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/edge_index_nested_cross_scope.d2,4:8:29-4:9:30", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "y" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ] + }, + "err": null +} diff --git a/testdata/d2compiler/TestCompile/edge_key_group_flat_nested.exp.json b/testdata/d2compiler/TestCompile/edge_key_group_flat_nested.exp.json new file mode 100644 index 000000000..169522086 --- /dev/null +++ b/testdata/d2compiler/TestCompile/edge_key_group_flat_nested.exp.json @@ -0,0 +1,421 @@ +{ + "graph": { + "ast": { + "range": "d2/testdata/d2compiler/TestCompile/edge_key_group_flat_nested.d2,0:0:0-5:0:50", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2compiler/TestCompile/edge_key_group_flat_nested.d2,1:0:1-3:1:16", + "key": { + "range": "d2/testdata/d2compiler/TestCompile/edge_key_group_flat_nested.d2,1:0:1-1:1:2", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/edge_key_group_flat_nested.d2,1:0:1-1:1:2", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "map": { + "range": "d2/testdata/d2compiler/TestCompile/edge_key_group_flat_nested.d2,1:3:4-3:0:15", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2compiler/TestCompile/edge_key_group_flat_nested.d2,2:2:8-2:8:14", + "edges": [ + { + "range": "d2/testdata/d2compiler/TestCompile/edge_key_group_flat_nested.d2,2:2:8-2:8:14", + "src": { + "range": "d2/testdata/d2compiler/TestCompile/edge_key_group_flat_nested.d2,2:2:8-2:4:10", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/edge_key_group_flat_nested.d2,2:2:8-2:3:9", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + } + ] + }, + "src_arrow": "", + "dst": { + "range": "d2/testdata/d2compiler/TestCompile/edge_key_group_flat_nested.d2,2:6:12-2:8:14", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/edge_key_group_flat_nested.d2,2:7:13-2:8:14", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + } + ] + }, + "dst_arrow": ">" + } + ], + "primary": {}, + "value": {} + } + } + ] + } + } + } + }, + { + "map_key": { + "range": "d2/testdata/d2compiler/TestCompile/edge_key_group_flat_nested.d2,4:0:17-4:32:49", + "key": { + "range": "d2/testdata/d2compiler/TestCompile/edge_key_group_flat_nested.d2,4:0:17-4:2:19", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/edge_key_group_flat_nested.d2,4:0:17-4:1:18", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "edges": [ + { + "range": "d2/testdata/d2compiler/TestCompile/edge_key_group_flat_nested.d2,4:3:20-4:9:26", + "src": { + "range": "d2/testdata/d2compiler/TestCompile/edge_key_group_flat_nested.d2,4:3:20-4:5:22", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/edge_key_group_flat_nested.d2,4:3:20-4:4:21", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + } + ] + }, + "src_arrow": "", + "dst": { + "range": "d2/testdata/d2compiler/TestCompile/edge_key_group_flat_nested.d2,4:7:24-4:9:26", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/edge_key_group_flat_nested.d2,4:8:25-4:9:26", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + } + ] + }, + "dst_arrow": ">" + } + ], + "edge_index": { + "range": "d2/testdata/d2compiler/TestCompile/edge_key_group_flat_nested.d2,4:10:27-4:13:30", + "int": 0, + "glob": false + }, + "edge_key": { + "range": "d2/testdata/d2compiler/TestCompile/edge_key_group_flat_nested.d2,4:14:31-4:27:44", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/edge_key_group_flat_nested.d2,4:14:31-4:19:36", + "value": [ + { + "string": "style", + "raw_string": "style" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/edge_key_group_flat_nested.d2,4:20:37-4:27:44", + "value": [ + { + "string": "opacity", + "raw_string": "opacity" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "number": { + "range": "d2/testdata/d2compiler/TestCompile/edge_key_group_flat_nested.d2,4:29:46-4:32:49", + "raw": "0.4", + "value": "2/5" + } + } + } + } + ] + }, + "root": { + "id": "", + "id_val": "", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + "edges": [ + { + "index": 0, + "minWidth": 0, + "minHeight": 0, + "label_dimensions": { + "width": 0, + "height": 0 + }, + "isCurve": false, + "src_arrow": false, + "dst_arrow": true, + "references": [ + { + "map_key_edge_index": 0 + }, + { + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "" + }, + "style": { + "opacity": { + "value": "0.4" + } + }, + "near_key": null, + "shape": { + "value": "" + } + } + } + ], + "objects": [ + { + "id": "x", + "id_val": "x", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2compiler/TestCompile/edge_key_group_flat_nested.d2,1:0:1-1:1:2", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/edge_key_group_flat_nested.d2,1:0:1-1:1:2", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + }, + { + "key": { + "range": "d2/testdata/d2compiler/TestCompile/edge_key_group_flat_nested.d2,4:0:17-4:2:19", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/edge_key_group_flat_nested.d2,4:0:17-4:1:18", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "x" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "a", + "id_val": "a", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2compiler/TestCompile/edge_key_group_flat_nested.d2,2:2:8-2:4:10", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/edge_key_group_flat_nested.d2,2:2:8-2:3:9", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + }, + { + "key": { + "range": "d2/testdata/d2compiler/TestCompile/edge_key_group_flat_nested.d2,4:3:20-4:5:22", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/edge_key_group_flat_nested.d2,4:3:20-4:4:21", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "a" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "b", + "id_val": "b", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2compiler/TestCompile/edge_key_group_flat_nested.d2,2:6:12-2:8:14", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/edge_key_group_flat_nested.d2,2:7:13-2:8:14", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + }, + { + "key": { + "range": "d2/testdata/d2compiler/TestCompile/edge_key_group_flat_nested.d2,4:7:24-4:9:26", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/edge_key_group_flat_nested.d2,4:8:25-4:9:26", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "b" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ] + }, + "err": null +} diff --git a/testdata/d2compiler/TestCompile/edge_key_group_flat_nested_underscore.exp.json b/testdata/d2compiler/TestCompile/edge_key_group_flat_nested_underscore.exp.json new file mode 100644 index 000000000..6db8f6429 --- /dev/null +++ b/testdata/d2compiler/TestCompile/edge_key_group_flat_nested_underscore.exp.json @@ -0,0 +1,429 @@ +{ + "graph": { + "ast": { + "range": "d2/testdata/d2compiler/TestCompile/edge_key_group_flat_nested_underscore.d2,0:0:0-5:0:51", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2compiler/TestCompile/edge_key_group_flat_nested_underscore.d2,1:0:1-1:6:7", + "edges": [ + { + "range": "d2/testdata/d2compiler/TestCompile/edge_key_group_flat_nested_underscore.d2,1:0:1-1:6:7", + "src": { + "range": "d2/testdata/d2compiler/TestCompile/edge_key_group_flat_nested_underscore.d2,1:0:1-1:2:3", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/edge_key_group_flat_nested_underscore.d2,1:0:1-1:1:2", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + } + ] + }, + "src_arrow": "", + "dst": { + "range": "d2/testdata/d2compiler/TestCompile/edge_key_group_flat_nested_underscore.d2,1:4:5-1:6:7", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/edge_key_group_flat_nested_underscore.d2,1:5:6-1:6:7", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + } + ] + }, + "dst_arrow": ">" + } + ], + "primary": {}, + "value": {} + } + }, + { + "map_key": { + "range": "d2/testdata/d2compiler/TestCompile/edge_key_group_flat_nested_underscore.d2,2:0:8-4:1:50", + "key": { + "range": "d2/testdata/d2compiler/TestCompile/edge_key_group_flat_nested_underscore.d2,2:0:8-2:1:9", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/edge_key_group_flat_nested_underscore.d2,2:0:8-2:1:9", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "map": { + "range": "d2/testdata/d2compiler/TestCompile/edge_key_group_flat_nested_underscore.d2,2:3:11-4:0:49", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2compiler/TestCompile/edge_key_group_flat_nested_underscore.d2,3:1:14-3:35:48", + "edges": [ + { + "range": "d2/testdata/d2compiler/TestCompile/edge_key_group_flat_nested_underscore.d2,3:2:15-3:12:25", + "src": { + "range": "d2/testdata/d2compiler/TestCompile/edge_key_group_flat_nested_underscore.d2,3:2:15-3:6:19", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/edge_key_group_flat_nested_underscore.d2,3:2:15-3:3:16", + "value": [ + { + "string": "_", + "raw_string": "_" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/edge_key_group_flat_nested_underscore.d2,3:4:17-3:5:18", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + } + ] + }, + "src_arrow": "", + "dst": { + "range": "d2/testdata/d2compiler/TestCompile/edge_key_group_flat_nested_underscore.d2,3:8:21-3:12:25", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/edge_key_group_flat_nested_underscore.d2,3:9:22-3:10:23", + "value": [ + { + "string": "_", + "raw_string": "_" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/edge_key_group_flat_nested_underscore.d2,3:11:24-3:12:25", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + } + ] + }, + "dst_arrow": ">" + } + ], + "edge_index": { + "range": "d2/testdata/d2compiler/TestCompile/edge_key_group_flat_nested_underscore.d2,3:13:26-3:16:29", + "int": 0, + "glob": false + }, + "edge_key": { + "range": "d2/testdata/d2compiler/TestCompile/edge_key_group_flat_nested_underscore.d2,3:17:30-3:30:43", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/edge_key_group_flat_nested_underscore.d2,3:17:30-3:22:35", + "value": [ + { + "string": "style", + "raw_string": "style" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/edge_key_group_flat_nested_underscore.d2,3:23:36-3:30:43", + "value": [ + { + "string": "opacity", + "raw_string": "opacity" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "number": { + "range": "d2/testdata/d2compiler/TestCompile/edge_key_group_flat_nested_underscore.d2,3:32:45-3:35:48", + "raw": "0.4", + "value": "2/5" + } + } + } + } + ] + } + } + } + } + ] + }, + "root": { + "id": "", + "id_val": "", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + "edges": [ + { + "index": 0, + "minWidth": 0, + "minHeight": 0, + "label_dimensions": { + "width": 0, + "height": 0 + }, + "isCurve": false, + "src_arrow": false, + "dst_arrow": true, + "references": [ + { + "map_key_edge_index": 0 + }, + { + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "" + }, + "style": { + "opacity": { + "value": "0.4" + } + }, + "near_key": null, + "shape": { + "value": "" + } + } + } + ], + "objects": [ + { + "id": "x", + "id_val": "x", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2compiler/TestCompile/edge_key_group_flat_nested_underscore.d2,2:0:8-2:1:9", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/edge_key_group_flat_nested_underscore.d2,2:0:8-2:1:9", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "x" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "a", + "id_val": "a", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2compiler/TestCompile/edge_key_group_flat_nested_underscore.d2,1:0:1-1:2:3", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/edge_key_group_flat_nested_underscore.d2,1:0:1-1:1:2", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + }, + { + "key": { + "range": "d2/testdata/d2compiler/TestCompile/edge_key_group_flat_nested_underscore.d2,3:2:15-3:6:19", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/edge_key_group_flat_nested_underscore.d2,3:2:15-3:3:16", + "value": [ + { + "string": "_", + "raw_string": "_" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/edge_key_group_flat_nested_underscore.d2,3:4:17-3:5:18", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + } + ] + }, + "key_path_index": 1, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "a" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "b", + "id_val": "b", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2compiler/TestCompile/edge_key_group_flat_nested_underscore.d2,1:4:5-1:6:7", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/edge_key_group_flat_nested_underscore.d2,1:5:6-1:6:7", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + }, + { + "key": { + "range": "d2/testdata/d2compiler/TestCompile/edge_key_group_flat_nested_underscore.d2,3:8:21-3:12:25", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/edge_key_group_flat_nested_underscore.d2,3:9:22-3:10:23", + "value": [ + { + "string": "_", + "raw_string": "_" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/edge_key_group_flat_nested_underscore.d2,3:11:24-3:12:25", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + } + ] + }, + "key_path_index": 1, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "b" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ] + }, + "err": null +} diff --git a/testdata/d2compiler/TestCompile/edge_key_group_map_flat_nested_underscore.exp.json b/testdata/d2compiler/TestCompile/edge_key_group_map_flat_nested_underscore.exp.json new file mode 100644 index 000000000..c85eccedc --- /dev/null +++ b/testdata/d2compiler/TestCompile/edge_key_group_map_flat_nested_underscore.exp.json @@ -0,0 +1,442 @@ +{ + "graph": { + "ast": { + "range": "d2/testdata/d2compiler/TestCompile/edge_key_group_map_flat_nested_underscore.d2,0:0:0-7:0:59", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2compiler/TestCompile/edge_key_group_map_flat_nested_underscore.d2,1:0:1-1:6:7", + "edges": [ + { + "range": "d2/testdata/d2compiler/TestCompile/edge_key_group_map_flat_nested_underscore.d2,1:0:1-1:6:7", + "src": { + "range": "d2/testdata/d2compiler/TestCompile/edge_key_group_map_flat_nested_underscore.d2,1:0:1-1:2:3", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/edge_key_group_map_flat_nested_underscore.d2,1:0:1-1:1:2", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + } + ] + }, + "src_arrow": "", + "dst": { + "range": "d2/testdata/d2compiler/TestCompile/edge_key_group_map_flat_nested_underscore.d2,1:4:5-1:6:7", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/edge_key_group_map_flat_nested_underscore.d2,1:5:6-1:6:7", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + } + ] + }, + "dst_arrow": ">" + } + ], + "primary": {}, + "value": {} + } + }, + { + "map_key": { + "range": "d2/testdata/d2compiler/TestCompile/edge_key_group_map_flat_nested_underscore.d2,2:0:8-6:1:58", + "key": { + "range": "d2/testdata/d2compiler/TestCompile/edge_key_group_map_flat_nested_underscore.d2,2:0:8-2:1:9", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/edge_key_group_map_flat_nested_underscore.d2,2:0:8-2:1:9", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "map": { + "range": "d2/testdata/d2compiler/TestCompile/edge_key_group_map_flat_nested_underscore.d2,2:3:11-6:0:57", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2compiler/TestCompile/edge_key_group_map_flat_nested_underscore.d2,3:1:14-5:2:56", + "edges": [ + { + "range": "d2/testdata/d2compiler/TestCompile/edge_key_group_map_flat_nested_underscore.d2,3:2:15-3:12:25", + "src": { + "range": "d2/testdata/d2compiler/TestCompile/edge_key_group_map_flat_nested_underscore.d2,3:2:15-3:6:19", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/edge_key_group_map_flat_nested_underscore.d2,3:2:15-3:3:16", + "value": [ + { + "string": "_", + "raw_string": "_" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/edge_key_group_map_flat_nested_underscore.d2,3:4:17-3:5:18", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + } + ] + }, + "src_arrow": "", + "dst": { + "range": "d2/testdata/d2compiler/TestCompile/edge_key_group_map_flat_nested_underscore.d2,3:8:21-3:12:25", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/edge_key_group_map_flat_nested_underscore.d2,3:9:22-3:10:23", + "value": [ + { + "string": "_", + "raw_string": "_" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/edge_key_group_map_flat_nested_underscore.d2,3:11:24-3:12:25", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + } + ] + }, + "dst_arrow": ">" + } + ], + "edge_index": { + "range": "d2/testdata/d2compiler/TestCompile/edge_key_group_map_flat_nested_underscore.d2,3:13:26-3:16:29", + "int": 0, + "glob": false + }, + "primary": {}, + "value": { + "map": { + "range": "d2/testdata/d2compiler/TestCompile/edge_key_group_map_flat_nested_underscore.d2,3:18:31-5:1:55", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2compiler/TestCompile/edge_key_group_map_flat_nested_underscore.d2,4:2:35-4:20:53", + "key": { + "range": "d2/testdata/d2compiler/TestCompile/edge_key_group_map_flat_nested_underscore.d2,4:2:35-4:15:48", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/edge_key_group_map_flat_nested_underscore.d2,4:2:35-4:7:40", + "value": [ + { + "string": "style", + "raw_string": "style" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/edge_key_group_map_flat_nested_underscore.d2,4:8:41-4:15:48", + "value": [ + { + "string": "opacity", + "raw_string": "opacity" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "number": { + "range": "d2/testdata/d2compiler/TestCompile/edge_key_group_map_flat_nested_underscore.d2,4:17:50-4:20:53", + "raw": "0.4", + "value": "2/5" + } + } + } + } + ] + } + } + } + } + ] + } + } + } + } + ] + }, + "root": { + "id": "", + "id_val": "", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + "edges": [ + { + "index": 0, + "minWidth": 0, + "minHeight": 0, + "label_dimensions": { + "width": 0, + "height": 0 + }, + "isCurve": false, + "src_arrow": false, + "dst_arrow": true, + "references": [ + { + "map_key_edge_index": 0 + }, + { + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "" + }, + "style": { + "opacity": { + "value": "0.4" + } + }, + "near_key": null, + "shape": { + "value": "" + } + } + } + ], + "objects": [ + { + "id": "x", + "id_val": "x", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2compiler/TestCompile/edge_key_group_map_flat_nested_underscore.d2,2:0:8-2:1:9", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/edge_key_group_map_flat_nested_underscore.d2,2:0:8-2:1:9", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "x" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "a", + "id_val": "a", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2compiler/TestCompile/edge_key_group_map_flat_nested_underscore.d2,1:0:1-1:2:3", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/edge_key_group_map_flat_nested_underscore.d2,1:0:1-1:1:2", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + }, + { + "key": { + "range": "d2/testdata/d2compiler/TestCompile/edge_key_group_map_flat_nested_underscore.d2,3:2:15-3:6:19", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/edge_key_group_map_flat_nested_underscore.d2,3:2:15-3:3:16", + "value": [ + { + "string": "_", + "raw_string": "_" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/edge_key_group_map_flat_nested_underscore.d2,3:4:17-3:5:18", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + } + ] + }, + "key_path_index": 1, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "a" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "b", + "id_val": "b", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2compiler/TestCompile/edge_key_group_map_flat_nested_underscore.d2,1:4:5-1:6:7", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/edge_key_group_map_flat_nested_underscore.d2,1:5:6-1:6:7", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + }, + { + "key": { + "range": "d2/testdata/d2compiler/TestCompile/edge_key_group_map_flat_nested_underscore.d2,3:8:21-3:12:25", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/edge_key_group_map_flat_nested_underscore.d2,3:9:22-3:10:23", + "value": [ + { + "string": "_", + "raw_string": "_" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/edge_key_group_map_flat_nested_underscore.d2,3:11:24-3:12:25", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + } + ] + }, + "key_path_index": 1, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "b" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ] + }, + "err": null +} diff --git a/testdata/d2compiler/TestCompile/edge_key_group_map_nested_underscore.exp.json b/testdata/d2compiler/TestCompile/edge_key_group_map_nested_underscore.exp.json new file mode 100644 index 000000000..f689762ad --- /dev/null +++ b/testdata/d2compiler/TestCompile/edge_key_group_map_nested_underscore.exp.json @@ -0,0 +1,460 @@ +{ + "graph": { + "ast": { + "range": "d2/testdata/d2compiler/TestCompile/edge_key_group_map_nested_underscore.d2,0:0:0-9:0:69", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2compiler/TestCompile/edge_key_group_map_nested_underscore.d2,1:0:1-1:6:7", + "edges": [ + { + "range": "d2/testdata/d2compiler/TestCompile/edge_key_group_map_nested_underscore.d2,1:0:1-1:6:7", + "src": { + "range": "d2/testdata/d2compiler/TestCompile/edge_key_group_map_nested_underscore.d2,1:0:1-1:2:3", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/edge_key_group_map_nested_underscore.d2,1:0:1-1:1:2", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + } + ] + }, + "src_arrow": "", + "dst": { + "range": "d2/testdata/d2compiler/TestCompile/edge_key_group_map_nested_underscore.d2,1:4:5-1:6:7", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/edge_key_group_map_nested_underscore.d2,1:5:6-1:6:7", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + } + ] + }, + "dst_arrow": ">" + } + ], + "primary": {}, + "value": {} + } + }, + { + "map_key": { + "range": "d2/testdata/d2compiler/TestCompile/edge_key_group_map_nested_underscore.d2,2:0:8-8:1:68", + "key": { + "range": "d2/testdata/d2compiler/TestCompile/edge_key_group_map_nested_underscore.d2,2:0:8-2:1:9", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/edge_key_group_map_nested_underscore.d2,2:0:8-2:1:9", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "map": { + "range": "d2/testdata/d2compiler/TestCompile/edge_key_group_map_nested_underscore.d2,2:3:11-8:0:67", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2compiler/TestCompile/edge_key_group_map_nested_underscore.d2,3:1:14-7:2:66", + "edges": [ + { + "range": "d2/testdata/d2compiler/TestCompile/edge_key_group_map_nested_underscore.d2,3:2:15-3:12:25", + "src": { + "range": "d2/testdata/d2compiler/TestCompile/edge_key_group_map_nested_underscore.d2,3:2:15-3:6:19", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/edge_key_group_map_nested_underscore.d2,3:2:15-3:3:16", + "value": [ + { + "string": "_", + "raw_string": "_" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/edge_key_group_map_nested_underscore.d2,3:4:17-3:5:18", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + } + ] + }, + "src_arrow": "", + "dst": { + "range": "d2/testdata/d2compiler/TestCompile/edge_key_group_map_nested_underscore.d2,3:8:21-3:12:25", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/edge_key_group_map_nested_underscore.d2,3:9:22-3:10:23", + "value": [ + { + "string": "_", + "raw_string": "_" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/edge_key_group_map_nested_underscore.d2,3:11:24-3:12:25", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + } + ] + }, + "dst_arrow": ">" + } + ], + "edge_index": { + "range": "d2/testdata/d2compiler/TestCompile/edge_key_group_map_nested_underscore.d2,3:13:26-3:16:29", + "int": 0, + "glob": false + }, + "primary": {}, + "value": { + "map": { + "range": "d2/testdata/d2compiler/TestCompile/edge_key_group_map_nested_underscore.d2,3:18:31-7:1:65", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2compiler/TestCompile/edge_key_group_map_nested_underscore.d2,4:2:35-6:3:63", + "key": { + "range": "d2/testdata/d2compiler/TestCompile/edge_key_group_map_nested_underscore.d2,4:2:35-4:7:40", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/edge_key_group_map_nested_underscore.d2,4:2:35-4:7:40", + "value": [ + { + "string": "style", + "raw_string": "style" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "map": { + "range": "d2/testdata/d2compiler/TestCompile/edge_key_group_map_nested_underscore.d2,4:9:42-6:2:62", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2compiler/TestCompile/edge_key_group_map_nested_underscore.d2,5:3:47-5:15:59", + "key": { + "range": "d2/testdata/d2compiler/TestCompile/edge_key_group_map_nested_underscore.d2,5:3:47-5:10:54", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/edge_key_group_map_nested_underscore.d2,5:3:47-5:10:54", + "value": [ + { + "string": "opacity", + "raw_string": "opacity" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "number": { + "range": "d2/testdata/d2compiler/TestCompile/edge_key_group_map_nested_underscore.d2,5:12:56-5:15:59", + "raw": "0.4", + "value": "2/5" + } + } + } + } + ] + } + } + } + } + ] + } + } + } + } + ] + } + } + } + } + ] + }, + "root": { + "id": "", + "id_val": "", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + "edges": [ + { + "index": 0, + "minWidth": 0, + "minHeight": 0, + "label_dimensions": { + "width": 0, + "height": 0 + }, + "isCurve": false, + "src_arrow": false, + "dst_arrow": true, + "references": [ + { + "map_key_edge_index": 0 + }, + { + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "" + }, + "style": { + "opacity": { + "value": "0.4" + } + }, + "near_key": null, + "shape": { + "value": "" + } + } + } + ], + "objects": [ + { + "id": "x", + "id_val": "x", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2compiler/TestCompile/edge_key_group_map_nested_underscore.d2,2:0:8-2:1:9", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/edge_key_group_map_nested_underscore.d2,2:0:8-2:1:9", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "x" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "a", + "id_val": "a", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2compiler/TestCompile/edge_key_group_map_nested_underscore.d2,1:0:1-1:2:3", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/edge_key_group_map_nested_underscore.d2,1:0:1-1:1:2", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + }, + { + "key": { + "range": "d2/testdata/d2compiler/TestCompile/edge_key_group_map_nested_underscore.d2,3:2:15-3:6:19", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/edge_key_group_map_nested_underscore.d2,3:2:15-3:3:16", + "value": [ + { + "string": "_", + "raw_string": "_" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/edge_key_group_map_nested_underscore.d2,3:4:17-3:5:18", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + } + ] + }, + "key_path_index": 1, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "a" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "b", + "id_val": "b", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2compiler/TestCompile/edge_key_group_map_nested_underscore.d2,1:4:5-1:6:7", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/edge_key_group_map_nested_underscore.d2,1:5:6-1:6:7", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + }, + { + "key": { + "range": "d2/testdata/d2compiler/TestCompile/edge_key_group_map_nested_underscore.d2,3:8:21-3:12:25", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/edge_key_group_map_nested_underscore.d2,3:9:22-3:10:23", + "value": [ + { + "string": "_", + "raw_string": "_" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/edge_key_group_map_nested_underscore.d2,3:11:24-3:12:25", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + } + ] + }, + "key_path_index": 1, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "b" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ] + }, + "err": null +} diff --git a/testdata/d2compiler/TestCompile/edge_label_map.exp.json b/testdata/d2compiler/TestCompile/edge_label_map.exp.json new file mode 100644 index 000000000..e91142b98 --- /dev/null +++ b/testdata/d2compiler/TestCompile/edge_label_map.exp.json @@ -0,0 +1,245 @@ +{ + "graph": { + "ast": { + "range": "d2/testdata/d2compiler/TestCompile/edge_label_map.d2,0:0:0-1:0:42", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2compiler/TestCompile/edge_label_map.d2,0:0:0-0:41:41", + "edges": [ + { + "range": "d2/testdata/d2compiler/TestCompile/edge_label_map.d2,0:0:0-0:14:14", + "src": { + "range": "d2/testdata/d2compiler/TestCompile/edge_label_map.d2,0:0:0-0:7:7", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/edge_label_map.d2,0:0:0-0:6:6", + "value": [ + { + "string": "hey y9", + "raw_string": "hey y9" + } + ] + } + } + ] + }, + "src_arrow": "", + "dst": { + "range": "d2/testdata/d2compiler/TestCompile/edge_label_map.d2,0:9:9-0:14:14", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/edge_label_map.d2,0:10:10-0:14:14", + "value": [ + { + "string": "qwer", + "raw_string": "qwer" + } + ] + } + } + ] + }, + "dst_arrow": ">" + } + ], + "primary": { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/edge_label_map.d2,0:16:16-0:20:20", + "value": [ + { + "string": "asdf", + "raw_string": "asdf" + } + ] + } + }, + "value": { + "map": { + "range": "d2/testdata/d2compiler/TestCompile/edge_label_map.d2,0:21:21-0:40:40", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2compiler/TestCompile/edge_label_map.d2,0:22:22-0:40:40", + "key": { + "range": "d2/testdata/d2compiler/TestCompile/edge_label_map.d2,0:22:22-0:35:35", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/edge_label_map.d2,0:22:22-0:27:27", + "value": [ + { + "string": "style", + "raw_string": "style" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/edge_label_map.d2,0:28:28-0:35:35", + "value": [ + { + "string": "opacity", + "raw_string": "opacity" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "number": { + "range": "d2/testdata/d2compiler/TestCompile/edge_label_map.d2,0:37:37-0:40:40", + "raw": "0.5", + "value": "1/2" + } + } + } + } + ] + } + } + } + } + ] + }, + "root": { + "id": "", + "id_val": "", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + "edges": [ + { + "index": 0, + "minWidth": 0, + "minHeight": 0, + "label_dimensions": { + "width": 0, + "height": 0 + }, + "isCurve": false, + "src_arrow": false, + "dst_arrow": true, + "references": [ + { + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "asdf" + }, + "style": { + "opacity": { + "value": "0.5" + } + }, + "near_key": null, + "shape": { + "value": "" + } + } + } + ], + "objects": [ + { + "id": "hey y9", + "id_val": "hey y9", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2compiler/TestCompile/edge_label_map.d2,0:0:0-0:7:7", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/edge_label_map.d2,0:0:0-0:6:6", + "value": [ + { + "string": "hey y9", + "raw_string": "hey y9" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "hey y9" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "qwer", + "id_val": "qwer", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2compiler/TestCompile/edge_label_map.d2,0:9:9-0:14:14", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/edge_label_map.d2,0:10:10-0:14:14", + "value": [ + { + "string": "qwer", + "raw_string": "qwer" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "qwer" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ] + }, + "err": null +} diff --git a/testdata/d2compiler/TestCompile/edge_map.exp.json b/testdata/d2compiler/TestCompile/edge_map.exp.json new file mode 100644 index 000000000..e1d436a20 --- /dev/null +++ b/testdata/d2compiler/TestCompile/edge_map.exp.json @@ -0,0 +1,224 @@ +{ + "graph": { + "ast": { + "range": "d2/testdata/d2compiler/TestCompile/edge_map.d2,0:0:0-4:0:102", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2compiler/TestCompile/edge_map.d2,1:0:1-3:1:101", + "edges": [ + { + "range": "d2/testdata/d2compiler/TestCompile/edge_map.d2,1:0:1-1:6:7", + "src": { + "range": "d2/testdata/d2compiler/TestCompile/edge_map.d2,1:0:1-1:2:3", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/edge_map.d2,1:0:1-1:1:2", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "src_arrow": "", + "dst": { + "range": "d2/testdata/d2compiler/TestCompile/edge_map.d2,1:4:5-1:6:7", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/edge_map.d2,1:5:6-1:6:7", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + } + ] + }, + "dst_arrow": ">" + } + ], + "primary": {}, + "value": { + "map": { + "range": "d2/testdata/d2compiler/TestCompile/edge_map.d2,1:8:9-3:0:100", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2compiler/TestCompile/edge_map.d2,2:2:13-2:88:99", + "key": { + "range": "d2/testdata/d2compiler/TestCompile/edge_map.d2,2:2:13-2:7:18", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/edge_map.d2,2:2:13-2:7:18", + "value": [ + { + "string": "label", + "raw_string": "label" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "double_quoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/edge_map.d2,2:9:20-2:88:99", + "value": [ + { + "string": "Space: the final frontier. These are the voyages of the starship Enterprise.", + "raw_string": "Space: the final frontier. These are the voyages of the starship Enterprise." + } + ] + } + } + } + } + ] + } + } + } + } + ] + }, + "root": { + "id": "", + "id_val": "", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + "edges": [ + { + "index": 0, + "minWidth": 0, + "minHeight": 0, + "label_dimensions": { + "width": 0, + "height": 0 + }, + "isCurve": false, + "src_arrow": false, + "dst_arrow": true, + "references": [ + { + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "Space: the final frontier. These are the voyages of the starship Enterprise." + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ], + "objects": [ + { + "id": "x", + "id_val": "x", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2compiler/TestCompile/edge_map.d2,1:0:1-1:2:3", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/edge_map.d2,1:0:1-1:1:2", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "x" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "y", + "id_val": "y", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2compiler/TestCompile/edge_map.d2,1:4:5-1:6:7", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/edge_map.d2,1:5:6-1:6:7", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "y" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ] + }, + "err": null +} diff --git a/testdata/d2compiler/TestCompile/edge_map_arrowhead.exp.json b/testdata/d2compiler/TestCompile/edge_map_arrowhead.exp.json new file mode 100644 index 000000000..9abaa0abc --- /dev/null +++ b/testdata/d2compiler/TestCompile/edge_map_arrowhead.exp.json @@ -0,0 +1,263 @@ +{ + "graph": { + "ast": { + "range": "d2/testdata/d2compiler/TestCompile/edge_map_arrowhead.d2,0:0:0-5:0:57", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2compiler/TestCompile/edge_map_arrowhead.d2,0:0:0-4:1:56", + "edges": [ + { + "range": "d2/testdata/d2compiler/TestCompile/edge_map_arrowhead.d2,0:0:0-0:6:6", + "src": { + "range": "d2/testdata/d2compiler/TestCompile/edge_map_arrowhead.d2,0:0:0-0:2:2", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/edge_map_arrowhead.d2,0:0:0-0:1:1", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "src_arrow": "", + "dst": { + "range": "d2/testdata/d2compiler/TestCompile/edge_map_arrowhead.d2,0:4:4-0:6:6", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/edge_map_arrowhead.d2,0:5:5-0:6:6", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + } + ] + }, + "dst_arrow": ">" + } + ], + "primary": {}, + "value": { + "map": { + "range": "d2/testdata/d2compiler/TestCompile/edge_map_arrowhead.d2,0:8:8-4:0:55", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2compiler/TestCompile/edge_map_arrowhead.d2,1:2:12-3:3:54", + "key": { + "range": "d2/testdata/d2compiler/TestCompile/edge_map_arrowhead.d2,1:2:12-1:18:28", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/edge_map_arrowhead.d2,1:2:12-1:18:28", + "value": [ + { + "string": "source-arrowhead", + "raw_string": "source-arrowhead" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "map": { + "range": "d2/testdata/d2compiler/TestCompile/edge_map_arrowhead.d2,1:20:30-3:2:53", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2compiler/TestCompile/edge_map_arrowhead.d2,2:4:36-2:18:50", + "key": { + "range": "d2/testdata/d2compiler/TestCompile/edge_map_arrowhead.d2,2:4:36-2:9:41", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/edge_map_arrowhead.d2,2:4:36-2:9:41", + "value": [ + { + "string": "shape", + "raw_string": "shape" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/edge_map_arrowhead.d2,2:11:43-2:18:50", + "value": [ + { + "string": "diamond", + "raw_string": "diamond" + } + ] + } + } + } + } + ] + } + } + } + } + ] + } + } + } + } + ] + }, + "root": { + "id": "", + "id_val": "", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + "edges": [ + { + "index": 0, + "minWidth": 0, + "minHeight": 0, + "label_dimensions": { + "width": 0, + "height": 0 + }, + "isCurve": false, + "src_arrow": false, + "srcArrowhead": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "diamond" + } + }, + "dst_arrow": true, + "references": [ + { + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ], + "objects": [ + { + "id": "x", + "id_val": "x", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2compiler/TestCompile/edge_map_arrowhead.d2,0:0:0-0:2:2", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/edge_map_arrowhead.d2,0:0:0-0:1:1", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "x" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "y", + "id_val": "y", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2compiler/TestCompile/edge_map_arrowhead.d2,0:4:4-0:6:6", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/edge_map_arrowhead.d2,0:5:5-0:6:6", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "y" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ] + }, + "err": null +} diff --git a/testdata/d2compiler/TestCompile/edge_map_group_flat.exp.json b/testdata/d2compiler/TestCompile/edge_map_group_flat.exp.json new file mode 100644 index 000000000..77788e717 --- /dev/null +++ b/testdata/d2compiler/TestCompile/edge_map_group_flat.exp.json @@ -0,0 +1,316 @@ +{ + "graph": { + "ast": { + "range": "d2/testdata/d2compiler/TestCompile/edge_map_group_flat.d2,0:0:0-3:0:39", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2compiler/TestCompile/edge_map_group_flat.d2,1:0:1-1:6:7", + "edges": [ + { + "range": "d2/testdata/d2compiler/TestCompile/edge_map_group_flat.d2,1:0:1-1:6:7", + "src": { + "range": "d2/testdata/d2compiler/TestCompile/edge_map_group_flat.d2,1:0:1-1:2:3", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/edge_map_group_flat.d2,1:0:1-1:1:2", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "src_arrow": "", + "dst": { + "range": "d2/testdata/d2compiler/TestCompile/edge_map_group_flat.d2,1:4:5-1:6:7", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/edge_map_group_flat.d2,1:5:6-1:6:7", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + } + ] + }, + "dst_arrow": ">" + } + ], + "primary": {}, + "value": {} + } + }, + { + "map_key": { + "range": "d2/testdata/d2compiler/TestCompile/edge_map_group_flat.d2,2:0:8-2:30:38", + "edges": [ + { + "range": "d2/testdata/d2compiler/TestCompile/edge_map_group_flat.d2,2:1:9-2:7:15", + "src": { + "range": "d2/testdata/d2compiler/TestCompile/edge_map_group_flat.d2,2:1:9-2:3:11", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/edge_map_group_flat.d2,2:1:9-2:2:10", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "src_arrow": "", + "dst": { + "range": "d2/testdata/d2compiler/TestCompile/edge_map_group_flat.d2,2:5:13-2:7:15", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/edge_map_group_flat.d2,2:6:14-2:7:15", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + } + ] + }, + "dst_arrow": ">" + } + ], + "edge_index": { + "range": "d2/testdata/d2compiler/TestCompile/edge_map_group_flat.d2,2:8:16-2:11:19", + "int": 0, + "glob": false + }, + "edge_key": { + "range": "d2/testdata/d2compiler/TestCompile/edge_map_group_flat.d2,2:12:20-2:25:33", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/edge_map_group_flat.d2,2:12:20-2:17:25", + "value": [ + { + "string": "style", + "raw_string": "style" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/edge_map_group_flat.d2,2:18:26-2:25:33", + "value": [ + { + "string": "opacity", + "raw_string": "opacity" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "number": { + "range": "d2/testdata/d2compiler/TestCompile/edge_map_group_flat.d2,2:27:35-2:30:38", + "raw": "0.4", + "value": "2/5" + } + } + } + } + ] + }, + "root": { + "id": "", + "id_val": "", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + "edges": [ + { + "index": 0, + "minWidth": 0, + "minHeight": 0, + "label_dimensions": { + "width": 0, + "height": 0 + }, + "isCurve": false, + "src_arrow": false, + "dst_arrow": true, + "references": [ + { + "map_key_edge_index": 0 + }, + { + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "" + }, + "style": { + "opacity": { + "value": "0.4" + } + }, + "near_key": null, + "shape": { + "value": "" + } + } + } + ], + "objects": [ + { + "id": "x", + "id_val": "x", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2compiler/TestCompile/edge_map_group_flat.d2,1:0:1-1:2:3", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/edge_map_group_flat.d2,1:0:1-1:1:2", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + }, + { + "key": { + "range": "d2/testdata/d2compiler/TestCompile/edge_map_group_flat.d2,2:1:9-2:3:11", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/edge_map_group_flat.d2,2:1:9-2:2:10", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "x" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "y", + "id_val": "y", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2compiler/TestCompile/edge_map_group_flat.d2,1:4:5-1:6:7", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/edge_map_group_flat.d2,1:5:6-1:6:7", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + }, + { + "key": { + "range": "d2/testdata/d2compiler/TestCompile/edge_map_group_flat.d2,2:5:13-2:7:15", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/edge_map_group_flat.d2,2:6:14-2:7:15", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "y" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ] + }, + "err": null +} diff --git a/testdata/d2compiler/TestCompile/edge_map_group_semiflat.exp.json b/testdata/d2compiler/TestCompile/edge_map_group_semiflat.exp.json new file mode 100644 index 000000000..67b44e188 --- /dev/null +++ b/testdata/d2compiler/TestCompile/edge_map_group_semiflat.exp.json @@ -0,0 +1,334 @@ +{ + "graph": { + "ast": { + "range": "d2/testdata/d2compiler/TestCompile/edge_map_group_semiflat.d2,0:0:0-4:0:45", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2compiler/TestCompile/edge_map_group_semiflat.d2,0:0:0-0:6:6", + "edges": [ + { + "range": "d2/testdata/d2compiler/TestCompile/edge_map_group_semiflat.d2,0:0:0-0:6:6", + "src": { + "range": "d2/testdata/d2compiler/TestCompile/edge_map_group_semiflat.d2,0:0:0-0:2:2", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/edge_map_group_semiflat.d2,0:0:0-0:1:1", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "src_arrow": "", + "dst": { + "range": "d2/testdata/d2compiler/TestCompile/edge_map_group_semiflat.d2,0:4:4-0:6:6", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/edge_map_group_semiflat.d2,0:5:5-0:6:6", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + } + ] + }, + "dst_arrow": ">" + } + ], + "primary": {}, + "value": {} + } + }, + { + "map_key": { + "range": "d2/testdata/d2compiler/TestCompile/edge_map_group_semiflat.d2,1:0:7-3:1:44", + "edges": [ + { + "range": "d2/testdata/d2compiler/TestCompile/edge_map_group_semiflat.d2,1:1:8-1:7:14", + "src": { + "range": "d2/testdata/d2compiler/TestCompile/edge_map_group_semiflat.d2,1:1:8-1:3:10", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/edge_map_group_semiflat.d2,1:1:8-1:2:9", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "src_arrow": "", + "dst": { + "range": "d2/testdata/d2compiler/TestCompile/edge_map_group_semiflat.d2,1:5:12-1:7:14", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/edge_map_group_semiflat.d2,1:6:13-1:7:14", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + } + ] + }, + "dst_arrow": ">" + } + ], + "edge_index": { + "range": "d2/testdata/d2compiler/TestCompile/edge_map_group_semiflat.d2,1:8:15-1:11:18", + "int": 0, + "glob": false + }, + "edge_key": { + "range": "d2/testdata/d2compiler/TestCompile/edge_map_group_semiflat.d2,1:12:19-1:17:24", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/edge_map_group_semiflat.d2,1:12:19-1:17:24", + "value": [ + { + "string": "style", + "raw_string": "style" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "map": { + "range": "d2/testdata/d2compiler/TestCompile/edge_map_group_semiflat.d2,1:19:26-3:0:43", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2compiler/TestCompile/edge_map_group_semiflat.d2,2:2:30-2:14:42", + "key": { + "range": "d2/testdata/d2compiler/TestCompile/edge_map_group_semiflat.d2,2:2:30-2:9:37", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/edge_map_group_semiflat.d2,2:2:30-2:9:37", + "value": [ + { + "string": "opacity", + "raw_string": "opacity" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "number": { + "range": "d2/testdata/d2compiler/TestCompile/edge_map_group_semiflat.d2,2:11:39-2:14:42", + "raw": "0.4", + "value": "2/5" + } + } + } + } + ] + } + } + } + } + ] + }, + "root": { + "id": "", + "id_val": "", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + "edges": [ + { + "index": 0, + "minWidth": 0, + "minHeight": 0, + "label_dimensions": { + "width": 0, + "height": 0 + }, + "isCurve": false, + "src_arrow": false, + "dst_arrow": true, + "references": [ + { + "map_key_edge_index": 0 + }, + { + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "" + }, + "style": { + "opacity": { + "value": "0.4" + } + }, + "near_key": null, + "shape": { + "value": "" + } + } + } + ], + "objects": [ + { + "id": "x", + "id_val": "x", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2compiler/TestCompile/edge_map_group_semiflat.d2,0:0:0-0:2:2", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/edge_map_group_semiflat.d2,0:0:0-0:1:1", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + }, + { + "key": { + "range": "d2/testdata/d2compiler/TestCompile/edge_map_group_semiflat.d2,1:1:8-1:3:10", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/edge_map_group_semiflat.d2,1:1:8-1:2:9", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "x" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "y", + "id_val": "y", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2compiler/TestCompile/edge_map_group_semiflat.d2,0:4:4-0:6:6", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/edge_map_group_semiflat.d2,0:5:5-0:6:6", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + }, + { + "key": { + "range": "d2/testdata/d2compiler/TestCompile/edge_map_group_semiflat.d2,1:5:12-1:7:14", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/edge_map_group_semiflat.d2,1:6:13-1:7:14", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "y" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ] + }, + "err": null +} diff --git a/testdata/d2compiler/TestCompile/edge_map_nested.exp.json b/testdata/d2compiler/TestCompile/edge_map_nested.exp.json new file mode 100644 index 000000000..44d73ca4d --- /dev/null +++ b/testdata/d2compiler/TestCompile/edge_map_nested.exp.json @@ -0,0 +1,253 @@ +{ + "graph": { + "ast": { + "range": "d2/testdata/d2compiler/TestCompile/edge_map_nested.d2,0:0:0-6:0:45", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2compiler/TestCompile/edge_map_nested.d2,1:0:1-5:1:44", + "edges": [ + { + "range": "d2/testdata/d2compiler/TestCompile/edge_map_nested.d2,1:0:1-1:6:7", + "src": { + "range": "d2/testdata/d2compiler/TestCompile/edge_map_nested.d2,1:0:1-1:2:3", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/edge_map_nested.d2,1:0:1-1:1:2", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "src_arrow": "", + "dst": { + "range": "d2/testdata/d2compiler/TestCompile/edge_map_nested.d2,1:4:5-1:6:7", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/edge_map_nested.d2,1:5:6-1:6:7", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + } + ] + }, + "dst_arrow": ">" + } + ], + "primary": {}, + "value": { + "map": { + "range": "d2/testdata/d2compiler/TestCompile/edge_map_nested.d2,1:8:9-5:0:43", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2compiler/TestCompile/edge_map_nested.d2,2:2:13-4:3:42", + "key": { + "range": "d2/testdata/d2compiler/TestCompile/edge_map_nested.d2,2:2:13-2:7:18", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/edge_map_nested.d2,2:2:13-2:7:18", + "value": [ + { + "string": "style", + "raw_string": "style" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "map": { + "range": "d2/testdata/d2compiler/TestCompile/edge_map_nested.d2,2:9:20-4:2:41", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2compiler/TestCompile/edge_map_nested.d2,3:4:26-3:16:38", + "key": { + "range": "d2/testdata/d2compiler/TestCompile/edge_map_nested.d2,3:4:26-3:11:33", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/edge_map_nested.d2,3:4:26-3:11:33", + "value": [ + { + "string": "opacity", + "raw_string": "opacity" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "number": { + "range": "d2/testdata/d2compiler/TestCompile/edge_map_nested.d2,3:13:35-3:16:38", + "raw": "0.4", + "value": "2/5" + } + } + } + } + ] + } + } + } + } + ] + } + } + } + } + ] + }, + "root": { + "id": "", + "id_val": "", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + "edges": [ + { + "index": 0, + "minWidth": 0, + "minHeight": 0, + "label_dimensions": { + "width": 0, + "height": 0 + }, + "isCurve": false, + "src_arrow": false, + "dst_arrow": true, + "references": [ + { + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "" + }, + "style": { + "opacity": { + "value": "0.4" + } + }, + "near_key": null, + "shape": { + "value": "" + } + } + } + ], + "objects": [ + { + "id": "x", + "id_val": "x", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2compiler/TestCompile/edge_map_nested.d2,1:0:1-1:2:3", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/edge_map_nested.d2,1:0:1-1:1:2", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "x" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "y", + "id_val": "y", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2compiler/TestCompile/edge_map_nested.d2,1:4:5-1:6:7", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/edge_map_nested.d2,1:5:6-1:6:7", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "y" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ] + }, + "err": null +} diff --git a/testdata/d2compiler/TestCompile/edge_map_nested_flat.exp.json b/testdata/d2compiler/TestCompile/edge_map_nested_flat.exp.json new file mode 100644 index 000000000..18161ea9f --- /dev/null +++ b/testdata/d2compiler/TestCompile/edge_map_nested_flat.exp.json @@ -0,0 +1,235 @@ +{ + "graph": { + "ast": { + "range": "d2/testdata/d2compiler/TestCompile/edge_map_nested_flat.d2,0:0:0-4:0:33", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2compiler/TestCompile/edge_map_nested_flat.d2,1:0:1-3:1:32", + "edges": [ + { + "range": "d2/testdata/d2compiler/TestCompile/edge_map_nested_flat.d2,1:0:1-1:6:7", + "src": { + "range": "d2/testdata/d2compiler/TestCompile/edge_map_nested_flat.d2,1:0:1-1:2:3", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/edge_map_nested_flat.d2,1:0:1-1:1:2", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "src_arrow": "", + "dst": { + "range": "d2/testdata/d2compiler/TestCompile/edge_map_nested_flat.d2,1:4:5-1:6:7", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/edge_map_nested_flat.d2,1:5:6-1:6:7", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + } + ] + }, + "dst_arrow": ">" + } + ], + "primary": {}, + "value": { + "map": { + "range": "d2/testdata/d2compiler/TestCompile/edge_map_nested_flat.d2,1:8:9-3:0:31", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2compiler/TestCompile/edge_map_nested_flat.d2,2:1:12-2:19:30", + "key": { + "range": "d2/testdata/d2compiler/TestCompile/edge_map_nested_flat.d2,2:1:12-2:14:25", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/edge_map_nested_flat.d2,2:1:12-2:6:17", + "value": [ + { + "string": "style", + "raw_string": "style" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/edge_map_nested_flat.d2,2:7:18-2:14:25", + "value": [ + { + "string": "opacity", + "raw_string": "opacity" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "number": { + "range": "d2/testdata/d2compiler/TestCompile/edge_map_nested_flat.d2,2:16:27-2:19:30", + "raw": "0.4", + "value": "2/5" + } + } + } + } + ] + } + } + } + } + ] + }, + "root": { + "id": "", + "id_val": "", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + "edges": [ + { + "index": 0, + "minWidth": 0, + "minHeight": 0, + "label_dimensions": { + "width": 0, + "height": 0 + }, + "isCurve": false, + "src_arrow": false, + "dst_arrow": true, + "references": [ + { + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "" + }, + "style": { + "opacity": { + "value": "0.4" + } + }, + "near_key": null, + "shape": { + "value": "" + } + } + } + ], + "objects": [ + { + "id": "x", + "id_val": "x", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2compiler/TestCompile/edge_map_nested_flat.d2,1:0:1-1:2:3", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/edge_map_nested_flat.d2,1:0:1-1:1:2", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "x" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "y", + "id_val": "y", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2compiler/TestCompile/edge_map_nested_flat.d2,1:4:5-1:6:7", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/edge_map_nested_flat.d2,1:5:6-1:6:7", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "y" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ] + }, + "err": null +} diff --git a/testdata/d2compiler/TestCompile/edge_map_non_reserved.exp.json b/testdata/d2compiler/TestCompile/edge_map_non_reserved.exp.json new file mode 100644 index 000000000..43f2de8b6 --- /dev/null +++ b/testdata/d2compiler/TestCompile/edge_map_non_reserved.exp.json @@ -0,0 +1,12 @@ +{ + "graph": null, + "err": { + "ioerr": null, + "errs": [ + { + "range": "d2/testdata/d2compiler/TestCompile/edge_map_non_reserved.d2,1:0:1-3:1:16", + "errmsg": "d2/testdata/d2compiler/TestCompile/edge_map_non_reserved.d2:2:1: edge map keys must be reserved keywords" + } + ] + } +} diff --git a/testdata/d2compiler/TestCompile/edge_mixed_arrowhead.exp.json b/testdata/d2compiler/TestCompile/edge_mixed_arrowhead.exp.json new file mode 100644 index 000000000..40af4edf1 --- /dev/null +++ b/testdata/d2compiler/TestCompile/edge_mixed_arrowhead.exp.json @@ -0,0 +1,404 @@ +{ + "graph": { + "ast": { + "range": "d2/testdata/d2compiler/TestCompile/edge_mixed_arrowhead.d2,0:0:0-6:0:97", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2compiler/TestCompile/edge_mixed_arrowhead.d2,0:0:0-2:1:45", + "edges": [ + { + "range": "d2/testdata/d2compiler/TestCompile/edge_mixed_arrowhead.d2,0:0:0-0:6:6", + "src": { + "range": "d2/testdata/d2compiler/TestCompile/edge_mixed_arrowhead.d2,0:0:0-0:2:2", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/edge_mixed_arrowhead.d2,0:0:0-0:1:1", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "src_arrow": "", + "dst": { + "range": "d2/testdata/d2compiler/TestCompile/edge_mixed_arrowhead.d2,0:4:4-0:6:6", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/edge_mixed_arrowhead.d2,0:5:5-0:6:6", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + } + ] + }, + "dst_arrow": ">" + } + ], + "primary": {}, + "value": { + "map": { + "range": "d2/testdata/d2compiler/TestCompile/edge_mixed_arrowhead.d2,0:8:8-2:0:44", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2compiler/TestCompile/edge_mixed_arrowhead.d2,1:2:12-1:33:43", + "key": { + "range": "d2/testdata/d2compiler/TestCompile/edge_mixed_arrowhead.d2,1:2:12-1:24:34", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/edge_mixed_arrowhead.d2,1:2:12-1:18:28", + "value": [ + { + "string": "target-arrowhead", + "raw_string": "target-arrowhead" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/edge_mixed_arrowhead.d2,1:19:29-1:24:34", + "value": [ + { + "string": "shape", + "raw_string": "shape" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/edge_mixed_arrowhead.d2,1:26:36-1:33:43", + "value": [ + { + "string": "diamond", + "raw_string": "diamond" + } + ] + } + } + } + } + ] + } + } + } + }, + { + "map_key": { + "range": "d2/testdata/d2compiler/TestCompile/edge_mixed_arrowhead.d2,3:0:46-5:1:96", + "edges": [ + { + "range": "d2/testdata/d2compiler/TestCompile/edge_mixed_arrowhead.d2,3:1:47-3:7:53", + "src": { + "range": "d2/testdata/d2compiler/TestCompile/edge_mixed_arrowhead.d2,3:1:47-3:3:49", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/edge_mixed_arrowhead.d2,3:1:47-3:2:48", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "src_arrow": "", + "dst": { + "range": "d2/testdata/d2compiler/TestCompile/edge_mixed_arrowhead.d2,3:5:51-3:7:53", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/edge_mixed_arrowhead.d2,3:6:52-3:7:53", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + } + ] + }, + "dst_arrow": ">" + } + ], + "edge_index": { + "range": "d2/testdata/d2compiler/TestCompile/edge_mixed_arrowhead.d2,3:8:54-3:11:57", + "int": 0, + "glob": false + }, + "edge_key": { + "range": "d2/testdata/d2compiler/TestCompile/edge_mixed_arrowhead.d2,3:12:58-3:28:74", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/edge_mixed_arrowhead.d2,3:12:58-3:28:74", + "value": [ + { + "string": "source-arrowhead", + "raw_string": "source-arrowhead" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "map": { + "range": "d2/testdata/d2compiler/TestCompile/edge_mixed_arrowhead.d2,3:30:76-5:0:95", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2compiler/TestCompile/edge_mixed_arrowhead.d2,4:2:80-4:16:94", + "key": { + "range": "d2/testdata/d2compiler/TestCompile/edge_mixed_arrowhead.d2,4:2:80-4:7:85", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/edge_mixed_arrowhead.d2,4:2:80-4:7:85", + "value": [ + { + "string": "shape", + "raw_string": "shape" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/edge_mixed_arrowhead.d2,4:9:87-4:16:94", + "value": [ + { + "string": "diamond", + "raw_string": "diamond" + } + ] + } + } + } + } + ] + } + } + } + } + ] + }, + "root": { + "id": "", + "id_val": "", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + "edges": [ + { + "index": 0, + "minWidth": 0, + "minHeight": 0, + "label_dimensions": { + "width": 0, + "height": 0 + }, + "isCurve": false, + "src_arrow": false, + "srcArrowhead": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "diamond" + } + }, + "dst_arrow": true, + "dstArrowhead": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "diamond" + } + }, + "references": [ + { + "map_key_edge_index": 0 + }, + { + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ], + "objects": [ + { + "id": "x", + "id_val": "x", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2compiler/TestCompile/edge_mixed_arrowhead.d2,0:0:0-0:2:2", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/edge_mixed_arrowhead.d2,0:0:0-0:1:1", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + }, + { + "key": { + "range": "d2/testdata/d2compiler/TestCompile/edge_mixed_arrowhead.d2,3:1:47-3:3:49", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/edge_mixed_arrowhead.d2,3:1:47-3:2:48", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "x" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "y", + "id_val": "y", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2compiler/TestCompile/edge_mixed_arrowhead.d2,0:4:4-0:6:6", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/edge_mixed_arrowhead.d2,0:5:5-0:6:6", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + }, + { + "key": { + "range": "d2/testdata/d2compiler/TestCompile/edge_mixed_arrowhead.d2,3:5:51-3:7:53", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/edge_mixed_arrowhead.d2,3:6:52-3:7:53", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "y" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ] + }, + "err": null +} diff --git a/testdata/d2compiler/TestCompile/edge_non_shape_arrowhead.exp.json b/testdata/d2compiler/TestCompile/edge_non_shape_arrowhead.exp.json new file mode 100644 index 000000000..0298cbd45 --- /dev/null +++ b/testdata/d2compiler/TestCompile/edge_non_shape_arrowhead.exp.json @@ -0,0 +1,245 @@ +{ + "graph": { + "ast": { + "range": "d2/testdata/d2compiler/TestCompile/edge_non_shape_arrowhead.d2,0:0:0-1:0:45", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2compiler/TestCompile/edge_non_shape_arrowhead.d2,0:0:0-0:44:44", + "edges": [ + { + "range": "d2/testdata/d2compiler/TestCompile/edge_non_shape_arrowhead.d2,0:0:0-0:6:6", + "src": { + "range": "d2/testdata/d2compiler/TestCompile/edge_non_shape_arrowhead.d2,0:0:0-0:2:2", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/edge_non_shape_arrowhead.d2,0:0:0-0:1:1", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "src_arrow": "", + "dst": { + "range": "d2/testdata/d2compiler/TestCompile/edge_non_shape_arrowhead.d2,0:4:4-0:6:6", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/edge_non_shape_arrowhead.d2,0:5:5-0:6:6", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + } + ] + }, + "dst_arrow": ">" + } + ], + "primary": {}, + "value": { + "map": { + "range": "d2/testdata/d2compiler/TestCompile/edge_non_shape_arrowhead.d2,0:8:8-0:43:43", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2compiler/TestCompile/edge_non_shape_arrowhead.d2,0:10:10-0:43:43", + "key": { + "range": "d2/testdata/d2compiler/TestCompile/edge_non_shape_arrowhead.d2,0:10:10-0:32:32", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/edge_non_shape_arrowhead.d2,0:10:10-0:26:26", + "value": [ + { + "string": "source-arrowhead", + "raw_string": "source-arrowhead" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/edge_non_shape_arrowhead.d2,0:27:27-0:32:32", + "value": [ + { + "string": "shape", + "raw_string": "shape" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/edge_non_shape_arrowhead.d2,0:34:34-0:42:42", + "value": [ + { + "string": "triangle", + "raw_string": "triangle" + } + ] + } + } + } + } + ] + } + } + } + } + ] + }, + "root": { + "id": "", + "id_val": "", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + "edges": [ + { + "index": 0, + "minWidth": 0, + "minHeight": 0, + "label_dimensions": { + "width": 0, + "height": 0 + }, + "isCurve": false, + "src_arrow": false, + "srcArrowhead": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "triangle" + } + }, + "dst_arrow": true, + "references": [ + { + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ], + "objects": [ + { + "id": "x", + "id_val": "x", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2compiler/TestCompile/edge_non_shape_arrowhead.d2,0:0:0-0:2:2", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/edge_non_shape_arrowhead.d2,0:0:0-0:1:1", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "x" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "y", + "id_val": "y", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2compiler/TestCompile/edge_non_shape_arrowhead.d2,0:4:4-0:6:6", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/edge_non_shape_arrowhead.d2,0:5:5-0:6:6", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "y" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ] + }, + "err": null +} diff --git a/testdata/d2compiler/TestCompile/edge_semiflat_arrowhead.exp.json b/testdata/d2compiler/TestCompile/edge_semiflat_arrowhead.exp.json new file mode 100644 index 000000000..d55583d16 --- /dev/null +++ b/testdata/d2compiler/TestCompile/edge_semiflat_arrowhead.exp.json @@ -0,0 +1,344 @@ +{ + "graph": { + "ast": { + "range": "d2/testdata/d2compiler/TestCompile/edge_semiflat_arrowhead.d2,0:0:0-4:0:58", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2compiler/TestCompile/edge_semiflat_arrowhead.d2,0:0:0-0:6:6", + "edges": [ + { + "range": "d2/testdata/d2compiler/TestCompile/edge_semiflat_arrowhead.d2,0:0:0-0:6:6", + "src": { + "range": "d2/testdata/d2compiler/TestCompile/edge_semiflat_arrowhead.d2,0:0:0-0:2:2", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/edge_semiflat_arrowhead.d2,0:0:0-0:1:1", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "src_arrow": "", + "dst": { + "range": "d2/testdata/d2compiler/TestCompile/edge_semiflat_arrowhead.d2,0:4:4-0:6:6", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/edge_semiflat_arrowhead.d2,0:5:5-0:6:6", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + } + ] + }, + "dst_arrow": ">" + } + ], + "primary": {}, + "value": {} + } + }, + { + "map_key": { + "range": "d2/testdata/d2compiler/TestCompile/edge_semiflat_arrowhead.d2,1:0:7-3:1:57", + "edges": [ + { + "range": "d2/testdata/d2compiler/TestCompile/edge_semiflat_arrowhead.d2,1:1:8-1:7:14", + "src": { + "range": "d2/testdata/d2compiler/TestCompile/edge_semiflat_arrowhead.d2,1:1:8-1:3:10", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/edge_semiflat_arrowhead.d2,1:1:8-1:2:9", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "src_arrow": "", + "dst": { + "range": "d2/testdata/d2compiler/TestCompile/edge_semiflat_arrowhead.d2,1:5:12-1:7:14", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/edge_semiflat_arrowhead.d2,1:6:13-1:7:14", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + } + ] + }, + "dst_arrow": ">" + } + ], + "edge_index": { + "range": "d2/testdata/d2compiler/TestCompile/edge_semiflat_arrowhead.d2,1:8:15-1:11:18", + "int": 0, + "glob": false + }, + "edge_key": { + "range": "d2/testdata/d2compiler/TestCompile/edge_semiflat_arrowhead.d2,1:12:19-1:28:35", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/edge_semiflat_arrowhead.d2,1:12:19-1:28:35", + "value": [ + { + "string": "source-arrowhead", + "raw_string": "source-arrowhead" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "map": { + "range": "d2/testdata/d2compiler/TestCompile/edge_semiflat_arrowhead.d2,1:30:37-3:0:56", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2compiler/TestCompile/edge_semiflat_arrowhead.d2,2:2:41-2:16:55", + "key": { + "range": "d2/testdata/d2compiler/TestCompile/edge_semiflat_arrowhead.d2,2:2:41-2:7:46", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/edge_semiflat_arrowhead.d2,2:2:41-2:7:46", + "value": [ + { + "string": "shape", + "raw_string": "shape" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/edge_semiflat_arrowhead.d2,2:9:48-2:16:55", + "value": [ + { + "string": "diamond", + "raw_string": "diamond" + } + ] + } + } + } + } + ] + } + } + } + } + ] + }, + "root": { + "id": "", + "id_val": "", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + "edges": [ + { + "index": 0, + "minWidth": 0, + "minHeight": 0, + "label_dimensions": { + "width": 0, + "height": 0 + }, + "isCurve": false, + "src_arrow": false, + "srcArrowhead": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "diamond" + } + }, + "dst_arrow": true, + "references": [ + { + "map_key_edge_index": 0 + }, + { + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ], + "objects": [ + { + "id": "x", + "id_val": "x", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2compiler/TestCompile/edge_semiflat_arrowhead.d2,0:0:0-0:2:2", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/edge_semiflat_arrowhead.d2,0:0:0-0:1:1", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + }, + { + "key": { + "range": "d2/testdata/d2compiler/TestCompile/edge_semiflat_arrowhead.d2,1:1:8-1:3:10", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/edge_semiflat_arrowhead.d2,1:1:8-1:2:9", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "x" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "y", + "id_val": "y", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2compiler/TestCompile/edge_semiflat_arrowhead.d2,0:4:4-0:6:6", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/edge_semiflat_arrowhead.d2,0:5:5-0:6:6", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + }, + { + "key": { + "range": "d2/testdata/d2compiler/TestCompile/edge_semiflat_arrowhead.d2,1:5:12-1:7:14", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/edge_semiflat_arrowhead.d2,1:6:13-1:7:14", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "y" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ] + }, + "err": null +} diff --git a/testdata/d2compiler/TestCompile/edge_to_style.exp.json b/testdata/d2compiler/TestCompile/edge_to_style.exp.json new file mode 100644 index 000000000..998c6e57c --- /dev/null +++ b/testdata/d2compiler/TestCompile/edge_to_style.exp.json @@ -0,0 +1,12 @@ +{ + "graph": null, + "err": { + "ioerr": null, + "errs": [ + { + "range": "d2/testdata/d2compiler/TestCompile/edge_to_style.d2,1:0:24-1:12:36", + "errmsg": "d2/testdata/d2compiler/TestCompile/edge_to_style.d2:2:1: cannot connect to reserved keyword" + } + ] + } +} diff --git a/testdata/d2compiler/TestCompile/edge_unquoted_hex.exp.json b/testdata/d2compiler/TestCompile/edge_unquoted_hex.exp.json new file mode 100644 index 000000000..153cd212a --- /dev/null +++ b/testdata/d2compiler/TestCompile/edge_unquoted_hex.exp.json @@ -0,0 +1,12 @@ +{ + "graph": null, + "err": { + "ioerr": null, + "errs": [ + { + "range": "d2/testdata/d2compiler/TestCompile/edge_unquoted_hex.d2,2:9:29-2:10:30", + "errmsg": "d2/testdata/d2compiler/TestCompile/edge_unquoted_hex.d2:3:10: missing value after colon" + } + ] + } +} diff --git a/testdata/d2compiler/TestCompile/errors/missing_shape_icon.exp.json b/testdata/d2compiler/TestCompile/errors/missing_shape_icon.exp.json new file mode 100644 index 000000000..e4b3afbd9 --- /dev/null +++ b/testdata/d2compiler/TestCompile/errors/missing_shape_icon.exp.json @@ -0,0 +1,12 @@ +{ + "graph": null, + "err": { + "ioerr": null, + "errs": [ + { + "range": "d2/testdata/d2compiler/TestCompile/errors/missing_shape_icon.d2,0:0:0-0:14:14", + "errmsg": "d2/testdata/d2compiler/TestCompile/errors/missing_shape_icon.d2:1:1: image shape must include an \"icon\" field" + } + ] + } +} diff --git a/testdata/d2compiler/TestCompile/errors/reserved_icon_style.exp.json b/testdata/d2compiler/TestCompile/errors/reserved_icon_style.exp.json new file mode 100644 index 000000000..4591c13df --- /dev/null +++ b/testdata/d2compiler/TestCompile/errors/reserved_icon_style.exp.json @@ -0,0 +1,24 @@ +{ + "graph": null, + "err": { + "ioerr": null, + "errs": [ + { + "range": "d2/testdata/d2compiler/TestCompile/errors/reserved_icon_style.d2,2:8:23-2:27:42", + "errmsg": "d2/testdata/d2compiler/TestCompile/errors/reserved_icon_style.d2:3:9: bad icon url \"::????:::%%orange\": parse \"::????:::%%orange\": missing protocol scheme" + }, + { + "range": "d2/testdata/d2compiler/TestCompile/errors/reserved_icon_style.d2,3:17:60-3:19:62", + "errmsg": "d2/testdata/d2compiler/TestCompile/errors/reserved_icon_style.d2:4:18: expected \"opacity\" to be a number between 0.0 and 1.0" + }, + { + "range": "d2/testdata/d2compiler/TestCompile/errors/reserved_icon_style.d2,4:17:80-4:20:83", + "errmsg": "d2/testdata/d2compiler/TestCompile/errors/reserved_icon_style.d2:5:18: expected \"opacity\" to be a number between 0.0 and 1.0" + }, + { + "range": "d2/testdata/d2compiler/TestCompile/errors/reserved_icon_style.d2,0:0:0-0:1:1", + "errmsg": "d2/testdata/d2compiler/TestCompile/errors/reserved_icon_style.d2:1:1: near key \"y\" does not exist. It must be the absolute path to a shape." + } + ] + } +} diff --git a/testdata/d2compiler/TestCompile/escaped_id.exp.json b/testdata/d2compiler/TestCompile/escaped_id.exp.json new file mode 100644 index 000000000..66ab3db4b --- /dev/null +++ b/testdata/d2compiler/TestCompile/escaped_id.exp.json @@ -0,0 +1,94 @@ +{ + "graph": { + "ast": { + "range": "d2/testdata/d2compiler/TestCompile/escaped_id.d2,0:0:0-0:4:4", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2compiler/TestCompile/escaped_id.d2,0:0:0-0:4:4", + "key": { + "range": "d2/testdata/d2compiler/TestCompile/escaped_id.d2,0:0:0-0:4:4", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/escaped_id.d2,0:0:0-0:4:4", + "value": [ + { + "string": "b\nb", + "raw_string": "b\\nb" + } + ] + } + } + ] + }, + "primary": {}, + "value": {} + } + } + ] + }, + "root": { + "id": "", + "id_val": "", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + "edges": null, + "objects": [ + { + "id": "\"b\\nb\"", + "id_val": "b\nb", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2compiler/TestCompile/escaped_id.d2,0:0:0-0:4:4", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/escaped_id.d2,0:0:0-0:4:4", + "value": [ + { + "string": "b\nb", + "raw_string": "b\\nb" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "b\nb" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ] + }, + "err": null +} diff --git a/testdata/d2compiler/TestCompile/illegal-stroke-width.exp.json b/testdata/d2compiler/TestCompile/illegal-stroke-width.exp.json new file mode 100644 index 000000000..4bdd9802f --- /dev/null +++ b/testdata/d2compiler/TestCompile/illegal-stroke-width.exp.json @@ -0,0 +1,12 @@ +{ + "graph": null, + "err": { + "ioerr": null, + "errs": [ + { + "range": "d2/testdata/d2compiler/TestCompile/illegal-stroke-width.d2,1:22:28-1:24:30", + "errmsg": "d2/testdata/d2compiler/TestCompile/illegal-stroke-width.d2:2:23: expected \"stroke-width\" to be a number between 0 and 15" + } + ] + } +} diff --git a/testdata/d2compiler/TestCompile/image_dimensions.exp.json b/testdata/d2compiler/TestCompile/image_dimensions.exp.json new file mode 100644 index 000000000..941ac9885 --- /dev/null +++ b/testdata/d2compiler/TestCompile/image_dimensions.exp.json @@ -0,0 +1,253 @@ +{ + "graph": { + "ast": { + "range": "d2/testdata/d2compiler/TestCompile/image_dimensions.d2,0:0:0-6:0:117", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2compiler/TestCompile/image_dimensions.d2,0:0:0-5:1:116", + "key": { + "range": "d2/testdata/d2compiler/TestCompile/image_dimensions.d2,0:0:0-0:3:3", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/image_dimensions.d2,0:0:0-0:3:3", + "value": [ + { + "string": "hey", + "raw_string": "hey" + } + ] + } + } + ] + }, + "primary": { + "double_quoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/image_dimensions.d2,0:5:5-0:7:7", + "value": null + } + }, + "value": { + "map": { + "range": "d2/testdata/d2compiler/TestCompile/image_dimensions.d2,0:8:8-5:0:115", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2compiler/TestCompile/image_dimensions.d2,1:2:12-1:64:74", + "key": { + "range": "d2/testdata/d2compiler/TestCompile/image_dimensions.d2,1:2:12-1:6:16", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/image_dimensions.d2,1:2:12-1:6:16", + "value": [ + { + "string": "icon", + "raw_string": "icon" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/image_dimensions.d2,1:8:18-1:64:74", + "value": [ + { + "string": "https://icons.terrastruct.com/essentials/004-picture.svg", + "raw_string": "https://icons.terrastruct.com/essentials/004-picture.svg" + } + ] + } + } + } + }, + { + "map_key": { + "range": "d2/testdata/d2compiler/TestCompile/image_dimensions.d2,2:2:77-2:14:89", + "key": { + "range": "d2/testdata/d2compiler/TestCompile/image_dimensions.d2,2:2:77-2:7:82", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/image_dimensions.d2,2:2:77-2:7:82", + "value": [ + { + "string": "shape", + "raw_string": "shape" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/image_dimensions.d2,2:9:84-2:14:89", + "value": [ + { + "string": "image", + "raw_string": "image" + } + ] + } + } + } + }, + { + "map_key": { + "range": "d2/testdata/d2compiler/TestCompile/image_dimensions.d2,3:1:91-3:11:101", + "key": { + "range": "d2/testdata/d2compiler/TestCompile/image_dimensions.d2,3:1:91-3:6:96", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/image_dimensions.d2,3:1:91-3:6:96", + "value": [ + { + "string": "width", + "raw_string": "width" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "number": { + "range": "d2/testdata/d2compiler/TestCompile/image_dimensions.d2,3:8:98-3:11:101", + "raw": "200", + "value": "200" + } + } + } + }, + { + "map_key": { + "range": "d2/testdata/d2compiler/TestCompile/image_dimensions.d2,4:1:103-4:12:114", + "key": { + "range": "d2/testdata/d2compiler/TestCompile/image_dimensions.d2,4:1:103-4:7:109", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/image_dimensions.d2,4:1:103-4:7:109", + "value": [ + { + "string": "height", + "raw_string": "height" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "number": { + "range": "d2/testdata/d2compiler/TestCompile/image_dimensions.d2,4:9:111-4:12:114", + "raw": "230", + "value": "230" + } + } + } + } + ] + } + } + } + } + ] + }, + "root": { + "id": "", + "id_val": "", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "width": { + "value": "" + }, + "height": { + "value": "" + }, + "near_key": null, + "shape": { + "value": "" + } + } + }, + "edges": null, + "objects": [ + { + "id": "hey", + "id_val": "hey", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2compiler/TestCompile/image_dimensions.d2,0:0:0-0:3:3", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/image_dimensions.d2,0:0:0-0:3:3", + "value": [ + { + "string": "hey", + "raw_string": "hey" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "icon": { + "Scheme": "https", + "Opaque": "", + "User": null, + "Host": "icons.terrastruct.com", + "Path": "/essentials/004-picture.svg", + "RawPath": "", + "ForceQuery": false, + "RawQuery": "", + "Fragment": "", + "RawFragment": "" + }, + "width": { + "value": "200" + }, + "height": { + "value": "230" + }, + "near_key": null, + "shape": { + "value": "image" + } + } + } + ] + }, + "err": null +} diff --git a/testdata/d2compiler/TestCompile/image_non_style.exp.json b/testdata/d2compiler/TestCompile/image_non_style.exp.json new file mode 100644 index 000000000..f34143327 --- /dev/null +++ b/testdata/d2compiler/TestCompile/image_non_style.exp.json @@ -0,0 +1,12 @@ +{ + "graph": null, + "err": { + "ioerr": null, + "errs": [ + { + "range": "d2/testdata/d2compiler/TestCompile/image_non_style.d2,3:2:115-3:9:122", + "errmsg": "d2/testdata/d2compiler/TestCompile/image_non_style.d2:4:3: image shapes cannot have children." + } + ] + } +} diff --git a/testdata/d2compiler/TestCompile/image_style.exp.json b/testdata/d2compiler/TestCompile/image_style.exp.json new file mode 100644 index 000000000..560a8afd4 --- /dev/null +++ b/testdata/d2compiler/TestCompile/image_style.exp.json @@ -0,0 +1,231 @@ +{ + "graph": { + "ast": { + "range": "d2/testdata/d2compiler/TestCompile/image_style.d2,0:0:0-5:0:118", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2compiler/TestCompile/image_style.d2,0:0:0-4:1:117", + "key": { + "range": "d2/testdata/d2compiler/TestCompile/image_style.d2,0:0:0-0:3:3", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/image_style.d2,0:0:0-0:3:3", + "value": [ + { + "string": "hey", + "raw_string": "hey" + } + ] + } + } + ] + }, + "primary": { + "double_quoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/image_style.d2,0:5:5-0:7:7", + "value": null + } + }, + "value": { + "map": { + "range": "d2/testdata/d2compiler/TestCompile/image_style.d2,0:8:8-4:0:116", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2compiler/TestCompile/image_style.d2,1:2:12-1:64:74", + "key": { + "range": "d2/testdata/d2compiler/TestCompile/image_style.d2,1:2:12-1:6:16", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/image_style.d2,1:2:12-1:6:16", + "value": [ + { + "string": "icon", + "raw_string": "icon" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/image_style.d2,1:8:18-1:64:74", + "value": [ + { + "string": "https://icons.terrastruct.com/essentials/004-picture.svg", + "raw_string": "https://icons.terrastruct.com/essentials/004-picture.svg" + } + ] + } + } + } + }, + { + "map_key": { + "range": "d2/testdata/d2compiler/TestCompile/image_style.d2,2:2:77-2:14:89", + "key": { + "range": "d2/testdata/d2compiler/TestCompile/image_style.d2,2:2:77-2:7:82", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/image_style.d2,2:2:77-2:7:82", + "value": [ + { + "string": "shape", + "raw_string": "shape" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/image_style.d2,2:9:84-2:14:89", + "value": [ + { + "string": "image", + "raw_string": "image" + } + ] + } + } + } + }, + { + "map_key": { + "range": "d2/testdata/d2compiler/TestCompile/image_style.d2,3:2:92-3:25:115", + "key": { + "range": "d2/testdata/d2compiler/TestCompile/image_style.d2,3:2:92-3:14:104", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/image_style.d2,3:2:92-3:7:97", + "value": [ + { + "string": "style", + "raw_string": "style" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/image_style.d2,3:8:98-3:14:104", + "value": [ + { + "string": "stroke", + "raw_string": "stroke" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "double_quoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/image_style.d2,3:16:106-3:25:115", + "value": [ + { + "string": "#0D32B2", + "raw_string": "#0D32B2" + } + ] + } + } + } + } + ] + } + } + } + } + ] + }, + "root": { + "id": "", + "id_val": "", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + "edges": [], + "objects": [ + { + "id": "hey", + "id_val": "hey", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2compiler/TestCompile/image_style.d2,0:0:0-0:3:3", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/image_style.d2,0:0:0-0:3:3", + "value": [ + { + "string": "hey", + "raw_string": "hey" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "" + }, + "style": { + "stroke": { + "value": "#0D32B2" + } + }, + "icon": { + "Scheme": "https", + "Opaque": "", + "User": null, + "Host": "icons.terrastruct.com", + "Path": "/essentials/004-picture.svg", + "RawPath": "", + "ForceQuery": false, + "RawQuery": "", + "Fragment": "", + "RawFragment": "" + }, + "near_key": null, + "shape": { + "value": "image" + } + } + } + ] + }, + "err": null +} diff --git a/testdata/d2compiler/TestCompile/nested_edge.exp.json b/testdata/d2compiler/TestCompile/nested_edge.exp.json new file mode 100644 index 000000000..e129a4538 --- /dev/null +++ b/testdata/d2compiler/TestCompile/nested_edge.exp.json @@ -0,0 +1,12 @@ +{ + "graph": null, + "err": { + "ioerr": null, + "errs": [ + { + "range": "d2/testdata/d2compiler/TestCompile/nested_edge.d2,0:0:0-2:1:39", + "errmsg": "d2/testdata/d2compiler/TestCompile/nested_edge.d2:1:1: edges cannot be nested within another edge" + } + ] + } +} diff --git a/testdata/d2compiler/TestCompile/nested_sql.exp.json b/testdata/d2compiler/TestCompile/nested_sql.exp.json new file mode 100644 index 000000000..20e9543c7 --- /dev/null +++ b/testdata/d2compiler/TestCompile/nested_sql.exp.json @@ -0,0 +1,284 @@ +{ + "graph": { + "ast": { + "range": "d2/testdata/d2compiler/TestCompile/nested_sql.d2,0:0:0-7:1:84", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2compiler/TestCompile/nested_sql.d2,0:0:0-7:1:84", + "key": { + "range": "d2/testdata/d2compiler/TestCompile/nested_sql.d2,0:0:0-0:5:5", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/nested_sql.d2,0:0:0-0:5:5", + "value": [ + { + "string": "outer", + "raw_string": "outer" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "map": { + "range": "d2/testdata/d2compiler/TestCompile/nested_sql.d2,0:7:7-7:0:83", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2compiler/TestCompile/nested_sql.d2,1:2:11-6:3:82", + "key": { + "range": "d2/testdata/d2compiler/TestCompile/nested_sql.d2,1:2:11-1:7:16", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/nested_sql.d2,1:2:11-1:7:16", + "value": [ + { + "string": "table", + "raw_string": "table" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "map": { + "range": "d2/testdata/d2compiler/TestCompile/nested_sql.d2,1:9:18-6:2:81", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2compiler/TestCompile/nested_sql.d2,2:4:24-2:20:40", + "key": { + "range": "d2/testdata/d2compiler/TestCompile/nested_sql.d2,2:4:24-2:9:29", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/nested_sql.d2,2:4:24-2:9:29", + "value": [ + { + "string": "shape", + "raw_string": "shape" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/nested_sql.d2,2:11:31-2:20:40", + "value": [ + { + "string": "sql_table", + "raw_string": "sql_table" + } + ] + } + } + } + }, + { + "map_key": { + "range": "d2/testdata/d2compiler/TestCompile/nested_sql.d2,4:4:46-4:21:63", + "key": { + "range": "d2/testdata/d2compiler/TestCompile/nested_sql.d2,4:4:46-4:13:55", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/nested_sql.d2,4:4:46-4:13:55", + "value": [ + { + "string": "GetType()", + "raw_string": "GetType()" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/nested_sql.d2,4:15:57-4:21:63", + "value": [ + { + "string": "string", + "raw_string": "string" + } + ] + } + } + } + }, + { + "map_key": { + "range": "d2/testdata/d2compiler/TestCompile/nested_sql.d2,5:4:68-5:14:78", + "key": { + "range": "d2/testdata/d2compiler/TestCompile/nested_sql.d2,5:4:68-5:8:72", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/nested_sql.d2,5:4:68-5:8:72", + "value": [ + { + "string": "Is()", + "raw_string": "Is()" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/nested_sql.d2,5:10:74-5:14:78", + "value": [ + { + "string": "bool", + "raw_string": "bool" + } + ] + } + } + } + } + ] + } + } + } + } + ] + } + } + } + } + ] + }, + "root": { + "id": "", + "id_val": "", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + "edges": [], + "objects": [ + { + "id": "outer", + "id_val": "outer", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2compiler/TestCompile/nested_sql.d2,0:0:0-0:5:5", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/nested_sql.d2,0:0:0-0:5:5", + "value": [ + { + "string": "outer", + "raw_string": "outer" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "outer" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "table", + "id_val": "table", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2compiler/TestCompile/nested_sql.d2,1:2:11-1:7:16", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/nested_sql.d2,1:2:11-1:7:16", + "value": [ + { + "string": "table", + "raw_string": "table" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "sql_table": { + "columns": [ + { + "name": "GetType()", + "type": "string", + "constraint": "", + "reference": "" + }, + { + "name": "Is()", + "type": "bool", + "constraint": "", + "reference": "" + } + ] + }, + "attributes": { + "label": { + "value": "table" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "sql_table" + } + } + } + ] + }, + "err": null +} diff --git a/testdata/d2compiler/TestCompile/object_arrowhead_shape.exp.json b/testdata/d2compiler/TestCompile/object_arrowhead_shape.exp.json new file mode 100644 index 000000000..d1fef4a09 --- /dev/null +++ b/testdata/d2compiler/TestCompile/object_arrowhead_shape.exp.json @@ -0,0 +1,12 @@ +{ + "graph": null, + "err": { + "ioerr": null, + "errs": [ + { + "range": "d2/testdata/d2compiler/TestCompile/object_arrowhead_shape.d2,0:4:4-0:19:19", + "errmsg": "d2/testdata/d2compiler/TestCompile/object_arrowhead_shape.d2:1:5: invalid shape, can only set \"triangle\" for arrowheads" + } + ] + } +} diff --git a/testdata/d2compiler/TestCompile/path_link.exp.json b/testdata/d2compiler/TestCompile/path_link.exp.json new file mode 100644 index 000000000..3c3090156 --- /dev/null +++ b/testdata/d2compiler/TestCompile/path_link.exp.json @@ -0,0 +1,134 @@ +{ + "graph": { + "ast": { + "range": "d2/testdata/d2compiler/TestCompile/path_link.d2,0:0:0-3:0:47", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2compiler/TestCompile/path_link.d2,0:0:0-2:1:46", + "key": { + "range": "d2/testdata/d2compiler/TestCompile/path_link.d2,0:0:0-0:1:1", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/path_link.d2,0:0:0-0:1:1", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "map": { + "range": "d2/testdata/d2compiler/TestCompile/path_link.d2,0:3:3-2:0:45", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2compiler/TestCompile/path_link.d2,1:2:7-1:39:44", + "key": { + "range": "d2/testdata/d2compiler/TestCompile/path_link.d2,1:2:7-1:6:11", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/path_link.d2,1:2:7-1:6:11", + "value": [ + { + "string": "link", + "raw_string": "link" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/path_link.d2,1:8:13-1:39:44", + "value": [ + { + "string": "Overview.Untitled board 7.zzzzz", + "raw_string": "Overview.Untitled board 7.zzzzz" + } + ] + } + } + } + } + ] + } + } + } + } + ] + }, + "root": { + "id": "", + "id_val": "", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + "edges": null, + "objects": [ + { + "id": "x", + "id_val": "x", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2compiler/TestCompile/path_link.d2,0:0:0-0:1:1", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/path_link.d2,0:0:0-0:1:1", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "x" + }, + "style": {}, + "link": "Overview.Untitled board 7.zzzzz", + "near_key": null, + "shape": { + "value": "" + } + } + } + ] + }, + "err": null +} diff --git a/testdata/d2compiler/TestCompile/reserved_icon_near_style.exp.json b/testdata/d2compiler/TestCompile/reserved_icon_near_style.exp.json new file mode 100644 index 000000000..f68047661 --- /dev/null +++ b/testdata/d2compiler/TestCompile/reserved_icon_near_style.exp.json @@ -0,0 +1,436 @@ +{ + "graph": { + "ast": { + "range": "d2/testdata/d2compiler/TestCompile/reserved_icon_near_style.d2,0:0:0-8:0:94", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2compiler/TestCompile/reserved_icon_near_style.d2,0:0:0-5:1:81", + "key": { + "range": "d2/testdata/d2compiler/TestCompile/reserved_icon_near_style.d2,0:0:0-0:1:1", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/reserved_icon_near_style.d2,0:0:0-0:1:1", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "map": { + "range": "d2/testdata/d2compiler/TestCompile/reserved_icon_near_style.d2,0:3:3-5:0:80", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2compiler/TestCompile/reserved_icon_near_style.d2,1:2:7-1:14:19", + "key": { + "range": "d2/testdata/d2compiler/TestCompile/reserved_icon_near_style.d2,1:2:7-1:6:11", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/reserved_icon_near_style.d2,1:2:7-1:6:11", + "value": [ + { + "string": "icon", + "raw_string": "icon" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/reserved_icon_near_style.d2,1:8:13-1:14:19", + "value": [ + { + "string": "orange", + "raw_string": "orange" + } + ] + } + } + } + }, + { + "map_key": { + "range": "d2/testdata/d2compiler/TestCompile/reserved_icon_near_style.d2,2:2:22-2:20:40", + "key": { + "range": "d2/testdata/d2compiler/TestCompile/reserved_icon_near_style.d2,2:2:22-2:15:35", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/reserved_icon_near_style.d2,2:2:22-2:7:27", + "value": [ + { + "string": "style", + "raw_string": "style" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/reserved_icon_near_style.d2,2:8:28-2:15:35", + "value": [ + { + "string": "opacity", + "raw_string": "opacity" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "number": { + "range": "d2/testdata/d2compiler/TestCompile/reserved_icon_near_style.d2,2:17:37-2:20:40", + "raw": "0.5", + "value": "1/2" + } + } + } + }, + { + "map_key": { + "range": "d2/testdata/d2compiler/TestCompile/reserved_icon_near_style.d2,3:2:43-3:19:60", + "key": { + "range": "d2/testdata/d2compiler/TestCompile/reserved_icon_near_style.d2,3:2:43-3:14:55", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/reserved_icon_near_style.d2,3:2:43-3:7:48", + "value": [ + { + "string": "style", + "raw_string": "style" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/reserved_icon_near_style.d2,3:8:49-3:14:55", + "value": [ + { + "string": "stroke", + "raw_string": "stroke" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/reserved_icon_near_style.d2,3:16:57-3:19:60", + "value": [ + { + "string": "red", + "raw_string": "red" + } + ] + } + } + } + }, + { + "map_key": { + "range": "d2/testdata/d2compiler/TestCompile/reserved_icon_near_style.d2,4:1:62-4:18:79", + "key": { + "range": "d2/testdata/d2compiler/TestCompile/reserved_icon_near_style.d2,4:1:62-4:11:72", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/reserved_icon_near_style.d2,4:1:62-4:6:67", + "value": [ + { + "string": "style", + "raw_string": "style" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/reserved_icon_near_style.d2,4:7:68-4:11:72", + "value": [ + { + "string": "fill", + "raw_string": "fill" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/reserved_icon_near_style.d2,4:13:74-4:18:79", + "value": [ + { + "string": "green", + "raw_string": "green" + } + ] + } + } + } + } + ] + } + } + } + }, + { + "map_key": { + "range": "d2/testdata/d2compiler/TestCompile/reserved_icon_near_style.d2,6:0:82-6:9:91", + "key": { + "range": "d2/testdata/d2compiler/TestCompile/reserved_icon_near_style.d2,6:0:82-6:6:88", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/reserved_icon_near_style.d2,6:0:82-6:1:83", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/reserved_icon_near_style.d2,6:2:84-6:6:88", + "value": [ + { + "string": "near", + "raw_string": "near" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/reserved_icon_near_style.d2,6:8:90-6:9:91", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + } + } + }, + { + "map_key": { + "range": "d2/testdata/d2compiler/TestCompile/reserved_icon_near_style.d2,7:0:92-7:1:93", + "key": { + "range": "d2/testdata/d2compiler/TestCompile/reserved_icon_near_style.d2,7:0:92-7:1:93", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/reserved_icon_near_style.d2,7:0:92-7:1:93", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + } + ] + }, + "primary": {}, + "value": {} + } + } + ] + }, + "root": { + "id": "", + "id_val": "", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + "edges": [], + "objects": [ + { + "id": "x", + "id_val": "x", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2compiler/TestCompile/reserved_icon_near_style.d2,0:0:0-0:1:1", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/reserved_icon_near_style.d2,0:0:0-0:1:1", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + }, + { + "key": { + "range": "d2/testdata/d2compiler/TestCompile/reserved_icon_near_style.d2,6:0:82-6:6:88", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/reserved_icon_near_style.d2,6:0:82-6:1:83", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/reserved_icon_near_style.d2,6:2:84-6:6:88", + "value": [ + { + "string": "near", + "raw_string": "near" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "x" + }, + "style": { + "opacity": { + "value": "0.5" + }, + "stroke": { + "value": "red" + }, + "fill": { + "value": "green" + } + }, + "icon": { + "Scheme": "", + "Opaque": "", + "User": null, + "Host": "", + "Path": "orange", + "RawPath": "", + "ForceQuery": false, + "RawQuery": "", + "Fragment": "", + "RawFragment": "" + }, + "near_key": { + "range": ",0:0:0-0:1:1", + "path": [ + { + "unquoted_string": { + "range": ",0:0:0-0:1:1", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + } + ] + }, + "shape": { + "value": "" + } + } + }, + { + "id": "y", + "id_val": "y", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2compiler/TestCompile/reserved_icon_near_style.d2,7:0:92-7:1:93", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/reserved_icon_near_style.d2,7:0:92-7:1:93", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "y" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ] + }, + "err": null +} diff --git a/testdata/d2compiler/TestCompile/shape.exp.json b/testdata/d2compiler/TestCompile/shape.exp.json new file mode 100644 index 000000000..7fab7d60e --- /dev/null +++ b/testdata/d2compiler/TestCompile/shape.exp.json @@ -0,0 +1,134 @@ +{ + "graph": { + "ast": { + "range": "d2/testdata/d2compiler/TestCompile/shape.d2,0:0:0-4:0:24", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2compiler/TestCompile/shape.d2,1:0:1-3:1:23", + "key": { + "range": "d2/testdata/d2compiler/TestCompile/shape.d2,1:0:1-1:1:2", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/shape.d2,1:0:1-1:1:2", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "map": { + "range": "d2/testdata/d2compiler/TestCompile/shape.d2,1:3:4-3:0:22", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2compiler/TestCompile/shape.d2,2:2:8-2:15:21", + "key": { + "range": "d2/testdata/d2compiler/TestCompile/shape.d2,2:2:8-2:7:13", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/shape.d2,2:2:8-2:7:13", + "value": [ + { + "string": "shape", + "raw_string": "shape" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/shape.d2,2:9:15-2:15:21", + "value": [ + { + "string": "circle", + "raw_string": "circle" + } + ] + } + } + } + } + ] + } + } + } + } + ] + }, + "root": { + "id": "", + "id_val": "", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + "edges": null, + "objects": [ + { + "id": "x", + "id_val": "x", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2compiler/TestCompile/shape.d2,1:0:1-1:1:2", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/shape.d2,1:0:1-1:1:2", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0, + "scope_key": "" + } + ], + "attributes": { + "label": { + "value": "x" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "circle" + } + } + } + ] + }, + "err": null +} diff --git a/testdata/d2compiler/TestCompile/shape_edge_style.exp.json b/testdata/d2compiler/TestCompile/shape_edge_style.exp.json new file mode 100644 index 000000000..b475d3889 --- /dev/null +++ b/testdata/d2compiler/TestCompile/shape_edge_style.exp.json @@ -0,0 +1,12 @@ +{ + "graph": null, + "err": { + "ioerr": null, + "errs": [ + { + "range": "d2/testdata/d2compiler/TestCompile/shape_edge_style.d2,2:1:7-2:21:27", + "errmsg": "d2/testdata/d2compiler/TestCompile/shape_edge_style.d2:3:2: key \"animated\" can only be applied to edges" + } + ] + } +} diff --git a/testdata/d2compiler/TestCompile/shape_unquoted_hex.exp.json b/testdata/d2compiler/TestCompile/shape_unquoted_hex.exp.json new file mode 100644 index 000000000..10960df9e --- /dev/null +++ b/testdata/d2compiler/TestCompile/shape_unquoted_hex.exp.json @@ -0,0 +1,12 @@ +{ + "graph": null, + "err": { + "ioerr": null, + "errs": [ + { + "range": "d2/testdata/d2compiler/TestCompile/shape_unquoted_hex.d2,2:9:24-2:10:25", + "errmsg": "d2/testdata/d2compiler/TestCompile/shape_unquoted_hex.d2:3:10: missing value after colon" + } + ] + } +} diff --git a/testdata/d2compiler/TestCompile/sql_paren.exp.json b/testdata/d2compiler/TestCompile/sql_paren.exp.json new file mode 100644 index 000000000..9af237e20 --- /dev/null +++ b/testdata/d2compiler/TestCompile/sql_paren.exp.json @@ -0,0 +1,225 @@ +{ + "graph": { + "ast": { + "range": "d2/testdata/d2compiler/TestCompile/sql_paren.d2,0:0:0-5:1:73", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2compiler/TestCompile/sql_paren.d2,0:0:0-5:1:73", + "key": { + "range": "d2/testdata/d2compiler/TestCompile/sql_paren.d2,0:0:0-0:7:7", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/sql_paren.d2,0:0:0-0:7:7", + "value": [ + { + "string": "_shape_", + "raw_string": "_shape_" + } + ] + } + } + ] + }, + "primary": { + "double_quoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/sql_paren.d2,0:9:9-0:16:16", + "value": [ + { + "string": "shape", + "raw_string": "shape" + } + ] + } + }, + "value": { + "map": { + "range": "d2/testdata/d2compiler/TestCompile/sql_paren.d2,0:17:17-5:0:72", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2compiler/TestCompile/sql_paren.d2,1:2:21-1:18:37", + "key": { + "range": "d2/testdata/d2compiler/TestCompile/sql_paren.d2,1:2:21-1:7:26", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/sql_paren.d2,1:2:21-1:7:26", + "value": [ + { + "string": "shape", + "raw_string": "shape" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/sql_paren.d2,1:9:28-1:18:37", + "value": [ + { + "string": "sql_table", + "raw_string": "sql_table" + } + ] + } + } + } + }, + { + "map_key": { + "range": "d2/testdata/d2compiler/TestCompile/sql_paren.d2,3:2:41-3:19:58", + "key": { + "range": "d2/testdata/d2compiler/TestCompile/sql_paren.d2,3:2:41-3:11:50", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/sql_paren.d2,3:2:41-3:11:50", + "value": [ + { + "string": "GetType()", + "raw_string": "GetType()" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/sql_paren.d2,3:13:52-3:19:58", + "value": [ + { + "string": "string", + "raw_string": "string" + } + ] + } + } + } + }, + { + "map_key": { + "range": "d2/testdata/d2compiler/TestCompile/sql_paren.d2,4:2:61-4:12:71", + "key": { + "range": "d2/testdata/d2compiler/TestCompile/sql_paren.d2,4:2:61-4:6:65", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/sql_paren.d2,4:2:61-4:6:65", + "value": [ + { + "string": "Is()", + "raw_string": "Is()" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/sql_paren.d2,4:8:67-4:12:71", + "value": [ + { + "string": "bool", + "raw_string": "bool" + } + ] + } + } + } + } + ] + } + } + } + } + ] + }, + "root": { + "id": "", + "id_val": "", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + "edges": [], + "objects": [ + { + "id": "_shape_", + "id_val": "_shape_", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2compiler/TestCompile/sql_paren.d2,0:0:0-0:7:7", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/sql_paren.d2,0:0:0-0:7:7", + "value": [ + { + "string": "_shape_", + "raw_string": "_shape_" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "sql_table": { + "columns": [ + { + "name": "GetType()", + "type": "string", + "constraint": "", + "reference": "" + }, + { + "name": "Is()", + "type": "bool", + "constraint": "", + "reference": "" + } + ] + }, + "attributes": { + "label": { + "value": "shape" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "sql_table" + } + } + } + ] + }, + "err": null +} diff --git a/testdata/d2compiler/TestCompile/stroke-width.exp.json b/testdata/d2compiler/TestCompile/stroke-width.exp.json new file mode 100644 index 000000000..09fcdd941 --- /dev/null +++ b/testdata/d2compiler/TestCompile/stroke-width.exp.json @@ -0,0 +1,144 @@ +{ + "graph": { + "ast": { + "range": "d2/testdata/d2compiler/TestCompile/stroke-width.d2,0:0:0-3:0:32", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2compiler/TestCompile/stroke-width.d2,0:0:0-2:1:31", + "key": { + "range": "d2/testdata/d2compiler/TestCompile/stroke-width.d2,0:0:0-0:4:4", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/stroke-width.d2,0:0:0-0:3:3", + "value": [ + { + "string": "hey", + "raw_string": "hey" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "map": { + "range": "d2/testdata/d2compiler/TestCompile/stroke-width.d2,0:4:4-2:0:30", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2compiler/TestCompile/stroke-width.d2,1:2:8-1:23:29", + "key": { + "range": "d2/testdata/d2compiler/TestCompile/stroke-width.d2,1:2:8-1:20:26", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/stroke-width.d2,1:2:8-1:7:13", + "value": [ + { + "string": "style", + "raw_string": "style" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/stroke-width.d2,1:8:14-1:20:26", + "value": [ + { + "string": "stroke-width", + "raw_string": "stroke-width" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "number": { + "range": "d2/testdata/d2compiler/TestCompile/stroke-width.d2,1:22:28-1:23:29", + "raw": "0", + "value": "0" + } + } + } + } + ] + } + } + } + } + ] + }, + "root": { + "id": "", + "id_val": "", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + "edges": [], + "objects": [ + { + "id": "hey", + "id_val": "hey", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2compiler/TestCompile/stroke-width.d2,0:0:0-0:4:4", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/stroke-width.d2,0:0:0-0:3:3", + "value": [ + { + "string": "hey", + "raw_string": "hey" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "hey" + }, + "style": { + "strokeWidth": { + "value": "0" + } + }, + "near_key": null, + "shape": { + "value": "" + } + } + } + ] + }, + "err": null +} diff --git a/testdata/d2compiler/TestCompile/style.exp.json b/testdata/d2compiler/TestCompile/style.exp.json new file mode 100644 index 000000000..d73335897 --- /dev/null +++ b/testdata/d2compiler/TestCompile/style.exp.json @@ -0,0 +1,145 @@ +{ + "graph": { + "ast": { + "range": "d2/testdata/d2compiler/TestCompile/style.d2,0:0:0-4:0:28", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2compiler/TestCompile/style.d2,1:0:1-3:1:27", + "key": { + "range": "d2/testdata/d2compiler/TestCompile/style.d2,1:0:1-1:1:2", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/style.d2,1:0:1-1:1:2", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "map": { + "range": "d2/testdata/d2compiler/TestCompile/style.d2,1:3:4-3:0:26", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2compiler/TestCompile/style.d2,2:1:7-2:19:25", + "key": { + "range": "d2/testdata/d2compiler/TestCompile/style.d2,2:1:7-2:14:20", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/style.d2,2:1:7-2:6:12", + "value": [ + { + "string": "style", + "raw_string": "style" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/style.d2,2:7:13-2:14:20", + "value": [ + { + "string": "opacity", + "raw_string": "opacity" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "number": { + "range": "d2/testdata/d2compiler/TestCompile/style.d2,2:16:22-2:19:25", + "raw": "0.4", + "value": "2/5" + } + } + } + } + ] + } + } + } + } + ] + }, + "root": { + "id": "", + "id_val": "", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + "edges": [], + "objects": [ + { + "id": "x", + "id_val": "x", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2compiler/TestCompile/style.d2,1:0:1-1:1:2", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/style.d2,1:0:1-1:1:2", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0, + "scope_key": "" + } + ], + "attributes": { + "label": { + "value": "x" + }, + "style": { + "opacity": { + "value": "0.4" + } + }, + "near_key": null, + "shape": { + "value": "" + } + } + } + ] + }, + "err": null +} diff --git a/testdata/d2compiler/TestCompile/table_style.exp.json b/testdata/d2compiler/TestCompile/table_style.exp.json new file mode 100644 index 000000000..112aa3a40 --- /dev/null +++ b/testdata/d2compiler/TestCompile/table_style.exp.json @@ -0,0 +1,220 @@ +{ + "graph": { + "ast": { + "range": "d2/testdata/d2compiler/TestCompile/table_style.d2,0:0:0-5:0:81", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2compiler/TestCompile/table_style.d2,0:0:0-4:1:80", + "key": { + "range": "d2/testdata/d2compiler/TestCompile/table_style.d2,0:0:0-0:15:15", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/table_style.d2,0:0:0-0:15:15", + "value": [ + { + "string": "IUserProperties", + "raw_string": "IUserProperties" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "map": { + "range": "d2/testdata/d2compiler/TestCompile/table_style.d2,0:17:17-4:0:79", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2compiler/TestCompile/table_style.d2,1:2:21-1:18:37", + "key": { + "range": "d2/testdata/d2compiler/TestCompile/table_style.d2,1:2:21-1:7:26", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/table_style.d2,1:2:21-1:7:26", + "value": [ + { + "string": "shape", + "raw_string": "shape" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/table_style.d2,1:9:28-1:18:37", + "value": [ + { + "string": "sql_table", + "raw_string": "sql_table" + } + ] + } + } + } + }, + { + "map_key": { + "range": "d2/testdata/d2compiler/TestCompile/table_style.d2,2:2:40-2:19:57", + "key": { + "range": "d2/testdata/d2compiler/TestCompile/table_style.d2,2:2:40-2:11:49", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/table_style.d2,2:2:40-2:11:49", + "value": [ + { + "string": "GetType()", + "raw_string": "GetType()" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/table_style.d2,2:13:51-2:19:57", + "value": [ + { + "string": "string", + "raw_string": "string" + } + ] + } + } + } + }, + { + "map_key": { + "range": "d2/testdata/d2compiler/TestCompile/table_style.d2,3:2:60-3:20:78", + "key": { + "range": "d2/testdata/d2compiler/TestCompile/table_style.d2,3:2:60-3:15:73", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/table_style.d2,3:2:60-3:7:65", + "value": [ + { + "string": "style", + "raw_string": "style" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/table_style.d2,3:8:66-3:15:73", + "value": [ + { + "string": "opacity", + "raw_string": "opacity" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "number": { + "range": "d2/testdata/d2compiler/TestCompile/table_style.d2,3:17:75-3:20:78", + "raw": "0.4", + "value": "2/5" + } + } + } + } + ] + } + } + } + } + ] + }, + "root": { + "id": "", + "id_val": "", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + "edges": [], + "objects": [ + { + "id": "IUserProperties", + "id_val": "IUserProperties", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2compiler/TestCompile/table_style.d2,0:0:0-0:15:15", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/table_style.d2,0:0:0-0:15:15", + "value": [ + { + "string": "IUserProperties", + "raw_string": "IUserProperties" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "sql_table": { + "columns": [ + { + "name": "GetType()", + "type": "string", + "constraint": "", + "reference": "" + } + ] + }, + "attributes": { + "label": { + "value": "IUserProperties" + }, + "style": { + "opacity": { + "value": "0.4" + } + }, + "near_key": null, + "shape": { + "value": "sql_table" + } + } + } + ] + }, + "err": null +} diff --git a/testdata/d2compiler/TestCompile/table_style_map.exp.json b/testdata/d2compiler/TestCompile/table_style_map.exp.json new file mode 100644 index 000000000..12baf6065 --- /dev/null +++ b/testdata/d2compiler/TestCompile/table_style_map.exp.json @@ -0,0 +1,271 @@ +{ + "graph": { + "ast": { + "range": "d2/testdata/d2compiler/TestCompile/table_style_map.d2,0:0:0-8:0:108", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2compiler/TestCompile/table_style_map.d2,0:0:0-7:1:107", + "key": { + "range": "d2/testdata/d2compiler/TestCompile/table_style_map.d2,0:0:0-0:15:15", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/table_style_map.d2,0:0:0-0:15:15", + "value": [ + { + "string": "IUserProperties", + "raw_string": "IUserProperties" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "map": { + "range": "d2/testdata/d2compiler/TestCompile/table_style_map.d2,0:17:17-7:0:106", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2compiler/TestCompile/table_style_map.d2,1:2:21-1:18:37", + "key": { + "range": "d2/testdata/d2compiler/TestCompile/table_style_map.d2,1:2:21-1:7:26", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/table_style_map.d2,1:2:21-1:7:26", + "value": [ + { + "string": "shape", + "raw_string": "shape" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/table_style_map.d2,1:9:28-1:18:37", + "value": [ + { + "string": "sql_table", + "raw_string": "sql_table" + } + ] + } + } + } + }, + { + "map_key": { + "range": "d2/testdata/d2compiler/TestCompile/table_style_map.d2,2:2:40-2:19:57", + "key": { + "range": "d2/testdata/d2compiler/TestCompile/table_style_map.d2,2:2:40-2:11:49", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/table_style_map.d2,2:2:40-2:11:49", + "value": [ + { + "string": "GetType()", + "raw_string": "GetType()" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/table_style_map.d2,2:13:51-2:19:57", + "value": [ + { + "string": "string", + "raw_string": "string" + } + ] + } + } + } + }, + { + "map_key": { + "range": "d2/testdata/d2compiler/TestCompile/table_style_map.d2,3:2:60-6:3:105", + "key": { + "range": "d2/testdata/d2compiler/TestCompile/table_style_map.d2,3:2:60-3:7:65", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/table_style_map.d2,3:2:60-3:7:65", + "value": [ + { + "string": "style", + "raw_string": "style" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "map": { + "range": "d2/testdata/d2compiler/TestCompile/table_style_map.d2,3:9:67-6:2:104", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2compiler/TestCompile/table_style_map.d2,4:4:73-4:16:85", + "key": { + "range": "d2/testdata/d2compiler/TestCompile/table_style_map.d2,4:4:73-4:11:80", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/table_style_map.d2,4:4:73-4:11:80", + "value": [ + { + "string": "opacity", + "raw_string": "opacity" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "number": { + "range": "d2/testdata/d2compiler/TestCompile/table_style_map.d2,4:13:82-4:16:85", + "raw": "0.4", + "value": "2/5" + } + } + } + }, + { + "map_key": { + "range": "d2/testdata/d2compiler/TestCompile/table_style_map.d2,5:4:90-5:15:101", + "key": { + "range": "d2/testdata/d2compiler/TestCompile/table_style_map.d2,5:4:90-5:9:95", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/table_style_map.d2,5:4:90-5:9:95", + "value": [ + { + "string": "color", + "raw_string": "color" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/table_style_map.d2,5:11:97-5:15:101", + "value": [ + { + "string": "blue", + "raw_string": "blue" + } + ] + } + } + } + } + ] + } + } + } + } + ] + } + } + } + } + ] + }, + "root": { + "id": "", + "id_val": "", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + "edges": [], + "objects": [ + { + "id": "IUserProperties", + "id_val": "IUserProperties", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2compiler/TestCompile/table_style_map.d2,0:0:0-0:15:15", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/table_style_map.d2,0:0:0-0:15:15", + "value": [ + { + "string": "IUserProperties", + "raw_string": "IUserProperties" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "sql_table": { + "columns": [ + { + "name": "GetType()", + "type": "string", + "constraint": "", + "reference": "" + } + ] + }, + "attributes": { + "label": { + "value": "IUserProperties" + }, + "style": { + "opacity": { + "value": "0.4" + } + }, + "near_key": null, + "shape": { + "value": "sql_table" + } + } + } + ] + }, + "err": null +} diff --git a/testdata/d2compiler/TestCompile/underscore_edge.exp.json b/testdata/d2compiler/TestCompile/underscore_edge.exp.json new file mode 100644 index 000000000..eb8834c51 --- /dev/null +++ b/testdata/d2compiler/TestCompile/underscore_edge.exp.json @@ -0,0 +1,278 @@ +{ + "graph": { + "ast": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_edge.d2,0:0:0-4:0:21", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_edge.d2,1:0:1-3:1:20", + "key": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_edge.d2,1:0:1-1:1:2", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_edge.d2,1:0:1-1:1:2", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "map": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_edge.d2,1:3:4-3:0:19", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_edge.d2,2:2:8-2:12:18", + "edges": [ + { + "range": "d2/testdata/d2compiler/TestCompile/underscore_edge.d2,2:2:8-2:12:18", + "src": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_edge.d2,2:2:8-2:6:12", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_edge.d2,2:2:8-2:3:9", + "value": [ + { + "string": "_", + "raw_string": "_" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_edge.d2,2:4:10-2:5:11", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + } + ] + }, + "src_arrow": "", + "dst": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_edge.d2,2:8:14-2:12:18", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_edge.d2,2:9:15-2:10:16", + "value": [ + { + "string": "_", + "raw_string": "_" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_edge.d2,2:11:17-2:12:18", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "dst_arrow": ">" + } + ], + "primary": {}, + "value": {} + } + } + ] + } + } + } + } + ] + }, + "root": { + "id": "", + "id_val": "", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + "edges": [ + { + "index": 0, + "minWidth": 0, + "minHeight": 0, + "label_dimensions": { + "width": 0, + "height": 0 + }, + "isCurve": false, + "src_arrow": false, + "dst_arrow": true, + "references": [ + { + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ], + "objects": [ + { + "id": "x", + "id_val": "x", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_edge.d2,1:0:1-1:1:2", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_edge.d2,1:0:1-1:1:2", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + }, + { + "key": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_edge.d2,2:8:14-2:12:18", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_edge.d2,2:9:15-2:10:16", + "value": [ + { + "string": "_", + "raw_string": "_" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_edge.d2,2:11:17-2:12:18", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "key_path_index": 1, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "x" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "y", + "id_val": "y", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_edge.d2,2:2:8-2:6:12", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_edge.d2,2:2:8-2:3:9", + "value": [ + { + "string": "_", + "raw_string": "_" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_edge.d2,2:4:10-2:5:11", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + } + ] + }, + "key_path_index": 1, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "y" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ] + }, + "err": null +} diff --git a/testdata/d2compiler/TestCompile/underscore_edge_chain.exp.json b/testdata/d2compiler/TestCompile/underscore_edge_chain.exp.json new file mode 100644 index 000000000..6d20bf30c --- /dev/null +++ b/testdata/d2compiler/TestCompile/underscore_edge_chain.exp.json @@ -0,0 +1,446 @@ +{ + "graph": { + "ast": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_edge_chain.d2,0:0:0-4:0:28", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_edge_chain.d2,1:0:1-3:1:27", + "key": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_edge_chain.d2,1:0:1-1:1:2", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_edge_chain.d2,1:0:1-1:1:2", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "map": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_edge_chain.d2,1:3:4-3:0:26", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_edge_chain.d2,2:2:8-2:19:25", + "edges": [ + { + "range": "d2/testdata/d2compiler/TestCompile/underscore_edge_chain.d2,2:2:8-2:13:19", + "src": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_edge_chain.d2,2:2:8-2:6:12", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_edge_chain.d2,2:2:8-2:3:9", + "value": [ + { + "string": "_", + "raw_string": "_" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_edge_chain.d2,2:4:10-2:5:11", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + } + ] + }, + "src_arrow": "", + "dst": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_edge_chain.d2,2:8:14-2:13:19", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_edge_chain.d2,2:9:15-2:10:16", + "value": [ + { + "string": "_", + "raw_string": "_" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_edge_chain.d2,2:11:17-2:12:18", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "dst_arrow": ">" + }, + { + "range": "d2/testdata/d2compiler/TestCompile/underscore_edge_chain.d2,2:8:14-2:19:25", + "src": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_edge_chain.d2,2:8:14-2:13:19", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_edge_chain.d2,2:9:15-2:10:16", + "value": [ + { + "string": "_", + "raw_string": "_" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_edge_chain.d2,2:11:17-2:12:18", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "src_arrow": "", + "dst": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_edge_chain.d2,2:15:21-2:19:25", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_edge_chain.d2,2:16:22-2:17:23", + "value": [ + { + "string": "_", + "raw_string": "_" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_edge_chain.d2,2:18:24-2:19:25", + "value": [ + { + "string": "z", + "raw_string": "z" + } + ] + } + } + ] + }, + "dst_arrow": ">" + } + ], + "primary": {}, + "value": {} + } + } + ] + } + } + } + } + ] + }, + "root": { + "id": "", + "id_val": "", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + "edges": [ + { + "index": 0, + "minWidth": 0, + "minHeight": 0, + "label_dimensions": { + "width": 0, + "height": 0 + }, + "isCurve": false, + "src_arrow": false, + "dst_arrow": true, + "references": [ + { + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "index": 0, + "minWidth": 0, + "minHeight": 0, + "label_dimensions": { + "width": 0, + "height": 0 + }, + "isCurve": false, + "src_arrow": false, + "dst_arrow": true, + "references": [ + { + "map_key_edge_index": 1 + } + ], + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ], + "objects": [ + { + "id": "x", + "id_val": "x", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_edge_chain.d2,1:0:1-1:1:2", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_edge_chain.d2,1:0:1-1:1:2", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + }, + { + "key": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_edge_chain.d2,2:8:14-2:13:19", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_edge_chain.d2,2:9:15-2:10:16", + "value": [ + { + "string": "_", + "raw_string": "_" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_edge_chain.d2,2:11:17-2:12:18", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "key_path_index": 1, + "map_key_edge_index": 0 + }, + { + "key": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_edge_chain.d2,2:8:14-2:13:19", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_edge_chain.d2,2:9:15-2:10:16", + "value": [ + { + "string": "_", + "raw_string": "_" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_edge_chain.d2,2:11:17-2:12:18", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "key_path_index": 1, + "map_key_edge_index": 1 + } + ], + "attributes": { + "label": { + "value": "x" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "y", + "id_val": "y", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_edge_chain.d2,2:2:8-2:6:12", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_edge_chain.d2,2:2:8-2:3:9", + "value": [ + { + "string": "_", + "raw_string": "_" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_edge_chain.d2,2:4:10-2:5:11", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + } + ] + }, + "key_path_index": 1, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "y" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "z", + "id_val": "z", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_edge_chain.d2,2:15:21-2:19:25", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_edge_chain.d2,2:16:22-2:17:23", + "value": [ + { + "string": "_", + "raw_string": "_" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_edge_chain.d2,2:18:24-2:19:25", + "value": [ + { + "string": "z", + "raw_string": "z" + } + ] + } + } + ] + }, + "key_path_index": 1, + "map_key_edge_index": 1 + } + ], + "attributes": { + "label": { + "value": "z" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ] + }, + "err": null +} diff --git a/testdata/d2compiler/TestCompile/underscore_edge_existing.exp.json b/testdata/d2compiler/TestCompile/underscore_edge_existing.exp.json new file mode 100644 index 000000000..cdbb0e417 --- /dev/null +++ b/testdata/d2compiler/TestCompile/underscore_edge_existing.exp.json @@ -0,0 +1,431 @@ +{ + "graph": { + "ast": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_edge_existing.d2,0:0:0-5:0:167", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_edge_existing.d2,1:0:1-1:77:78", + "edges": [ + { + "range": "d2/testdata/d2compiler/TestCompile/underscore_edge_existing.d2,1:0:1-1:6:7", + "src": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_edge_existing.d2,1:0:1-1:2:3", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_edge_existing.d2,1:0:1-1:1:2", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + } + ] + }, + "src_arrow": "", + "dst": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_edge_existing.d2,1:4:5-1:6:7", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_edge_existing.d2,1:5:6-1:6:7", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + } + ] + }, + "dst_arrow": ">" + } + ], + "primary": {}, + "value": { + "double_quoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_edge_existing.d2,1:8:9-1:77:78", + "value": [ + { + "string": "Can you imagine how life could be improved if we could do away with", + "raw_string": "Can you imagine how life could be improved if we could do away with" + } + ] + } + } + } + }, + { + "map_key": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_edge_existing.d2,2:0:79-4:1:166", + "key": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_edge_existing.d2,2:0:79-2:1:80", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_edge_existing.d2,2:0:79-2:1:80", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "map": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_edge_existing.d2,2:3:82-4:0:165", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_edge_existing.d2,3:1:85-3:80:164", + "edges": [ + { + "range": "d2/testdata/d2compiler/TestCompile/underscore_edge_existing.d2,3:1:85-3:11:95", + "src": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_edge_existing.d2,3:1:85-3:5:89", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_edge_existing.d2,3:1:85-3:2:86", + "value": [ + { + "string": "_", + "raw_string": "_" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_edge_existing.d2,3:3:87-3:4:88", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + } + ] + }, + "src_arrow": "", + "dst": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_edge_existing.d2,3:7:91-3:11:95", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_edge_existing.d2,3:8:92-3:9:93", + "value": [ + { + "string": "_", + "raw_string": "_" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_edge_existing.d2,3:10:94-3:11:95", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + } + ] + }, + "dst_arrow": ">" + } + ], + "primary": {}, + "value": { + "double_quoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_edge_existing.d2,3:13:97-3:80:164", + "value": [ + { + "string": "Well, it's garish, ugly, and derelicts have used it for a toilet.", + "raw_string": "Well, it's garish, ugly, and derelicts have used it for a toilet." + } + ] + } + } + } + } + ] + } + } + } + } + ] + }, + "root": { + "id": "", + "id_val": "", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + "edges": [ + { + "index": 0, + "minWidth": 0, + "minHeight": 0, + "label_dimensions": { + "width": 0, + "height": 0 + }, + "isCurve": false, + "src_arrow": false, + "dst_arrow": true, + "references": [ + { + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "Can you imagine how life could be improved if we could do away with" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "index": 1, + "minWidth": 0, + "minHeight": 0, + "label_dimensions": { + "width": 0, + "height": 0 + }, + "isCurve": false, + "src_arrow": false, + "dst_arrow": true, + "references": [ + { + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "Well, it's garish, ugly, and derelicts have used it for a toilet." + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ], + "objects": [ + { + "id": "x", + "id_val": "x", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_edge_existing.d2,2:0:79-2:1:80", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_edge_existing.d2,2:0:79-2:1:80", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "x" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "a", + "id_val": "a", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_edge_existing.d2,1:0:1-1:2:3", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_edge_existing.d2,1:0:1-1:1:2", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + }, + { + "key": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_edge_existing.d2,3:1:85-3:5:89", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_edge_existing.d2,3:1:85-3:2:86", + "value": [ + { + "string": "_", + "raw_string": "_" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_edge_existing.d2,3:3:87-3:4:88", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + } + ] + }, + "key_path_index": 1, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "a" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "b", + "id_val": "b", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_edge_existing.d2,1:4:5-1:6:7", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_edge_existing.d2,1:5:6-1:6:7", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + }, + { + "key": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_edge_existing.d2,3:7:91-3:11:95", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_edge_existing.d2,3:8:92-3:9:93", + "value": [ + { + "string": "_", + "raw_string": "_" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_edge_existing.d2,3:10:94-3:11:95", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + } + ] + }, + "key_path_index": 1, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "b" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ] + }, + "err": null +} diff --git a/testdata/d2compiler/TestCompile/underscore_edge_existing_new.exp.json b/testdata/d2compiler/TestCompile/underscore_edge_existing_new.exp.json new file mode 100644 index 000000000..a5eea4c8c --- /dev/null +++ b/testdata/d2compiler/TestCompile/underscore_edge_existing_new.exp.json @@ -0,0 +1,346 @@ +{ + "graph": { + "ast": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_edge_existing_new.d2,0:0:0-5:0:167", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_edge_existing_new.d2,1:0:1-1:77:78", + "edges": [ + { + "range": "d2/testdata/d2compiler/TestCompile/underscore_edge_existing_new.d2,1:0:1-1:6:7", + "src": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_edge_existing_new.d2,1:0:1-1:2:3", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_edge_existing_new.d2,1:0:1-1:1:2", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + } + ] + }, + "src_arrow": "", + "dst": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_edge_existing_new.d2,1:4:5-1:6:7", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_edge_existing_new.d2,1:5:6-1:6:7", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + } + ] + }, + "dst_arrow": ">" + } + ], + "primary": {}, + "value": { + "double_quoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_edge_existing_new.d2,1:8:9-1:77:78", + "value": [ + { + "string": "Can you imagine how life could be improved if we could do away with", + "raw_string": "Can you imagine how life could be improved if we could do away with" + } + ] + } + } + } + }, + { + "map_key": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_edge_existing_new.d2,2:0:79-4:1:166", + "key": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_edge_existing_new.d2,2:0:79-2:1:80", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_edge_existing_new.d2,2:0:79-2:1:80", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "map": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_edge_existing_new.d2,2:3:82-4:0:165", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_edge_existing_new.d2,3:1:85-3:80:164", + "edges": [ + { + "range": "d2/testdata/d2compiler/TestCompile/underscore_edge_existing_new.d2,3:1:85-3:11:95", + "src": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_edge_existing_new.d2,3:1:85-3:5:89", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_edge_existing_new.d2,3:1:85-3:2:86", + "value": [ + { + "string": "_", + "raw_string": "_" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_edge_existing_new.d2,3:3:87-3:4:88", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + } + ] + }, + "src_arrow": "", + "dst": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_edge_existing_new.d2,3:7:91-3:11:95", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_edge_existing_new.d2,3:8:92-3:9:93", + "value": [ + { + "string": "_", + "raw_string": "_" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_edge_existing_new.d2,3:10:94-3:11:95", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + } + ] + }, + "dst_arrow": ">" + } + ], + "primary": {}, + "value": { + "double_quoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_edge_existing_new.d2,3:13:97-3:80:164", + "value": [ + { + "string": "Well, it's garish, ugly, and derelicts have used it for a toilet.", + "raw_string": "Well, it's garish, ugly, and derelicts have used it for a toilet." + } + ] + } + } + } + } + ] + } + } + } + } + ] + }, + "root": { + "id": "", + "id_val": "", + "label": { + "value": "" + }, + "label_dimensions": { + "width": 0, + "height": 0 + }, + "shape": { + "value": "" + }, + "near_key": null, + "style": {} + }, + "edges": [ + { + "index": 0, + "label": { + "value": "Can you imagine how life could be improved if we could do away with" + }, + "label_dimensions": { + "width": 0, + "height": 0 + }, + "src_arrow": false, + "dst_arrow": true, + "references": [ + { + "map_key_edge_index": 0, + "scope_key": "" + } + ] + }, + { + "index": 1, + "label": { + "value": "Well, it's garish, ugly, and derelicts have used it for a toilet." + }, + "label_dimensions": { + "width": 0, + "height": 0 + }, + "src_arrow": false, + "dst_arrow": true, + "references": [ + { + "map_key_edge_index": 0, + "scope_key": "x" + } + ] + } + ], + "objects": [ + { + "id": "x", + "id_val": "x", + "label": { + "value": "x" + }, + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_edge_existing_new.d2,2:0:79-2:1:80", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_edge_existing_new.d2,2:0:79-2:1:80", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0, + "scope_key": "" + } + ], + "shape": { + "value": "" + }, + "near_key": null, + "style": {} + }, + { + "id": "a", + "id_val": "a", + "label": { + "value": "a" + }, + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_edge_existing_new.d2,1:0:1-1:2:3", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_edge_existing_new.d2,1:0:1-1:1:2", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0, + "scope_key": "" + } + ], + "shape": { + "value": "" + }, + "near_key": null, + "style": {} + }, + { + "id": "b", + "id_val": "b", + "label": { + "value": "b" + }, + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_edge_existing_new.d2,1:4:5-1:6:7", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_edge_existing_new.d2,1:5:6-1:6:7", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0, + "scope_key": "" + } + ], + "shape": { + "value": "" + }, + "near_key": null, + "style": {} + } + ] + }, + "err": null +} diff --git a/testdata/d2compiler/TestCompile/underscore_edge_index.exp.json b/testdata/d2compiler/TestCompile/underscore_edge_index.exp.json new file mode 100644 index 000000000..9dc877365 --- /dev/null +++ b/testdata/d2compiler/TestCompile/underscore_edge_index.exp.json @@ -0,0 +1,412 @@ +{ + "graph": { + "ast": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_edge_index.d2,0:0:0-5:0:172", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_edge_index.d2,1:0:1-1:77:78", + "edges": [ + { + "range": "d2/testdata/d2compiler/TestCompile/underscore_edge_index.d2,1:0:1-1:6:7", + "src": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_edge_index.d2,1:0:1-1:2:3", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_edge_index.d2,1:0:1-1:1:2", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + } + ] + }, + "src_arrow": "", + "dst": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_edge_index.d2,1:4:5-1:6:7", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_edge_index.d2,1:5:6-1:6:7", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + } + ] + }, + "dst_arrow": ">" + } + ], + "primary": {}, + "value": { + "double_quoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_edge_index.d2,1:8:9-1:77:78", + "value": [ + { + "string": "Can you imagine how life could be improved if we could do away with", + "raw_string": "Can you imagine how life could be improved if we could do away with" + } + ] + } + } + } + }, + { + "map_key": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_edge_index.d2,2:0:79-4:1:171", + "key": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_edge_index.d2,2:0:79-2:1:80", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_edge_index.d2,2:0:79-2:1:80", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "map": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_edge_index.d2,2:3:82-4:0:170", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_edge_index.d2,3:1:85-3:85:169", + "edges": [ + { + "range": "d2/testdata/d2compiler/TestCompile/underscore_edge_index.d2,3:2:86-3:12:96", + "src": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_edge_index.d2,3:2:86-3:6:90", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_edge_index.d2,3:2:86-3:3:87", + "value": [ + { + "string": "_", + "raw_string": "_" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_edge_index.d2,3:4:88-3:5:89", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + } + ] + }, + "src_arrow": "", + "dst": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_edge_index.d2,3:8:92-3:12:96", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_edge_index.d2,3:9:93-3:10:94", + "value": [ + { + "string": "_", + "raw_string": "_" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_edge_index.d2,3:11:95-3:12:96", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + } + ] + }, + "dst_arrow": ">" + } + ], + "edge_index": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_edge_index.d2,3:13:97-3:16:100", + "int": 0, + "glob": false + }, + "primary": {}, + "value": { + "double_quoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_edge_index.d2,3:18:102-3:85:169", + "value": [ + { + "string": "Well, it's garish, ugly, and derelicts have used it for a toilet.", + "raw_string": "Well, it's garish, ugly, and derelicts have used it for a toilet." + } + ] + } + } + } + } + ] + } + } + } + } + ] + }, + "root": { + "id": "", + "id_val": "", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + "edges": [ + { + "index": 0, + "minWidth": 0, + "minHeight": 0, + "label_dimensions": { + "width": 0, + "height": 0 + }, + "isCurve": false, + "src_arrow": false, + "dst_arrow": true, + "references": [ + { + "map_key_edge_index": 0 + }, + { + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "Well, it's garish, ugly, and derelicts have used it for a toilet." + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ], + "objects": [ + { + "id": "x", + "id_val": "x", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_edge_index.d2,2:0:79-2:1:80", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_edge_index.d2,2:0:79-2:1:80", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "x" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "a", + "id_val": "a", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_edge_index.d2,1:0:1-1:2:3", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_edge_index.d2,1:0:1-1:1:2", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + }, + { + "key": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_edge_index.d2,3:2:86-3:6:90", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_edge_index.d2,3:2:86-3:3:87", + "value": [ + { + "string": "_", + "raw_string": "_" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_edge_index.d2,3:4:88-3:5:89", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + } + ] + }, + "key_path_index": 1, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "a" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "b", + "id_val": "b", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_edge_index.d2,1:4:5-1:6:7", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_edge_index.d2,1:5:6-1:6:7", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + }, + { + "key": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_edge_index.d2,3:8:92-3:12:96", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_edge_index.d2,3:9:93-3:10:94", + "value": [ + { + "string": "_", + "raw_string": "_" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_edge_index.d2,3:11:95-3:12:96", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + } + ] + }, + "key_path_index": 1, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "b" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ] + }, + "err": null +} diff --git a/testdata/d2compiler/TestCompile/underscore_edge_nested.exp.json b/testdata/d2compiler/TestCompile/underscore_edge_nested.exp.json new file mode 100644 index 000000000..f69c79872 --- /dev/null +++ b/testdata/d2compiler/TestCompile/underscore_edge_nested.exp.json @@ -0,0 +1,369 @@ +{ + "graph": { + "ast": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_edge_nested.d2,0:0:0-6:0:32", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_edge_nested.d2,1:0:1-5:1:31", + "key": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_edge_nested.d2,1:0:1-1:1:2", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_edge_nested.d2,1:0:1-1:1:2", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "map": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_edge_nested.d2,1:3:4-5:0:30", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_edge_nested.d2,2:1:7-4:2:29", + "key": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_edge_nested.d2,2:1:7-2:2:8", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_edge_nested.d2,2:1:7-2:2:8", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "map": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_edge_nested.d2,2:4:10-4:1:28", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_edge_nested.d2,3:2:14-3:14:26", + "edges": [ + { + "range": "d2/testdata/d2compiler/TestCompile/underscore_edge_nested.d2,3:2:14-3:14:26", + "src": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_edge_nested.d2,3:2:14-3:8:20", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_edge_nested.d2,3:2:14-3:3:15", + "value": [ + { + "string": "_", + "raw_string": "_" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_edge_nested.d2,3:4:16-3:5:17", + "value": [ + { + "string": "_", + "raw_string": "_" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_edge_nested.d2,3:6:18-3:7:19", + "value": [ + { + "string": "z", + "raw_string": "z" + } + ] + } + } + ] + }, + "src_arrow": "", + "dst": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_edge_nested.d2,3:10:22-3:14:26", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_edge_nested.d2,3:11:23-3:12:24", + "value": [ + { + "string": "_", + "raw_string": "_" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_edge_nested.d2,3:13:25-3:14:26", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + } + ] + }, + "dst_arrow": ">" + } + ], + "primary": {}, + "value": {} + } + } + ] + } + } + } + } + ] + } + } + } + } + ] + }, + "root": { + "id": "", + "id_val": "", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + "edges": [ + { + "index": 0, + "minWidth": 0, + "minHeight": 0, + "label_dimensions": { + "width": 0, + "height": 0 + }, + "isCurve": false, + "src_arrow": false, + "dst_arrow": true, + "references": [ + { + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ], + "objects": [ + { + "id": "x", + "id_val": "x", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_edge_nested.d2,1:0:1-1:1:2", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_edge_nested.d2,1:0:1-1:1:2", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "x" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "y", + "id_val": "y", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_edge_nested.d2,2:1:7-2:2:8", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_edge_nested.d2,2:1:7-2:2:8", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + }, + { + "key": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_edge_nested.d2,3:10:22-3:14:26", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_edge_nested.d2,3:11:23-3:12:24", + "value": [ + { + "string": "_", + "raw_string": "_" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_edge_nested.d2,3:13:25-3:14:26", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + } + ] + }, + "key_path_index": 1, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "y" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "z", + "id_val": "z", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_edge_nested.d2,3:2:14-3:8:20", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_edge_nested.d2,3:2:14-3:3:15", + "value": [ + { + "string": "_", + "raw_string": "_" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_edge_nested.d2,3:4:16-3:5:17", + "value": [ + { + "string": "_", + "raw_string": "_" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_edge_nested.d2,3:6:18-3:7:19", + "value": [ + { + "string": "z", + "raw_string": "z" + } + ] + } + } + ] + }, + "key_path_index": 2, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "z" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ] + }, + "err": null +} diff --git a/testdata/d2compiler/TestCompile/underscore_edge_reference.exp.json b/testdata/d2compiler/TestCompile/underscore_edge_reference.exp.json new file mode 100644 index 000000000..d4f000070 --- /dev/null +++ b/testdata/d2compiler/TestCompile/underscore_edge_reference.exp.json @@ -0,0 +1,336 @@ +{ + "graph": { + "ast": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_edge_reference.d2,0:0:0-5:0:96", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_edge_reference.d2,1:0:1-1:6:7", + "edges": [ + { + "range": "d2/testdata/d2compiler/TestCompile/underscore_edge_reference.d2,1:0:1-1:6:7", + "src": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_edge_reference.d2,1:0:1-1:2:3", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_edge_reference.d2,1:0:1-1:1:2", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + } + ] + }, + "src_arrow": "", + "dst": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_edge_reference.d2,1:4:5-1:6:7", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_edge_reference.d2,1:5:6-1:6:7", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + } + ] + }, + "dst_arrow": ">" + } + ], + "primary": {}, + "value": {} + } + }, + { + "map_key": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_edge_reference.d2,2:0:8-4:1:95", + "key": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_edge_reference.d2,2:0:8-2:1:9", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_edge_reference.d2,2:0:8-2:1:9", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "map": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_edge_reference.d2,2:3:11-4:0:94", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_edge_reference.d2,3:1:14-3:80:93", + "edges": [ + { + "range": "d2/testdata/d2compiler/TestCompile/underscore_edge_reference.d2,3:1:14-3:11:24", + "src": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_edge_reference.d2,3:1:14-3:5:18", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_edge_reference.d2,3:1:14-3:2:15", + "value": [ + { + "string": "_", + "raw_string": "_" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_edge_reference.d2,3:3:16-3:4:17", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + } + ] + }, + "src_arrow": "", + "dst": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_edge_reference.d2,3:7:20-3:11:24", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_edge_reference.d2,3:8:21-3:9:22", + "value": [ + { + "string": "_", + "raw_string": "_" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_edge_reference.d2,3:10:23-3:11:24", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + } + ] + }, + "dst_arrow": ">" + } + ], + "primary": {}, + "value": { + "double_quoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_edge_reference.d2,3:13:26-3:80:93", + "value": [ + { + "string": "Well, it's garish, ugly, and derelicts have used it for a toilet.", + "raw_string": "Well, it's garish, ugly, and derelicts have used it for a toilet." + } + ] + } + } + } + } + ] + } + } + } + } + ] + }, + "root": { + "id": "", + "id_val": "", + "label": { + "value": "" + }, + "label_dimensions": { + "width": 0, + "height": 0 + }, + "shape": { + "value": "" + }, + "near_key": null, + "style": {} + }, + "edges": [ + { + "index": 0, + "label": { + "value": "" + }, + "label_dimensions": { + "width": 0, + "height": 0 + }, + "src_arrow": false, + "dst_arrow": true, + "references": [ + { + "map_key_edge_index": 0, + "scope_key": "" + } + ] + }, + { + "index": 1, + "label": { + "value": "Well, it's garish, ugly, and derelicts have used it for a toilet." + }, + "label_dimensions": { + "width": 0, + "height": 0 + }, + "src_arrow": false, + "dst_arrow": true, + "references": [ + { + "map_key_edge_index": 0, + "scope_key": "x" + } + ] + } + ], + "objects": [ + { + "id": "x", + "id_val": "x", + "label": { + "value": "x" + }, + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_edge_reference.d2,2:0:8-2:1:9", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_edge_reference.d2,2:0:8-2:1:9", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0, + "scope_key": "" + } + ], + "shape": { + "value": "" + }, + "near_key": null, + "style": {} + }, + { + "id": "a", + "id_val": "a", + "label": { + "value": "a" + }, + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_edge_reference.d2,1:0:1-1:2:3", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_edge_reference.d2,1:0:1-1:1:2", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0, + "scope_key": "" + } + ], + "shape": { + "value": "" + }, + "near_key": null, + "style": {} + }, + { + "id": "b", + "id_val": "b", + "label": { + "value": "b" + }, + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_edge_reference.d2,1:4:5-1:6:7", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_edge_reference.d2,1:5:6-1:6:7", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0, + "scope_key": "" + } + ], + "shape": { + "value": "" + }, + "near_key": null, + "style": {} + } + ] + }, + "err": null +} diff --git a/testdata/d2compiler/TestCompile/underscore_parent.exp.json b/testdata/d2compiler/TestCompile/underscore_parent.exp.json new file mode 100644 index 000000000..eb86b7795 --- /dev/null +++ b/testdata/d2compiler/TestCompile/underscore_parent.exp.json @@ -0,0 +1,181 @@ +{ + "graph": { + "ast": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_parent.d2,0:0:0-4:0:13", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_parent.d2,1:0:1-3:1:12", + "key": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_parent.d2,1:0:1-1:1:2", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_parent.d2,1:0:1-1:1:2", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "map": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_parent.d2,1:3:4-3:0:11", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_parent.d2,2:1:7-2:4:10", + "key": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_parent.d2,2:1:7-2:4:10", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_parent.d2,2:1:7-2:2:8", + "value": [ + { + "string": "_", + "raw_string": "_" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_parent.d2,2:3:9-2:4:10", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + } + ] + }, + "primary": {}, + "value": {} + } + } + ] + } + } + } + } + ] + }, + "root": { + "id": "", + "id_val": "", + "label": { + "value": "" + }, + "label_dimensions": { + "width": 0, + "height": 0 + }, + "shape": { + "value": "" + }, + "near_key": null, + "style": {} + }, + "edges": null, + "objects": [ + { + "id": "x", + "id_val": "x", + "label": { + "value": "x" + }, + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_parent.d2,1:0:1-1:1:2", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_parent.d2,1:0:1-1:1:2", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0, + "scope_key": "" + } + ], + "shape": { + "value": "" + }, + "near_key": null, + "style": {} + }, + { + "id": "y", + "id_val": "y", + "label": { + "value": "y" + }, + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_parent.d2,2:1:7-2:4:10", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_parent.d2,2:1:7-2:2:8", + "value": [ + { + "string": "_", + "raw_string": "_" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_parent.d2,2:3:9-2:4:10", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0, + "scope_key": "" + } + ], + "shape": { + "value": "" + }, + "near_key": null, + "style": {} + } + ] + }, + "err": null +} diff --git a/testdata/d2compiler/TestCompile/underscore_parent_create.exp.json b/testdata/d2compiler/TestCompile/underscore_parent_create.exp.json new file mode 100644 index 000000000..aca48bc91 --- /dev/null +++ b/testdata/d2compiler/TestCompile/underscore_parent_create.exp.json @@ -0,0 +1,185 @@ +{ + "graph": { + "ast": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_parent_create.d2,0:0:0-4:0:13", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_parent_create.d2,1:0:1-3:1:12", + "key": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_parent_create.d2,1:0:1-1:1:2", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_parent_create.d2,1:0:1-1:1:2", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "map": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_parent_create.d2,1:3:4-3:0:11", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_parent_create.d2,2:1:7-2:4:10", + "key": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_parent_create.d2,2:1:7-2:4:10", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_parent_create.d2,2:1:7-2:2:8", + "value": [ + { + "string": "_", + "raw_string": "_" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_parent_create.d2,2:3:9-2:4:10", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + } + ] + }, + "primary": {}, + "value": {} + } + } + ] + } + } + } + } + ] + }, + "root": { + "id": "", + "id_val": "", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + "edges": null, + "objects": [ + { + "id": "x", + "id_val": "x", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_parent_create.d2,1:0:1-1:1:2", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_parent_create.d2,1:0:1-1:1:2", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "x" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "y", + "id_val": "y", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_parent_create.d2,2:1:7-2:4:10", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_parent_create.d2,2:1:7-2:2:8", + "value": [ + { + "string": "_", + "raw_string": "_" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_parent_create.d2,2:3:9-2:4:10", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + } + ] + }, + "key_path_index": 1, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "y" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ] + }, + "err": null +} diff --git a/testdata/d2compiler/TestCompile/underscore_parent_middle_path.exp.json b/testdata/d2compiler/TestCompile/underscore_parent_middle_path.exp.json new file mode 100644 index 000000000..a00f27155 --- /dev/null +++ b/testdata/d2compiler/TestCompile/underscore_parent_middle_path.exp.json @@ -0,0 +1,12 @@ +{ + "graph": null, + "err": { + "ioerr": null, + "errs": [ + { + "range": "d2/testdata/d2compiler/TestCompile/underscore_parent_middle_path.d2,2:2:8-2:7:13", + "errmsg": "d2/testdata/d2compiler/TestCompile/underscore_parent_middle_path.d2:3:3: parent \"_\" can only be used in the beginning of paths, e.g. \"_.x\"" + } + ] + } +} diff --git a/testdata/d2compiler/TestCompile/underscore_parent_not_root.exp.json b/testdata/d2compiler/TestCompile/underscore_parent_not_root.exp.json new file mode 100644 index 000000000..28f0903f3 --- /dev/null +++ b/testdata/d2compiler/TestCompile/underscore_parent_not_root.exp.json @@ -0,0 +1,254 @@ +{ + "graph": { + "ast": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_parent_not_root.d2,0:0:0-6:0:27", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_parent_not_root.d2,1:0:1-5:1:26", + "key": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_parent_not_root.d2,1:0:1-1:1:2", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_parent_not_root.d2,1:0:1-1:1:2", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "map": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_parent_not_root.d2,1:3:4-5:0:25", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_parent_not_root.d2,2:2:8-4:3:24", + "key": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_parent_not_root.d2,2:2:8-2:3:9", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_parent_not_root.d2,2:2:8-2:3:9", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "map": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_parent_not_root.d2,2:5:11-4:2:23", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_parent_not_root.d2,3:4:17-3:7:20", + "key": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_parent_not_root.d2,3:4:17-3:7:20", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_parent_not_root.d2,3:4:17-3:5:18", + "value": [ + { + "string": "_", + "raw_string": "_" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_parent_not_root.d2,3:6:19-3:7:20", + "value": [ + { + "string": "z", + "raw_string": "z" + } + ] + } + } + ] + }, + "primary": {}, + "value": {} + } + } + ] + } + } + } + } + ] + } + } + } + } + ] + }, + "root": { + "id": "", + "id_val": "", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + "edges": null, + "objects": [ + { + "id": "x", + "id_val": "x", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_parent_not_root.d2,1:0:1-1:1:2", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_parent_not_root.d2,1:0:1-1:1:2", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "x" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "y", + "id_val": "y", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_parent_not_root.d2,2:2:8-2:3:9", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_parent_not_root.d2,2:2:8-2:3:9", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "y" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "z", + "id_val": "z", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_parent_not_root.d2,3:4:17-3:7:20", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_parent_not_root.d2,3:4:17-3:5:18", + "value": [ + { + "string": "_", + "raw_string": "_" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_parent_not_root.d2,3:6:19-3:7:20", + "value": [ + { + "string": "z", + "raw_string": "z" + } + ] + } + } + ] + }, + "key_path_index": 1, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "z" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ] + }, + "err": null +} diff --git a/testdata/d2compiler/TestCompile/underscore_parent_preference.exp.json b/testdata/d2compiler/TestCompile/underscore_parent_preference.exp.json new file mode 100644 index 000000000..670784fef --- /dev/null +++ b/testdata/d2compiler/TestCompile/underscore_parent_preference.exp.json @@ -0,0 +1,245 @@ +{ + "graph": { + "ast": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_parent_preference.d2,0:0:0-5:0:174", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_parent_preference.d2,1:0:1-3:1:92", + "key": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_parent_preference.d2,1:0:1-1:1:2", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_parent_preference.d2,1:0:1-1:1:2", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "map": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_parent_preference.d2,1:3:4-3:0:91", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_parent_preference.d2,2:1:7-2:84:90", + "key": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_parent_preference.d2,2:1:7-2:4:10", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_parent_preference.d2,2:1:7-2:2:8", + "value": [ + { + "string": "_", + "raw_string": "_" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_parent_preference.d2,2:3:9-2:4:10", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "double_quoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_parent_preference.d2,2:6:12-2:84:90", + "value": [ + { + "string": "All we are given is possibilities -- to make ourselves one thing or another.", + "raw_string": "All we are given is possibilities -- to make ourselves one thing or another." + } + ] + } + } + } + } + ] + } + } + } + }, + { + "map_key": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_parent_preference.d2,4:0:93-4:80:173", + "key": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_parent_preference.d2,4:0:93-4:1:94", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_parent_preference.d2,4:0:93-4:1:94", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "double_quoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_parent_preference.d2,4:3:96-4:80:173", + "value": [ + { + "string": "But it's real. And if it's real it can be affected ... we may not be able", + "raw_string": "But it's real. And if it's real it can be affected ... we may not be able" + } + ] + } + } + } + } + ] + }, + "root": { + "id": "", + "id_val": "", + "label": { + "value": "" + }, + "label_dimensions": { + "width": 0, + "height": 0 + }, + "shape": { + "value": "" + }, + "near_key": null, + "style": {} + }, + "edges": null, + "objects": [ + { + "id": "x", + "id_val": "x", + "label": { + "value": "x" + }, + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_parent_preference.d2,1:0:1-1:1:2", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_parent_preference.d2,1:0:1-1:1:2", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0, + "scope_key": "" + } + ], + "shape": { + "value": "" + }, + "near_key": null, + "style": {} + }, + { + "id": "y", + "id_val": "y", + "label": { + "value": "But it's real. And if it's real it can be affected ... we may not be able" + }, + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_parent_preference.d2,2:1:7-2:4:10", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_parent_preference.d2,2:1:7-2:2:8", + "value": [ + { + "string": "_", + "raw_string": "_" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_parent_preference.d2,2:3:9-2:4:10", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0, + "scope_key": "" + }, + { + "key": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_parent_preference.d2,4:0:93-4:1:94", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_parent_preference.d2,4:0:93-4:1:94", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0, + "scope_key": "" + } + ], + "shape": { + "value": "" + }, + "near_key": null, + "style": {} + } + ] + }, + "err": null +} diff --git a/testdata/d2compiler/TestCompile/underscore_parent_preference_1.exp.json b/testdata/d2compiler/TestCompile/underscore_parent_preference_1.exp.json new file mode 100644 index 000000000..db0e2f7dd --- /dev/null +++ b/testdata/d2compiler/TestCompile/underscore_parent_preference_1.exp.json @@ -0,0 +1,248 @@ +{ + "graph": { + "ast": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_parent_preference_1.d2,0:0:0-5:0:174", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_parent_preference_1.d2,1:0:1-3:1:92", + "key": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_parent_preference_1.d2,1:0:1-1:1:2", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_parent_preference_1.d2,1:0:1-1:1:2", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "map": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_parent_preference_1.d2,1:3:4-3:0:91", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_parent_preference_1.d2,2:1:7-2:84:90", + "key": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_parent_preference_1.d2,2:1:7-2:4:10", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_parent_preference_1.d2,2:1:7-2:2:8", + "value": [ + { + "string": "_", + "raw_string": "_" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_parent_preference_1.d2,2:3:9-2:4:10", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "double_quoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_parent_preference_1.d2,2:6:12-2:84:90", + "value": [ + { + "string": "All we are given is possibilities -- to make ourselves one thing or another.", + "raw_string": "All we are given is possibilities -- to make ourselves one thing or another." + } + ] + } + } + } + } + ] + } + } + } + }, + { + "map_key": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_parent_preference_1.d2,4:0:93-4:80:173", + "key": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_parent_preference_1.d2,4:0:93-4:1:94", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_parent_preference_1.d2,4:0:93-4:1:94", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "double_quoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_parent_preference_1.d2,4:3:96-4:80:173", + "value": [ + { + "string": "But it's real. And if it's real it can be affected ... we may not be able", + "raw_string": "But it's real. And if it's real it can be affected ... we may not be able" + } + ] + } + } + } + } + ] + }, + "root": { + "id": "", + "id_val": "", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + "edges": null, + "objects": [ + { + "id": "x", + "id_val": "x", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_parent_preference_1.d2,1:0:1-1:1:2", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_parent_preference_1.d2,1:0:1-1:1:2", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "x" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "y", + "id_val": "y", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_parent_preference_1.d2,2:1:7-2:4:10", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_parent_preference_1.d2,2:1:7-2:2:8", + "value": [ + { + "string": "_", + "raw_string": "_" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_parent_preference_1.d2,2:3:9-2:4:10", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + } + ] + }, + "key_path_index": 1, + "map_key_edge_index": 0 + }, + { + "key": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_parent_preference_1.d2,4:0:93-4:1:94", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_parent_preference_1.d2,4:0:93-4:1:94", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "But it's real. And if it's real it can be affected ... we may not be able" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ] + }, + "err": null +} diff --git a/testdata/d2compiler/TestCompile/underscore_parent_preference_2.exp.json b/testdata/d2compiler/TestCompile/underscore_parent_preference_2.exp.json new file mode 100644 index 000000000..18754b590 --- /dev/null +++ b/testdata/d2compiler/TestCompile/underscore_parent_preference_2.exp.json @@ -0,0 +1,248 @@ +{ + "graph": { + "ast": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_parent_preference_2.d2,0:0:0-5:0:174", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_parent_preference_2.d2,1:0:1-1:80:81", + "key": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_parent_preference_2.d2,1:0:1-1:1:2", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_parent_preference_2.d2,1:0:1-1:1:2", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "double_quoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_parent_preference_2.d2,1:3:4-1:80:81", + "value": [ + { + "string": "But it's real. And if it's real it can be affected ... we may not be able", + "raw_string": "But it's real. And if it's real it can be affected ... we may not be able" + } + ] + } + } + } + }, + { + "map_key": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_parent_preference_2.d2,2:0:82-4:1:173", + "key": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_parent_preference_2.d2,2:0:82-2:1:83", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_parent_preference_2.d2,2:0:82-2:1:83", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "map": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_parent_preference_2.d2,2:3:85-4:0:172", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_parent_preference_2.d2,3:1:88-3:84:171", + "key": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_parent_preference_2.d2,3:1:88-3:4:91", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_parent_preference_2.d2,3:1:88-3:2:89", + "value": [ + { + "string": "_", + "raw_string": "_" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_parent_preference_2.d2,3:3:90-3:4:91", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "double_quoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_parent_preference_2.d2,3:6:93-3:84:171", + "value": [ + { + "string": "All we are given is possibilities -- to make ourselves one thing or another.", + "raw_string": "All we are given is possibilities -- to make ourselves one thing or another." + } + ] + } + } + } + } + ] + } + } + } + } + ] + }, + "root": { + "id": "", + "id_val": "", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + "edges": null, + "objects": [ + { + "id": "y", + "id_val": "y", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_parent_preference_2.d2,1:0:1-1:1:2", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_parent_preference_2.d2,1:0:1-1:1:2", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + }, + { + "key": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_parent_preference_2.d2,3:1:88-3:4:91", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_parent_preference_2.d2,3:1:88-3:2:89", + "value": [ + { + "string": "_", + "raw_string": "_" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_parent_preference_2.d2,3:3:90-3:4:91", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + } + ] + }, + "key_path_index": 1, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "All we are given is possibilities -- to make ourselves one thing or another." + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "x", + "id_val": "x", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_parent_preference_2.d2,2:0:82-2:1:83", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_parent_preference_2.d2,2:0:82-2:1:83", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "x" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ] + }, + "err": null +} diff --git a/testdata/d2compiler/TestCompile/underscore_parent_root.exp.json b/testdata/d2compiler/TestCompile/underscore_parent_root.exp.json new file mode 100644 index 000000000..174ed82c5 --- /dev/null +++ b/testdata/d2compiler/TestCompile/underscore_parent_root.exp.json @@ -0,0 +1,12 @@ +{ + "graph": null, + "err": { + "ioerr": null, + "errs": [ + { + "range": "d2/testdata/d2compiler/TestCompile/underscore_parent_root.d2,1:0:1-1:3:4", + "errmsg": "d2/testdata/d2compiler/TestCompile/underscore_parent_root.d2:2:1: parent \"_\" cannot be used in the root scope" + } + ] + } +} diff --git a/testdata/d2compiler/TestCompile/underscore_parent_sandwich_path.exp.json b/testdata/d2compiler/TestCompile/underscore_parent_sandwich_path.exp.json new file mode 100644 index 000000000..d2c8b3fc1 --- /dev/null +++ b/testdata/d2compiler/TestCompile/underscore_parent_sandwich_path.exp.json @@ -0,0 +1,12 @@ +{ + "graph": null, + "err": { + "ioerr": null, + "errs": [ + { + "range": "d2/testdata/d2compiler/TestCompile/underscore_parent_sandwich_path.d2,2:2:8-2:7:13", + "errmsg": "d2/testdata/d2compiler/TestCompile/underscore_parent_sandwich_path.d2:3:3: parent \"_\" can only be used in the beginning of paths, e.g. \"_.x\"" + } + ] + } +} diff --git a/testdata/d2compiler/TestCompile/underscore_parent_squared.exp.json b/testdata/d2compiler/TestCompile/underscore_parent_squared.exp.json new file mode 100644 index 000000000..e45990c65 --- /dev/null +++ b/testdata/d2compiler/TestCompile/underscore_parent_squared.exp.json @@ -0,0 +1,276 @@ +{ + "graph": { + "ast": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_parent_squared.d2,0:0:0-6:0:29", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_parent_squared.d2,1:0:1-5:1:28", + "key": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_parent_squared.d2,1:0:1-1:1:2", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_parent_squared.d2,1:0:1-1:1:2", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "map": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_parent_squared.d2,1:3:4-5:0:27", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_parent_squared.d2,2:2:8-4:3:26", + "key": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_parent_squared.d2,2:2:8-2:3:9", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_parent_squared.d2,2:2:8-2:3:9", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "map": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_parent_squared.d2,2:5:11-4:2:25", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_parent_squared.d2,3:4:17-3:9:22", + "key": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_parent_squared.d2,3:4:17-3:9:22", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_parent_squared.d2,3:4:17-3:5:18", + "value": [ + { + "string": "_", + "raw_string": "_" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_parent_squared.d2,3:6:19-3:7:20", + "value": [ + { + "string": "_", + "raw_string": "_" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_parent_squared.d2,3:8:21-3:9:22", + "value": [ + { + "string": "z", + "raw_string": "z" + } + ] + } + } + ] + }, + "primary": {}, + "value": {} + } + } + ] + } + } + } + } + ] + } + } + } + } + ] + }, + "root": { + "id": "", + "id_val": "", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + "edges": null, + "objects": [ + { + "id": "x", + "id_val": "x", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_parent_squared.d2,1:0:1-1:1:2", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_parent_squared.d2,1:0:1-1:1:2", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "x" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "y", + "id_val": "y", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_parent_squared.d2,2:2:8-2:3:9", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_parent_squared.d2,2:2:8-2:3:9", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "y" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "z", + "id_val": "z", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_parent_squared.d2,3:4:17-3:9:22", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_parent_squared.d2,3:4:17-3:5:18", + "value": [ + { + "string": "_", + "raw_string": "_" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_parent_squared.d2,3:6:19-3:7:20", + "value": [ + { + "string": "_", + "raw_string": "_" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/underscore_parent_squared.d2,3:8:21-3:9:22", + "value": [ + { + "string": "z", + "raw_string": "z" + } + ] + } + } + ] + }, + "key_path_index": 2, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "z" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ] + }, + "err": null +} diff --git a/testdata/d2compiler/TestCompile/url_link.exp.json b/testdata/d2compiler/TestCompile/url_link.exp.json new file mode 100644 index 000000000..8b73b1ff3 --- /dev/null +++ b/testdata/d2compiler/TestCompile/url_link.exp.json @@ -0,0 +1,134 @@ +{ + "graph": { + "ast": { + "range": "d2/testdata/d2compiler/TestCompile/url_link.d2,0:0:0-3:0:34", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2compiler/TestCompile/url_link.d2,0:0:0-2:1:33", + "key": { + "range": "d2/testdata/d2compiler/TestCompile/url_link.d2,0:0:0-0:1:1", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/url_link.d2,0:0:0-0:1:1", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "map": { + "range": "d2/testdata/d2compiler/TestCompile/url_link.d2,0:3:3-2:0:32", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2compiler/TestCompile/url_link.d2,1:2:7-1:26:31", + "key": { + "range": "d2/testdata/d2compiler/TestCompile/url_link.d2,1:2:7-1:6:11", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/url_link.d2,1:2:7-1:6:11", + "value": [ + { + "string": "link", + "raw_string": "link" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/url_link.d2,1:8:13-1:26:31", + "value": [ + { + "string": "https://google.com", + "raw_string": "https://google.com" + } + ] + } + } + } + } + ] + } + } + } + } + ] + }, + "root": { + "id": "", + "id_val": "", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + "edges": null, + "objects": [ + { + "id": "x", + "id_val": "x", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2compiler/TestCompile/url_link.d2,0:0:0-0:1:1", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile/url_link.d2,0:0:0-0:1:1", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "x" + }, + "style": {}, + "link": "https://google.com", + "near_key": null, + "shape": { + "value": "" + } + } + } + ] + }, + "err": null +} diff --git a/testdata/d2exporter/TestExport/connection/arrowhead.exp.json b/testdata/d2exporter/TestExport/connection/arrowhead.exp.json new file mode 100644 index 000000000..665dfb37c --- /dev/null +++ b/testdata/d2exporter/TestExport/connection/arrowhead.exp.json @@ -0,0 +1,111 @@ +{ + "name": "", + "shapes": [ + { + "id": "x", + "type": "", + "pos": { + "x": 0, + "y": 0 + }, + "width": 0, + "height": 0, + "level": 1, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#F7F8FE", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "x", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 0, + "labelHeight": 0 + }, + { + "id": "y", + "type": "", + "pos": { + "x": 0, + "y": 0 + }, + "width": 0, + "height": 0, + "level": 1, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#F7F8FE", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "y", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 0, + "labelHeight": 0 + } + ], + "connections": [ + { + "id": "(x -> y)[0]", + "src": "x", + "srcArrow": "none", + "srcLabel": "If you've done six impossible things before breakfast, why not round it", + "dst": "y", + "dstArrow": "filled-diamond", + "dstLabel": "A man with one watch knows what time it is.", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + } + ] +} diff --git a/testdata/d2exporter/TestExport/connection/basic.exp.json b/testdata/d2exporter/TestExport/connection/basic.exp.json new file mode 100644 index 000000000..4459332b3 --- /dev/null +++ b/testdata/d2exporter/TestExport/connection/basic.exp.json @@ -0,0 +1,111 @@ +{ + "name": "", + "shapes": [ + { + "id": "x", + "type": "", + "pos": { + "x": 0, + "y": 0 + }, + "width": 0, + "height": 0, + "level": 1, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#F7F8FE", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "x", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 0, + "labelHeight": 0 + }, + { + "id": "y", + "type": "", + "pos": { + "x": 0, + "y": 0 + }, + "width": 0, + "height": 0, + "level": 1, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#F7F8FE", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "y", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 0, + "labelHeight": 0 + } + ], + "connections": [ + { + "id": "(x -> y)[0]", + "src": "x", + "srcArrow": "none", + "srcLabel": "", + "dst": "y", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + } + ] +} diff --git a/testdata/d2exporter/TestExport/connection/stroke-dash.exp.json b/testdata/d2exporter/TestExport/connection/stroke-dash.exp.json new file mode 100644 index 000000000..70c56b898 --- /dev/null +++ b/testdata/d2exporter/TestExport/connection/stroke-dash.exp.json @@ -0,0 +1,111 @@ +{ + "name": "", + "shapes": [ + { + "id": "x", + "type": "", + "pos": { + "x": 0, + "y": 0 + }, + "width": 0, + "height": 0, + "level": 1, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#F7F8FE", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "x", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 0, + "labelHeight": 0 + }, + { + "id": "y", + "type": "", + "pos": { + "x": 0, + "y": 0 + }, + "width": 0, + "height": 0, + "level": 1, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#F7F8FE", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "y", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 0, + "labelHeight": 0 + } + ], + "connections": [ + { + "id": "(x -> y)[0]", + "src": "x", + "srcArrow": "none", + "srcLabel": "", + "dst": "y", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 4, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + } + ] +} diff --git a/testdata/d2exporter/TestExport/connection/theme_stroke-dash.exp.json b/testdata/d2exporter/TestExport/connection/theme_stroke-dash.exp.json new file mode 100644 index 000000000..8d71f6d80 --- /dev/null +++ b/testdata/d2exporter/TestExport/connection/theme_stroke-dash.exp.json @@ -0,0 +1,141 @@ +{ + "name": "", + "shapes": [ + { + "id": "x", + "type": "", + "pos": { + "x": 0, + "y": 0 + }, + "width": 0, + "height": 0, + "level": 1, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#E7EAFF", + "stroke": "#000E3D", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "x", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 0, + "labelHeight": 0 + }, + { + "id": "y", + "type": "", + "pos": { + "x": 0, + "y": 0 + }, + "width": 0, + "height": 0, + "level": 1, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#E7EAFF", + "stroke": "#000E3D", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "y", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 0, + "labelHeight": 0 + } + ], + "connections": [ + { + "id": "(x -> y)[0]", + "src": "x", + "srcArrow": "none", + "srcLabel": "", + "dst": "y", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#000E3D", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + }, + { + "id": "(x -> y)[1]", + "src": "x", + "srcArrow": "none", + "srcLabel": "", + "dst": "y", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#000E3D", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + } + ] +} diff --git a/testdata/d2exporter/TestExport/label/basic_shape.exp.json b/testdata/d2exporter/TestExport/label/basic_shape.exp.json new file mode 100644 index 000000000..3f802e743 --- /dev/null +++ b/testdata/d2exporter/TestExport/label/basic_shape.exp.json @@ -0,0 +1,43 @@ +{ + "name": "", + "shapes": [ + { + "id": "x", + "type": "", + "pos": { + "x": 0, + "y": 0 + }, + "width": 0, + "height": 0, + "level": 1, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#F7F8FE", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "yo", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 0, + "labelHeight": 0 + } + ], + "connections": [] +} diff --git a/testdata/d2exporter/TestExport/label/connection_font_color.exp.json b/testdata/d2exporter/TestExport/label/connection_font_color.exp.json new file mode 100644 index 000000000..b7dbac9f3 --- /dev/null +++ b/testdata/d2exporter/TestExport/label/connection_font_color.exp.json @@ -0,0 +1,111 @@ +{ + "name": "", + "shapes": [ + { + "id": "x", + "type": "", + "pos": { + "x": 0, + "y": 0 + }, + "width": 0, + "height": 0, + "level": 1, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#F7F8FE", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "x", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 0, + "labelHeight": 0 + }, + { + "id": "y", + "type": "", + "pos": { + "x": 0, + "y": 0 + }, + "width": 0, + "height": 0, + "level": 1, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#F7F8FE", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "y", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 0, + "labelHeight": 0 + } + ], + "connections": [ + { + "id": "(x -> y)[0]", + "src": "x", + "srcArrow": "none", + "srcLabel": "", + "dst": "y", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "yo", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "red", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + } + ] +} diff --git a/testdata/d2exporter/TestExport/label/shape_font_color.exp.json b/testdata/d2exporter/TestExport/label/shape_font_color.exp.json new file mode 100644 index 000000000..4ad10e627 --- /dev/null +++ b/testdata/d2exporter/TestExport/label/shape_font_color.exp.json @@ -0,0 +1,43 @@ +{ + "name": "", + "shapes": [ + { + "id": "x", + "type": "", + "pos": { + "x": 0, + "y": 0 + }, + "width": 0, + "height": 0, + "level": 1, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#F7F8FE", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "yo", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "red", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 0, + "labelHeight": 0 + } + ], + "connections": [] +} diff --git a/testdata/d2exporter/TestExport/shape/basic.exp.json b/testdata/d2exporter/TestExport/shape/basic.exp.json new file mode 100644 index 000000000..37448aad5 --- /dev/null +++ b/testdata/d2exporter/TestExport/shape/basic.exp.json @@ -0,0 +1,43 @@ +{ + "name": "", + "shapes": [ + { + "id": "x", + "type": "", + "pos": { + "x": 0, + "y": 0 + }, + "width": 0, + "height": 0, + "level": 1, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#F7F8FE", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "x", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 0, + "labelHeight": 0 + } + ], + "connections": [] +} diff --git a/testdata/d2exporter/TestExport/shape/border-radius.exp.json b/testdata/d2exporter/TestExport/shape/border-radius.exp.json new file mode 100644 index 000000000..53c93e150 --- /dev/null +++ b/testdata/d2exporter/TestExport/shape/border-radius.exp.json @@ -0,0 +1,43 @@ +{ + "name": "", + "shapes": [ + { + "id": "Square", + "type": "", + "pos": { + "x": 0, + "y": 0 + }, + "width": 0, + "height": 0, + "level": 1, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 5, + "fill": "#F7F8FE", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 0, + "labelHeight": 0 + } + ], + "connections": [] +} diff --git a/testdata/d2exporter/TestExport/shape/image_dimensions.exp.json b/testdata/d2exporter/TestExport/shape/image_dimensions.exp.json new file mode 100644 index 000000000..cc127ddba --- /dev/null +++ b/testdata/d2exporter/TestExport/shape/image_dimensions.exp.json @@ -0,0 +1,54 @@ +{ + "name": "", + "shapes": [ + { + "id": "hey", + "type": "image", + "pos": { + "x": 0, + "y": 0 + }, + "width": 0, + "height": 0, + "level": 1, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#FFFFFF", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": { + "Scheme": "https", + "Opaque": "", + "User": null, + "Host": "icons.terrastruct.com", + "Path": "/essentials/004-picture.svg", + "RawPath": "", + "ForceQuery": false, + "RawQuery": "", + "Fragment": "", + "RawFragment": "" + }, + "iconPosition": "INSIDE_MIDDLE_CENTER", + "fields": null, + "methods": null, + "columns": null, + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 0, + "labelHeight": 0 + } + ], + "connections": [] +} diff --git a/testdata/d2exporter/TestExport/shape/synonyms.exp.json b/testdata/d2exporter/TestExport/shape/synonyms.exp.json new file mode 100644 index 000000000..6b1d8f27b --- /dev/null +++ b/testdata/d2exporter/TestExport/shape/synonyms.exp.json @@ -0,0 +1,80 @@ +{ + "name": "", + "shapes": [ + { + "id": "x", + "type": "oval", + "pos": { + "x": 0, + "y": 0 + }, + "width": 0, + "height": 0, + "level": 1, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#F7F8FE", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "x", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 0, + "labelHeight": 0 + }, + { + "id": "y", + "type": "rectangle", + "pos": { + "x": 0, + "y": 0 + }, + "width": 0, + "height": 0, + "level": 1, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#F7F8FE", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "y", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 0, + "labelHeight": 0 + } + ], + "connections": [] +} diff --git a/testdata/d2exporter/TestExport/shape/text_color.exp.json b/testdata/d2exporter/TestExport/shape/text_color.exp.json new file mode 100644 index 000000000..39fc5164c --- /dev/null +++ b/testdata/d2exporter/TestExport/shape/text_color.exp.json @@ -0,0 +1,43 @@ +{ + "name": "", + "shapes": [ + { + "id": "x", + "type": "text", + "pos": { + "x": 0, + "y": 0 + }, + "width": 0, + "height": 0, + "level": 1, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#FFFFFF", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "yo", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "markdown", + "color": "red", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 0, + "labelHeight": 0 + } + ], + "connections": [] +} diff --git a/testdata/d2exporter/TestExport/theme/connection_with_bold.exp.json b/testdata/d2exporter/TestExport/theme/connection_with_bold.exp.json new file mode 100644 index 000000000..bb51aac7c --- /dev/null +++ b/testdata/d2exporter/TestExport/theme/connection_with_bold.exp.json @@ -0,0 +1,111 @@ +{ + "name": "", + "shapes": [ + { + "id": "x", + "type": "", + "pos": { + "x": 0, + "y": 0 + }, + "width": 0, + "height": 0, + "level": 1, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#E7EAFF", + "stroke": "#000E3D", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "x", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 0, + "labelHeight": 0 + }, + { + "id": "y", + "type": "", + "pos": { + "x": 0, + "y": 0 + }, + "width": 0, + "height": 0, + "level": 1, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#E7EAFF", + "stroke": "#000E3D", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "y", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 0, + "labelHeight": 0 + } + ], + "connections": [ + { + "id": "(x -> y)[0]", + "src": "x", + "srcArrow": "none", + "srcLabel": "", + "dst": "y", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#000E3D", + "label": "asdf", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": true, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + } + ] +} diff --git a/testdata/d2exporter/TestExport/theme/connection_with_italic.exp.json b/testdata/d2exporter/TestExport/theme/connection_with_italic.exp.json new file mode 100644 index 000000000..f0f5d8fe4 --- /dev/null +++ b/testdata/d2exporter/TestExport/theme/connection_with_italic.exp.json @@ -0,0 +1,111 @@ +{ + "name": "", + "shapes": [ + { + "id": "x", + "type": "", + "pos": { + "x": 0, + "y": 0 + }, + "width": 0, + "height": 0, + "level": 1, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#E7EAFF", + "stroke": "#000E3D", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "x", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 0, + "labelHeight": 0 + }, + { + "id": "y", + "type": "", + "pos": { + "x": 0, + "y": 0 + }, + "width": 0, + "height": 0, + "level": 1, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#E7EAFF", + "stroke": "#000E3D", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "y", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 0, + "labelHeight": 0 + } + ], + "connections": [ + { + "id": "(x -> y)[0]", + "src": "x", + "srcArrow": "none", + "srcLabel": "", + "dst": "y", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#000E3D", + "label": "asdf", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + } + ] +} diff --git a/testdata/d2exporter/TestExport/theme/connection_without_italic.exp.json b/testdata/d2exporter/TestExport/theme/connection_without_italic.exp.json new file mode 100644 index 000000000..5dcbdc290 --- /dev/null +++ b/testdata/d2exporter/TestExport/theme/connection_without_italic.exp.json @@ -0,0 +1,111 @@ +{ + "name": "", + "shapes": [ + { + "id": "x", + "type": "", + "pos": { + "x": 0, + "y": 0 + }, + "width": 0, + "height": 0, + "level": 1, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#E7EAFF", + "stroke": "#000E3D", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "x", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 0, + "labelHeight": 0 + }, + { + "id": "y", + "type": "", + "pos": { + "x": 0, + "y": 0 + }, + "width": 0, + "height": 0, + "level": 1, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#E7EAFF", + "stroke": "#000E3D", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "y", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 0, + "labelHeight": 0 + } + ], + "connections": [ + { + "id": "(x -> y)[0]", + "src": "x", + "srcArrow": "none", + "srcLabel": "", + "dst": "y", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#000E3D", + "label": "asdf", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null + } + ] +} diff --git a/testdata/d2exporter/TestExport/theme/shape_with_italic.exp.json b/testdata/d2exporter/TestExport/theme/shape_with_italic.exp.json new file mode 100644 index 000000000..3f8c3fc3c --- /dev/null +++ b/testdata/d2exporter/TestExport/theme/shape_with_italic.exp.json @@ -0,0 +1,43 @@ +{ + "name": "", + "shapes": [ + { + "id": "x", + "type": "", + "pos": { + "x": 0, + "y": 0 + }, + "width": 0, + "height": 0, + "level": 1, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#E7EAFF", + "stroke": "#000E3D", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "x", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": true, + "underline": false, + "labelWidth": 0, + "labelHeight": 0 + } + ], + "connections": [] +} diff --git a/testdata/d2exporter/TestExport/theme/shape_without_bold.exp.json b/testdata/d2exporter/TestExport/theme/shape_without_bold.exp.json new file mode 100644 index 000000000..3111dd17e --- /dev/null +++ b/testdata/d2exporter/TestExport/theme/shape_without_bold.exp.json @@ -0,0 +1,43 @@ +{ + "name": "", + "shapes": [ + { + "id": "x", + "type": "", + "pos": { + "x": 0, + "y": 0 + }, + "width": 0, + "height": 0, + "level": 1, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#E7EAFF", + "stroke": "#000E3D", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "x", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0 + } + ], + "connections": [] +} diff --git a/testdata/d2oracle/TestCreate/base.exp.json b/testdata/d2oracle/TestCreate/base.exp.json new file mode 100644 index 000000000..11e2b663a --- /dev/null +++ b/testdata/d2oracle/TestCreate/base.exp.json @@ -0,0 +1,94 @@ +{ + "graph": { + "ast": { + "range": "d2/testdata/d2oracle/TestCreate/base.d2,0:0:0-1:0:7", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestCreate/base.d2,0:0:0-0:6:6", + "key": { + "range": "d2/testdata/d2oracle/TestCreate/base.d2,0:0:0-0:6:6", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestCreate/base.d2,0:0:0-0:6:6", + "value": [ + { + "string": "square", + "raw_string": "square" + } + ] + } + } + ] + }, + "primary": {}, + "value": {} + } + } + ] + }, + "root": { + "id": "", + "id_val": "", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + "edges": null, + "objects": [ + { + "id": "square", + "id_val": "square", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestCreate/base.d2,0:0:0-0:6:6", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestCreate/base.d2,0:0:0-0:6:6", + "value": [ + { + "string": "square", + "raw_string": "square" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "square" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ] + }, + "err": "" +} diff --git a/testdata/d2oracle/TestCreate/container.exp.json b/testdata/d2oracle/TestCreate/container.exp.json new file mode 100644 index 000000000..33048c8aa --- /dev/null +++ b/testdata/d2oracle/TestCreate/container.exp.json @@ -0,0 +1,163 @@ +{ + "graph": { + "ast": { + "range": "d2/testdata/d2oracle/TestCreate/container.d2,0:0:0-3:0:11", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestCreate/container.d2,0:0:0-2:1:10", + "key": { + "range": "d2/testdata/d2oracle/TestCreate/container.d2,0:0:0-0:1:1", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestCreate/container.d2,0:0:0-0:1:1", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "map": { + "range": "d2/testdata/d2oracle/TestCreate/container.d2,0:3:3-2:0:9", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestCreate/container.d2,1:2:7-1:3:8", + "key": { + "range": "d2/testdata/d2oracle/TestCreate/container.d2,1:2:7-1:3:8", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestCreate/container.d2,1:2:7-1:3:8", + "value": [ + { + "string": "q", + "raw_string": "q" + } + ] + } + } + ] + }, + "primary": {}, + "value": {} + } + } + ] + } + } + } + } + ] + }, + "root": { + "id": "", + "id_val": "", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + "edges": null, + "objects": [ + { + "id": "b", + "id_val": "b", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestCreate/container.d2,0:0:0-0:1:1", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestCreate/container.d2,0:0:0-0:1:1", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "b" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "q", + "id_val": "q", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestCreate/container.d2,1:2:7-1:3:8", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestCreate/container.d2,1:2:7-1:3:8", + "value": [ + { + "string": "q", + "raw_string": "q" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "q" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ] + }, + "err": "" +} diff --git a/testdata/d2oracle/TestCreate/container_edge.exp.json b/testdata/d2oracle/TestCreate/container_edge.exp.json new file mode 100644 index 000000000..39697a995 --- /dev/null +++ b/testdata/d2oracle/TestCreate/container_edge.exp.json @@ -0,0 +1,254 @@ +{ + "graph": { + "ast": { + "range": "d2/testdata/d2oracle/TestCreate/container_edge.d2,0:0:0-3:0:16", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestCreate/container_edge.d2,0:0:0-2:1:15", + "key": { + "range": "d2/testdata/d2oracle/TestCreate/container_edge.d2,0:0:0-0:1:1", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestCreate/container_edge.d2,0:0:0-0:1:1", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "map": { + "range": "d2/testdata/d2oracle/TestCreate/container_edge.d2,0:3:3-2:0:14", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestCreate/container_edge.d2,1:2:7-1:8:13", + "edges": [ + { + "range": "d2/testdata/d2oracle/TestCreate/container_edge.d2,1:2:7-1:8:13", + "src": { + "range": "d2/testdata/d2oracle/TestCreate/container_edge.d2,1:2:7-1:4:9", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestCreate/container_edge.d2,1:2:7-1:3:8", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "src_arrow": "", + "dst": { + "range": "d2/testdata/d2oracle/TestCreate/container_edge.d2,1:6:11-1:8:13", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestCreate/container_edge.d2,1:7:12-1:8:13", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + } + ] + }, + "dst_arrow": ">" + } + ], + "primary": {}, + "value": {} + } + } + ] + } + } + } + } + ] + }, + "root": { + "id": "", + "id_val": "", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + "edges": [ + { + "index": 0, + "minWidth": 0, + "minHeight": 0, + "label_dimensions": { + "width": 0, + "height": 0 + }, + "isCurve": false, + "src_arrow": false, + "dst_arrow": true, + "references": [ + { + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ], + "objects": [ + { + "id": "b", + "id_val": "b", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestCreate/container_edge.d2,0:0:0-0:1:1", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestCreate/container_edge.d2,0:0:0-0:1:1", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "b" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "x", + "id_val": "x", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestCreate/container_edge.d2,1:2:7-1:4:9", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestCreate/container_edge.d2,1:2:7-1:3:8", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "x" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "y", + "id_val": "y", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestCreate/container_edge.d2,1:6:11-1:8:13", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestCreate/container_edge.d2,1:7:12-1:8:13", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "y" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ] + }, + "err": "" +} diff --git a/testdata/d2oracle/TestCreate/container_edge_label.exp.json b/testdata/d2oracle/TestCreate/container_edge_label.exp.json new file mode 100644 index 000000000..4804a6f1e --- /dev/null +++ b/testdata/d2oracle/TestCreate/container_edge_label.exp.json @@ -0,0 +1,264 @@ +{ + "graph": { + "ast": { + "range": "d2/testdata/d2oracle/TestCreate/container_edge_label.d2,0:0:0-3:0:21", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestCreate/container_edge_label.d2,0:0:0-2:1:20", + "key": { + "range": "d2/testdata/d2oracle/TestCreate/container_edge_label.d2,0:0:0-0:1:1", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestCreate/container_edge_label.d2,0:0:0-0:1:1", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + } + ] + }, + "primary": { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestCreate/container_edge_label.d2,0:3:3-0:7:7", + "value": [ + { + "string": "zoom", + "raw_string": "zoom" + } + ] + } + }, + "value": { + "map": { + "range": "d2/testdata/d2oracle/TestCreate/container_edge_label.d2,0:8:8-2:0:19", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestCreate/container_edge_label.d2,1:2:12-1:8:18", + "edges": [ + { + "range": "d2/testdata/d2oracle/TestCreate/container_edge_label.d2,1:2:12-1:8:18", + "src": { + "range": "d2/testdata/d2oracle/TestCreate/container_edge_label.d2,1:2:12-1:4:14", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestCreate/container_edge_label.d2,1:2:12-1:3:13", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "src_arrow": "", + "dst": { + "range": "d2/testdata/d2oracle/TestCreate/container_edge_label.d2,1:6:16-1:8:18", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestCreate/container_edge_label.d2,1:7:17-1:8:18", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + } + ] + }, + "dst_arrow": ">" + } + ], + "primary": {}, + "value": {} + } + } + ] + } + } + } + } + ] + }, + "root": { + "id": "", + "id_val": "", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + "edges": [ + { + "index": 0, + "minWidth": 0, + "minHeight": 0, + "label_dimensions": { + "width": 0, + "height": 0 + }, + "isCurve": false, + "src_arrow": false, + "dst_arrow": true, + "references": [ + { + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ], + "objects": [ + { + "id": "b", + "id_val": "b", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestCreate/container_edge_label.d2,0:0:0-0:1:1", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestCreate/container_edge_label.d2,0:0:0-0:1:1", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "zoom" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "x", + "id_val": "x", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestCreate/container_edge_label.d2,1:2:12-1:4:14", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestCreate/container_edge_label.d2,1:2:12-1:3:13", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "x" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "y", + "id_val": "y", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestCreate/container_edge_label.d2,1:6:16-1:8:18", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestCreate/container_edge_label.d2,1:7:17-1:8:18", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "y" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ] + }, + "err": "" +} diff --git a/testdata/d2oracle/TestCreate/edge.exp.json b/testdata/d2oracle/TestCreate/edge.exp.json new file mode 100644 index 000000000..9b2014c1e --- /dev/null +++ b/testdata/d2oracle/TestCreate/edge.exp.json @@ -0,0 +1,185 @@ +{ + "graph": { + "ast": { + "range": "d2/testdata/d2oracle/TestCreate/edge.d2,0:0:0-1:0:7", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestCreate/edge.d2,0:0:0-0:6:6", + "edges": [ + { + "range": "d2/testdata/d2oracle/TestCreate/edge.d2,0:0:0-0:6:6", + "src": { + "range": "d2/testdata/d2oracle/TestCreate/edge.d2,0:0:0-0:2:2", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestCreate/edge.d2,0:0:0-0:1:1", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "src_arrow": "", + "dst": { + "range": "d2/testdata/d2oracle/TestCreate/edge.d2,0:4:4-0:6:6", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestCreate/edge.d2,0:5:5-0:6:6", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + } + ] + }, + "dst_arrow": ">" + } + ], + "primary": {}, + "value": {} + } + } + ] + }, + "root": { + "id": "", + "id_val": "", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + "edges": [ + { + "index": 0, + "minWidth": 0, + "minHeight": 0, + "label_dimensions": { + "width": 0, + "height": 0 + }, + "isCurve": false, + "src_arrow": false, + "dst_arrow": true, + "references": [ + { + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ], + "objects": [ + { + "id": "x", + "id_val": "x", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestCreate/edge.d2,0:0:0-0:2:2", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestCreate/edge.d2,0:0:0-0:1:1", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "x" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "y", + "id_val": "y", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestCreate/edge.d2,0:4:4-0:6:6", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestCreate/edge.d2,0:5:5-0:6:6", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "y" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ] + }, + "err": "" +} diff --git a/testdata/d2oracle/TestCreate/edge_nested.exp.json b/testdata/d2oracle/TestCreate/edge_nested.exp.json new file mode 100644 index 000000000..149603016 --- /dev/null +++ b/testdata/d2oracle/TestCreate/edge_nested.exp.json @@ -0,0 +1,241 @@ +{ + "graph": { + "ast": { + "range": "d2/testdata/d2oracle/TestCreate/edge_nested.d2,0:0:0-1:0:19", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestCreate/edge_nested.d2,0:0:0-0:18:18", + "key": { + "range": "d2/testdata/d2oracle/TestCreate/edge_nested.d2,0:0:0-0:10:10", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestCreate/edge_nested.d2,0:0:0-0:9:9", + "value": [ + { + "string": "container", + "raw_string": "container" + } + ] + } + } + ] + }, + "edges": [ + { + "range": "d2/testdata/d2oracle/TestCreate/edge_nested.d2,0:11:11-0:17:17", + "src": { + "range": "d2/testdata/d2oracle/TestCreate/edge_nested.d2,0:11:11-0:13:13", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestCreate/edge_nested.d2,0:11:11-0:12:12", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "src_arrow": "", + "dst": { + "range": "d2/testdata/d2oracle/TestCreate/edge_nested.d2,0:15:15-0:17:17", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestCreate/edge_nested.d2,0:16:16-0:17:17", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + } + ] + }, + "dst_arrow": ">" + } + ], + "primary": {}, + "value": {} + } + } + ] + }, + "root": { + "id": "", + "id_val": "", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + "edges": [ + { + "index": 0, + "minWidth": 0, + "minHeight": 0, + "label_dimensions": { + "width": 0, + "height": 0 + }, + "isCurve": false, + "src_arrow": false, + "dst_arrow": true, + "references": [ + { + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ], + "objects": [ + { + "id": "container", + "id_val": "container", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestCreate/edge_nested.d2,0:0:0-0:10:10", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestCreate/edge_nested.d2,0:0:0-0:9:9", + "value": [ + { + "string": "container", + "raw_string": "container" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "container" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "x", + "id_val": "x", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestCreate/edge_nested.d2,0:11:11-0:13:13", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestCreate/edge_nested.d2,0:11:11-0:12:12", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "x" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "y", + "id_val": "y", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestCreate/edge_nested.d2,0:15:15-0:17:17", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestCreate/edge_nested.d2,0:16:16-0:17:17", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "y" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ] + }, + "err": "" +} diff --git a/testdata/d2oracle/TestCreate/edge_scope.exp.json b/testdata/d2oracle/TestCreate/edge_scope.exp.json new file mode 100644 index 000000000..ea6ae05e1 --- /dev/null +++ b/testdata/d2oracle/TestCreate/edge_scope.exp.json @@ -0,0 +1,254 @@ +{ + "graph": { + "ast": { + "range": "d2/testdata/d2oracle/TestCreate/edge_scope.d2,0:0:0-3:0:24", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestCreate/edge_scope.d2,0:0:0-2:1:23", + "key": { + "range": "d2/testdata/d2oracle/TestCreate/edge_scope.d2,0:0:0-0:9:9", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestCreate/edge_scope.d2,0:0:0-0:9:9", + "value": [ + { + "string": "container", + "raw_string": "container" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "map": { + "range": "d2/testdata/d2oracle/TestCreate/edge_scope.d2,0:11:11-2:0:22", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestCreate/edge_scope.d2,1:2:15-1:8:21", + "edges": [ + { + "range": "d2/testdata/d2oracle/TestCreate/edge_scope.d2,1:2:15-1:8:21", + "src": { + "range": "d2/testdata/d2oracle/TestCreate/edge_scope.d2,1:2:15-1:4:17", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestCreate/edge_scope.d2,1:2:15-1:3:16", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "src_arrow": "", + "dst": { + "range": "d2/testdata/d2oracle/TestCreate/edge_scope.d2,1:6:19-1:8:21", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestCreate/edge_scope.d2,1:7:20-1:8:21", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + } + ] + }, + "dst_arrow": ">" + } + ], + "primary": {}, + "value": {} + } + } + ] + } + } + } + } + ] + }, + "root": { + "id": "", + "id_val": "", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + "edges": [ + { + "index": 0, + "minWidth": 0, + "minHeight": 0, + "label_dimensions": { + "width": 0, + "height": 0 + }, + "isCurve": false, + "src_arrow": false, + "dst_arrow": true, + "references": [ + { + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ], + "objects": [ + { + "id": "container", + "id_val": "container", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestCreate/edge_scope.d2,0:0:0-0:9:9", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestCreate/edge_scope.d2,0:0:0-0:9:9", + "value": [ + { + "string": "container", + "raw_string": "container" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "container" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "x", + "id_val": "x", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestCreate/edge_scope.d2,1:2:15-1:4:17", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestCreate/edge_scope.d2,1:2:15-1:3:16", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "x" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "y", + "id_val": "y", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestCreate/edge_scope.d2,1:6:19-1:8:21", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestCreate/edge_scope.d2,1:7:20-1:8:21", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "y" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ] + }, + "err": "" +} diff --git a/testdata/d2oracle/TestCreate/edge_scope_flat.exp.json b/testdata/d2oracle/TestCreate/edge_scope_flat.exp.json new file mode 100644 index 000000000..dc5658e40 --- /dev/null +++ b/testdata/d2oracle/TestCreate/edge_scope_flat.exp.json @@ -0,0 +1,254 @@ +{ + "graph": { + "ast": { + "range": "d2/testdata/d2oracle/TestCreate/edge_scope_flat.d2,0:0:0-3:0:24", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestCreate/edge_scope_flat.d2,0:0:0-2:1:23", + "key": { + "range": "d2/testdata/d2oracle/TestCreate/edge_scope_flat.d2,0:0:0-0:9:9", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestCreate/edge_scope_flat.d2,0:0:0-0:9:9", + "value": [ + { + "string": "container", + "raw_string": "container" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "map": { + "range": "d2/testdata/d2oracle/TestCreate/edge_scope_flat.d2,0:11:11-2:0:22", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestCreate/edge_scope_flat.d2,1:2:15-1:8:21", + "edges": [ + { + "range": "d2/testdata/d2oracle/TestCreate/edge_scope_flat.d2,1:2:15-1:8:21", + "src": { + "range": "d2/testdata/d2oracle/TestCreate/edge_scope_flat.d2,1:2:15-1:4:17", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestCreate/edge_scope_flat.d2,1:2:15-1:3:16", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "src_arrow": "", + "dst": { + "range": "d2/testdata/d2oracle/TestCreate/edge_scope_flat.d2,1:6:19-1:8:21", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestCreate/edge_scope_flat.d2,1:7:20-1:8:21", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + } + ] + }, + "dst_arrow": ">" + } + ], + "primary": {}, + "value": {} + } + } + ] + } + } + } + } + ] + }, + "root": { + "id": "", + "id_val": "", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + "edges": [ + { + "index": 0, + "minWidth": 0, + "minHeight": 0, + "label_dimensions": { + "width": 0, + "height": 0 + }, + "isCurve": false, + "src_arrow": false, + "dst_arrow": true, + "references": [ + { + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ], + "objects": [ + { + "id": "container", + "id_val": "container", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestCreate/edge_scope_flat.d2,0:0:0-0:9:9", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestCreate/edge_scope_flat.d2,0:0:0-0:9:9", + "value": [ + { + "string": "container", + "raw_string": "container" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "container" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "x", + "id_val": "x", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestCreate/edge_scope_flat.d2,1:2:15-1:4:17", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestCreate/edge_scope_flat.d2,1:2:15-1:3:16", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "x" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "y", + "id_val": "y", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestCreate/edge_scope_flat.d2,1:6:19-1:8:21", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestCreate/edge_scope_flat.d2,1:7:20-1:8:21", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "y" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ] + }, + "err": "" +} diff --git a/testdata/d2oracle/TestCreate/edge_scope_nested.exp.json b/testdata/d2oracle/TestCreate/edge_scope_nested.exp.json new file mode 100644 index 000000000..ea215f9ed --- /dev/null +++ b/testdata/d2oracle/TestCreate/edge_scope_nested.exp.json @@ -0,0 +1,327 @@ +{ + "graph": { + "ast": { + "range": "d2/testdata/d2oracle/TestCreate/edge_scope_nested.d2,0:0:0-3:0:18", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestCreate/edge_scope_nested.d2,0:0:0-2:1:17", + "key": { + "range": "d2/testdata/d2oracle/TestCreate/edge_scope_nested.d2,0:0:0-0:3:3", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestCreate/edge_scope_nested.d2,0:0:0-0:1:1", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestCreate/edge_scope_nested.d2,0:2:2-0:3:3", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "map": { + "range": "d2/testdata/d2oracle/TestCreate/edge_scope_nested.d2,0:5:5-2:0:16", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestCreate/edge_scope_nested.d2,1:2:9-1:8:15", + "edges": [ + { + "range": "d2/testdata/d2oracle/TestCreate/edge_scope_nested.d2,1:2:9-1:8:15", + "src": { + "range": "d2/testdata/d2oracle/TestCreate/edge_scope_nested.d2,1:2:9-1:4:11", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestCreate/edge_scope_nested.d2,1:2:9-1:3:10", + "value": [ + { + "string": "z", + "raw_string": "z" + } + ] + } + } + ] + }, + "src_arrow": "", + "dst": { + "range": "d2/testdata/d2oracle/TestCreate/edge_scope_nested.d2,1:6:13-1:8:15", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestCreate/edge_scope_nested.d2,1:7:14-1:8:15", + "value": [ + { + "string": "q", + "raw_string": "q" + } + ] + } + } + ] + }, + "dst_arrow": ">" + } + ], + "primary": {}, + "value": {} + } + } + ] + } + } + } + } + ] + }, + "root": { + "id": "", + "id_val": "", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + "edges": [ + { + "index": 0, + "minWidth": 0, + "minHeight": 0, + "label_dimensions": { + "width": 0, + "height": 0 + }, + "isCurve": false, + "src_arrow": false, + "dst_arrow": true, + "references": [ + { + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ], + "objects": [ + { + "id": "x", + "id_val": "x", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestCreate/edge_scope_nested.d2,0:0:0-0:3:3", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestCreate/edge_scope_nested.d2,0:0:0-0:1:1", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestCreate/edge_scope_nested.d2,0:2:2-0:3:3", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "x" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "y", + "id_val": "y", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestCreate/edge_scope_nested.d2,0:0:0-0:3:3", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestCreate/edge_scope_nested.d2,0:0:0-0:1:1", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestCreate/edge_scope_nested.d2,0:2:2-0:3:3", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + } + ] + }, + "key_path_index": 1, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "y" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "z", + "id_val": "z", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestCreate/edge_scope_nested.d2,1:2:9-1:4:11", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestCreate/edge_scope_nested.d2,1:2:9-1:3:10", + "value": [ + { + "string": "z", + "raw_string": "z" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "z" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "q", + "id_val": "q", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestCreate/edge_scope_nested.d2,1:6:13-1:8:15", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestCreate/edge_scope_nested.d2,1:7:14-1:8:15", + "value": [ + { + "string": "q", + "raw_string": "q" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "q" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ] + }, + "err": "" +} diff --git a/testdata/d2oracle/TestCreate/edge_unique.exp.json b/testdata/d2oracle/TestCreate/edge_unique.exp.json new file mode 100644 index 000000000..64946f4f7 --- /dev/null +++ b/testdata/d2oracle/TestCreate/edge_unique.exp.json @@ -0,0 +1,692 @@ +{ + "graph": { + "ast": { + "range": "d2/testdata/d2oracle/TestCreate/edge_unique.d2,0:0:0-4:0:52", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestCreate/edge_unique.d2,0:0:0-0:6:6", + "edges": [ + { + "range": "d2/testdata/d2oracle/TestCreate/edge_unique.d2,0:0:0-0:6:6", + "src": { + "range": "d2/testdata/d2oracle/TestCreate/edge_unique.d2,0:0:0-0:2:2", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestCreate/edge_unique.d2,0:0:0-0:1:1", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "src_arrow": "", + "dst": { + "range": "d2/testdata/d2oracle/TestCreate/edge_unique.d2,0:4:4-0:6:6", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestCreate/edge_unique.d2,0:5:5-0:6:6", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + } + ] + }, + "dst_arrow": ">" + } + ], + "primary": {}, + "value": {} + } + }, + { + "map_key": { + "range": "d2/testdata/d2oracle/TestCreate/edge_unique.d2,1:0:7-1:14:21", + "key": { + "range": "d2/testdata/d2oracle/TestCreate/edge_unique.d2,1:0:7-1:6:13", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestCreate/edge_unique.d2,1:0:7-1:5:12", + "value": [ + { + "string": "hello", + "raw_string": "hello" + } + ] + } + } + ] + }, + "edges": [ + { + "range": "d2/testdata/d2oracle/TestCreate/edge_unique.d2,1:7:14-1:13:20", + "src": { + "range": "d2/testdata/d2oracle/TestCreate/edge_unique.d2,1:7:14-1:9:16", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestCreate/edge_unique.d2,1:7:14-1:8:15", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "src_arrow": "", + "dst": { + "range": "d2/testdata/d2oracle/TestCreate/edge_unique.d2,1:11:18-1:13:20", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestCreate/edge_unique.d2,1:12:19-1:13:20", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + } + ] + }, + "dst_arrow": ">" + } + ], + "primary": {}, + "value": {} + } + }, + { + "map_key": { + "range": "d2/testdata/d2oracle/TestCreate/edge_unique.d2,2:0:22-2:14:36", + "key": { + "range": "d2/testdata/d2oracle/TestCreate/edge_unique.d2,2:0:22-2:6:28", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestCreate/edge_unique.d2,2:0:22-2:5:27", + "value": [ + { + "string": "hello", + "raw_string": "hello" + } + ] + } + } + ] + }, + "edges": [ + { + "range": "d2/testdata/d2oracle/TestCreate/edge_unique.d2,2:7:29-2:13:35", + "src": { + "range": "d2/testdata/d2oracle/TestCreate/edge_unique.d2,2:7:29-2:9:31", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestCreate/edge_unique.d2,2:7:29-2:8:30", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "src_arrow": "", + "dst": { + "range": "d2/testdata/d2oracle/TestCreate/edge_unique.d2,2:11:33-2:13:35", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestCreate/edge_unique.d2,2:12:34-2:13:35", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + } + ] + }, + "dst_arrow": ">" + } + ], + "primary": {}, + "value": {} + } + }, + { + "map_key": { + "range": "d2/testdata/d2oracle/TestCreate/edge_unique.d2,3:0:37-3:14:51", + "key": { + "range": "d2/testdata/d2oracle/TestCreate/edge_unique.d2,3:0:37-3:6:43", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestCreate/edge_unique.d2,3:0:37-3:5:42", + "value": [ + { + "string": "hello", + "raw_string": "hello" + } + ] + } + } + ] + }, + "edges": [ + { + "range": "d2/testdata/d2oracle/TestCreate/edge_unique.d2,3:7:44-3:13:50", + "src": { + "range": "d2/testdata/d2oracle/TestCreate/edge_unique.d2,3:7:44-3:9:46", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestCreate/edge_unique.d2,3:7:44-3:8:45", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "src_arrow": "", + "dst": { + "range": "d2/testdata/d2oracle/TestCreate/edge_unique.d2,3:11:48-3:13:50", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestCreate/edge_unique.d2,3:12:49-3:13:50", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + } + ] + }, + "dst_arrow": ">" + } + ], + "primary": {}, + "value": {} + } + } + ] + }, + "root": { + "id": "", + "id_val": "", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + "edges": [ + { + "index": 0, + "minWidth": 0, + "minHeight": 0, + "label_dimensions": { + "width": 0, + "height": 0 + }, + "isCurve": false, + "src_arrow": false, + "dst_arrow": true, + "references": [ + { + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "index": 0, + "minWidth": 0, + "minHeight": 0, + "label_dimensions": { + "width": 0, + "height": 0 + }, + "isCurve": false, + "src_arrow": false, + "dst_arrow": true, + "references": [ + { + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "index": 1, + "minWidth": 0, + "minHeight": 0, + "label_dimensions": { + "width": 0, + "height": 0 + }, + "isCurve": false, + "src_arrow": false, + "dst_arrow": true, + "references": [ + { + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "index": 2, + "minWidth": 0, + "minHeight": 0, + "label_dimensions": { + "width": 0, + "height": 0 + }, + "isCurve": false, + "src_arrow": false, + "dst_arrow": true, + "references": [ + { + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ], + "objects": [ + { + "id": "x", + "id_val": "x", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestCreate/edge_unique.d2,0:0:0-0:2:2", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestCreate/edge_unique.d2,0:0:0-0:1:1", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "x" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "y", + "id_val": "y", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestCreate/edge_unique.d2,0:4:4-0:6:6", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestCreate/edge_unique.d2,0:5:5-0:6:6", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "y" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "hello", + "id_val": "hello", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestCreate/edge_unique.d2,1:0:7-1:6:13", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestCreate/edge_unique.d2,1:0:7-1:5:12", + "value": [ + { + "string": "hello", + "raw_string": "hello" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + }, + { + "key": { + "range": "d2/testdata/d2oracle/TestCreate/edge_unique.d2,2:0:22-2:6:28", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestCreate/edge_unique.d2,2:0:22-2:5:27", + "value": [ + { + "string": "hello", + "raw_string": "hello" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + }, + { + "key": { + "range": "d2/testdata/d2oracle/TestCreate/edge_unique.d2,3:0:37-3:6:43", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestCreate/edge_unique.d2,3:0:37-3:5:42", + "value": [ + { + "string": "hello", + "raw_string": "hello" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "hello" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "x", + "id_val": "x", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestCreate/edge_unique.d2,1:7:14-1:9:16", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestCreate/edge_unique.d2,1:7:14-1:8:15", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + }, + { + "key": { + "range": "d2/testdata/d2oracle/TestCreate/edge_unique.d2,2:7:29-2:9:31", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestCreate/edge_unique.d2,2:7:29-2:8:30", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + }, + { + "key": { + "range": "d2/testdata/d2oracle/TestCreate/edge_unique.d2,3:7:44-3:9:46", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestCreate/edge_unique.d2,3:7:44-3:8:45", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "x" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "y", + "id_val": "y", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestCreate/edge_unique.d2,1:11:18-1:13:20", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestCreate/edge_unique.d2,1:12:19-1:13:20", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + }, + { + "key": { + "range": "d2/testdata/d2oracle/TestCreate/edge_unique.d2,2:11:33-2:13:35", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestCreate/edge_unique.d2,2:12:34-2:13:35", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + }, + { + "key": { + "range": "d2/testdata/d2oracle/TestCreate/edge_unique.d2,3:11:48-3:13:50", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestCreate/edge_unique.d2,3:12:49-3:13:50", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "y" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ] + }, + "err": "" +} diff --git a/testdata/d2oracle/TestCreate/gen_key.exp.json b/testdata/d2oracle/TestCreate/gen_key.exp.json new file mode 100644 index 000000000..1966893ff --- /dev/null +++ b/testdata/d2oracle/TestCreate/gen_key.exp.json @@ -0,0 +1,157 @@ +{ + "graph": { + "ast": { + "range": "d2/testdata/d2oracle/TestCreate/gen_key.d2,0:0:0-1:0:17", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestCreate/gen_key.d2,0:0:0-0:6:6", + "key": { + "range": "d2/testdata/d2oracle/TestCreate/gen_key.d2,0:0:0-0:6:6", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestCreate/gen_key.d2,0:0:0-0:6:6", + "value": [ + { + "string": "square", + "raw_string": "square" + } + ] + } + } + ] + }, + "primary": {}, + "value": {} + } + }, + { + "map_key": { + "range": "d2/testdata/d2oracle/TestCreate/gen_key.d2,0:8:8-0:16:16", + "key": { + "range": "d2/testdata/d2oracle/TestCreate/gen_key.d2,0:8:8-0:16:16", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestCreate/gen_key.d2,0:8:8-0:16:16", + "value": [ + { + "string": "square 2", + "raw_string": "square 2" + } + ] + } + } + ] + }, + "primary": {}, + "value": {} + } + } + ] + }, + "root": { + "id": "", + "id_val": "", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + "edges": null, + "objects": [ + { + "id": "square", + "id_val": "square", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestCreate/gen_key.d2,0:0:0-0:6:6", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestCreate/gen_key.d2,0:0:0-0:6:6", + "value": [ + { + "string": "square", + "raw_string": "square" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "square" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "square 2", + "id_val": "square 2", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestCreate/gen_key.d2,0:8:8-0:16:16", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestCreate/gen_key.d2,0:8:8-0:16:16", + "value": [ + { + "string": "square 2", + "raw_string": "square 2" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "square 2" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ] + }, + "err": "" +} diff --git a/testdata/d2oracle/TestCreate/gen_key_n.exp.json b/testdata/d2oracle/TestCreate/gen_key_n.exp.json new file mode 100644 index 000000000..04df49dbc --- /dev/null +++ b/testdata/d2oracle/TestCreate/gen_key_n.exp.json @@ -0,0 +1,961 @@ +{ + "graph": { + "ast": { + "range": "d2/testdata/d2oracle/TestCreate/gen_key_n.d2,0:0:0-13:0:132", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestCreate/gen_key_n.d2,0:0:0-12:1:131", + "key": { + "range": "d2/testdata/d2oracle/TestCreate/gen_key_n.d2,0:0:0-0:5:5", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestCreate/gen_key_n.d2,0:0:0-0:1:1", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestCreate/gen_key_n.d2,0:2:2-0:3:3", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestCreate/gen_key_n.d2,0:4:4-0:5:5", + "value": [ + { + "string": "z", + "raw_string": "z" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "map": { + "range": "d2/testdata/d2oracle/TestCreate/gen_key_n.d2,0:7:7-12:0:130", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestCreate/gen_key_n.d2,1:2:11-1:8:17", + "key": { + "range": "d2/testdata/d2oracle/TestCreate/gen_key_n.d2,1:2:11-1:8:17", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestCreate/gen_key_n.d2,1:2:11-1:8:17", + "value": [ + { + "string": "square", + "raw_string": "square" + } + ] + } + } + ] + }, + "primary": {}, + "value": {} + } + }, + { + "map_key": { + "range": "d2/testdata/d2oracle/TestCreate/gen_key_n.d2,2:2:20-2:10:28", + "key": { + "range": "d2/testdata/d2oracle/TestCreate/gen_key_n.d2,2:2:20-2:10:28", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestCreate/gen_key_n.d2,2:2:20-2:10:28", + "value": [ + { + "string": "square 2", + "raw_string": "square 2" + } + ] + } + } + ] + }, + "primary": {}, + "value": {} + } + }, + { + "map_key": { + "range": "d2/testdata/d2oracle/TestCreate/gen_key_n.d2,3:2:31-3:10:39", + "key": { + "range": "d2/testdata/d2oracle/TestCreate/gen_key_n.d2,3:2:31-3:10:39", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestCreate/gen_key_n.d2,3:2:31-3:10:39", + "value": [ + { + "string": "square 3", + "raw_string": "square 3" + } + ] + } + } + ] + }, + "primary": {}, + "value": {} + } + }, + { + "map_key": { + "range": "d2/testdata/d2oracle/TestCreate/gen_key_n.d2,4:2:42-4:10:50", + "key": { + "range": "d2/testdata/d2oracle/TestCreate/gen_key_n.d2,4:2:42-4:10:50", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestCreate/gen_key_n.d2,4:2:42-4:10:50", + "value": [ + { + "string": "square 4", + "raw_string": "square 4" + } + ] + } + } + ] + }, + "primary": {}, + "value": {} + } + }, + { + "map_key": { + "range": "d2/testdata/d2oracle/TestCreate/gen_key_n.d2,5:2:53-5:10:61", + "key": { + "range": "d2/testdata/d2oracle/TestCreate/gen_key_n.d2,5:2:53-5:10:61", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestCreate/gen_key_n.d2,5:2:53-5:10:61", + "value": [ + { + "string": "square 5", + "raw_string": "square 5" + } + ] + } + } + ] + }, + "primary": {}, + "value": {} + } + }, + { + "map_key": { + "range": "d2/testdata/d2oracle/TestCreate/gen_key_n.d2,6:2:64-6:10:72", + "key": { + "range": "d2/testdata/d2oracle/TestCreate/gen_key_n.d2,6:2:64-6:10:72", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestCreate/gen_key_n.d2,6:2:64-6:10:72", + "value": [ + { + "string": "square 6", + "raw_string": "square 6" + } + ] + } + } + ] + }, + "primary": {}, + "value": {} + } + }, + { + "map_key": { + "range": "d2/testdata/d2oracle/TestCreate/gen_key_n.d2,7:2:75-7:10:83", + "key": { + "range": "d2/testdata/d2oracle/TestCreate/gen_key_n.d2,7:2:75-7:10:83", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestCreate/gen_key_n.d2,7:2:75-7:10:83", + "value": [ + { + "string": "square 7", + "raw_string": "square 7" + } + ] + } + } + ] + }, + "primary": {}, + "value": {} + } + }, + { + "map_key": { + "range": "d2/testdata/d2oracle/TestCreate/gen_key_n.d2,8:2:86-8:10:94", + "key": { + "range": "d2/testdata/d2oracle/TestCreate/gen_key_n.d2,8:2:86-8:10:94", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestCreate/gen_key_n.d2,8:2:86-8:10:94", + "value": [ + { + "string": "square 8", + "raw_string": "square 8" + } + ] + } + } + ] + }, + "primary": {}, + "value": {} + } + }, + { + "map_key": { + "range": "d2/testdata/d2oracle/TestCreate/gen_key_n.d2,9:2:97-9:10:105", + "key": { + "range": "d2/testdata/d2oracle/TestCreate/gen_key_n.d2,9:2:97-9:10:105", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestCreate/gen_key_n.d2,9:2:97-9:10:105", + "value": [ + { + "string": "square 9", + "raw_string": "square 9" + } + ] + } + } + ] + }, + "primary": {}, + "value": {} + } + }, + { + "map_key": { + "range": "d2/testdata/d2oracle/TestCreate/gen_key_n.d2,10:2:108-10:11:117", + "key": { + "range": "d2/testdata/d2oracle/TestCreate/gen_key_n.d2,10:2:108-10:11:117", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestCreate/gen_key_n.d2,10:2:108-10:11:117", + "value": [ + { + "string": "square 10", + "raw_string": "square 10" + } + ] + } + } + ] + }, + "primary": {}, + "value": {} + } + }, + { + "map_key": { + "range": "d2/testdata/d2oracle/TestCreate/gen_key_n.d2,11:2:120-11:11:129", + "key": { + "range": "d2/testdata/d2oracle/TestCreate/gen_key_n.d2,11:2:120-11:11:129", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestCreate/gen_key_n.d2,11:2:120-11:11:129", + "value": [ + { + "string": "square 11", + "raw_string": "square 11" + } + ] + } + } + ] + }, + "primary": {}, + "value": {} + } + } + ] + } + } + } + } + ] + }, + "root": { + "id": "", + "id_val": "", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + "edges": null, + "objects": [ + { + "id": "x", + "id_val": "x", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestCreate/gen_key_n.d2,0:0:0-0:5:5", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestCreate/gen_key_n.d2,0:0:0-0:1:1", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestCreate/gen_key_n.d2,0:2:2-0:3:3", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestCreate/gen_key_n.d2,0:4:4-0:5:5", + "value": [ + { + "string": "z", + "raw_string": "z" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "x" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "y", + "id_val": "y", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestCreate/gen_key_n.d2,0:0:0-0:5:5", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestCreate/gen_key_n.d2,0:0:0-0:1:1", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestCreate/gen_key_n.d2,0:2:2-0:3:3", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestCreate/gen_key_n.d2,0:4:4-0:5:5", + "value": [ + { + "string": "z", + "raw_string": "z" + } + ] + } + } + ] + }, + "key_path_index": 1, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "y" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "z", + "id_val": "z", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestCreate/gen_key_n.d2,0:0:0-0:5:5", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestCreate/gen_key_n.d2,0:0:0-0:1:1", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestCreate/gen_key_n.d2,0:2:2-0:3:3", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestCreate/gen_key_n.d2,0:4:4-0:5:5", + "value": [ + { + "string": "z", + "raw_string": "z" + } + ] + } + } + ] + }, + "key_path_index": 2, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "z" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "square", + "id_val": "square", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestCreate/gen_key_n.d2,1:2:11-1:8:17", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestCreate/gen_key_n.d2,1:2:11-1:8:17", + "value": [ + { + "string": "square", + "raw_string": "square" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "square" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "square 2", + "id_val": "square 2", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestCreate/gen_key_n.d2,2:2:20-2:10:28", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestCreate/gen_key_n.d2,2:2:20-2:10:28", + "value": [ + { + "string": "square 2", + "raw_string": "square 2" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "square 2" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "square 3", + "id_val": "square 3", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestCreate/gen_key_n.d2,3:2:31-3:10:39", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestCreate/gen_key_n.d2,3:2:31-3:10:39", + "value": [ + { + "string": "square 3", + "raw_string": "square 3" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "square 3" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "square 4", + "id_val": "square 4", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestCreate/gen_key_n.d2,4:2:42-4:10:50", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestCreate/gen_key_n.d2,4:2:42-4:10:50", + "value": [ + { + "string": "square 4", + "raw_string": "square 4" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "square 4" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "square 5", + "id_val": "square 5", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestCreate/gen_key_n.d2,5:2:53-5:10:61", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestCreate/gen_key_n.d2,5:2:53-5:10:61", + "value": [ + { + "string": "square 5", + "raw_string": "square 5" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "square 5" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "square 6", + "id_val": "square 6", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestCreate/gen_key_n.d2,6:2:64-6:10:72", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestCreate/gen_key_n.d2,6:2:64-6:10:72", + "value": [ + { + "string": "square 6", + "raw_string": "square 6" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "square 6" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "square 7", + "id_val": "square 7", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestCreate/gen_key_n.d2,7:2:75-7:10:83", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestCreate/gen_key_n.d2,7:2:75-7:10:83", + "value": [ + { + "string": "square 7", + "raw_string": "square 7" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "square 7" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "square 8", + "id_val": "square 8", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestCreate/gen_key_n.d2,8:2:86-8:10:94", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestCreate/gen_key_n.d2,8:2:86-8:10:94", + "value": [ + { + "string": "square 8", + "raw_string": "square 8" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "square 8" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "square 9", + "id_val": "square 9", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestCreate/gen_key_n.d2,9:2:97-9:10:105", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestCreate/gen_key_n.d2,9:2:97-9:10:105", + "value": [ + { + "string": "square 9", + "raw_string": "square 9" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "square 9" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "square 10", + "id_val": "square 10", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestCreate/gen_key_n.d2,10:2:108-10:11:117", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestCreate/gen_key_n.d2,10:2:108-10:11:117", + "value": [ + { + "string": "square 10", + "raw_string": "square 10" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "square 10" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "square 11", + "id_val": "square 11", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestCreate/gen_key_n.d2,11:2:120-11:11:129", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestCreate/gen_key_n.d2,11:2:120-11:11:129", + "value": [ + { + "string": "square 11", + "raw_string": "square 11" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "square 11" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ] + }, + "err": "" +} diff --git a/testdata/d2oracle/TestCreate/gen_key_nested.exp.json b/testdata/d2oracle/TestCreate/gen_key_nested.exp.json new file mode 100644 index 000000000..9b88fbb09 --- /dev/null +++ b/testdata/d2oracle/TestCreate/gen_key_nested.exp.json @@ -0,0 +1,667 @@ +{ + "graph": { + "ast": { + "range": "d2/testdata/d2oracle/TestCreate/gen_key_nested.d2,0:0:0-1:0:29", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestCreate/gen_key_nested.d2,0:0:0-0:12:12", + "key": { + "range": "d2/testdata/d2oracle/TestCreate/gen_key_nested.d2,0:0:0-0:12:12", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestCreate/gen_key_nested.d2,0:0:0-0:1:1", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestCreate/gen_key_nested.d2,0:2:2-0:3:3", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestCreate/gen_key_nested.d2,0:4:4-0:5:5", + "value": [ + { + "string": "z", + "raw_string": "z" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestCreate/gen_key_nested.d2,0:6:6-0:12:12", + "value": [ + { + "string": "square", + "raw_string": "square" + } + ] + } + } + ] + }, + "primary": {}, + "value": {} + } + }, + { + "map_key": { + "range": "d2/testdata/d2oracle/TestCreate/gen_key_nested.d2,0:14:14-0:28:28", + "key": { + "range": "d2/testdata/d2oracle/TestCreate/gen_key_nested.d2,0:14:14-0:28:28", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestCreate/gen_key_nested.d2,0:14:14-0:15:15", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestCreate/gen_key_nested.d2,0:16:16-0:17:17", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestCreate/gen_key_nested.d2,0:18:18-0:19:19", + "value": [ + { + "string": "z", + "raw_string": "z" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestCreate/gen_key_nested.d2,0:20:20-0:28:28", + "value": [ + { + "string": "square 2", + "raw_string": "square 2" + } + ] + } + } + ] + }, + "primary": {}, + "value": {} + } + } + ] + }, + "root": { + "id": "", + "id_val": "", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + "edges": null, + "objects": [ + { + "id": "x", + "id_val": "x", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestCreate/gen_key_nested.d2,0:0:0-0:12:12", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestCreate/gen_key_nested.d2,0:0:0-0:1:1", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestCreate/gen_key_nested.d2,0:2:2-0:3:3", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestCreate/gen_key_nested.d2,0:4:4-0:5:5", + "value": [ + { + "string": "z", + "raw_string": "z" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestCreate/gen_key_nested.d2,0:6:6-0:12:12", + "value": [ + { + "string": "square", + "raw_string": "square" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + }, + { + "key": { + "range": "d2/testdata/d2oracle/TestCreate/gen_key_nested.d2,0:14:14-0:28:28", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestCreate/gen_key_nested.d2,0:14:14-0:15:15", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestCreate/gen_key_nested.d2,0:16:16-0:17:17", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestCreate/gen_key_nested.d2,0:18:18-0:19:19", + "value": [ + { + "string": "z", + "raw_string": "z" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestCreate/gen_key_nested.d2,0:20:20-0:28:28", + "value": [ + { + "string": "square 2", + "raw_string": "square 2" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "x" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "y", + "id_val": "y", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestCreate/gen_key_nested.d2,0:0:0-0:12:12", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestCreate/gen_key_nested.d2,0:0:0-0:1:1", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestCreate/gen_key_nested.d2,0:2:2-0:3:3", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestCreate/gen_key_nested.d2,0:4:4-0:5:5", + "value": [ + { + "string": "z", + "raw_string": "z" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestCreate/gen_key_nested.d2,0:6:6-0:12:12", + "value": [ + { + "string": "square", + "raw_string": "square" + } + ] + } + } + ] + }, + "key_path_index": 1, + "map_key_edge_index": 0 + }, + { + "key": { + "range": "d2/testdata/d2oracle/TestCreate/gen_key_nested.d2,0:14:14-0:28:28", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestCreate/gen_key_nested.d2,0:14:14-0:15:15", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestCreate/gen_key_nested.d2,0:16:16-0:17:17", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestCreate/gen_key_nested.d2,0:18:18-0:19:19", + "value": [ + { + "string": "z", + "raw_string": "z" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestCreate/gen_key_nested.d2,0:20:20-0:28:28", + "value": [ + { + "string": "square 2", + "raw_string": "square 2" + } + ] + } + } + ] + }, + "key_path_index": 1, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "y" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "z", + "id_val": "z", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestCreate/gen_key_nested.d2,0:0:0-0:12:12", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestCreate/gen_key_nested.d2,0:0:0-0:1:1", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestCreate/gen_key_nested.d2,0:2:2-0:3:3", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestCreate/gen_key_nested.d2,0:4:4-0:5:5", + "value": [ + { + "string": "z", + "raw_string": "z" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestCreate/gen_key_nested.d2,0:6:6-0:12:12", + "value": [ + { + "string": "square", + "raw_string": "square" + } + ] + } + } + ] + }, + "key_path_index": 2, + "map_key_edge_index": 0 + }, + { + "key": { + "range": "d2/testdata/d2oracle/TestCreate/gen_key_nested.d2,0:14:14-0:28:28", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestCreate/gen_key_nested.d2,0:14:14-0:15:15", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestCreate/gen_key_nested.d2,0:16:16-0:17:17", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestCreate/gen_key_nested.d2,0:18:18-0:19:19", + "value": [ + { + "string": "z", + "raw_string": "z" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestCreate/gen_key_nested.d2,0:20:20-0:28:28", + "value": [ + { + "string": "square 2", + "raw_string": "square 2" + } + ] + } + } + ] + }, + "key_path_index": 2, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "z" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "square", + "id_val": "square", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestCreate/gen_key_nested.d2,0:0:0-0:12:12", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestCreate/gen_key_nested.d2,0:0:0-0:1:1", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestCreate/gen_key_nested.d2,0:2:2-0:3:3", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestCreate/gen_key_nested.d2,0:4:4-0:5:5", + "value": [ + { + "string": "z", + "raw_string": "z" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestCreate/gen_key_nested.d2,0:6:6-0:12:12", + "value": [ + { + "string": "square", + "raw_string": "square" + } + ] + } + } + ] + }, + "key_path_index": 3, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "square" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "square 2", + "id_val": "square 2", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestCreate/gen_key_nested.d2,0:14:14-0:28:28", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestCreate/gen_key_nested.d2,0:14:14-0:15:15", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestCreate/gen_key_nested.d2,0:16:16-0:17:17", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestCreate/gen_key_nested.d2,0:18:18-0:19:19", + "value": [ + { + "string": "z", + "raw_string": "z" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestCreate/gen_key_nested.d2,0:20:20-0:28:28", + "value": [ + { + "string": "square 2", + "raw_string": "square 2" + } + ] + } + } + ] + }, + "key_path_index": 3, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "square 2" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ] + }, + "err": "" +} diff --git a/testdata/d2oracle/TestCreate/gen_key_scope.exp.json b/testdata/d2oracle/TestCreate/gen_key_scope.exp.json new file mode 100644 index 000000000..9f0e8d7cb --- /dev/null +++ b/testdata/d2oracle/TestCreate/gen_key_scope.exp.json @@ -0,0 +1,394 @@ +{ + "graph": { + "ast": { + "range": "d2/testdata/d2oracle/TestCreate/gen_key_scope.d2,0:0:0-4:0:31", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestCreate/gen_key_scope.d2,0:0:0-3:1:30", + "key": { + "range": "d2/testdata/d2oracle/TestCreate/gen_key_scope.d2,0:0:0-0:5:5", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestCreate/gen_key_scope.d2,0:0:0-0:1:1", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestCreate/gen_key_scope.d2,0:2:2-0:3:3", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestCreate/gen_key_scope.d2,0:4:4-0:5:5", + "value": [ + { + "string": "z", + "raw_string": "z" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "map": { + "range": "d2/testdata/d2oracle/TestCreate/gen_key_scope.d2,0:7:7-3:0:29", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestCreate/gen_key_scope.d2,1:2:11-1:8:17", + "key": { + "range": "d2/testdata/d2oracle/TestCreate/gen_key_scope.d2,1:2:11-1:8:17", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestCreate/gen_key_scope.d2,1:2:11-1:8:17", + "value": [ + { + "string": "square", + "raw_string": "square" + } + ] + } + } + ] + }, + "primary": {}, + "value": {} + } + }, + { + "map_key": { + "range": "d2/testdata/d2oracle/TestCreate/gen_key_scope.d2,2:2:20-2:10:28", + "key": { + "range": "d2/testdata/d2oracle/TestCreate/gen_key_scope.d2,2:2:20-2:10:28", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestCreate/gen_key_scope.d2,2:2:20-2:10:28", + "value": [ + { + "string": "square 2", + "raw_string": "square 2" + } + ] + } + } + ] + }, + "primary": {}, + "value": {} + } + } + ] + } + } + } + } + ] + }, + "root": { + "id": "", + "id_val": "", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + "edges": null, + "objects": [ + { + "id": "x", + "id_val": "x", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestCreate/gen_key_scope.d2,0:0:0-0:5:5", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestCreate/gen_key_scope.d2,0:0:0-0:1:1", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestCreate/gen_key_scope.d2,0:2:2-0:3:3", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestCreate/gen_key_scope.d2,0:4:4-0:5:5", + "value": [ + { + "string": "z", + "raw_string": "z" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "x" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "y", + "id_val": "y", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestCreate/gen_key_scope.d2,0:0:0-0:5:5", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestCreate/gen_key_scope.d2,0:0:0-0:1:1", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestCreate/gen_key_scope.d2,0:2:2-0:3:3", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestCreate/gen_key_scope.d2,0:4:4-0:5:5", + "value": [ + { + "string": "z", + "raw_string": "z" + } + ] + } + } + ] + }, + "key_path_index": 1, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "y" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "z", + "id_val": "z", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestCreate/gen_key_scope.d2,0:0:0-0:5:5", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestCreate/gen_key_scope.d2,0:0:0-0:1:1", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestCreate/gen_key_scope.d2,0:2:2-0:3:3", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestCreate/gen_key_scope.d2,0:4:4-0:5:5", + "value": [ + { + "string": "z", + "raw_string": "z" + } + ] + } + } + ] + }, + "key_path_index": 2, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "z" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "square", + "id_val": "square", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestCreate/gen_key_scope.d2,1:2:11-1:8:17", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestCreate/gen_key_scope.d2,1:2:11-1:8:17", + "value": [ + { + "string": "square", + "raw_string": "square" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "square" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "square 2", + "id_val": "square 2", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestCreate/gen_key_scope.d2,2:2:20-2:10:28", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestCreate/gen_key_scope.d2,2:2:20-2:10:28", + "value": [ + { + "string": "square 2", + "raw_string": "square 2" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "square 2" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ] + }, + "err": "" +} diff --git a/testdata/d2oracle/TestCreate/gen_key_suffix.exp.json b/testdata/d2oracle/TestCreate/gen_key_suffix.exp.json new file mode 100644 index 000000000..e5683b146 --- /dev/null +++ b/testdata/d2oracle/TestCreate/gen_key_suffix.exp.json @@ -0,0 +1,157 @@ +{ + "graph": { + "ast": { + "range": "d2/testdata/d2oracle/TestCreate/gen_key_suffix.d2,0:0:0-2:0:10", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestCreate/gen_key_suffix.d2,0:0:0-0:4:4", + "key": { + "range": "d2/testdata/d2oracle/TestCreate/gen_key_suffix.d2,0:0:0-0:4:4", + "path": [ + { + "double_quoted_string": { + "range": "d2/testdata/d2oracle/TestCreate/gen_key_suffix.d2,0:0:0-0:4:4", + "value": [ + { + "string": "x ", + "raw_string": "x " + } + ] + } + } + ] + }, + "primary": {}, + "value": {} + } + }, + { + "map_key": { + "range": "d2/testdata/d2oracle/TestCreate/gen_key_suffix.d2,1:0:5-1:4:9", + "key": { + "range": "d2/testdata/d2oracle/TestCreate/gen_key_suffix.d2,1:0:5-1:4:9", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestCreate/gen_key_suffix.d2,1:0:5-1:4:9", + "value": [ + { + "string": "x 2", + "raw_string": "x 2" + } + ] + } + } + ] + }, + "primary": {}, + "value": {} + } + } + ] + }, + "root": { + "id": "", + "id_val": "", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + "edges": null, + "objects": [ + { + "id": "\"x \"", + "id_val": "x ", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestCreate/gen_key_suffix.d2,0:0:0-0:4:4", + "path": [ + { + "double_quoted_string": { + "range": "d2/testdata/d2oracle/TestCreate/gen_key_suffix.d2,0:0:0-0:4:4", + "value": [ + { + "string": "x ", + "raw_string": "x " + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "x " + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "x 2", + "id_val": "x 2", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestCreate/gen_key_suffix.d2,1:0:5-1:4:9", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestCreate/gen_key_suffix.d2,1:0:5-1:4:9", + "value": [ + { + "string": "x 2", + "raw_string": "x 2" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "x 2" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ] + }, + "err": "" +} diff --git a/testdata/d2oracle/TestCreate/make_scope_multiline.exp.json b/testdata/d2oracle/TestCreate/make_scope_multiline.exp.json new file mode 100644 index 000000000..77d428f85 --- /dev/null +++ b/testdata/d2oracle/TestCreate/make_scope_multiline.exp.json @@ -0,0 +1,196 @@ +{ + "graph": { + "ast": { + "range": "d2/testdata/d2oracle/TestCreate/make_scope_multiline.d2,0:0:0-4:0:35", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestCreate/make_scope_multiline.d2,0:0:0-3:1:34", + "key": { + "range": "d2/testdata/d2oracle/TestCreate/make_scope_multiline.d2,0:0:0-0:4:4", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestCreate/make_scope_multiline.d2,0:0:0-0:4:4", + "value": [ + { + "string": "rawr", + "raw_string": "rawr" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "map": { + "range": "d2/testdata/d2oracle/TestCreate/make_scope_multiline.d2,0:6:6-3:0:33", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestCreate/make_scope_multiline.d2,1:2:10-1:15:23", + "key": { + "range": "d2/testdata/d2oracle/TestCreate/make_scope_multiline.d2,1:2:10-1:7:15", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestCreate/make_scope_multiline.d2,1:2:10-1:7:15", + "value": [ + { + "string": "shape", + "raw_string": "shape" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestCreate/make_scope_multiline.d2,1:9:17-1:15:23", + "value": [ + { + "string": "circle", + "raw_string": "circle" + } + ] + } + } + } + }, + { + "map_key": { + "range": "d2/testdata/d2oracle/TestCreate/make_scope_multiline.d2,2:2:26-2:8:32", + "key": { + "range": "d2/testdata/d2oracle/TestCreate/make_scope_multiline.d2,2:2:26-2:8:32", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestCreate/make_scope_multiline.d2,2:2:26-2:8:32", + "value": [ + { + "string": "orange", + "raw_string": "orange" + } + ] + } + } + ] + }, + "primary": {}, + "value": {} + } + } + ] + } + } + } + } + ] + }, + "root": { + "id": "", + "id_val": "", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + "edges": null, + "objects": [ + { + "id": "rawr", + "id_val": "rawr", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestCreate/make_scope_multiline.d2,0:0:0-0:4:4", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestCreate/make_scope_multiline.d2,0:0:0-0:4:4", + "value": [ + { + "string": "rawr", + "raw_string": "rawr" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "rawr" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "circle" + } + } + }, + { + "id": "orange", + "id_val": "orange", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestCreate/make_scope_multiline.d2,2:2:26-2:8:32", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestCreate/make_scope_multiline.d2,2:2:26-2:8:32", + "value": [ + { + "string": "orange", + "raw_string": "orange" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "orange" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ] + }, + "err": "" +} diff --git a/testdata/d2oracle/TestCreate/make_scope_multiline_spacing_1.exp.json b/testdata/d2oracle/TestCreate/make_scope_multiline_spacing_1.exp.json new file mode 100644 index 000000000..2b616bff2 --- /dev/null +++ b/testdata/d2oracle/TestCreate/make_scope_multiline_spacing_1.exp.json @@ -0,0 +1,322 @@ +{ + "graph": { + "ast": { + "range": "d2/testdata/d2oracle/TestCreate/make_scope_multiline_spacing_1.d2,0:0:0-6:0:48", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestCreate/make_scope_multiline_spacing_1.d2,0:0:0-0:6:6", + "key": { + "range": "d2/testdata/d2oracle/TestCreate/make_scope_multiline_spacing_1.d2,0:0:0-0:6:6", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestCreate/make_scope_multiline_spacing_1.d2,0:0:0-0:6:6", + "value": [ + { + "string": "before", + "raw_string": "before" + } + ] + } + } + ] + }, + "primary": {}, + "value": {} + } + }, + { + "map_key": { + "range": "d2/testdata/d2oracle/TestCreate/make_scope_multiline_spacing_1.d2,1:0:7-4:1:41", + "key": { + "range": "d2/testdata/d2oracle/TestCreate/make_scope_multiline_spacing_1.d2,1:0:7-1:4:11", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestCreate/make_scope_multiline_spacing_1.d2,1:0:7-1:4:11", + "value": [ + { + "string": "rawr", + "raw_string": "rawr" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "map": { + "range": "d2/testdata/d2oracle/TestCreate/make_scope_multiline_spacing_1.d2,1:6:13-4:0:40", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestCreate/make_scope_multiline_spacing_1.d2,2:2:17-2:15:30", + "key": { + "range": "d2/testdata/d2oracle/TestCreate/make_scope_multiline_spacing_1.d2,2:2:17-2:7:22", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestCreate/make_scope_multiline_spacing_1.d2,2:2:17-2:7:22", + "value": [ + { + "string": "shape", + "raw_string": "shape" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestCreate/make_scope_multiline_spacing_1.d2,2:9:24-2:15:30", + "value": [ + { + "string": "circle", + "raw_string": "circle" + } + ] + } + } + } + }, + { + "map_key": { + "range": "d2/testdata/d2oracle/TestCreate/make_scope_multiline_spacing_1.d2,3:2:33-3:8:39", + "key": { + "range": "d2/testdata/d2oracle/TestCreate/make_scope_multiline_spacing_1.d2,3:2:33-3:8:39", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestCreate/make_scope_multiline_spacing_1.d2,3:2:33-3:8:39", + "value": [ + { + "string": "orange", + "raw_string": "orange" + } + ] + } + } + ] + }, + "primary": {}, + "value": {} + } + } + ] + } + } + } + }, + { + "map_key": { + "range": "d2/testdata/d2oracle/TestCreate/make_scope_multiline_spacing_1.d2,5:0:42-5:5:47", + "key": { + "range": "d2/testdata/d2oracle/TestCreate/make_scope_multiline_spacing_1.d2,5:0:42-5:5:47", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestCreate/make_scope_multiline_spacing_1.d2,5:0:42-5:5:47", + "value": [ + { + "string": "after", + "raw_string": "after" + } + ] + } + } + ] + }, + "primary": {}, + "value": {} + } + } + ] + }, + "root": { + "id": "", + "id_val": "", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + "edges": null, + "objects": [ + { + "id": "before", + "id_val": "before", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestCreate/make_scope_multiline_spacing_1.d2,0:0:0-0:6:6", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestCreate/make_scope_multiline_spacing_1.d2,0:0:0-0:6:6", + "value": [ + { + "string": "before", + "raw_string": "before" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "before" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "rawr", + "id_val": "rawr", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestCreate/make_scope_multiline_spacing_1.d2,1:0:7-1:4:11", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestCreate/make_scope_multiline_spacing_1.d2,1:0:7-1:4:11", + "value": [ + { + "string": "rawr", + "raw_string": "rawr" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "rawr" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "circle" + } + } + }, + { + "id": "orange", + "id_val": "orange", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestCreate/make_scope_multiline_spacing_1.d2,3:2:33-3:8:39", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestCreate/make_scope_multiline_spacing_1.d2,3:2:33-3:8:39", + "value": [ + { + "string": "orange", + "raw_string": "orange" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "orange" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "after", + "id_val": "after", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestCreate/make_scope_multiline_spacing_1.d2,5:0:42-5:5:47", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestCreate/make_scope_multiline_spacing_1.d2,5:0:42-5:5:47", + "value": [ + { + "string": "after", + "raw_string": "after" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "after" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ] + }, + "err": "" +} diff --git a/testdata/d2oracle/TestCreate/make_scope_multiline_spacing_2.exp.json b/testdata/d2oracle/TestCreate/make_scope_multiline_spacing_2.exp.json new file mode 100644 index 000000000..575a33b3b --- /dev/null +++ b/testdata/d2oracle/TestCreate/make_scope_multiline_spacing_2.exp.json @@ -0,0 +1,322 @@ +{ + "graph": { + "ast": { + "range": "d2/testdata/d2oracle/TestCreate/make_scope_multiline_spacing_2.d2,0:0:0-8:0:50", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestCreate/make_scope_multiline_spacing_2.d2,0:0:0-0:6:6", + "key": { + "range": "d2/testdata/d2oracle/TestCreate/make_scope_multiline_spacing_2.d2,0:0:0-0:6:6", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestCreate/make_scope_multiline_spacing_2.d2,0:0:0-0:6:6", + "value": [ + { + "string": "before", + "raw_string": "before" + } + ] + } + } + ] + }, + "primary": {}, + "value": {} + } + }, + { + "map_key": { + "range": "d2/testdata/d2oracle/TestCreate/make_scope_multiline_spacing_2.d2,2:0:8-5:1:42", + "key": { + "range": "d2/testdata/d2oracle/TestCreate/make_scope_multiline_spacing_2.d2,2:0:8-2:4:12", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestCreate/make_scope_multiline_spacing_2.d2,2:0:8-2:4:12", + "value": [ + { + "string": "rawr", + "raw_string": "rawr" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "map": { + "range": "d2/testdata/d2oracle/TestCreate/make_scope_multiline_spacing_2.d2,2:6:14-5:0:41", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestCreate/make_scope_multiline_spacing_2.d2,3:2:18-3:15:31", + "key": { + "range": "d2/testdata/d2oracle/TestCreate/make_scope_multiline_spacing_2.d2,3:2:18-3:7:23", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestCreate/make_scope_multiline_spacing_2.d2,3:2:18-3:7:23", + "value": [ + { + "string": "shape", + "raw_string": "shape" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestCreate/make_scope_multiline_spacing_2.d2,3:9:25-3:15:31", + "value": [ + { + "string": "circle", + "raw_string": "circle" + } + ] + } + } + } + }, + { + "map_key": { + "range": "d2/testdata/d2oracle/TestCreate/make_scope_multiline_spacing_2.d2,4:2:34-4:8:40", + "key": { + "range": "d2/testdata/d2oracle/TestCreate/make_scope_multiline_spacing_2.d2,4:2:34-4:8:40", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestCreate/make_scope_multiline_spacing_2.d2,4:2:34-4:8:40", + "value": [ + { + "string": "orange", + "raw_string": "orange" + } + ] + } + } + ] + }, + "primary": {}, + "value": {} + } + } + ] + } + } + } + }, + { + "map_key": { + "range": "d2/testdata/d2oracle/TestCreate/make_scope_multiline_spacing_2.d2,7:0:44-7:5:49", + "key": { + "range": "d2/testdata/d2oracle/TestCreate/make_scope_multiline_spacing_2.d2,7:0:44-7:5:49", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestCreate/make_scope_multiline_spacing_2.d2,7:0:44-7:5:49", + "value": [ + { + "string": "after", + "raw_string": "after" + } + ] + } + } + ] + }, + "primary": {}, + "value": {} + } + } + ] + }, + "root": { + "id": "", + "id_val": "", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + "edges": null, + "objects": [ + { + "id": "before", + "id_val": "before", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestCreate/make_scope_multiline_spacing_2.d2,0:0:0-0:6:6", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestCreate/make_scope_multiline_spacing_2.d2,0:0:0-0:6:6", + "value": [ + { + "string": "before", + "raw_string": "before" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "before" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "rawr", + "id_val": "rawr", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestCreate/make_scope_multiline_spacing_2.d2,2:0:8-2:4:12", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestCreate/make_scope_multiline_spacing_2.d2,2:0:8-2:4:12", + "value": [ + { + "string": "rawr", + "raw_string": "rawr" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "rawr" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "circle" + } + } + }, + { + "id": "orange", + "id_val": "orange", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestCreate/make_scope_multiline_spacing_2.d2,4:2:34-4:8:40", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestCreate/make_scope_multiline_spacing_2.d2,4:2:34-4:8:40", + "value": [ + { + "string": "orange", + "raw_string": "orange" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "orange" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "after", + "id_val": "after", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestCreate/make_scope_multiline_spacing_2.d2,7:0:44-7:5:49", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestCreate/make_scope_multiline_spacing_2.d2,7:0:44-7:5:49", + "value": [ + { + "string": "after", + "raw_string": "after" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "after" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ] + }, + "err": "" +} diff --git a/testdata/d2oracle/TestCreate/nested.exp.json b/testdata/d2oracle/TestCreate/nested.exp.json new file mode 100644 index 000000000..f8e78aa88 --- /dev/null +++ b/testdata/d2oracle/TestCreate/nested.exp.json @@ -0,0 +1,262 @@ +{ + "graph": { + "ast": { + "range": "d2/testdata/d2oracle/TestCreate/nested.d2,0:0:0-1:0:11", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestCreate/nested.d2,0:0:0-0:10:10", + "key": { + "range": "d2/testdata/d2oracle/TestCreate/nested.d2,0:0:0-0:10:10", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestCreate/nested.d2,0:0:0-0:1:1", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestCreate/nested.d2,0:2:2-0:3:3", + "value": [ + { + "string": "c", + "raw_string": "c" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestCreate/nested.d2,0:4:4-0:10:10", + "value": [ + { + "string": "square", + "raw_string": "square" + } + ] + } + } + ] + }, + "primary": {}, + "value": {} + } + } + ] + }, + "root": { + "id": "", + "id_val": "", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + "edges": null, + "objects": [ + { + "id": "b", + "id_val": "b", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestCreate/nested.d2,0:0:0-0:10:10", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestCreate/nested.d2,0:0:0-0:1:1", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestCreate/nested.d2,0:2:2-0:3:3", + "value": [ + { + "string": "c", + "raw_string": "c" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestCreate/nested.d2,0:4:4-0:10:10", + "value": [ + { + "string": "square", + "raw_string": "square" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "b" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "c", + "id_val": "c", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestCreate/nested.d2,0:0:0-0:10:10", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestCreate/nested.d2,0:0:0-0:1:1", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestCreate/nested.d2,0:2:2-0:3:3", + "value": [ + { + "string": "c", + "raw_string": "c" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestCreate/nested.d2,0:4:4-0:10:10", + "value": [ + { + "string": "square", + "raw_string": "square" + } + ] + } + } + ] + }, + "key_path_index": 1, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "c" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "square", + "id_val": "square", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestCreate/nested.d2,0:0:0-0:10:10", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestCreate/nested.d2,0:0:0-0:1:1", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestCreate/nested.d2,0:2:2-0:3:3", + "value": [ + { + "string": "c", + "raw_string": "c" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestCreate/nested.d2,0:4:4-0:10:10", + "value": [ + { + "string": "square", + "raw_string": "square" + } + ] + } + } + ] + }, + "key_path_index": 2, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "square" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ] + }, + "err": "" +} diff --git a/testdata/d2oracle/TestCreate/scope.exp.json b/testdata/d2oracle/TestCreate/scope.exp.json new file mode 100644 index 000000000..07f096cec --- /dev/null +++ b/testdata/d2oracle/TestCreate/scope.exp.json @@ -0,0 +1,331 @@ +{ + "graph": { + "ast": { + "range": "d2/testdata/d2oracle/TestCreate/scope.d2,0:0:0-3:0:20", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestCreate/scope.d2,0:0:0-2:1:19", + "key": { + "range": "d2/testdata/d2oracle/TestCreate/scope.d2,0:0:0-0:5:5", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestCreate/scope.d2,0:0:0-0:1:1", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestCreate/scope.d2,0:2:2-0:3:3", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestCreate/scope.d2,0:4:4-0:5:5", + "value": [ + { + "string": "z", + "raw_string": "z" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "map": { + "range": "d2/testdata/d2oracle/TestCreate/scope.d2,0:7:7-2:0:18", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestCreate/scope.d2,1:2:11-1:8:17", + "key": { + "range": "d2/testdata/d2oracle/TestCreate/scope.d2,1:2:11-1:8:17", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestCreate/scope.d2,1:2:11-1:8:17", + "value": [ + { + "string": "square", + "raw_string": "square" + } + ] + } + } + ] + }, + "primary": {}, + "value": {} + } + } + ] + } + } + } + } + ] + }, + "root": { + "id": "", + "id_val": "", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + "edges": null, + "objects": [ + { + "id": "x", + "id_val": "x", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestCreate/scope.d2,0:0:0-0:5:5", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestCreate/scope.d2,0:0:0-0:1:1", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestCreate/scope.d2,0:2:2-0:3:3", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestCreate/scope.d2,0:4:4-0:5:5", + "value": [ + { + "string": "z", + "raw_string": "z" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "x" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "y", + "id_val": "y", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestCreate/scope.d2,0:0:0-0:5:5", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestCreate/scope.d2,0:0:0-0:1:1", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestCreate/scope.d2,0:2:2-0:3:3", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestCreate/scope.d2,0:4:4-0:5:5", + "value": [ + { + "string": "z", + "raw_string": "z" + } + ] + } + } + ] + }, + "key_path_index": 1, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "y" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "z", + "id_val": "z", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestCreate/scope.d2,0:0:0-0:5:5", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestCreate/scope.d2,0:0:0-0:1:1", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestCreate/scope.d2,0:2:2-0:3:3", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestCreate/scope.d2,0:4:4-0:5:5", + "value": [ + { + "string": "z", + "raw_string": "z" + } + ] + } + } + ] + }, + "key_path_index": 2, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "z" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "square", + "id_val": "square", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestCreate/scope.d2,1:2:11-1:8:17", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestCreate/scope.d2,1:2:11-1:8:17", + "value": [ + { + "string": "square", + "raw_string": "square" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "square" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ] + }, + "err": "" +} diff --git a/testdata/d2oracle/TestDelete/breakup_arrowhead.exp.json b/testdata/d2oracle/TestDelete/breakup_arrowhead.exp.json new file mode 100644 index 000000000..b1b39ff28 --- /dev/null +++ b/testdata/d2oracle/TestDelete/breakup_arrowhead.exp.json @@ -0,0 +1,94 @@ +{ + "graph": { + "ast": { + "range": "d2/testdata/d2oracle/TestDelete/breakup_arrowhead.d2,0:0:0-1:0:2", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestDelete/breakup_arrowhead.d2,0:0:0-0:1:1", + "key": { + "range": "d2/testdata/d2oracle/TestDelete/breakup_arrowhead.d2,0:0:0-0:1:1", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/breakup_arrowhead.d2,0:0:0-0:1:1", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + } + ] + }, + "primary": {}, + "value": {} + } + } + ] + }, + "root": { + "id": "", + "id_val": "", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + "edges": null, + "objects": [ + { + "id": "y", + "id_val": "y", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestDelete/breakup_arrowhead.d2,0:0:0-0:1:1", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/breakup_arrowhead.d2,0:0:0-0:1:1", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "y" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ] + }, + "err": "" +} diff --git a/testdata/d2oracle/TestDelete/children.exp.json b/testdata/d2oracle/TestDelete/children.exp.json new file mode 100644 index 000000000..f0cfc7ed9 --- /dev/null +++ b/testdata/d2oracle/TestDelete/children.exp.json @@ -0,0 +1,248 @@ +{ + "graph": { + "ast": { + "range": "d2/testdata/d2oracle/TestDelete/children.d2,0:0:0-2:0:17", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestDelete/children.d2,0:0:0-0:9:9", + "key": { + "range": "d2/testdata/d2oracle/TestDelete/children.d2,0:0:0-0:9:9", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/children.d2,0:0:0-0:9:9", + "value": [ + { + "string": "what's up", + "raw_string": "what's up" + } + ] + } + } + ] + }, + "primary": {}, + "value": {} + } + }, + { + "map_key": { + "range": "d2/testdata/d2oracle/TestDelete/children.d2,1:0:10-1:6:16", + "edges": [ + { + "range": "d2/testdata/d2oracle/TestDelete/children.d2,1:0:10-1:6:16", + "src": { + "range": "d2/testdata/d2oracle/TestDelete/children.d2,1:0:10-1:2:12", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/children.d2,1:0:10-1:1:11", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "src_arrow": "", + "dst": { + "range": "d2/testdata/d2oracle/TestDelete/children.d2,1:4:14-1:6:16", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/children.d2,1:5:15-1:6:16", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + } + ] + }, + "dst_arrow": ">" + } + ], + "primary": {}, + "value": {} + } + } + ] + }, + "root": { + "id": "", + "id_val": "", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + "edges": [ + { + "index": 0, + "minWidth": 0, + "minHeight": 0, + "label_dimensions": { + "width": 0, + "height": 0 + }, + "isCurve": false, + "src_arrow": false, + "dst_arrow": true, + "references": [ + { + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ], + "objects": [ + { + "id": "\"what's up\"", + "id_val": "what's up", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestDelete/children.d2,0:0:0-0:9:9", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/children.d2,0:0:0-0:9:9", + "value": [ + { + "string": "what's up", + "raw_string": "what's up" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "what's up" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "x", + "id_val": "x", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestDelete/children.d2,1:0:10-1:2:12", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/children.d2,1:0:10-1:1:11", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "x" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "y", + "id_val": "y", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestDelete/children.d2,1:4:14-1:6:16", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/children.d2,1:5:15-1:6:16", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "y" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ] + }, + "err": "" +} diff --git a/testdata/d2oracle/TestDelete/children_conflicts.exp.json b/testdata/d2oracle/TestDelete/children_conflicts.exp.json new file mode 100644 index 000000000..8e7573a3f --- /dev/null +++ b/testdata/d2oracle/TestDelete/children_conflicts.exp.json @@ -0,0 +1,157 @@ +{ + "graph": { + "ast": { + "range": "d2/testdata/d2oracle/TestDelete/children_conflicts.d2,0:0:0-3:0:7", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestDelete/children_conflicts.d2,0:0:0-0:3:3", + "key": { + "range": "d2/testdata/d2oracle/TestDelete/children_conflicts.d2,0:0:0-0:3:3", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/children_conflicts.d2,0:0:0-0:3:3", + "value": [ + { + "string": "x 2", + "raw_string": "x 2" + } + ] + } + } + ] + }, + "primary": {}, + "value": {} + } + }, + { + "map_key": { + "range": "d2/testdata/d2oracle/TestDelete/children_conflicts.d2,2:0:5-2:1:6", + "key": { + "range": "d2/testdata/d2oracle/TestDelete/children_conflicts.d2,2:0:5-2:1:6", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/children_conflicts.d2,2:0:5-2:1:6", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "primary": {}, + "value": {} + } + } + ] + }, + "root": { + "id": "", + "id_val": "", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + "edges": null, + "objects": [ + { + "id": "x 2", + "id_val": "x 2", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestDelete/children_conflicts.d2,0:0:0-0:3:3", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/children_conflicts.d2,0:0:0-0:3:3", + "value": [ + { + "string": "x 2", + "raw_string": "x 2" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "x 2" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "x", + "id_val": "x", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestDelete/children_conflicts.d2,2:0:5-2:1:6", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/children_conflicts.d2,2:0:5-2:1:6", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "x" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ] + }, + "err": "" +} diff --git a/testdata/d2oracle/TestDelete/children_edge_conflicts.exp.json b/testdata/d2oracle/TestDelete/children_edge_conflicts.exp.json new file mode 100644 index 000000000..23512a8fa --- /dev/null +++ b/testdata/d2oracle/TestDelete/children_edge_conflicts.exp.json @@ -0,0 +1,301 @@ +{ + "graph": { + "ast": { + "range": "d2/testdata/d2oracle/TestDelete/children_edge_conflicts.d2,0:0:0-5:0:23", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestDelete/children_edge_conflicts.d2,0:0:0-0:8:8", + "edges": [ + { + "range": "d2/testdata/d2oracle/TestDelete/children_edge_conflicts.d2,0:0:0-0:8:8", + "src": { + "range": "d2/testdata/d2oracle/TestDelete/children_edge_conflicts.d2,0:0:0-0:4:4", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/children_edge_conflicts.d2,0:0:0-0:3:3", + "value": [ + { + "string": "x 2", + "raw_string": "x 2" + } + ] + } + } + ] + }, + "src_arrow": "", + "dst": { + "range": "d2/testdata/d2oracle/TestDelete/children_edge_conflicts.d2,0:6:6-0:8:8", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/children_edge_conflicts.d2,0:7:7-0:8:8", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + } + ] + }, + "dst_arrow": ">" + } + ], + "primary": {}, + "value": {} + } + }, + { + "map_key": { + "range": "d2/testdata/d2oracle/TestDelete/children_edge_conflicts.d2,2:0:10-2:1:11", + "key": { + "range": "d2/testdata/d2oracle/TestDelete/children_edge_conflicts.d2,2:0:10-2:1:11", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/children_edge_conflicts.d2,2:0:10-2:1:11", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "primary": {}, + "value": {} + } + }, + { + "map_key": { + "range": "d2/testdata/d2oracle/TestDelete/children_edge_conflicts.d2,4:0:13-4:9:22", + "key": { + "range": "d2/testdata/d2oracle/TestDelete/children_edge_conflicts.d2,4:0:13-4:3:16", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/children_edge_conflicts.d2,4:0:13-4:3:16", + "value": [ + { + "string": "x 2", + "raw_string": "x 2" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "double_quoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/children_edge_conflicts.d2,4:5:18-4:9:22", + "value": [ + { + "string": "hi", + "raw_string": "hi" + } + ] + } + } + } + } + ] + }, + "root": { + "id": "", + "id_val": "", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + "edges": [ + { + "index": 0, + "minWidth": 0, + "minHeight": 0, + "label_dimensions": { + "width": 0, + "height": 0 + }, + "isCurve": false, + "src_arrow": false, + "dst_arrow": true, + "references": [ + { + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ], + "objects": [ + { + "id": "x", + "id_val": "x", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestDelete/children_edge_conflicts.d2,2:0:10-2:1:11", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/children_edge_conflicts.d2,2:0:10-2:1:11", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "x" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "x 2", + "id_val": "x 2", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestDelete/children_edge_conflicts.d2,4:0:13-4:3:16", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/children_edge_conflicts.d2,4:0:13-4:3:16", + "value": [ + { + "string": "x 2", + "raw_string": "x 2" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + }, + { + "key": { + "range": "d2/testdata/d2oracle/TestDelete/children_edge_conflicts.d2,0:0:0-0:4:4", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/children_edge_conflicts.d2,0:0:0-0:3:3", + "value": [ + { + "string": "x 2", + "raw_string": "x 2" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "hi" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "y", + "id_val": "y", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestDelete/children_edge_conflicts.d2,0:6:6-0:8:8", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/children_edge_conflicts.d2,0:7:7-0:8:8", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "y" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ] + }, + "err": "" +} diff --git a/testdata/d2oracle/TestDelete/children_edges_flat_conflicts.exp.json b/testdata/d2oracle/TestDelete/children_edges_flat_conflicts.exp.json new file mode 100644 index 000000000..87432da31 --- /dev/null +++ b/testdata/d2oracle/TestDelete/children_edges_flat_conflicts.exp.json @@ -0,0 +1,541 @@ +{ + "graph": { + "ast": { + "range": "d2/testdata/d2oracle/TestDelete/children_edges_flat_conflicts.d2,0:0:0-6:0:41", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestDelete/children_edges_flat_conflicts.d2,0:0:0-0:15:15", + "edges": [ + { + "range": "d2/testdata/d2oracle/TestDelete/children_edges_flat_conflicts.d2,0:0:0-0:9:9", + "src": { + "range": "d2/testdata/d2oracle/TestDelete/children_edges_flat_conflicts.d2,0:0:0-0:4:4", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/children_edges_flat_conflicts.d2,0:0:0-0:3:3", + "value": [ + { + "string": "x 2", + "raw_string": "x 2" + } + ] + } + } + ] + }, + "src_arrow": "", + "dst": { + "range": "d2/testdata/d2oracle/TestDelete/children_edges_flat_conflicts.d2,0:6:6-0:9:9", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/children_edges_flat_conflicts.d2,0:7:7-0:8:8", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + } + ] + }, + "dst_arrow": ">" + }, + { + "range": "d2/testdata/d2oracle/TestDelete/children_edges_flat_conflicts.d2,0:6:6-0:15:15", + "src": { + "range": "d2/testdata/d2oracle/TestDelete/children_edges_flat_conflicts.d2,0:6:6-0:9:9", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/children_edges_flat_conflicts.d2,0:7:7-0:8:8", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + } + ] + }, + "src_arrow": "", + "dst": { + "range": "d2/testdata/d2oracle/TestDelete/children_edges_flat_conflicts.d2,0:11:11-0:15:15", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/children_edges_flat_conflicts.d2,0:12:12-0:15:15", + "value": [ + { + "string": "z 2", + "raw_string": "z 2" + } + ] + } + } + ] + }, + "dst_arrow": ">" + } + ], + "primary": {}, + "value": {} + } + }, + { + "map_key": { + "range": "d2/testdata/d2oracle/TestDelete/children_edges_flat_conflicts.d2,1:0:16-1:1:17", + "key": { + "range": "d2/testdata/d2oracle/TestDelete/children_edges_flat_conflicts.d2,1:0:16-1:1:17", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/children_edges_flat_conflicts.d2,1:0:16-1:1:17", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "primary": {}, + "value": {} + } + }, + { + "map_key": { + "range": "d2/testdata/d2oracle/TestDelete/children_edges_flat_conflicts.d2,2:0:18-2:1:19", + "key": { + "range": "d2/testdata/d2oracle/TestDelete/children_edges_flat_conflicts.d2,2:0:18-2:1:19", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/children_edges_flat_conflicts.d2,2:0:18-2:1:19", + "value": [ + { + "string": "z", + "raw_string": "z" + } + ] + } + } + ] + }, + "primary": {}, + "value": {} + } + }, + { + "map_key": { + "range": "d2/testdata/d2oracle/TestDelete/children_edges_flat_conflicts.d2,4:0:21-4:9:30", + "key": { + "range": "d2/testdata/d2oracle/TestDelete/children_edges_flat_conflicts.d2,4:0:21-4:3:24", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/children_edges_flat_conflicts.d2,4:0:21-4:3:24", + "value": [ + { + "string": "x 2", + "raw_string": "x 2" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "double_quoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/children_edges_flat_conflicts.d2,4:5:26-4:9:30", + "value": [ + { + "string": "hi", + "raw_string": "hi" + } + ] + } + } + } + }, + { + "map_key": { + "range": "d2/testdata/d2oracle/TestDelete/children_edges_flat_conflicts.d2,5:0:31-5:9:40", + "key": { + "range": "d2/testdata/d2oracle/TestDelete/children_edges_flat_conflicts.d2,5:0:31-5:3:34", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/children_edges_flat_conflicts.d2,5:0:31-5:3:34", + "value": [ + { + "string": "z 2", + "raw_string": "z 2" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "double_quoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/children_edges_flat_conflicts.d2,5:5:36-5:9:40", + "value": [ + { + "string": "ey", + "raw_string": "ey" + } + ] + } + } + } + } + ] + }, + "root": { + "id": "", + "id_val": "", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + "edges": [ + { + "index": 0, + "minWidth": 0, + "minHeight": 0, + "label_dimensions": { + "width": 0, + "height": 0 + }, + "isCurve": false, + "src_arrow": false, + "dst_arrow": true, + "references": [ + { + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "index": 0, + "minWidth": 0, + "minHeight": 0, + "label_dimensions": { + "width": 0, + "height": 0 + }, + "isCurve": false, + "src_arrow": false, + "dst_arrow": true, + "references": [ + { + "map_key_edge_index": 1 + } + ], + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ], + "objects": [ + { + "id": "x", + "id_val": "x", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestDelete/children_edges_flat_conflicts.d2,1:0:16-1:1:17", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/children_edges_flat_conflicts.d2,1:0:16-1:1:17", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "x" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "z", + "id_val": "z", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestDelete/children_edges_flat_conflicts.d2,2:0:18-2:1:19", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/children_edges_flat_conflicts.d2,2:0:18-2:1:19", + "value": [ + { + "string": "z", + "raw_string": "z" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "z" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "x 2", + "id_val": "x 2", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestDelete/children_edges_flat_conflicts.d2,4:0:21-4:3:24", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/children_edges_flat_conflicts.d2,4:0:21-4:3:24", + "value": [ + { + "string": "x 2", + "raw_string": "x 2" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + }, + { + "key": { + "range": "d2/testdata/d2oracle/TestDelete/children_edges_flat_conflicts.d2,0:0:0-0:4:4", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/children_edges_flat_conflicts.d2,0:0:0-0:3:3", + "value": [ + { + "string": "x 2", + "raw_string": "x 2" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "hi" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "z 2", + "id_val": "z 2", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestDelete/children_edges_flat_conflicts.d2,5:0:31-5:3:34", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/children_edges_flat_conflicts.d2,5:0:31-5:3:34", + "value": [ + { + "string": "z 2", + "raw_string": "z 2" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + }, + { + "key": { + "range": "d2/testdata/d2oracle/TestDelete/children_edges_flat_conflicts.d2,0:11:11-0:15:15", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/children_edges_flat_conflicts.d2,0:12:12-0:15:15", + "value": [ + { + "string": "z 2", + "raw_string": "z 2" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 1 + } + ], + "attributes": { + "label": { + "value": "ey" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "y", + "id_val": "y", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestDelete/children_edges_flat_conflicts.d2,0:6:6-0:9:9", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/children_edges_flat_conflicts.d2,0:7:7-0:8:8", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + }, + { + "key": { + "range": "d2/testdata/d2oracle/TestDelete/children_edges_flat_conflicts.d2,0:6:6-0:9:9", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/children_edges_flat_conflicts.d2,0:7:7-0:8:8", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 1 + } + ], + "attributes": { + "label": { + "value": "y" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ] + }, + "err": "" +} diff --git a/testdata/d2oracle/TestDelete/children_flat_conflicts.exp.json b/testdata/d2oracle/TestDelete/children_flat_conflicts.exp.json new file mode 100644 index 000000000..3f0fa04a0 --- /dev/null +++ b/testdata/d2oracle/TestDelete/children_flat_conflicts.exp.json @@ -0,0 +1,210 @@ +{ + "graph": { + "ast": { + "range": "d2/testdata/d2oracle/TestDelete/children_flat_conflicts.d2,0:0:0-4:0:17", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestDelete/children_flat_conflicts.d2,0:0:0-0:3:3", + "key": { + "range": "d2/testdata/d2oracle/TestDelete/children_flat_conflicts.d2,0:0:0-0:3:3", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/children_flat_conflicts.d2,0:0:0-0:3:3", + "value": [ + { + "string": "x 2", + "raw_string": "x 2" + } + ] + } + } + ] + }, + "primary": {}, + "value": {} + } + }, + { + "map_key": { + "range": "d2/testdata/d2oracle/TestDelete/children_flat_conflicts.d2,1:0:4-1:1:5", + "key": { + "range": "d2/testdata/d2oracle/TestDelete/children_flat_conflicts.d2,1:0:4-1:1:5", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/children_flat_conflicts.d2,1:0:4-1:1:5", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "primary": {}, + "value": {} + } + }, + { + "map_key": { + "range": "d2/testdata/d2oracle/TestDelete/children_flat_conflicts.d2,3:0:7-3:9:16", + "key": { + "range": "d2/testdata/d2oracle/TestDelete/children_flat_conflicts.d2,3:0:7-3:3:10", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/children_flat_conflicts.d2,3:0:7-3:3:10", + "value": [ + { + "string": "x 2", + "raw_string": "x 2" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "double_quoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/children_flat_conflicts.d2,3:5:12-3:9:16", + "value": [ + { + "string": "hi", + "raw_string": "hi" + } + ] + } + } + } + } + ] + }, + "root": { + "id": "", + "id_val": "", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + "edges": null, + "objects": [ + { + "id": "x 2", + "id_val": "x 2", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestDelete/children_flat_conflicts.d2,0:0:0-0:3:3", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/children_flat_conflicts.d2,0:0:0-0:3:3", + "value": [ + { + "string": "x 2", + "raw_string": "x 2" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + }, + { + "key": { + "range": "d2/testdata/d2oracle/TestDelete/children_flat_conflicts.d2,3:0:7-3:3:10", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/children_flat_conflicts.d2,3:0:7-3:3:10", + "value": [ + { + "string": "x 2", + "raw_string": "x 2" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "hi" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "x", + "id_val": "x", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestDelete/children_flat_conflicts.d2,1:0:4-1:1:5", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/children_flat_conflicts.d2,1:0:4-1:1:5", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "x" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ] + }, + "err": "" +} diff --git a/testdata/d2oracle/TestDelete/children_multiple_conflicts.exp.json b/testdata/d2oracle/TestDelete/children_multiple_conflicts.exp.json new file mode 100644 index 000000000..7843427b7 --- /dev/null +++ b/testdata/d2oracle/TestDelete/children_multiple_conflicts.exp.json @@ -0,0 +1,450 @@ +{ + "graph": { + "ast": { + "range": "d2/testdata/d2oracle/TestDelete/children_multiple_conflicts.d2,0:0:0-8:0:35", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestDelete/children_multiple_conflicts.d2,0:0:0-0:10:10", + "edges": [ + { + "range": "d2/testdata/d2oracle/TestDelete/children_multiple_conflicts.d2,0:0:0-0:10:10", + "src": { + "range": "d2/testdata/d2oracle/TestDelete/children_multiple_conflicts.d2,0:0:0-0:4:4", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/children_multiple_conflicts.d2,0:0:0-0:3:3", + "value": [ + { + "string": "x 2", + "raw_string": "x 2" + } + ] + } + } + ] + }, + "src_arrow": "", + "dst": { + "range": "d2/testdata/d2oracle/TestDelete/children_multiple_conflicts.d2,0:6:6-0:10:10", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/children_multiple_conflicts.d2,0:7:7-0:10:10", + "value": [ + { + "string": "y 2", + "raw_string": "y 2" + } + ] + } + } + ] + }, + "dst_arrow": ">" + } + ], + "primary": {}, + "value": {} + } + }, + { + "map_key": { + "range": "d2/testdata/d2oracle/TestDelete/children_multiple_conflicts.d2,1:0:11-1:3:14", + "key": { + "range": "d2/testdata/d2oracle/TestDelete/children_multiple_conflicts.d2,1:0:11-1:3:14", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/children_multiple_conflicts.d2,1:0:11-1:3:14", + "value": [ + { + "string": "x 2", + "raw_string": "x 2" + } + ] + } + } + ] + }, + "primary": {}, + "value": {} + } + }, + { + "map_key": { + "range": "d2/testdata/d2oracle/TestDelete/children_multiple_conflicts.d2,2:0:15-2:3:18", + "key": { + "range": "d2/testdata/d2oracle/TestDelete/children_multiple_conflicts.d2,2:0:15-2:3:18", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/children_multiple_conflicts.d2,2:0:15-2:3:18", + "value": [ + { + "string": "y 2", + "raw_string": "y 2" + } + ] + } + } + ] + }, + "primary": {}, + "value": {} + } + }, + { + "map_key": { + "range": "d2/testdata/d2oracle/TestDelete/children_multiple_conflicts.d2,4:0:20-4:1:21", + "key": { + "range": "d2/testdata/d2oracle/TestDelete/children_multiple_conflicts.d2,4:0:20-4:1:21", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/children_multiple_conflicts.d2,4:0:20-4:1:21", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "primary": {}, + "value": {} + } + }, + { + "map_key": { + "range": "d2/testdata/d2oracle/TestDelete/children_multiple_conflicts.d2,5:0:22-5:1:23", + "key": { + "range": "d2/testdata/d2oracle/TestDelete/children_multiple_conflicts.d2,5:0:22-5:1:23", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/children_multiple_conflicts.d2,5:0:22-5:1:23", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + } + ] + }, + "primary": {}, + "value": {} + } + }, + { + "map_key": { + "range": "d2/testdata/d2oracle/TestDelete/children_multiple_conflicts.d2,7:0:25-7:9:34", + "key": { + "range": "d2/testdata/d2oracle/TestDelete/children_multiple_conflicts.d2,7:0:25-7:3:28", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/children_multiple_conflicts.d2,7:0:25-7:3:28", + "value": [ + { + "string": "x 2", + "raw_string": "x 2" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "double_quoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/children_multiple_conflicts.d2,7:5:30-7:9:34", + "value": [ + { + "string": "hi", + "raw_string": "hi" + } + ] + } + } + } + } + ] + }, + "root": { + "id": "", + "id_val": "", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + "edges": [ + { + "index": 0, + "minWidth": 0, + "minHeight": 0, + "label_dimensions": { + "width": 0, + "height": 0 + }, + "isCurve": false, + "src_arrow": false, + "dst_arrow": true, + "references": [ + { + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ], + "objects": [ + { + "id": "x 2", + "id_val": "x 2", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestDelete/children_multiple_conflicts.d2,1:0:11-1:3:14", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/children_multiple_conflicts.d2,1:0:11-1:3:14", + "value": [ + { + "string": "x 2", + "raw_string": "x 2" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + }, + { + "key": { + "range": "d2/testdata/d2oracle/TestDelete/children_multiple_conflicts.d2,7:0:25-7:3:28", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/children_multiple_conflicts.d2,7:0:25-7:3:28", + "value": [ + { + "string": "x 2", + "raw_string": "x 2" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + }, + { + "key": { + "range": "d2/testdata/d2oracle/TestDelete/children_multiple_conflicts.d2,0:0:0-0:4:4", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/children_multiple_conflicts.d2,0:0:0-0:3:3", + "value": [ + { + "string": "x 2", + "raw_string": "x 2" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "hi" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "y 2", + "id_val": "y 2", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestDelete/children_multiple_conflicts.d2,2:0:15-2:3:18", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/children_multiple_conflicts.d2,2:0:15-2:3:18", + "value": [ + { + "string": "y 2", + "raw_string": "y 2" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + }, + { + "key": { + "range": "d2/testdata/d2oracle/TestDelete/children_multiple_conflicts.d2,0:6:6-0:10:10", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/children_multiple_conflicts.d2,0:7:7-0:10:10", + "value": [ + { + "string": "y 2", + "raw_string": "y 2" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "y 2" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "x", + "id_val": "x", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestDelete/children_multiple_conflicts.d2,4:0:20-4:1:21", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/children_multiple_conflicts.d2,4:0:20-4:1:21", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "x" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "y", + "id_val": "y", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestDelete/children_multiple_conflicts.d2,5:0:22-5:1:23", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/children_multiple_conflicts.d2,5:0:22-5:1:23", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "y" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ] + }, + "err": "" +} diff --git a/testdata/d2oracle/TestDelete/children_nested_conflicts.exp.json b/testdata/d2oracle/TestDelete/children_nested_conflicts.exp.json new file mode 100644 index 000000000..8aff2d1e9 --- /dev/null +++ b/testdata/d2oracle/TestDelete/children_nested_conflicts.exp.json @@ -0,0 +1,226 @@ +{ + "graph": { + "ast": { + "range": "d2/testdata/d2oracle/TestDelete/children_nested_conflicts.d2,0:0:0-5:0:16", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestDelete/children_nested_conflicts.d2,0:0:0-2:1:12", + "key": { + "range": "d2/testdata/d2oracle/TestDelete/children_nested_conflicts.d2,0:0:0-0:3:3", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/children_nested_conflicts.d2,0:0:0-0:3:3", + "value": [ + { + "string": "x 2", + "raw_string": "x 2" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "map": { + "range": "d2/testdata/d2oracle/TestDelete/children_nested_conflicts.d2,0:5:5-2:0:11", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestDelete/children_nested_conflicts.d2,1:2:9-1:3:10", + "key": { + "range": "d2/testdata/d2oracle/TestDelete/children_nested_conflicts.d2,1:2:9-1:3:10", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/children_nested_conflicts.d2,1:2:9-1:3:10", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + } + ] + }, + "primary": {}, + "value": {} + } + } + ] + } + } + } + }, + { + "map_key": { + "range": "d2/testdata/d2oracle/TestDelete/children_nested_conflicts.d2,4:0:14-4:1:15", + "key": { + "range": "d2/testdata/d2oracle/TestDelete/children_nested_conflicts.d2,4:0:14-4:1:15", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/children_nested_conflicts.d2,4:0:14-4:1:15", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "primary": {}, + "value": {} + } + } + ] + }, + "root": { + "id": "", + "id_val": "", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + "edges": null, + "objects": [ + { + "id": "x 2", + "id_val": "x 2", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestDelete/children_nested_conflicts.d2,0:0:0-0:3:3", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/children_nested_conflicts.d2,0:0:0-0:3:3", + "value": [ + { + "string": "x 2", + "raw_string": "x 2" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "x 2" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "y", + "id_val": "y", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestDelete/children_nested_conflicts.d2,1:2:9-1:3:10", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/children_nested_conflicts.d2,1:2:9-1:3:10", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "y" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "x", + "id_val": "x", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestDelete/children_nested_conflicts.d2,4:0:14-4:1:15", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/children_nested_conflicts.d2,4:0:14-4:1:15", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "x" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ] + }, + "err": "" +} diff --git a/testdata/d2oracle/TestDelete/children_nested_referenced_conflicts.exp.json b/testdata/d2oracle/TestDelete/children_nested_referenced_conflicts.exp.json new file mode 100644 index 000000000..ed59ef9d0 --- /dev/null +++ b/testdata/d2oracle/TestDelete/children_nested_referenced_conflicts.exp.json @@ -0,0 +1,389 @@ +{ + "graph": { + "ast": { + "range": "d2/testdata/d2oracle/TestDelete/children_nested_referenced_conflicts.d2,0:0:0-6:0:33", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestDelete/children_nested_referenced_conflicts.d2,0:0:0-0:5:5", + "key": { + "range": "d2/testdata/d2oracle/TestDelete/children_nested_referenced_conflicts.d2,0:0:0-0:5:5", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/children_nested_referenced_conflicts.d2,0:0:0-0:3:3", + "value": [ + { + "string": "x 2", + "raw_string": "x 2" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/children_nested_referenced_conflicts.d2,0:4:4-0:5:5", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + } + ] + }, + "primary": {}, + "value": {} + } + }, + { + "map_key": { + "range": "d2/testdata/d2oracle/TestDelete/children_nested_referenced_conflicts.d2,2:0:7-2:1:8", + "key": { + "range": "d2/testdata/d2oracle/TestDelete/children_nested_referenced_conflicts.d2,2:0:7-2:1:8", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/children_nested_referenced_conflicts.d2,2:0:7-2:1:8", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "primary": {}, + "value": {} + } + }, + { + "map_key": { + "range": "d2/testdata/d2oracle/TestDelete/children_nested_referenced_conflicts.d2,4:0:10-4:9:19", + "key": { + "range": "d2/testdata/d2oracle/TestDelete/children_nested_referenced_conflicts.d2,4:0:10-4:3:13", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/children_nested_referenced_conflicts.d2,4:0:10-4:3:13", + "value": [ + { + "string": "x 2", + "raw_string": "x 2" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "double_quoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/children_nested_referenced_conflicts.d2,4:5:15-4:9:19", + "value": [ + { + "string": "hi", + "raw_string": "hi" + } + ] + } + } + } + }, + { + "map_key": { + "range": "d2/testdata/d2oracle/TestDelete/children_nested_referenced_conflicts.d2,5:0:20-5:12:32", + "key": { + "range": "d2/testdata/d2oracle/TestDelete/children_nested_referenced_conflicts.d2,5:0:20-5:5:25", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/children_nested_referenced_conflicts.d2,5:0:20-5:3:23", + "value": [ + { + "string": "x 2", + "raw_string": "x 2" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/children_nested_referenced_conflicts.d2,5:4:24-5:5:25", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "double_quoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/children_nested_referenced_conflicts.d2,5:7:27-5:12:32", + "value": [ + { + "string": "hey", + "raw_string": "hey" + } + ] + } + } + } + } + ] + }, + "root": { + "id": "", + "id_val": "", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + "edges": null, + "objects": [ + { + "id": "x 2", + "id_val": "x 2", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestDelete/children_nested_referenced_conflicts.d2,0:0:0-0:5:5", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/children_nested_referenced_conflicts.d2,0:0:0-0:3:3", + "value": [ + { + "string": "x 2", + "raw_string": "x 2" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/children_nested_referenced_conflicts.d2,0:4:4-0:5:5", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + }, + { + "key": { + "range": "d2/testdata/d2oracle/TestDelete/children_nested_referenced_conflicts.d2,4:0:10-4:3:13", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/children_nested_referenced_conflicts.d2,4:0:10-4:3:13", + "value": [ + { + "string": "x 2", + "raw_string": "x 2" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + }, + { + "key": { + "range": "d2/testdata/d2oracle/TestDelete/children_nested_referenced_conflicts.d2,5:0:20-5:5:25", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/children_nested_referenced_conflicts.d2,5:0:20-5:3:23", + "value": [ + { + "string": "x 2", + "raw_string": "x 2" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/children_nested_referenced_conflicts.d2,5:4:24-5:5:25", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "hi" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "y", + "id_val": "y", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestDelete/children_nested_referenced_conflicts.d2,0:0:0-0:5:5", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/children_nested_referenced_conflicts.d2,0:0:0-0:3:3", + "value": [ + { + "string": "x 2", + "raw_string": "x 2" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/children_nested_referenced_conflicts.d2,0:4:4-0:5:5", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + } + ] + }, + "key_path_index": 1, + "map_key_edge_index": 0 + }, + { + "key": { + "range": "d2/testdata/d2oracle/TestDelete/children_nested_referenced_conflicts.d2,5:0:20-5:5:25", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/children_nested_referenced_conflicts.d2,5:0:20-5:3:23", + "value": [ + { + "string": "x 2", + "raw_string": "x 2" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/children_nested_referenced_conflicts.d2,5:4:24-5:5:25", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + } + ] + }, + "key_path_index": 1, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "hey" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "x", + "id_val": "x", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestDelete/children_nested_referenced_conflicts.d2,2:0:7-2:1:8", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/children_nested_referenced_conflicts.d2,2:0:7-2:1:8", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "x" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ] + }, + "err": "" +} diff --git a/testdata/d2oracle/TestDelete/children_no_self_conflict.exp.json b/testdata/d2oracle/TestDelete/children_no_self_conflict.exp.json new file mode 100644 index 000000000..cf57b18f7 --- /dev/null +++ b/testdata/d2oracle/TestDelete/children_no_self_conflict.exp.json @@ -0,0 +1,94 @@ +{ + "graph": { + "ast": { + "range": "d2/testdata/d2oracle/TestDelete/children_no_self_conflict.d2,0:0:0-1:0:2", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestDelete/children_no_self_conflict.d2,0:0:0-0:1:1", + "key": { + "range": "d2/testdata/d2oracle/TestDelete/children_no_self_conflict.d2,0:0:0-0:1:1", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/children_no_self_conflict.d2,0:0:0-0:1:1", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "primary": {}, + "value": {} + } + } + ] + }, + "root": { + "id": "", + "id_val": "", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + "edges": null, + "objects": [ + { + "id": "x", + "id_val": "x", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestDelete/children_no_self_conflict.d2,0:0:0-0:1:1", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/children_no_self_conflict.d2,0:0:0-0:1:1", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "x" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ] + }, + "err": "" +} diff --git a/testdata/d2oracle/TestDelete/children_order.exp.json b/testdata/d2oracle/TestDelete/children_order.exp.json new file mode 100644 index 000000000..78a2a6d1a --- /dev/null +++ b/testdata/d2oracle/TestDelete/children_order.exp.json @@ -0,0 +1,289 @@ +{ + "graph": { + "ast": { + "range": "d2/testdata/d2oracle/TestDelete/children_order.d2,0:0:0-7:0:34", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestDelete/children_order.d2,0:0:0-6:1:33", + "key": { + "range": "d2/testdata/d2oracle/TestDelete/children_order.d2,0:0:0-0:1:1", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/children_order.d2,0:0:0-0:1:1", + "value": [ + { + "string": "c", + "raw_string": "c" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "map": { + "range": "d2/testdata/d2oracle/TestDelete/children_order.d2,0:3:3-6:0:32", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestDelete/children_order.d2,1:2:7-1:8:13", + "key": { + "range": "d2/testdata/d2oracle/TestDelete/children_order.d2,1:2:7-1:8:13", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/children_order.d2,1:2:7-1:8:13", + "value": [ + { + "string": "before", + "raw_string": "before" + } + ] + } + } + ] + }, + "primary": {}, + "value": {} + } + }, + { + "map_key": { + "range": "d2/testdata/d2oracle/TestDelete/children_order.d2,3:2:17-3:7:22", + "key": { + "range": "d2/testdata/d2oracle/TestDelete/children_order.d2,3:2:17-3:7:22", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/children_order.d2,3:2:17-3:7:22", + "value": [ + { + "string": "congo", + "raw_string": "congo" + } + ] + } + } + ] + }, + "primary": {}, + "value": {} + } + }, + { + "map_key": { + "range": "d2/testdata/d2oracle/TestDelete/children_order.d2,5:2:26-5:7:31", + "key": { + "range": "d2/testdata/d2oracle/TestDelete/children_order.d2,5:2:26-5:7:31", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/children_order.d2,5:2:26-5:7:31", + "value": [ + { + "string": "after", + "raw_string": "after" + } + ] + } + } + ] + }, + "primary": {}, + "value": {} + } + } + ] + } + } + } + } + ] + }, + "root": { + "id": "", + "id_val": "", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + "edges": null, + "objects": [ + { + "id": "c", + "id_val": "c", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestDelete/children_order.d2,0:0:0-0:1:1", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/children_order.d2,0:0:0-0:1:1", + "value": [ + { + "string": "c", + "raw_string": "c" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "c" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "before", + "id_val": "before", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestDelete/children_order.d2,1:2:7-1:8:13", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/children_order.d2,1:2:7-1:8:13", + "value": [ + { + "string": "before", + "raw_string": "before" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "before" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "congo", + "id_val": "congo", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestDelete/children_order.d2,3:2:17-3:7:22", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/children_order.d2,3:2:17-3:7:22", + "value": [ + { + "string": "congo", + "raw_string": "congo" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "congo" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "after", + "id_val": "after", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestDelete/children_order.d2,5:2:26-5:7:31", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/children_order.d2,5:2:26-5:7:31", + "value": [ + { + "string": "after", + "raw_string": "after" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "after" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ] + }, + "err": "" +} diff --git a/testdata/d2oracle/TestDelete/children_referenced_conflicts.exp.json b/testdata/d2oracle/TestDelete/children_referenced_conflicts.exp.json new file mode 100644 index 000000000..b616a010e --- /dev/null +++ b/testdata/d2oracle/TestDelete/children_referenced_conflicts.exp.json @@ -0,0 +1,210 @@ +{ + "graph": { + "ast": { + "range": "d2/testdata/d2oracle/TestDelete/children_referenced_conflicts.d2,0:0:0-5:0:18", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestDelete/children_referenced_conflicts.d2,0:0:0-0:3:3", + "key": { + "range": "d2/testdata/d2oracle/TestDelete/children_referenced_conflicts.d2,0:0:0-0:3:3", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/children_referenced_conflicts.d2,0:0:0-0:3:3", + "value": [ + { + "string": "x 2", + "raw_string": "x 2" + } + ] + } + } + ] + }, + "primary": {}, + "value": {} + } + }, + { + "map_key": { + "range": "d2/testdata/d2oracle/TestDelete/children_referenced_conflicts.d2,2:0:5-2:1:6", + "key": { + "range": "d2/testdata/d2oracle/TestDelete/children_referenced_conflicts.d2,2:0:5-2:1:6", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/children_referenced_conflicts.d2,2:0:5-2:1:6", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "primary": {}, + "value": {} + } + }, + { + "map_key": { + "range": "d2/testdata/d2oracle/TestDelete/children_referenced_conflicts.d2,4:0:8-4:9:17", + "key": { + "range": "d2/testdata/d2oracle/TestDelete/children_referenced_conflicts.d2,4:0:8-4:3:11", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/children_referenced_conflicts.d2,4:0:8-4:3:11", + "value": [ + { + "string": "x 2", + "raw_string": "x 2" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "double_quoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/children_referenced_conflicts.d2,4:5:13-4:9:17", + "value": [ + { + "string": "hi", + "raw_string": "hi" + } + ] + } + } + } + } + ] + }, + "root": { + "id": "", + "id_val": "", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + "edges": null, + "objects": [ + { + "id": "x 2", + "id_val": "x 2", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestDelete/children_referenced_conflicts.d2,0:0:0-0:3:3", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/children_referenced_conflicts.d2,0:0:0-0:3:3", + "value": [ + { + "string": "x 2", + "raw_string": "x 2" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + }, + { + "key": { + "range": "d2/testdata/d2oracle/TestDelete/children_referenced_conflicts.d2,4:0:8-4:3:11", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/children_referenced_conflicts.d2,4:0:8-4:3:11", + "value": [ + { + "string": "x 2", + "raw_string": "x 2" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "hi" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "x", + "id_val": "x", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestDelete/children_referenced_conflicts.d2,2:0:5-2:1:6", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/children_referenced_conflicts.d2,2:0:5-2:1:6", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "x" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ] + }, + "err": "" +} diff --git a/testdata/d2oracle/TestDelete/children_scope.exp.json b/testdata/d2oracle/TestDelete/children_scope.exp.json new file mode 100644 index 000000000..13095ab3f --- /dev/null +++ b/testdata/d2oracle/TestDelete/children_scope.exp.json @@ -0,0 +1,390 @@ +{ + "graph": { + "ast": { + "range": "d2/testdata/d2oracle/TestDelete/children_scope.d2,0:0:0-4:0:30", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestDelete/children_scope.d2,0:0:0-3:1:29", + "key": { + "range": "d2/testdata/d2oracle/TestDelete/children_scope.d2,0:0:0-0:3:3", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/children_scope.d2,0:0:0-0:1:1", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/children_scope.d2,0:2:2-0:3:3", + "value": [ + { + "string": "q", + "raw_string": "q" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "map": { + "range": "d2/testdata/d2oracle/TestDelete/children_scope.d2,0:5:5-3:0:28", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestDelete/children_scope.d2,1:2:9-1:11:18", + "key": { + "range": "d2/testdata/d2oracle/TestDelete/children_scope.d2,1:2:9-1:11:18", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/children_scope.d2,1:2:9-1:11:18", + "value": [ + { + "string": "what's up", + "raw_string": "what's up" + } + ] + } + } + ] + }, + "primary": {}, + "value": {} + } + }, + { + "map_key": { + "range": "d2/testdata/d2oracle/TestDelete/children_scope.d2,2:2:21-2:8:27", + "edges": [ + { + "range": "d2/testdata/d2oracle/TestDelete/children_scope.d2,2:2:21-2:8:27", + "src": { + "range": "d2/testdata/d2oracle/TestDelete/children_scope.d2,2:2:21-2:4:23", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/children_scope.d2,2:2:21-2:3:22", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "src_arrow": "", + "dst": { + "range": "d2/testdata/d2oracle/TestDelete/children_scope.d2,2:6:25-2:8:27", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/children_scope.d2,2:7:26-2:8:27", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + } + ] + }, + "dst_arrow": ">" + } + ], + "primary": {}, + "value": {} + } + } + ] + } + } + } + } + ] + }, + "root": { + "id": "", + "id_val": "", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + "edges": [ + { + "index": 0, + "minWidth": 0, + "minHeight": 0, + "label_dimensions": { + "width": 0, + "height": 0 + }, + "isCurve": false, + "src_arrow": false, + "dst_arrow": true, + "references": [ + { + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ], + "objects": [ + { + "id": "x", + "id_val": "x", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestDelete/children_scope.d2,0:0:0-0:3:3", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/children_scope.d2,0:0:0-0:1:1", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/children_scope.d2,0:2:2-0:3:3", + "value": [ + { + "string": "q", + "raw_string": "q" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "x" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "q", + "id_val": "q", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestDelete/children_scope.d2,0:0:0-0:3:3", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/children_scope.d2,0:0:0-0:1:1", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/children_scope.d2,0:2:2-0:3:3", + "value": [ + { + "string": "q", + "raw_string": "q" + } + ] + } + } + ] + }, + "key_path_index": 1, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "q" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "\"what's up\"", + "id_val": "what's up", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestDelete/children_scope.d2,1:2:9-1:11:18", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/children_scope.d2,1:2:9-1:11:18", + "value": [ + { + "string": "what's up", + "raw_string": "what's up" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "what's up" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "x", + "id_val": "x", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestDelete/children_scope.d2,2:2:21-2:4:23", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/children_scope.d2,2:2:21-2:3:22", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "x" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "y", + "id_val": "y", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestDelete/children_scope.d2,2:6:25-2:8:27", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/children_scope.d2,2:7:26-2:8:27", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "y" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ] + }, + "err": "" +} diff --git a/testdata/d2oracle/TestDelete/connection_style_and_object_style.exp.json b/testdata/d2oracle/TestDelete/connection_style_and_object_style.exp.json new file mode 100644 index 000000000..77a10451d --- /dev/null +++ b/testdata/d2oracle/TestDelete/connection_style_and_object_style.exp.json @@ -0,0 +1,322 @@ +{ + "graph": { + "ast": { + "range": "d2/testdata/d2oracle/TestDelete/connection_style_and_object_style.d2,0:0:0-3:0:38", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestDelete/connection_style_and_object_style.d2,0:0:0-0:1:1", + "key": { + "range": "d2/testdata/d2oracle/TestDelete/connection_style_and_object_style.d2,0:0:0-0:1:1", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/connection_style_and_object_style.d2,0:0:0-0:1:1", + "value": [ + { + "string": "A", + "raw_string": "A" + } + ] + } + } + ] + }, + "primary": {}, + "value": {} + } + }, + { + "map_key": { + "range": "d2/testdata/d2oracle/TestDelete/connection_style_and_object_style.d2,1:0:2-1:1:3", + "key": { + "range": "d2/testdata/d2oracle/TestDelete/connection_style_and_object_style.d2,1:0:2-1:1:3", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/connection_style_and_object_style.d2,1:0:2-1:1:3", + "value": [ + { + "string": "B", + "raw_string": "B" + } + ] + } + } + ] + }, + "primary": {}, + "value": {} + } + }, + { + "map_key": { + "range": "d2/testdata/d2oracle/TestDelete/connection_style_and_object_style.d2,2:0:4-2:33:37", + "edges": [ + { + "range": "d2/testdata/d2oracle/TestDelete/connection_style_and_object_style.d2,2:0:4-2:6:10", + "src": { + "range": "d2/testdata/d2oracle/TestDelete/connection_style_and_object_style.d2,2:0:4-2:2:6", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/connection_style_and_object_style.d2,2:0:4-2:1:5", + "value": [ + { + "string": "A", + "raw_string": "A" + } + ] + } + } + ] + }, + "src_arrow": "", + "dst": { + "range": "d2/testdata/d2oracle/TestDelete/connection_style_and_object_style.d2,2:4:8-2:6:10", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/connection_style_and_object_style.d2,2:5:9-2:6:10", + "value": [ + { + "string": "B", + "raw_string": "B" + } + ] + } + } + ] + }, + "dst_arrow": ">" + } + ], + "primary": {}, + "value": { + "map": { + "range": "d2/testdata/d2oracle/TestDelete/connection_style_and_object_style.d2,2:8:12-2:32:36", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestDelete/connection_style_and_object_style.d2,2:9:13-2:32:36", + "key": { + "range": "d2/testdata/d2oracle/TestDelete/connection_style_and_object_style.d2,2:9:13-2:21:25", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/connection_style_and_object_style.d2,2:9:13-2:14:18", + "value": [ + { + "string": "style", + "raw_string": "style" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/connection_style_and_object_style.d2,2:15:19-2:21:25", + "value": [ + { + "string": "stroke", + "raw_string": "stroke" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "double_quoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/connection_style_and_object_style.d2,2:23:27-2:32:36", + "value": [ + { + "string": "#2b50c2", + "raw_string": "#2b50c2" + } + ] + } + } + } + } + ] + } + } + } + } + ] + }, + "root": { + "id": "", + "id_val": "", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + "edges": [ + { + "index": 0, + "label_dimensions": { + "width": 0, + "height": 0 + }, + "src_arrow": false, + "dst_arrow": true, + "references": [ + { + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "" + }, + "style": { + "stroke": { + "value": "#2b50c2" + } + }, + "near_key": null, + "shape": { + "value": "" + } + } + } + ], + "objects": [ + { + "id": "A", + "id_val": "A", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestDelete/connection_style_and_object_style.d2,0:0:0-0:1:1", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/connection_style_and_object_style.d2,0:0:0-0:1:1", + "value": [ + { + "string": "A", + "raw_string": "A" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + }, + { + "key": { + "range": "d2/testdata/d2oracle/TestDelete/connection_style_and_object_style.d2,2:0:4-2:2:6", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/connection_style_and_object_style.d2,2:0:4-2:1:5", + "value": [ + { + "string": "A", + "raw_string": "A" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "A" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "B", + "id_val": "B", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestDelete/connection_style_and_object_style.d2,1:0:2-1:1:3", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/connection_style_and_object_style.d2,1:0:2-1:1:3", + "value": [ + { + "string": "B", + "raw_string": "B" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + }, + { + "key": { + "range": "d2/testdata/d2oracle/TestDelete/connection_style_and_object_style.d2,2:4:8-2:6:10", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/connection_style_and_object_style.d2,2:5:9-2:6:10", + "value": [ + { + "string": "B", + "raw_string": "B" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "B" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ] + }, + "err": "" +} diff --git a/testdata/d2oracle/TestDelete/connection_style_and_object_style_2.exp.json b/testdata/d2oracle/TestDelete/connection_style_and_object_style_2.exp.json new file mode 100644 index 000000000..65e69226c --- /dev/null +++ b/testdata/d2oracle/TestDelete/connection_style_and_object_style_2.exp.json @@ -0,0 +1,322 @@ +{ + "graph": { + "ast": { + "range": "d2/testdata/d2oracle/TestDelete/connection_style_and_object_style_2.d2,0:0:0-3:0:38", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestDelete/connection_style_and_object_style_2.d2,0:0:0-0:28:28", + "key": { + "range": "d2/testdata/d2oracle/TestDelete/connection_style_and_object_style_2.d2,0:0:0-0:1:1", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/connection_style_and_object_style_2.d2,0:0:0-0:1:1", + "value": [ + { + "string": "A", + "raw_string": "A" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "map": { + "range": "d2/testdata/d2oracle/TestDelete/connection_style_and_object_style_2.d2,0:3:3-0:27:27", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestDelete/connection_style_and_object_style_2.d2,0:4:4-0:27:27", + "key": { + "range": "d2/testdata/d2oracle/TestDelete/connection_style_and_object_style_2.d2,0:4:4-0:16:16", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/connection_style_and_object_style_2.d2,0:4:4-0:9:9", + "value": [ + { + "string": "style", + "raw_string": "style" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/connection_style_and_object_style_2.d2,0:10:10-0:16:16", + "value": [ + { + "string": "stroke", + "raw_string": "stroke" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "double_quoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/connection_style_and_object_style_2.d2,0:18:18-0:27:27", + "value": [ + { + "string": "#000e3d", + "raw_string": "#000e3d" + } + ] + } + } + } + } + ] + } + } + } + }, + { + "map_key": { + "range": "d2/testdata/d2oracle/TestDelete/connection_style_and_object_style_2.d2,1:0:29-1:1:30", + "key": { + "range": "d2/testdata/d2oracle/TestDelete/connection_style_and_object_style_2.d2,1:0:29-1:1:30", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/connection_style_and_object_style_2.d2,1:0:29-1:1:30", + "value": [ + { + "string": "B", + "raw_string": "B" + } + ] + } + } + ] + }, + "primary": {}, + "value": {} + } + }, + { + "map_key": { + "range": "d2/testdata/d2oracle/TestDelete/connection_style_and_object_style_2.d2,2:0:31-2:6:37", + "edges": [ + { + "range": "d2/testdata/d2oracle/TestDelete/connection_style_and_object_style_2.d2,2:0:31-2:6:37", + "src": { + "range": "d2/testdata/d2oracle/TestDelete/connection_style_and_object_style_2.d2,2:0:31-2:2:33", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/connection_style_and_object_style_2.d2,2:0:31-2:1:32", + "value": [ + { + "string": "A", + "raw_string": "A" + } + ] + } + } + ] + }, + "src_arrow": "", + "dst": { + "range": "d2/testdata/d2oracle/TestDelete/connection_style_and_object_style_2.d2,2:4:35-2:6:37", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/connection_style_and_object_style_2.d2,2:5:36-2:6:37", + "value": [ + { + "string": "B", + "raw_string": "B" + } + ] + } + } + ] + }, + "dst_arrow": ">" + } + ], + "primary": {}, + "value": {} + } + } + ] + }, + "root": { + "id": "", + "id_val": "", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + "edges": [ + { + "index": 0, + "label_dimensions": { + "width": 0, + "height": 0 + }, + "src_arrow": false, + "dst_arrow": true, + "references": [ + { + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ], + "objects": [ + { + "id": "A", + "id_val": "A", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestDelete/connection_style_and_object_style_2.d2,0:0:0-0:1:1", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/connection_style_and_object_style_2.d2,0:0:0-0:1:1", + "value": [ + { + "string": "A", + "raw_string": "A" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + }, + { + "key": { + "range": "d2/testdata/d2oracle/TestDelete/connection_style_and_object_style_2.d2,2:0:31-2:2:33", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/connection_style_and_object_style_2.d2,2:0:31-2:1:32", + "value": [ + { + "string": "A", + "raw_string": "A" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "A" + }, + "style": { + "stroke": { + "value": "#000e3d" + } + }, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "B", + "id_val": "B", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestDelete/connection_style_and_object_style_2.d2,1:0:29-1:1:30", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/connection_style_and_object_style_2.d2,1:0:29-1:1:30", + "value": [ + { + "string": "B", + "raw_string": "B" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + }, + { + "key": { + "range": "d2/testdata/d2oracle/TestDelete/connection_style_and_object_style_2.d2,2:4:35-2:6:37", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/connection_style_and_object_style_2.d2,2:5:36-2:6:37", + "value": [ + { + "string": "B", + "raw_string": "B" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "B" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ] + }, + "err": "" +} diff --git a/testdata/d2oracle/TestDelete/container_near.exp.json b/testdata/d2oracle/TestDelete/container_near.exp.json new file mode 100644 index 000000000..9d9af588a --- /dev/null +++ b/testdata/d2oracle/TestDelete/container_near.exp.json @@ -0,0 +1,328 @@ +{ + "graph": { + "ast": { + "range": "d2/testdata/d2oracle/TestDelete/container_near.d2,0:0:0-7:0:36", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestDelete/container_near.d2,0:0:0-2:1:16", + "key": { + "range": "d2/testdata/d2oracle/TestDelete/container_near.d2,0:0:0-0:1:1", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/container_near.d2,0:0:0-0:1:1", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "map": { + "range": "d2/testdata/d2oracle/TestDelete/container_near.d2,0:3:3-2:0:15", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestDelete/container_near.d2,1:2:7-1:9:14", + "key": { + "range": "d2/testdata/d2oracle/TestDelete/container_near.d2,1:2:7-1:6:11", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/container_near.d2,1:2:7-1:6:11", + "value": [ + { + "string": "near", + "raw_string": "near" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/container_near.d2,1:8:13-1:9:14", + "value": [ + { + "string": "z", + "raw_string": "z" + } + ] + } + } + } + } + ] + } + } + } + }, + { + "map_key": { + "range": "d2/testdata/d2oracle/TestDelete/container_near.d2,3:0:17-3:1:18", + "key": { + "range": "d2/testdata/d2oracle/TestDelete/container_near.d2,3:0:17-3:1:18", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/container_near.d2,3:0:17-3:1:18", + "value": [ + { + "string": "z", + "raw_string": "z" + } + ] + } + } + ] + }, + "primary": {}, + "value": {} + } + }, + { + "map_key": { + "range": "d2/testdata/d2oracle/TestDelete/container_near.d2,4:0:19-6:1:35", + "key": { + "range": "d2/testdata/d2oracle/TestDelete/container_near.d2,4:0:19-4:1:20", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/container_near.d2,4:0:19-4:1:20", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "map": { + "range": "d2/testdata/d2oracle/TestDelete/container_near.d2,4:3:22-6:0:34", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestDelete/container_near.d2,5:2:26-5:9:33", + "key": { + "range": "d2/testdata/d2oracle/TestDelete/container_near.d2,5:2:26-5:6:30", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/container_near.d2,5:2:26-5:6:30", + "value": [ + { + "string": "near", + "raw_string": "near" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/container_near.d2,5:8:32-5:9:33", + "value": [ + { + "string": "z", + "raw_string": "z" + } + ] + } + } + } + } + ] + } + } + } + } + ] + }, + "root": { + "id": "", + "id_val": "", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + "edges": null, + "objects": [ + { + "id": "y", + "id_val": "y", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestDelete/container_near.d2,0:0:0-0:1:1", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/container_near.d2,0:0:0-0:1:1", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "y" + }, + "style": {}, + "near_key": { + "range": ",0:0:0-0:1:1", + "path": [ + { + "unquoted_string": { + "range": ",0:0:0-0:1:1", + "value": [ + { + "string": "z", + "raw_string": "z" + } + ] + } + } + ] + }, + "shape": { + "value": "" + } + } + }, + { + "id": "z", + "id_val": "z", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestDelete/container_near.d2,3:0:17-3:1:18", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/container_near.d2,3:0:17-3:1:18", + "value": [ + { + "string": "z", + "raw_string": "z" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "z" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "a", + "id_val": "a", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestDelete/container_near.d2,4:0:19-4:1:20", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/container_near.d2,4:0:19-4:1:20", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "a" + }, + "style": {}, + "near_key": { + "range": ",0:0:0-0:1:1", + "path": [ + { + "unquoted_string": { + "range": ",0:0:0-0:1:1", + "value": [ + { + "string": "z", + "raw_string": "z" + } + ] + } + } + ] + }, + "shape": { + "value": "" + } + } + } + ] + }, + "err": "" +} diff --git a/testdata/d2oracle/TestDelete/delete_icon.exp.json b/testdata/d2oracle/TestDelete/delete_icon.exp.json new file mode 100644 index 000000000..ed3731899 --- /dev/null +++ b/testdata/d2oracle/TestDelete/delete_icon.exp.json @@ -0,0 +1,207 @@ +{ + "graph": { + "ast": { + "range": "d2/testdata/d2oracle/TestDelete/delete_icon.d2,0:0:0-3:0:36", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestDelete/delete_icon.d2,0:0:0-2:1:35", + "key": { + "range": "d2/testdata/d2oracle/TestDelete/delete_icon.d2,0:0:0-0:3:3", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/delete_icon.d2,0:0:0-0:1:1", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/delete_icon.d2,0:2:2-0:3:3", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "map": { + "range": "d2/testdata/d2oracle/TestDelete/delete_icon.d2,0:5:5-2:0:34", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestDelete/delete_icon.d2,1:2:9-1:26:33", + "key": { + "range": "d2/testdata/d2oracle/TestDelete/delete_icon.d2,1:2:9-1:6:13", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/delete_icon.d2,1:2:9-1:6:13", + "value": [ + { + "string": "link", + "raw_string": "link" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/delete_icon.d2,1:8:15-1:26:33", + "value": [ + { + "string": "https://google.com", + "raw_string": "https://google.com" + } + ] + } + } + } + } + ] + } + } + } + } + ] + }, + "root": { + "id": "", + "id_val": "", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + "edges": null, + "objects": [ + { + "id": "y", + "id_val": "y", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestDelete/delete_icon.d2,0:0:0-0:3:3", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/delete_icon.d2,0:0:0-0:1:1", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/delete_icon.d2,0:2:2-0:3:3", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "y" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "x", + "id_val": "x", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestDelete/delete_icon.d2,0:0:0-0:3:3", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/delete_icon.d2,0:0:0-0:1:1", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/delete_icon.d2,0:2:2-0:3:3", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "key_path_index": 1, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "x" + }, + "style": {}, + "link": "https://google.com", + "near_key": null, + "shape": { + "value": "" + } + } + } + ] + }, + "err": "" +} diff --git a/testdata/d2oracle/TestDelete/delete_link.exp.json b/testdata/d2oracle/TestDelete/delete_link.exp.json new file mode 100644 index 000000000..88bb37eb2 --- /dev/null +++ b/testdata/d2oracle/TestDelete/delete_link.exp.json @@ -0,0 +1,94 @@ +{ + "graph": { + "ast": { + "range": "d2/testdata/d2oracle/TestDelete/delete_link.d2,0:0:0-1:0:2", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestDelete/delete_link.d2,0:0:0-0:1:1", + "key": { + "range": "d2/testdata/d2oracle/TestDelete/delete_link.d2,0:0:0-0:1:1", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/delete_link.d2,0:0:0-0:1:1", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "primary": {}, + "value": {} + } + } + ] + }, + "root": { + "id": "", + "id_val": "", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + "edges": null, + "objects": [ + { + "id": "x", + "id_val": "x", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestDelete/delete_link.d2,0:0:0-0:1:1", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/delete_link.d2,0:0:0-0:1:1", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "x" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ] + }, + "err": "" +} diff --git a/testdata/d2oracle/TestDelete/delete_near.exp.json b/testdata/d2oracle/TestDelete/delete_near.exp.json new file mode 100644 index 000000000..89b874662 --- /dev/null +++ b/testdata/d2oracle/TestDelete/delete_near.exp.json @@ -0,0 +1,157 @@ +{ + "graph": { + "ast": { + "range": "d2/testdata/d2oracle/TestDelete/delete_near.d2,0:0:0-2:0:4", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestDelete/delete_near.d2,0:0:0-0:1:1", + "key": { + "range": "d2/testdata/d2oracle/TestDelete/delete_near.d2,0:0:0-0:1:1", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/delete_near.d2,0:0:0-0:1:1", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "primary": {}, + "value": {} + } + }, + { + "map_key": { + "range": "d2/testdata/d2oracle/TestDelete/delete_near.d2,1:0:2-1:1:3", + "key": { + "range": "d2/testdata/d2oracle/TestDelete/delete_near.d2,1:0:2-1:1:3", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/delete_near.d2,1:0:2-1:1:3", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + } + ] + }, + "primary": {}, + "value": {} + } + } + ] + }, + "root": { + "id": "", + "id_val": "", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + "edges": null, + "objects": [ + { + "id": "x", + "id_val": "x", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestDelete/delete_near.d2,0:0:0-0:1:1", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/delete_near.d2,0:0:0-0:1:1", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "x" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "y", + "id_val": "y", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestDelete/delete_near.d2,1:0:2-1:1:3", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/delete_near.d2,1:0:2-1:1:3", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "y" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ] + }, + "err": "" +} diff --git a/testdata/d2oracle/TestDelete/delete_needed_flat_near.exp.json b/testdata/d2oracle/TestDelete/delete_needed_flat_near.exp.json new file mode 100644 index 000000000..458914658 --- /dev/null +++ b/testdata/d2oracle/TestDelete/delete_needed_flat_near.exp.json @@ -0,0 +1,157 @@ +{ + "graph": { + "ast": { + "range": "d2/testdata/d2oracle/TestDelete/delete_needed_flat_near.d2,0:0:0-2:0:4", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestDelete/delete_needed_flat_near.d2,0:0:0-0:1:1", + "key": { + "range": "d2/testdata/d2oracle/TestDelete/delete_needed_flat_near.d2,0:0:0-0:1:1", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/delete_needed_flat_near.d2,0:0:0-0:1:1", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "primary": {}, + "value": {} + } + }, + { + "map_key": { + "range": "d2/testdata/d2oracle/TestDelete/delete_needed_flat_near.d2,1:0:2-1:1:3", + "key": { + "range": "d2/testdata/d2oracle/TestDelete/delete_needed_flat_near.d2,1:0:2-1:1:3", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/delete_needed_flat_near.d2,1:0:2-1:1:3", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + } + ] + }, + "primary": {}, + "value": {} + } + } + ] + }, + "root": { + "id": "", + "id_val": "", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + "edges": null, + "objects": [ + { + "id": "x", + "id_val": "x", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestDelete/delete_needed_flat_near.d2,0:0:0-0:1:1", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/delete_needed_flat_near.d2,0:0:0-0:1:1", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "x" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "y", + "id_val": "y", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestDelete/delete_needed_flat_near.d2,1:0:2-1:1:3", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/delete_needed_flat_near.d2,1:0:2-1:1:3", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "y" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ] + }, + "err": "" +} diff --git a/testdata/d2oracle/TestDelete/delete_redundant_flat_near.exp.json b/testdata/d2oracle/TestDelete/delete_redundant_flat_near.exp.json new file mode 100644 index 000000000..03973a0aa --- /dev/null +++ b/testdata/d2oracle/TestDelete/delete_redundant_flat_near.exp.json @@ -0,0 +1,157 @@ +{ + "graph": { + "ast": { + "range": "d2/testdata/d2oracle/TestDelete/delete_redundant_flat_near.d2,0:0:0-3:0:5", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestDelete/delete_redundant_flat_near.d2,0:0:0-0:1:1", + "key": { + "range": "d2/testdata/d2oracle/TestDelete/delete_redundant_flat_near.d2,0:0:0-0:1:1", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/delete_redundant_flat_near.d2,0:0:0-0:1:1", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "primary": {}, + "value": {} + } + }, + { + "map_key": { + "range": "d2/testdata/d2oracle/TestDelete/delete_redundant_flat_near.d2,2:0:3-2:1:4", + "key": { + "range": "d2/testdata/d2oracle/TestDelete/delete_redundant_flat_near.d2,2:0:3-2:1:4", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/delete_redundant_flat_near.d2,2:0:3-2:1:4", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + } + ] + }, + "primary": {}, + "value": {} + } + } + ] + }, + "root": { + "id": "", + "id_val": "", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + "edges": null, + "objects": [ + { + "id": "x", + "id_val": "x", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestDelete/delete_redundant_flat_near.d2,0:0:0-0:1:1", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/delete_redundant_flat_near.d2,0:0:0-0:1:1", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "x" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "y", + "id_val": "y", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestDelete/delete_redundant_flat_near.d2,2:0:3-2:1:4", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/delete_redundant_flat_near.d2,2:0:3-2:1:4", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "y" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ] + }, + "err": "" +} diff --git a/testdata/d2oracle/TestDelete/delete_tooltip.exp.json b/testdata/d2oracle/TestDelete/delete_tooltip.exp.json new file mode 100644 index 000000000..6ed58fb8e --- /dev/null +++ b/testdata/d2oracle/TestDelete/delete_tooltip.exp.json @@ -0,0 +1,94 @@ +{ + "graph": { + "ast": { + "range": "d2/testdata/d2oracle/TestDelete/delete_tooltip.d2,0:0:0-1:0:2", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestDelete/delete_tooltip.d2,0:0:0-0:1:1", + "key": { + "range": "d2/testdata/d2oracle/TestDelete/delete_tooltip.d2,0:0:0-0:1:1", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/delete_tooltip.d2,0:0:0-0:1:1", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "primary": {}, + "value": {} + } + } + ] + }, + "root": { + "id": "", + "id_val": "", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + "edges": null, + "objects": [ + { + "id": "x", + "id_val": "x", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestDelete/delete_tooltip.d2,0:0:0-0:1:1", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/delete_tooltip.d2,0:0:0-0:1:1", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "x" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ] + }, + "err": "" +} diff --git a/testdata/d2oracle/TestDelete/edge_both_identical_childs.exp.json b/testdata/d2oracle/TestDelete/edge_both_identical_childs.exp.json new file mode 100644 index 000000000..be9e9d472 --- /dev/null +++ b/testdata/d2oracle/TestDelete/edge_both_identical_childs.exp.json @@ -0,0 +1,406 @@ +{ + "graph": { + "ast": { + "range": "d2/testdata/d2oracle/TestDelete/edge_both_identical_childs.d2,0:0:0-1:0:13", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestDelete/edge_both_identical_childs.d2,0:0:0-0:12:12", + "edges": [ + { + "range": "d2/testdata/d2oracle/TestDelete/edge_both_identical_childs.d2,0:0:0-0:12:12", + "src": { + "range": "d2/testdata/d2oracle/TestDelete/edge_both_identical_childs.d2,0:0:0-0:6:6", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/edge_both_identical_childs.d2,0:0:0-0:1:1", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/edge_both_identical_childs.d2,0:2:2-0:3:3", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/edge_both_identical_childs.d2,0:4:4-0:5:5", + "value": [ + { + "string": "z", + "raw_string": "z" + } + ] + } + } + ] + }, + "src_arrow": "", + "dst": { + "range": "d2/testdata/d2oracle/TestDelete/edge_both_identical_childs.d2,0:8:8-0:12:12", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/edge_both_identical_childs.d2,0:9:9-0:10:10", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/edge_both_identical_childs.d2,0:11:11-0:12:12", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + } + ] + }, + "dst_arrow": ">" + } + ], + "primary": {}, + "value": {} + } + } + ] + }, + "root": { + "id": "", + "id_val": "", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + "edges": [ + { + "index": 0, + "minWidth": 0, + "minHeight": 0, + "label_dimensions": { + "width": 0, + "height": 0 + }, + "isCurve": false, + "src_arrow": false, + "dst_arrow": true, + "references": [ + { + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ], + "objects": [ + { + "id": "x", + "id_val": "x", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestDelete/edge_both_identical_childs.d2,0:0:0-0:6:6", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/edge_both_identical_childs.d2,0:0:0-0:1:1", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/edge_both_identical_childs.d2,0:2:2-0:3:3", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/edge_both_identical_childs.d2,0:4:4-0:5:5", + "value": [ + { + "string": "z", + "raw_string": "z" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + }, + { + "key": { + "range": "d2/testdata/d2oracle/TestDelete/edge_both_identical_childs.d2,0:8:8-0:12:12", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/edge_both_identical_childs.d2,0:9:9-0:10:10", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/edge_both_identical_childs.d2,0:11:11-0:12:12", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "x" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "y", + "id_val": "y", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestDelete/edge_both_identical_childs.d2,0:0:0-0:6:6", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/edge_both_identical_childs.d2,0:0:0-0:1:1", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/edge_both_identical_childs.d2,0:2:2-0:3:3", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/edge_both_identical_childs.d2,0:4:4-0:5:5", + "value": [ + { + "string": "z", + "raw_string": "z" + } + ] + } + } + ] + }, + "key_path_index": 1, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "y" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "z", + "id_val": "z", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestDelete/edge_both_identical_childs.d2,0:0:0-0:6:6", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/edge_both_identical_childs.d2,0:0:0-0:1:1", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/edge_both_identical_childs.d2,0:2:2-0:3:3", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/edge_both_identical_childs.d2,0:4:4-0:5:5", + "value": [ + { + "string": "z", + "raw_string": "z" + } + ] + } + } + ] + }, + "key_path_index": 2, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "z" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "b", + "id_val": "b", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestDelete/edge_both_identical_childs.d2,0:8:8-0:12:12", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/edge_both_identical_childs.d2,0:9:9-0:10:10", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/edge_both_identical_childs.d2,0:11:11-0:12:12", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + } + ] + }, + "key_path_index": 1, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "b" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ] + }, + "err": "" +} diff --git a/testdata/d2oracle/TestDelete/edge_common.exp.json b/testdata/d2oracle/TestDelete/edge_common.exp.json new file mode 100644 index 000000000..99941b391 --- /dev/null +++ b/testdata/d2oracle/TestDelete/edge_common.exp.json @@ -0,0 +1,185 @@ +{ + "graph": { + "ast": { + "range": "d2/testdata/d2oracle/TestDelete/edge_common.d2,0:0:0-1:0:7", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestDelete/edge_common.d2,0:0:0-0:6:6", + "edges": [ + { + "range": "d2/testdata/d2oracle/TestDelete/edge_common.d2,0:0:0-0:6:6", + "src": { + "range": "d2/testdata/d2oracle/TestDelete/edge_common.d2,0:0:0-0:2:2", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/edge_common.d2,0:0:0-0:1:1", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + } + ] + }, + "src_arrow": "", + "dst": { + "range": "d2/testdata/d2oracle/TestDelete/edge_common.d2,0:4:4-0:6:6", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/edge_common.d2,0:5:5-0:6:6", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + } + ] + }, + "dst_arrow": ">" + } + ], + "primary": {}, + "value": {} + } + } + ] + }, + "root": { + "id": "", + "id_val": "", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + "edges": [ + { + "index": 0, + "minWidth": 0, + "minHeight": 0, + "label_dimensions": { + "width": 0, + "height": 0 + }, + "isCurve": false, + "src_arrow": false, + "dst_arrow": true, + "references": [ + { + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ], + "objects": [ + { + "id": "a", + "id_val": "a", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestDelete/edge_common.d2,0:0:0-0:2:2", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/edge_common.d2,0:0:0-0:1:1", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "a" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "y", + "id_val": "y", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestDelete/edge_common.d2,0:4:4-0:6:6", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/edge_common.d2,0:5:5-0:6:6", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "y" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ] + }, + "err": "" +} diff --git a/testdata/d2oracle/TestDelete/edge_common_2.exp.json b/testdata/d2oracle/TestDelete/edge_common_2.exp.json new file mode 100644 index 000000000..08de68293 --- /dev/null +++ b/testdata/d2oracle/TestDelete/edge_common_2.exp.json @@ -0,0 +1,185 @@ +{ + "graph": { + "ast": { + "range": "d2/testdata/d2oracle/TestDelete/edge_common_2.d2,0:0:0-1:0:7", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestDelete/edge_common_2.d2,0:0:0-0:6:6", + "edges": [ + { + "range": "d2/testdata/d2oracle/TestDelete/edge_common_2.d2,0:0:0-0:6:6", + "src": { + "range": "d2/testdata/d2oracle/TestDelete/edge_common_2.d2,0:0:0-0:2:2", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/edge_common_2.d2,0:0:0-0:1:1", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + } + ] + }, + "src_arrow": "", + "dst": { + "range": "d2/testdata/d2oracle/TestDelete/edge_common_2.d2,0:4:4-0:6:6", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/edge_common_2.d2,0:5:5-0:6:6", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + } + ] + }, + "dst_arrow": ">" + } + ], + "primary": {}, + "value": {} + } + } + ] + }, + "root": { + "id": "", + "id_val": "", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + "edges": [ + { + "index": 0, + "minWidth": 0, + "minHeight": 0, + "label_dimensions": { + "width": 0, + "height": 0 + }, + "isCurve": false, + "src_arrow": false, + "dst_arrow": true, + "references": [ + { + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ], + "objects": [ + { + "id": "a", + "id_val": "a", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestDelete/edge_common_2.d2,0:0:0-0:2:2", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/edge_common_2.d2,0:0:0-0:1:1", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "a" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "y", + "id_val": "y", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestDelete/edge_common_2.d2,0:4:4-0:6:6", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/edge_common_2.d2,0:5:5-0:6:6", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "y" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ] + }, + "err": "" +} diff --git a/testdata/d2oracle/TestDelete/edge_common_3.exp.json b/testdata/d2oracle/TestDelete/edge_common_3.exp.json new file mode 100644 index 000000000..6382f6033 --- /dev/null +++ b/testdata/d2oracle/TestDelete/edge_common_3.exp.json @@ -0,0 +1,283 @@ +{ + "graph": { + "ast": { + "range": "d2/testdata/d2oracle/TestDelete/edge_common_3.d2,0:0:0-2:0:8", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestDelete/edge_common_3.d2,0:0:0-0:3:3", + "key": { + "range": "d2/testdata/d2oracle/TestDelete/edge_common_3.d2,0:0:0-0:3:3", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/edge_common_3.d2,0:0:0-0:1:1", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/edge_common_3.d2,0:2:2-0:3:3", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + } + ] + }, + "primary": {}, + "value": {} + } + }, + { + "map_key": { + "range": "d2/testdata/d2oracle/TestDelete/edge_common_3.d2,1:0:4-1:3:7", + "key": { + "range": "d2/testdata/d2oracle/TestDelete/edge_common_3.d2,1:0:4-1:3:7", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/edge_common_3.d2,1:0:4-1:1:5", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/edge_common_3.d2,1:2:6-1:3:7", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + } + ] + }, + "primary": {}, + "value": {} + } + } + ] + }, + "root": { + "id": "", + "id_val": "", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + "edges": null, + "objects": [ + { + "id": "x", + "id_val": "x", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestDelete/edge_common_3.d2,0:0:0-0:3:3", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/edge_common_3.d2,0:0:0-0:1:1", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/edge_common_3.d2,0:2:2-0:3:3", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + }, + { + "key": { + "range": "d2/testdata/d2oracle/TestDelete/edge_common_3.d2,1:0:4-1:3:7", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/edge_common_3.d2,1:0:4-1:1:5", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/edge_common_3.d2,1:2:6-1:3:7", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "x" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "a", + "id_val": "a", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestDelete/edge_common_3.d2,0:0:0-0:3:3", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/edge_common_3.d2,0:0:0-0:1:1", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/edge_common_3.d2,0:2:2-0:3:3", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + } + ] + }, + "key_path_index": 1, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "a" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "y", + "id_val": "y", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestDelete/edge_common_3.d2,1:0:4-1:3:7", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/edge_common_3.d2,1:0:4-1:1:5", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/edge_common_3.d2,1:2:6-1:3:7", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + } + ] + }, + "key_path_index": 1, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "y" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ] + }, + "err": "" +} diff --git a/testdata/d2oracle/TestDelete/edge_common_4.exp.json b/testdata/d2oracle/TestDelete/edge_common_4.exp.json new file mode 100644 index 000000000..1d948b7b2 --- /dev/null +++ b/testdata/d2oracle/TestDelete/edge_common_4.exp.json @@ -0,0 +1,283 @@ +{ + "graph": { + "ast": { + "range": "d2/testdata/d2oracle/TestDelete/edge_common_4.d2,0:0:0-2:0:8", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestDelete/edge_common_4.d2,0:0:0-0:3:3", + "key": { + "range": "d2/testdata/d2oracle/TestDelete/edge_common_4.d2,0:0:0-0:3:3", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/edge_common_4.d2,0:0:0-0:1:1", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/edge_common_4.d2,0:2:2-0:3:3", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + } + ] + }, + "primary": {}, + "value": {} + } + }, + { + "map_key": { + "range": "d2/testdata/d2oracle/TestDelete/edge_common_4.d2,1:0:4-1:3:7", + "key": { + "range": "d2/testdata/d2oracle/TestDelete/edge_common_4.d2,1:0:4-1:3:7", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/edge_common_4.d2,1:0:4-1:1:5", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/edge_common_4.d2,1:2:6-1:3:7", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + } + ] + }, + "primary": {}, + "value": {} + } + } + ] + }, + "root": { + "id": "", + "id_val": "", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + "edges": null, + "objects": [ + { + "id": "x", + "id_val": "x", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestDelete/edge_common_4.d2,0:0:0-0:3:3", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/edge_common_4.d2,0:0:0-0:1:1", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/edge_common_4.d2,0:2:2-0:3:3", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + }, + { + "key": { + "range": "d2/testdata/d2oracle/TestDelete/edge_common_4.d2,1:0:4-1:3:7", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/edge_common_4.d2,1:0:4-1:1:5", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/edge_common_4.d2,1:2:6-1:3:7", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "x" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "a", + "id_val": "a", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestDelete/edge_common_4.d2,0:0:0-0:3:3", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/edge_common_4.d2,0:0:0-0:1:1", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/edge_common_4.d2,0:2:2-0:3:3", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + } + ] + }, + "key_path_index": 1, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "a" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "y", + "id_val": "y", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestDelete/edge_common_4.d2,1:0:4-1:3:7", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/edge_common_4.d2,1:0:4-1:1:5", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/edge_common_4.d2,1:2:6-1:3:7", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + } + ] + }, + "key_path_index": 1, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "y" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ] + }, + "err": "" +} diff --git a/testdata/d2oracle/TestDelete/edge_conflict.exp.json b/testdata/d2oracle/TestDelete/edge_conflict.exp.json new file mode 100644 index 000000000..7a272710b --- /dev/null +++ b/testdata/d2oracle/TestDelete/edge_conflict.exp.json @@ -0,0 +1,374 @@ +{ + "graph": { + "ast": { + "range": "d2/testdata/d2oracle/TestDelete/edge_conflict.d2,0:0:0-2:0:17", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestDelete/edge_conflict.d2,0:0:0-0:14:14", + "edges": [ + { + "range": "d2/testdata/d2oracle/TestDelete/edge_conflict.d2,0:0:0-0:14:14", + "src": { + "range": "d2/testdata/d2oracle/TestDelete/edge_conflict.d2,0:0:0-0:6:6", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/edge_conflict.d2,0:0:0-0:3:3", + "value": [ + { + "string": "y 2", + "raw_string": "y 2" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/edge_conflict.d2,0:4:4-0:5:5", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + } + ] + }, + "src_arrow": "", + "dst": { + "range": "d2/testdata/d2oracle/TestDelete/edge_conflict.d2,0:8:8-0:14:14", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/edge_conflict.d2,0:9:9-0:12:12", + "value": [ + { + "string": "y 2", + "raw_string": "y 2" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/edge_conflict.d2,0:13:13-0:14:14", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + } + ] + }, + "dst_arrow": ">" + } + ], + "primary": {}, + "value": {} + } + }, + { + "map_key": { + "range": "d2/testdata/d2oracle/TestDelete/edge_conflict.d2,1:0:15-1:1:16", + "key": { + "range": "d2/testdata/d2oracle/TestDelete/edge_conflict.d2,1:0:15-1:1:16", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/edge_conflict.d2,1:0:15-1:1:16", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + } + ] + }, + "primary": {}, + "value": {} + } + } + ] + }, + "root": { + "id": "", + "id_val": "", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + "edges": [ + { + "index": 0, + "minWidth": 0, + "minHeight": 0, + "label_dimensions": { + "width": 0, + "height": 0 + }, + "isCurve": false, + "src_arrow": false, + "dst_arrow": true, + "references": [ + { + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ], + "objects": [ + { + "id": "y", + "id_val": "y", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestDelete/edge_conflict.d2,1:0:15-1:1:16", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/edge_conflict.d2,1:0:15-1:1:16", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "y" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "y 2", + "id_val": "y 2", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestDelete/edge_conflict.d2,0:0:0-0:6:6", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/edge_conflict.d2,0:0:0-0:3:3", + "value": [ + { + "string": "y 2", + "raw_string": "y 2" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/edge_conflict.d2,0:4:4-0:5:5", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + }, + { + "key": { + "range": "d2/testdata/d2oracle/TestDelete/edge_conflict.d2,0:8:8-0:14:14", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/edge_conflict.d2,0:9:9-0:12:12", + "value": [ + { + "string": "y 2", + "raw_string": "y 2" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/edge_conflict.d2,0:13:13-0:14:14", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "y 2" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "a", + "id_val": "a", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestDelete/edge_conflict.d2,0:0:0-0:6:6", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/edge_conflict.d2,0:0:0-0:3:3", + "value": [ + { + "string": "y 2", + "raw_string": "y 2" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/edge_conflict.d2,0:4:4-0:5:5", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + } + ] + }, + "key_path_index": 1, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "a" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "b", + "id_val": "b", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestDelete/edge_conflict.d2,0:8:8-0:14:14", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/edge_conflict.d2,0:9:9-0:12:12", + "value": [ + { + "string": "y 2", + "raw_string": "y 2" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/edge_conflict.d2,0:13:13-0:14:14", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + } + ] + }, + "key_path_index": 1, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "b" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ] + }, + "err": "" +} diff --git a/testdata/d2oracle/TestDelete/edge_decrement.exp.json b/testdata/d2oracle/TestDelete/edge_decrement.exp.json new file mode 100644 index 000000000..d1d9ef1ec --- /dev/null +++ b/testdata/d2oracle/TestDelete/edge_decrement.exp.json @@ -0,0 +1,940 @@ +{ + "graph": { + "ast": { + "range": "d2/testdata/d2oracle/TestDelete/edge_decrement.d2,0:0:0-10:0:102", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestDelete/edge_decrement.d2,0:0:0-0:6:6", + "edges": [ + { + "range": "d2/testdata/d2oracle/TestDelete/edge_decrement.d2,0:0:0-0:6:6", + "src": { + "range": "d2/testdata/d2oracle/TestDelete/edge_decrement.d2,0:0:0-0:2:2", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/edge_decrement.d2,0:0:0-0:1:1", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + } + ] + }, + "src_arrow": "", + "dst": { + "range": "d2/testdata/d2oracle/TestDelete/edge_decrement.d2,0:4:4-0:6:6", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/edge_decrement.d2,0:5:5-0:6:6", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + } + ] + }, + "dst_arrow": ">" + } + ], + "primary": {}, + "value": {} + } + }, + { + "map_key": { + "range": "d2/testdata/d2oracle/TestDelete/edge_decrement.d2,1:0:7-1:6:13", + "edges": [ + { + "range": "d2/testdata/d2oracle/TestDelete/edge_decrement.d2,1:0:7-1:6:13", + "src": { + "range": "d2/testdata/d2oracle/TestDelete/edge_decrement.d2,1:0:7-1:2:9", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/edge_decrement.d2,1:0:7-1:1:8", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + } + ] + }, + "src_arrow": "", + "dst": { + "range": "d2/testdata/d2oracle/TestDelete/edge_decrement.d2,1:4:11-1:6:13", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/edge_decrement.d2,1:5:12-1:6:13", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + } + ] + }, + "dst_arrow": ">" + } + ], + "primary": {}, + "value": {} + } + }, + { + "map_key": { + "range": "d2/testdata/d2oracle/TestDelete/edge_decrement.d2,3:0:15-3:6:21", + "edges": [ + { + "range": "d2/testdata/d2oracle/TestDelete/edge_decrement.d2,3:0:15-3:6:21", + "src": { + "range": "d2/testdata/d2oracle/TestDelete/edge_decrement.d2,3:0:15-3:2:17", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/edge_decrement.d2,3:0:15-3:1:16", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + } + ] + }, + "src_arrow": "", + "dst": { + "range": "d2/testdata/d2oracle/TestDelete/edge_decrement.d2,3:4:19-3:6:21", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/edge_decrement.d2,3:5:20-3:6:21", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + } + ] + }, + "dst_arrow": ">" + } + ], + "primary": {}, + "value": {} + } + }, + { + "map_key": { + "range": "d2/testdata/d2oracle/TestDelete/edge_decrement.d2,4:0:22-4:6:28", + "edges": [ + { + "range": "d2/testdata/d2oracle/TestDelete/edge_decrement.d2,4:0:22-4:6:28", + "src": { + "range": "d2/testdata/d2oracle/TestDelete/edge_decrement.d2,4:0:22-4:2:24", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/edge_decrement.d2,4:0:22-4:1:23", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + } + ] + }, + "src_arrow": "", + "dst": { + "range": "d2/testdata/d2oracle/TestDelete/edge_decrement.d2,4:4:26-4:6:28", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/edge_decrement.d2,4:5:27-4:6:28", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + } + ] + }, + "dst_arrow": ">" + } + ], + "primary": {}, + "value": {} + } + }, + { + "map_key": { + "range": "d2/testdata/d2oracle/TestDelete/edge_decrement.d2,5:0:29-5:17:46", + "edges": [ + { + "range": "d2/testdata/d2oracle/TestDelete/edge_decrement.d2,5:1:30-5:7:36", + "src": { + "range": "d2/testdata/d2oracle/TestDelete/edge_decrement.d2,5:1:30-5:3:32", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/edge_decrement.d2,5:1:30-5:2:31", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + } + ] + }, + "src_arrow": "", + "dst": { + "range": "d2/testdata/d2oracle/TestDelete/edge_decrement.d2,5:5:34-5:7:36", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/edge_decrement.d2,5:6:35-5:7:36", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + } + ] + }, + "dst_arrow": ">" + } + ], + "edge_index": { + "range": "d2/testdata/d2oracle/TestDelete/edge_decrement.d2,5:8:37-5:11:40", + "int": 0, + "glob": false + }, + "primary": {}, + "value": { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/edge_decrement.d2,5:13:42-5:17:46", + "value": [ + { + "string": "zero", + "raw_string": "zero" + } + ] + } + } + } + }, + { + "map_key": { + "range": "d2/testdata/d2oracle/TestDelete/edge_decrement.d2,6:0:47-6:16:63", + "edges": [ + { + "range": "d2/testdata/d2oracle/TestDelete/edge_decrement.d2,6:1:48-6:7:54", + "src": { + "range": "d2/testdata/d2oracle/TestDelete/edge_decrement.d2,6:1:48-6:3:50", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/edge_decrement.d2,6:1:48-6:2:49", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + } + ] + }, + "src_arrow": "", + "dst": { + "range": "d2/testdata/d2oracle/TestDelete/edge_decrement.d2,6:5:52-6:7:54", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/edge_decrement.d2,6:6:53-6:7:54", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + } + ] + }, + "dst_arrow": ">" + } + ], + "edge_index": { + "range": "d2/testdata/d2oracle/TestDelete/edge_decrement.d2,6:8:55-6:11:58", + "int": 1, + "glob": false + }, + "primary": {}, + "value": { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/edge_decrement.d2,6:13:60-6:16:63", + "value": [ + { + "string": "one", + "raw_string": "one" + } + ] + } + } + } + }, + { + "map_key": { + "range": "d2/testdata/d2oracle/TestDelete/edge_decrement.d2,8:0:65-8:18:83", + "edges": [ + { + "range": "d2/testdata/d2oracle/TestDelete/edge_decrement.d2,8:1:66-8:7:72", + "src": { + "range": "d2/testdata/d2oracle/TestDelete/edge_decrement.d2,8:1:66-8:3:68", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/edge_decrement.d2,8:1:66-8:2:67", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + } + ] + }, + "src_arrow": "", + "dst": { + "range": "d2/testdata/d2oracle/TestDelete/edge_decrement.d2,8:5:70-8:7:72", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/edge_decrement.d2,8:6:71-8:7:72", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + } + ] + }, + "dst_arrow": ">" + } + ], + "edge_index": { + "range": "d2/testdata/d2oracle/TestDelete/edge_decrement.d2,8:8:73-8:11:76", + "int": 2, + "glob": false + }, + "primary": {}, + "value": { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/edge_decrement.d2,8:13:78-8:18:83", + "value": [ + { + "string": "three", + "raw_string": "three" + } + ] + } + } + } + }, + { + "map_key": { + "range": "d2/testdata/d2oracle/TestDelete/edge_decrement.d2,9:0:84-9:17:101", + "edges": [ + { + "range": "d2/testdata/d2oracle/TestDelete/edge_decrement.d2,9:1:85-9:7:91", + "src": { + "range": "d2/testdata/d2oracle/TestDelete/edge_decrement.d2,9:1:85-9:3:87", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/edge_decrement.d2,9:1:85-9:2:86", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + } + ] + }, + "src_arrow": "", + "dst": { + "range": "d2/testdata/d2oracle/TestDelete/edge_decrement.d2,9:5:89-9:7:91", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/edge_decrement.d2,9:6:90-9:7:91", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + } + ] + }, + "dst_arrow": ">" + } + ], + "edge_index": { + "range": "d2/testdata/d2oracle/TestDelete/edge_decrement.d2,9:8:92-9:11:95", + "int": 3, + "glob": false + }, + "primary": {}, + "value": { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/edge_decrement.d2,9:13:97-9:17:101", + "value": [ + { + "string": "four", + "raw_string": "four" + } + ] + } + } + } + } + ] + }, + "root": { + "id": "", + "id_val": "", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + "edges": [ + { + "index": 0, + "minWidth": 0, + "minHeight": 0, + "label_dimensions": { + "width": 0, + "height": 0 + }, + "isCurve": false, + "src_arrow": false, + "dst_arrow": true, + "references": [ + { + "map_key_edge_index": 0 + }, + { + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "zero" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "index": 1, + "minWidth": 0, + "minHeight": 0, + "label_dimensions": { + "width": 0, + "height": 0 + }, + "isCurve": false, + "src_arrow": false, + "dst_arrow": true, + "references": [ + { + "map_key_edge_index": 0 + }, + { + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "one" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "index": 2, + "minWidth": 0, + "minHeight": 0, + "label_dimensions": { + "width": 0, + "height": 0 + }, + "isCurve": false, + "src_arrow": false, + "dst_arrow": true, + "references": [ + { + "map_key_edge_index": 0 + }, + { + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "three" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "index": 3, + "minWidth": 0, + "minHeight": 0, + "label_dimensions": { + "width": 0, + "height": 0 + }, + "isCurve": false, + "src_arrow": false, + "dst_arrow": true, + "references": [ + { + "map_key_edge_index": 0 + }, + { + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "four" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ], + "objects": [ + { + "id": "a", + "id_val": "a", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestDelete/edge_decrement.d2,0:0:0-0:2:2", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/edge_decrement.d2,0:0:0-0:1:1", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + }, + { + "key": { + "range": "d2/testdata/d2oracle/TestDelete/edge_decrement.d2,1:0:7-1:2:9", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/edge_decrement.d2,1:0:7-1:1:8", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + }, + { + "key": { + "range": "d2/testdata/d2oracle/TestDelete/edge_decrement.d2,3:0:15-3:2:17", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/edge_decrement.d2,3:0:15-3:1:16", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + }, + { + "key": { + "range": "d2/testdata/d2oracle/TestDelete/edge_decrement.d2,4:0:22-4:2:24", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/edge_decrement.d2,4:0:22-4:1:23", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + }, + { + "key": { + "range": "d2/testdata/d2oracle/TestDelete/edge_decrement.d2,5:1:30-5:3:32", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/edge_decrement.d2,5:1:30-5:2:31", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + }, + { + "key": { + "range": "d2/testdata/d2oracle/TestDelete/edge_decrement.d2,6:1:48-6:3:50", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/edge_decrement.d2,6:1:48-6:2:49", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + }, + { + "key": { + "range": "d2/testdata/d2oracle/TestDelete/edge_decrement.d2,8:1:66-8:3:68", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/edge_decrement.d2,8:1:66-8:2:67", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + }, + { + "key": { + "range": "d2/testdata/d2oracle/TestDelete/edge_decrement.d2,9:1:85-9:3:87", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/edge_decrement.d2,9:1:85-9:2:86", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "a" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "b", + "id_val": "b", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestDelete/edge_decrement.d2,0:4:4-0:6:6", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/edge_decrement.d2,0:5:5-0:6:6", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + }, + { + "key": { + "range": "d2/testdata/d2oracle/TestDelete/edge_decrement.d2,1:4:11-1:6:13", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/edge_decrement.d2,1:5:12-1:6:13", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + }, + { + "key": { + "range": "d2/testdata/d2oracle/TestDelete/edge_decrement.d2,3:4:19-3:6:21", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/edge_decrement.d2,3:5:20-3:6:21", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + }, + { + "key": { + "range": "d2/testdata/d2oracle/TestDelete/edge_decrement.d2,4:4:26-4:6:28", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/edge_decrement.d2,4:5:27-4:6:28", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + }, + { + "key": { + "range": "d2/testdata/d2oracle/TestDelete/edge_decrement.d2,5:5:34-5:7:36", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/edge_decrement.d2,5:6:35-5:7:36", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + }, + { + "key": { + "range": "d2/testdata/d2oracle/TestDelete/edge_decrement.d2,6:5:52-6:7:54", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/edge_decrement.d2,6:6:53-6:7:54", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + }, + { + "key": { + "range": "d2/testdata/d2oracle/TestDelete/edge_decrement.d2,8:5:70-8:7:72", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/edge_decrement.d2,8:6:71-8:7:72", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + }, + { + "key": { + "range": "d2/testdata/d2oracle/TestDelete/edge_decrement.d2,9:5:89-9:7:91", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/edge_decrement.d2,9:6:90-9:7:91", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "b" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ] + }, + "err": "" +} diff --git a/testdata/d2oracle/TestDelete/edge_first.exp.json b/testdata/d2oracle/TestDelete/edge_first.exp.json new file mode 100644 index 000000000..53f981334 --- /dev/null +++ b/testdata/d2oracle/TestDelete/edge_first.exp.json @@ -0,0 +1,609 @@ +{ + "graph": { + "ast": { + "range": "d2/testdata/d2oracle/TestDelete/edge_first.d2,0:0:0-1:0:24", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestDelete/edge_first.d2,0:0:0-0:23:23", + "key": { + "range": "d2/testdata/d2oracle/TestDelete/edge_first.d2,0:0:0-0:5:5", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/edge_first.d2,0:0:0-0:1:1", + "value": [ + { + "string": "l", + "raw_string": "l" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/edge_first.d2,0:2:2-0:3:3", + "value": [ + { + "string": "p", + "raw_string": "p" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/edge_first.d2,0:4:4-0:5:5", + "value": [ + { + "string": "d", + "raw_string": "d" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "map": { + "range": "d2/testdata/d2oracle/TestDelete/edge_first.d2,0:7:7-0:22:22", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestDelete/edge_first.d2,0:8:8-0:9:9", + "key": { + "range": "d2/testdata/d2oracle/TestDelete/edge_first.d2,0:8:8-0:9:9", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/edge_first.d2,0:8:8-0:9:9", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "primary": {}, + "value": {} + } + }, + { + "map_key": { + "range": "d2/testdata/d2oracle/TestDelete/edge_first.d2,0:11:11-0:22:22", + "edges": [ + { + "range": "d2/testdata/d2oracle/TestDelete/edge_first.d2,0:11:11-0:18:18", + "src": { + "range": "d2/testdata/d2oracle/TestDelete/edge_first.d2,0:11:11-0:13:13", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/edge_first.d2,0:11:11-0:12:12", + "value": [ + { + "string": "p", + "raw_string": "p" + } + ] + } + } + ] + }, + "src_arrow": "", + "dst": { + "range": "d2/testdata/d2oracle/TestDelete/edge_first.d2,0:15:15-0:18:18", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/edge_first.d2,0:16:16-0:17:17", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + } + ] + }, + "dst_arrow": ">" + }, + { + "range": "d2/testdata/d2oracle/TestDelete/edge_first.d2,0:15:15-0:22:22", + "src": { + "range": "d2/testdata/d2oracle/TestDelete/edge_first.d2,0:15:15-0:18:18", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/edge_first.d2,0:16:16-0:17:17", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + } + ] + }, + "src_arrow": "", + "dst": { + "range": "d2/testdata/d2oracle/TestDelete/edge_first.d2,0:20:20-0:22:22", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/edge_first.d2,0:21:21-0:22:22", + "value": [ + { + "string": "z", + "raw_string": "z" + } + ] + } + } + ] + }, + "dst_arrow": ">" + } + ], + "primary": {}, + "value": {} + } + } + ] + } + } + } + } + ] + }, + "root": { + "id": "", + "id_val": "", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + "edges": [ + { + "index": 0, + "minWidth": 0, + "minHeight": 0, + "label_dimensions": { + "width": 0, + "height": 0 + }, + "isCurve": false, + "src_arrow": false, + "dst_arrow": true, + "references": [ + { + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "index": 0, + "minWidth": 0, + "minHeight": 0, + "label_dimensions": { + "width": 0, + "height": 0 + }, + "isCurve": false, + "src_arrow": false, + "dst_arrow": true, + "references": [ + { + "map_key_edge_index": 1 + } + ], + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ], + "objects": [ + { + "id": "l", + "id_val": "l", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestDelete/edge_first.d2,0:0:0-0:5:5", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/edge_first.d2,0:0:0-0:1:1", + "value": [ + { + "string": "l", + "raw_string": "l" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/edge_first.d2,0:2:2-0:3:3", + "value": [ + { + "string": "p", + "raw_string": "p" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/edge_first.d2,0:4:4-0:5:5", + "value": [ + { + "string": "d", + "raw_string": "d" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "l" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "p", + "id_val": "p", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestDelete/edge_first.d2,0:0:0-0:5:5", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/edge_first.d2,0:0:0-0:1:1", + "value": [ + { + "string": "l", + "raw_string": "l" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/edge_first.d2,0:2:2-0:3:3", + "value": [ + { + "string": "p", + "raw_string": "p" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/edge_first.d2,0:4:4-0:5:5", + "value": [ + { + "string": "d", + "raw_string": "d" + } + ] + } + } + ] + }, + "key_path_index": 1, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "p" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "d", + "id_val": "d", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestDelete/edge_first.d2,0:0:0-0:5:5", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/edge_first.d2,0:0:0-0:1:1", + "value": [ + { + "string": "l", + "raw_string": "l" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/edge_first.d2,0:2:2-0:3:3", + "value": [ + { + "string": "p", + "raw_string": "p" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/edge_first.d2,0:4:4-0:5:5", + "value": [ + { + "string": "d", + "raw_string": "d" + } + ] + } + } + ] + }, + "key_path_index": 2, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "d" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "x", + "id_val": "x", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestDelete/edge_first.d2,0:8:8-0:9:9", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/edge_first.d2,0:8:8-0:9:9", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "x" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "p", + "id_val": "p", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestDelete/edge_first.d2,0:11:11-0:13:13", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/edge_first.d2,0:11:11-0:12:12", + "value": [ + { + "string": "p", + "raw_string": "p" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "p" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "y", + "id_val": "y", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestDelete/edge_first.d2,0:15:15-0:18:18", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/edge_first.d2,0:16:16-0:17:17", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + }, + { + "key": { + "range": "d2/testdata/d2oracle/TestDelete/edge_first.d2,0:15:15-0:18:18", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/edge_first.d2,0:16:16-0:17:17", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 1 + } + ], + "attributes": { + "label": { + "value": "y" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "z", + "id_val": "z", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestDelete/edge_first.d2,0:20:20-0:22:22", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/edge_first.d2,0:21:21-0:22:22", + "value": [ + { + "string": "z", + "raw_string": "z" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 1 + } + ], + "attributes": { + "label": { + "value": "z" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ] + }, + "err": "" +} diff --git a/testdata/d2oracle/TestDelete/edge_flat_style.exp.json b/testdata/d2oracle/TestDelete/edge_flat_style.exp.json new file mode 100644 index 000000000..0969164e0 --- /dev/null +++ b/testdata/d2oracle/TestDelete/edge_flat_style.exp.json @@ -0,0 +1,94 @@ +{ + "graph": { + "ast": { + "range": "d2/testdata/d2oracle/TestDelete/edge_flat_style.d2,0:0:0-1:0:2", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestDelete/edge_flat_style.d2,0:0:0-0:1:1", + "key": { + "range": "d2/testdata/d2oracle/TestDelete/edge_flat_style.d2,0:0:0-0:1:1", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/edge_flat_style.d2,0:0:0-0:1:1", + "value": [ + { + "string": "B", + "raw_string": "B" + } + ] + } + } + ] + }, + "primary": {}, + "value": {} + } + } + ] + }, + "root": { + "id": "", + "id_val": "", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + "edges": null, + "objects": [ + { + "id": "B", + "id_val": "B", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestDelete/edge_flat_style.d2,0:0:0-0:1:1", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/edge_flat_style.d2,0:0:0-0:1:1", + "value": [ + { + "string": "B", + "raw_string": "B" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "B" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ] + }, + "err": "" +} diff --git a/testdata/d2oracle/TestDelete/edge_identical_child.exp.json b/testdata/d2oracle/TestDelete/edge_identical_child.exp.json new file mode 100644 index 000000000..7cacbe9bb --- /dev/null +++ b/testdata/d2oracle/TestDelete/edge_identical_child.exp.json @@ -0,0 +1,426 @@ +{ + "graph": { + "ast": { + "range": "d2/testdata/d2oracle/TestDelete/edge_identical_child.d2,0:0:0-1:0:13", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestDelete/edge_identical_child.d2,0:0:0-0:12:12", + "edges": [ + { + "range": "d2/testdata/d2oracle/TestDelete/edge_identical_child.d2,0:0:0-0:12:12", + "src": { + "range": "d2/testdata/d2oracle/TestDelete/edge_identical_child.d2,0:0:0-0:6:6", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/edge_identical_child.d2,0:0:0-0:1:1", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/edge_identical_child.d2,0:2:2-0:3:3", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/edge_identical_child.d2,0:4:4-0:5:5", + "value": [ + { + "string": "z", + "raw_string": "z" + } + ] + } + } + ] + }, + "src_arrow": "", + "dst": { + "range": "d2/testdata/d2oracle/TestDelete/edge_identical_child.d2,0:8:8-0:12:12", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/edge_identical_child.d2,0:9:9-0:10:10", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/edge_identical_child.d2,0:11:11-0:12:12", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + } + ] + }, + "dst_arrow": ">" + } + ], + "primary": {}, + "value": {} + } + } + ] + }, + "root": { + "id": "", + "id_val": "", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + "edges": [ + { + "index": 0, + "minWidth": 0, + "minHeight": 0, + "label_dimensions": { + "width": 0, + "height": 0 + }, + "isCurve": false, + "src_arrow": false, + "dst_arrow": true, + "references": [ + { + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ], + "objects": [ + { + "id": "x", + "id_val": "x", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestDelete/edge_identical_child.d2,0:0:0-0:6:6", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/edge_identical_child.d2,0:0:0-0:1:1", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/edge_identical_child.d2,0:2:2-0:3:3", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/edge_identical_child.d2,0:4:4-0:5:5", + "value": [ + { + "string": "z", + "raw_string": "z" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "x" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "y", + "id_val": "y", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestDelete/edge_identical_child.d2,0:0:0-0:6:6", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/edge_identical_child.d2,0:0:0-0:1:1", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/edge_identical_child.d2,0:2:2-0:3:3", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/edge_identical_child.d2,0:4:4-0:5:5", + "value": [ + { + "string": "z", + "raw_string": "z" + } + ] + } + } + ] + }, + "key_path_index": 1, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "y" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "z", + "id_val": "z", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestDelete/edge_identical_child.d2,0:0:0-0:6:6", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/edge_identical_child.d2,0:0:0-0:1:1", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/edge_identical_child.d2,0:2:2-0:3:3", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/edge_identical_child.d2,0:4:4-0:5:5", + "value": [ + { + "string": "z", + "raw_string": "z" + } + ] + } + } + ] + }, + "key_path_index": 2, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "z" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "y", + "id_val": "y", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestDelete/edge_identical_child.d2,0:8:8-0:12:12", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/edge_identical_child.d2,0:9:9-0:10:10", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/edge_identical_child.d2,0:11:11-0:12:12", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "y" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "b", + "id_val": "b", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestDelete/edge_identical_child.d2,0:8:8-0:12:12", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/edge_identical_child.d2,0:9:9-0:10:10", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/edge_identical_child.d2,0:11:11-0:12:12", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + } + ] + }, + "key_path_index": 1, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "b" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ] + }, + "err": "" +} diff --git a/testdata/d2oracle/TestDelete/edge_key_style.exp.json b/testdata/d2oracle/TestDelete/edge_key_style.exp.json new file mode 100644 index 000000000..4f1b062c7 --- /dev/null +++ b/testdata/d2oracle/TestDelete/edge_key_style.exp.json @@ -0,0 +1,185 @@ +{ + "graph": { + "ast": { + "range": "d2/testdata/d2oracle/TestDelete/edge_key_style.d2,0:0:0-1:0:7", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestDelete/edge_key_style.d2,0:0:0-0:6:6", + "edges": [ + { + "range": "d2/testdata/d2oracle/TestDelete/edge_key_style.d2,0:0:0-0:6:6", + "src": { + "range": "d2/testdata/d2oracle/TestDelete/edge_key_style.d2,0:0:0-0:2:2", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/edge_key_style.d2,0:0:0-0:1:1", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "src_arrow": "", + "dst": { + "range": "d2/testdata/d2oracle/TestDelete/edge_key_style.d2,0:4:4-0:6:6", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/edge_key_style.d2,0:5:5-0:6:6", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + } + ] + }, + "dst_arrow": ">" + } + ], + "primary": {}, + "value": {} + } + } + ] + }, + "root": { + "id": "", + "id_val": "", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + "edges": [ + { + "index": 0, + "minWidth": 0, + "minHeight": 0, + "label_dimensions": { + "width": 0, + "height": 0 + }, + "isCurve": false, + "src_arrow": false, + "dst_arrow": true, + "references": [ + { + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ], + "objects": [ + { + "id": "x", + "id_val": "x", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestDelete/edge_key_style.d2,0:0:0-0:2:2", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/edge_key_style.d2,0:0:0-0:1:1", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "x" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "y", + "id_val": "y", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestDelete/edge_key_style.d2,0:4:4-0:6:6", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/edge_key_style.d2,0:5:5-0:6:6", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "y" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ] + }, + "err": "" +} diff --git a/testdata/d2oracle/TestDelete/edge_last.exp.json b/testdata/d2oracle/TestDelete/edge_last.exp.json new file mode 100644 index 000000000..33cd89cd6 --- /dev/null +++ b/testdata/d2oracle/TestDelete/edge_last.exp.json @@ -0,0 +1,733 @@ +{ + "graph": { + "ast": { + "range": "d2/testdata/d2oracle/TestDelete/edge_last.d2,0:0:0-1:0:29", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestDelete/edge_last.d2,0:0:0-0:28:28", + "key": { + "range": "d2/testdata/d2oracle/TestDelete/edge_last.d2,0:0:0-0:5:5", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/edge_last.d2,0:0:0-0:1:1", + "value": [ + { + "string": "l", + "raw_string": "l" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/edge_last.d2,0:2:2-0:3:3", + "value": [ + { + "string": "p", + "raw_string": "p" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/edge_last.d2,0:4:4-0:5:5", + "value": [ + { + "string": "d", + "raw_string": "d" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "map": { + "range": "d2/testdata/d2oracle/TestDelete/edge_last.d2,0:7:7-0:27:27", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestDelete/edge_last.d2,0:8:8-0:24:24", + "edges": [ + { + "range": "d2/testdata/d2oracle/TestDelete/edge_last.d2,0:8:8-0:15:15", + "src": { + "range": "d2/testdata/d2oracle/TestDelete/edge_last.d2,0:8:8-0:10:10", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/edge_last.d2,0:8:8-0:9:9", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "src_arrow": "", + "dst": { + "range": "d2/testdata/d2oracle/TestDelete/edge_last.d2,0:12:12-0:15:15", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/edge_last.d2,0:13:13-0:14:14", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + } + ] + }, + "dst_arrow": ">" + }, + { + "range": "d2/testdata/d2oracle/TestDelete/edge_last.d2,0:12:12-0:20:20", + "src": { + "range": "d2/testdata/d2oracle/TestDelete/edge_last.d2,0:12:12-0:15:15", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/edge_last.d2,0:13:13-0:14:14", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + } + ] + }, + "src_arrow": "", + "dst": { + "range": "d2/testdata/d2oracle/TestDelete/edge_last.d2,0:17:17-0:20:20", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/edge_last.d2,0:18:18-0:19:19", + "value": [ + { + "string": "z", + "raw_string": "z" + } + ] + } + } + ] + }, + "dst_arrow": ">" + }, + { + "range": "d2/testdata/d2oracle/TestDelete/edge_last.d2,0:17:17-0:24:24", + "src": { + "range": "d2/testdata/d2oracle/TestDelete/edge_last.d2,0:17:17-0:20:20", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/edge_last.d2,0:18:18-0:19:19", + "value": [ + { + "string": "z", + "raw_string": "z" + } + ] + } + } + ] + }, + "src_arrow": "", + "dst": { + "range": "d2/testdata/d2oracle/TestDelete/edge_last.d2,0:22:22-0:24:24", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/edge_last.d2,0:23:23-0:24:24", + "value": [ + { + "string": "q", + "raw_string": "q" + } + ] + } + } + ] + }, + "dst_arrow": ">" + } + ], + "primary": {}, + "value": {} + } + }, + { + "map_key": { + "range": "d2/testdata/d2oracle/TestDelete/edge_last.d2,0:26:26-0:27:27", + "key": { + "range": "d2/testdata/d2oracle/TestDelete/edge_last.d2,0:26:26-0:27:27", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/edge_last.d2,0:26:26-0:27:27", + "value": [ + { + "string": "p", + "raw_string": "p" + } + ] + } + } + ] + }, + "primary": {}, + "value": {} + } + } + ] + } + } + } + } + ] + }, + "root": { + "id": "", + "id_val": "", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + "edges": [ + { + "index": 0, + "minWidth": 0, + "minHeight": 0, + "label_dimensions": { + "width": 0, + "height": 0 + }, + "isCurve": false, + "src_arrow": false, + "dst_arrow": true, + "references": [ + { + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "index": 0, + "minWidth": 0, + "minHeight": 0, + "label_dimensions": { + "width": 0, + "height": 0 + }, + "isCurve": false, + "src_arrow": false, + "dst_arrow": true, + "references": [ + { + "map_key_edge_index": 1 + } + ], + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "index": 0, + "minWidth": 0, + "minHeight": 0, + "label_dimensions": { + "width": 0, + "height": 0 + }, + "isCurve": false, + "src_arrow": false, + "dst_arrow": true, + "references": [ + { + "map_key_edge_index": 2 + } + ], + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ], + "objects": [ + { + "id": "l", + "id_val": "l", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestDelete/edge_last.d2,0:0:0-0:5:5", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/edge_last.d2,0:0:0-0:1:1", + "value": [ + { + "string": "l", + "raw_string": "l" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/edge_last.d2,0:2:2-0:3:3", + "value": [ + { + "string": "p", + "raw_string": "p" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/edge_last.d2,0:4:4-0:5:5", + "value": [ + { + "string": "d", + "raw_string": "d" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "l" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "p", + "id_val": "p", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestDelete/edge_last.d2,0:0:0-0:5:5", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/edge_last.d2,0:0:0-0:1:1", + "value": [ + { + "string": "l", + "raw_string": "l" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/edge_last.d2,0:2:2-0:3:3", + "value": [ + { + "string": "p", + "raw_string": "p" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/edge_last.d2,0:4:4-0:5:5", + "value": [ + { + "string": "d", + "raw_string": "d" + } + ] + } + } + ] + }, + "key_path_index": 1, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "p" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "d", + "id_val": "d", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestDelete/edge_last.d2,0:0:0-0:5:5", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/edge_last.d2,0:0:0-0:1:1", + "value": [ + { + "string": "l", + "raw_string": "l" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/edge_last.d2,0:2:2-0:3:3", + "value": [ + { + "string": "p", + "raw_string": "p" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/edge_last.d2,0:4:4-0:5:5", + "value": [ + { + "string": "d", + "raw_string": "d" + } + ] + } + } + ] + }, + "key_path_index": 2, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "d" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "p", + "id_val": "p", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestDelete/edge_last.d2,0:26:26-0:27:27", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/edge_last.d2,0:26:26-0:27:27", + "value": [ + { + "string": "p", + "raw_string": "p" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "p" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "x", + "id_val": "x", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestDelete/edge_last.d2,0:8:8-0:10:10", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/edge_last.d2,0:8:8-0:9:9", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "x" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "y", + "id_val": "y", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestDelete/edge_last.d2,0:12:12-0:15:15", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/edge_last.d2,0:13:13-0:14:14", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + }, + { + "key": { + "range": "d2/testdata/d2oracle/TestDelete/edge_last.d2,0:12:12-0:15:15", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/edge_last.d2,0:13:13-0:14:14", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 1 + } + ], + "attributes": { + "label": { + "value": "y" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "z", + "id_val": "z", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestDelete/edge_last.d2,0:17:17-0:20:20", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/edge_last.d2,0:18:18-0:19:19", + "value": [ + { + "string": "z", + "raw_string": "z" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 1 + }, + { + "key": { + "range": "d2/testdata/d2oracle/TestDelete/edge_last.d2,0:17:17-0:20:20", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/edge_last.d2,0:18:18-0:19:19", + "value": [ + { + "string": "z", + "raw_string": "z" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 2 + } + ], + "attributes": { + "label": { + "value": "z" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "q", + "id_val": "q", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestDelete/edge_last.d2,0:22:22-0:24:24", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/edge_last.d2,0:23:23-0:24:24", + "value": [ + { + "string": "q", + "raw_string": "q" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 2 + } + ], + "attributes": { + "label": { + "value": "q" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ] + }, + "err": "" +} diff --git a/testdata/d2oracle/TestDelete/edge_map_style.exp.json b/testdata/d2oracle/TestDelete/edge_map_style.exp.json new file mode 100644 index 000000000..9192eebd7 --- /dev/null +++ b/testdata/d2oracle/TestDelete/edge_map_style.exp.json @@ -0,0 +1,185 @@ +{ + "graph": { + "ast": { + "range": "d2/testdata/d2oracle/TestDelete/edge_map_style.d2,0:0:0-1:0:7", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestDelete/edge_map_style.d2,0:0:0-0:6:6", + "edges": [ + { + "range": "d2/testdata/d2oracle/TestDelete/edge_map_style.d2,0:0:0-0:6:6", + "src": { + "range": "d2/testdata/d2oracle/TestDelete/edge_map_style.d2,0:0:0-0:2:2", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/edge_map_style.d2,0:0:0-0:1:1", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "src_arrow": "", + "dst": { + "range": "d2/testdata/d2oracle/TestDelete/edge_map_style.d2,0:4:4-0:6:6", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/edge_map_style.d2,0:5:5-0:6:6", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + } + ] + }, + "dst_arrow": ">" + } + ], + "primary": {}, + "value": {} + } + } + ] + }, + "root": { + "id": "", + "id_val": "", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + "edges": [ + { + "index": 0, + "minWidth": 0, + "minHeight": 0, + "label_dimensions": { + "width": 0, + "height": 0 + }, + "isCurve": false, + "src_arrow": false, + "dst_arrow": true, + "references": [ + { + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ], + "objects": [ + { + "id": "x", + "id_val": "x", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestDelete/edge_map_style.d2,0:0:0-0:2:2", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/edge_map_style.d2,0:0:0-0:1:1", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "x" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "y", + "id_val": "y", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestDelete/edge_map_style.d2,0:4:4-0:6:6", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/edge_map_style.d2,0:5:5-0:6:6", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "y" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ] + }, + "err": "" +} diff --git a/testdata/d2oracle/TestDelete/edge_middle.exp.json b/testdata/d2oracle/TestDelete/edge_middle.exp.json new file mode 100644 index 000000000..ddb63fae2 --- /dev/null +++ b/testdata/d2oracle/TestDelete/edge_middle.exp.json @@ -0,0 +1,699 @@ +{ + "graph": { + "ast": { + "range": "d2/testdata/d2oracle/TestDelete/edge_middle.d2,0:0:0-1:0:29", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestDelete/edge_middle.d2,0:0:0-0:28:28", + "key": { + "range": "d2/testdata/d2oracle/TestDelete/edge_middle.d2,0:0:0-0:5:5", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/edge_middle.d2,0:0:0-0:1:1", + "value": [ + { + "string": "l", + "raw_string": "l" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/edge_middle.d2,0:2:2-0:3:3", + "value": [ + { + "string": "p", + "raw_string": "p" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/edge_middle.d2,0:4:4-0:5:5", + "value": [ + { + "string": "d", + "raw_string": "d" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "map": { + "range": "d2/testdata/d2oracle/TestDelete/edge_middle.d2,0:7:7-0:27:27", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestDelete/edge_middle.d2,0:8:8-0:19:19", + "edges": [ + { + "range": "d2/testdata/d2oracle/TestDelete/edge_middle.d2,0:8:8-0:15:15", + "src": { + "range": "d2/testdata/d2oracle/TestDelete/edge_middle.d2,0:8:8-0:10:10", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/edge_middle.d2,0:8:8-0:9:9", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "src_arrow": "", + "dst": { + "range": "d2/testdata/d2oracle/TestDelete/edge_middle.d2,0:12:12-0:15:15", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/edge_middle.d2,0:13:13-0:14:14", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + } + ] + }, + "dst_arrow": ">" + }, + { + "range": "d2/testdata/d2oracle/TestDelete/edge_middle.d2,0:12:12-0:19:19", + "src": { + "range": "d2/testdata/d2oracle/TestDelete/edge_middle.d2,0:12:12-0:15:15", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/edge_middle.d2,0:13:13-0:14:14", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + } + ] + }, + "src_arrow": "", + "dst": { + "range": "d2/testdata/d2oracle/TestDelete/edge_middle.d2,0:17:17-0:19:19", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/edge_middle.d2,0:18:18-0:19:19", + "value": [ + { + "string": "z", + "raw_string": "z" + } + ] + } + } + ] + }, + "dst_arrow": ">" + } + ], + "primary": {}, + "value": {} + } + }, + { + "map_key": { + "range": "d2/testdata/d2oracle/TestDelete/edge_middle.d2,0:21:21-0:27:27", + "edges": [ + { + "range": "d2/testdata/d2oracle/TestDelete/edge_middle.d2,0:21:21-0:27:27", + "src": { + "range": "d2/testdata/d2oracle/TestDelete/edge_middle.d2,0:21:21-0:23:23", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/edge_middle.d2,0:21:21-0:22:22", + "value": [ + { + "string": "q", + "raw_string": "q" + } + ] + } + } + ] + }, + "src_arrow": "", + "dst": { + "range": "d2/testdata/d2oracle/TestDelete/edge_middle.d2,0:25:25-0:27:27", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/edge_middle.d2,0:26:26-0:27:27", + "value": [ + { + "string": "p", + "raw_string": "p" + } + ] + } + } + ] + }, + "dst_arrow": ">" + } + ], + "primary": {}, + "value": {} + } + } + ] + } + } + } + } + ] + }, + "root": { + "id": "", + "id_val": "", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + "edges": [ + { + "index": 0, + "minWidth": 0, + "minHeight": 0, + "label_dimensions": { + "width": 0, + "height": 0 + }, + "isCurve": false, + "src_arrow": false, + "dst_arrow": true, + "references": [ + { + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "index": 0, + "minWidth": 0, + "minHeight": 0, + "label_dimensions": { + "width": 0, + "height": 0 + }, + "isCurve": false, + "src_arrow": false, + "dst_arrow": true, + "references": [ + { + "map_key_edge_index": 1 + } + ], + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "index": 0, + "minWidth": 0, + "minHeight": 0, + "label_dimensions": { + "width": 0, + "height": 0 + }, + "isCurve": false, + "src_arrow": false, + "dst_arrow": true, + "references": [ + { + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ], + "objects": [ + { + "id": "l", + "id_val": "l", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestDelete/edge_middle.d2,0:0:0-0:5:5", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/edge_middle.d2,0:0:0-0:1:1", + "value": [ + { + "string": "l", + "raw_string": "l" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/edge_middle.d2,0:2:2-0:3:3", + "value": [ + { + "string": "p", + "raw_string": "p" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/edge_middle.d2,0:4:4-0:5:5", + "value": [ + { + "string": "d", + "raw_string": "d" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "l" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "p", + "id_val": "p", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestDelete/edge_middle.d2,0:0:0-0:5:5", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/edge_middle.d2,0:0:0-0:1:1", + "value": [ + { + "string": "l", + "raw_string": "l" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/edge_middle.d2,0:2:2-0:3:3", + "value": [ + { + "string": "p", + "raw_string": "p" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/edge_middle.d2,0:4:4-0:5:5", + "value": [ + { + "string": "d", + "raw_string": "d" + } + ] + } + } + ] + }, + "key_path_index": 1, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "p" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "d", + "id_val": "d", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestDelete/edge_middle.d2,0:0:0-0:5:5", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/edge_middle.d2,0:0:0-0:1:1", + "value": [ + { + "string": "l", + "raw_string": "l" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/edge_middle.d2,0:2:2-0:3:3", + "value": [ + { + "string": "p", + "raw_string": "p" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/edge_middle.d2,0:4:4-0:5:5", + "value": [ + { + "string": "d", + "raw_string": "d" + } + ] + } + } + ] + }, + "key_path_index": 2, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "d" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "x", + "id_val": "x", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestDelete/edge_middle.d2,0:8:8-0:10:10", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/edge_middle.d2,0:8:8-0:9:9", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "x" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "y", + "id_val": "y", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestDelete/edge_middle.d2,0:12:12-0:15:15", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/edge_middle.d2,0:13:13-0:14:14", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + }, + { + "key": { + "range": "d2/testdata/d2oracle/TestDelete/edge_middle.d2,0:12:12-0:15:15", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/edge_middle.d2,0:13:13-0:14:14", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 1 + } + ], + "attributes": { + "label": { + "value": "y" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "z", + "id_val": "z", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestDelete/edge_middle.d2,0:17:17-0:19:19", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/edge_middle.d2,0:18:18-0:19:19", + "value": [ + { + "string": "z", + "raw_string": "z" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 1 + } + ], + "attributes": { + "label": { + "value": "z" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "q", + "id_val": "q", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestDelete/edge_middle.d2,0:21:21-0:23:23", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/edge_middle.d2,0:21:21-0:22:22", + "value": [ + { + "string": "q", + "raw_string": "q" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "q" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "p", + "id_val": "p", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestDelete/edge_middle.d2,0:25:25-0:27:27", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/edge_middle.d2,0:26:26-0:27:27", + "value": [ + { + "string": "p", + "raw_string": "p" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "p" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ] + }, + "err": "" +} diff --git a/testdata/d2oracle/TestDelete/empty_map.exp.json b/testdata/d2oracle/TestDelete/empty_map.exp.json new file mode 100644 index 000000000..fdcec95ac --- /dev/null +++ b/testdata/d2oracle/TestDelete/empty_map.exp.json @@ -0,0 +1,163 @@ +{ + "graph": { + "ast": { + "range": "d2/testdata/d2oracle/TestDelete/empty_map.d2,0:0:0-3:0:11", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestDelete/empty_map.d2,0:0:0-2:1:10", + "key": { + "range": "d2/testdata/d2oracle/TestDelete/empty_map.d2,0:0:0-0:1:1", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/empty_map.d2,0:0:0-0:1:1", + "value": [ + { + "string": "c", + "raw_string": "c" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "map": { + "range": "d2/testdata/d2oracle/TestDelete/empty_map.d2,0:3:3-2:0:9", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestDelete/empty_map.d2,1:2:7-1:3:8", + "key": { + "range": "d2/testdata/d2oracle/TestDelete/empty_map.d2,1:2:7-1:3:8", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/empty_map.d2,1:2:7-1:3:8", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + } + ] + }, + "primary": {}, + "value": {} + } + } + ] + } + } + } + } + ] + }, + "root": { + "id": "", + "id_val": "", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + "edges": null, + "objects": [ + { + "id": "c", + "id_val": "c", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestDelete/empty_map.d2,0:0:0-0:1:1", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/empty_map.d2,0:0:0-0:1:1", + "value": [ + { + "string": "c", + "raw_string": "c" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "c" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "y", + "id_val": "y", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestDelete/empty_map.d2,1:2:7-1:3:8", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/empty_map.d2,1:2:7-1:3:8", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "y" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ] + }, + "err": "" +} diff --git a/testdata/d2oracle/TestDelete/flat.exp.json b/testdata/d2oracle/TestDelete/flat.exp.json new file mode 100644 index 000000000..3b726f41f --- /dev/null +++ b/testdata/d2oracle/TestDelete/flat.exp.json @@ -0,0 +1,29 @@ +{ + "graph": { + "ast": { + "range": "d2/testdata/d2oracle/TestDelete/flat.d2,0:0:0-0:0:0", + "nodes": null + }, + "root": { + "id": "", + "id_val": "", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + "edges": null, + "objects": null + }, + "err": "" +} diff --git a/testdata/d2oracle/TestDelete/flat_middle_container.exp.json b/testdata/d2oracle/TestDelete/flat_middle_container.exp.json new file mode 100644 index 000000000..9f9c8547c --- /dev/null +++ b/testdata/d2oracle/TestDelete/flat_middle_container.exp.json @@ -0,0 +1,167 @@ +{ + "graph": { + "ast": { + "range": "d2/testdata/d2oracle/TestDelete/flat_middle_container.d2,0:0:0-1:0:4", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestDelete/flat_middle_container.d2,0:0:0-0:3:3", + "key": { + "range": "d2/testdata/d2oracle/TestDelete/flat_middle_container.d2,0:0:0-0:3:3", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/flat_middle_container.d2,0:0:0-0:1:1", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/flat_middle_container.d2,0:2:2-0:3:3", + "value": [ + { + "string": "c", + "raw_string": "c" + } + ] + } + } + ] + }, + "primary": {}, + "value": {} + } + } + ] + }, + "root": { + "id": "", + "id_val": "", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + "edges": null, + "objects": [ + { + "id": "a", + "id_val": "a", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestDelete/flat_middle_container.d2,0:0:0-0:3:3", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/flat_middle_container.d2,0:0:0-0:1:1", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/flat_middle_container.d2,0:2:2-0:3:3", + "value": [ + { + "string": "c", + "raw_string": "c" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "a" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "c", + "id_val": "c", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestDelete/flat_middle_container.d2,0:0:0-0:3:3", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/flat_middle_container.d2,0:0:0-0:1:1", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/flat_middle_container.d2,0:2:2-0:3:3", + "value": [ + { + "string": "c", + "raw_string": "c" + } + ] + } + } + ] + }, + "key_path_index": 1, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "c" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ] + }, + "err": "" +} diff --git a/testdata/d2oracle/TestDelete/flat_reserved.exp.json b/testdata/d2oracle/TestDelete/flat_reserved.exp.json new file mode 100644 index 000000000..d88534289 --- /dev/null +++ b/testdata/d2oracle/TestDelete/flat_reserved.exp.json @@ -0,0 +1,185 @@ +{ + "graph": { + "ast": { + "range": "d2/testdata/d2oracle/TestDelete/flat_reserved.d2,0:0:0-1:0:7", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestDelete/flat_reserved.d2,0:0:0-0:6:6", + "edges": [ + { + "range": "d2/testdata/d2oracle/TestDelete/flat_reserved.d2,0:0:0-0:6:6", + "src": { + "range": "d2/testdata/d2oracle/TestDelete/flat_reserved.d2,0:0:0-0:2:2", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/flat_reserved.d2,0:0:0-0:1:1", + "value": [ + { + "string": "A", + "raw_string": "A" + } + ] + } + } + ] + }, + "src_arrow": "", + "dst": { + "range": "d2/testdata/d2oracle/TestDelete/flat_reserved.d2,0:4:4-0:6:6", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/flat_reserved.d2,0:5:5-0:6:6", + "value": [ + { + "string": "B", + "raw_string": "B" + } + ] + } + } + ] + }, + "dst_arrow": ">" + } + ], + "primary": {}, + "value": {} + } + } + ] + }, + "root": { + "id": "", + "id_val": "", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + "edges": [ + { + "index": 0, + "minWidth": 0, + "minHeight": 0, + "label_dimensions": { + "width": 0, + "height": 0 + }, + "isCurve": false, + "src_arrow": false, + "dst_arrow": true, + "references": [ + { + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ], + "objects": [ + { + "id": "A", + "id_val": "A", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestDelete/flat_reserved.d2,0:0:0-0:2:2", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/flat_reserved.d2,0:0:0-0:1:1", + "value": [ + { + "string": "A", + "raw_string": "A" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "A" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "B", + "id_val": "B", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestDelete/flat_reserved.d2,0:4:4-0:6:6", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/flat_reserved.d2,0:5:5-0:6:6", + "value": [ + { + "string": "B", + "raw_string": "B" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "B" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ] + }, + "err": "" +} diff --git a/testdata/d2oracle/TestDelete/hoist_children.exp.json b/testdata/d2oracle/TestDelete/hoist_children.exp.json new file mode 100644 index 000000000..ce3647df9 --- /dev/null +++ b/testdata/d2oracle/TestDelete/hoist_children.exp.json @@ -0,0 +1,163 @@ +{ + "graph": { + "ast": { + "range": "d2/testdata/d2oracle/TestDelete/hoist_children.d2,0:0:0-3:0:11", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestDelete/hoist_children.d2,0:0:0-2:1:10", + "key": { + "range": "d2/testdata/d2oracle/TestDelete/hoist_children.d2,0:0:0-0:1:1", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/hoist_children.d2,0:0:0-0:1:1", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "map": { + "range": "d2/testdata/d2oracle/TestDelete/hoist_children.d2,0:3:3-2:0:9", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestDelete/hoist_children.d2,1:2:7-1:3:8", + "key": { + "range": "d2/testdata/d2oracle/TestDelete/hoist_children.d2,1:2:7-1:3:8", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/hoist_children.d2,1:2:7-1:3:8", + "value": [ + { + "string": "c", + "raw_string": "c" + } + ] + } + } + ] + }, + "primary": {}, + "value": {} + } + } + ] + } + } + } + } + ] + }, + "root": { + "id": "", + "id_val": "", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + "edges": null, + "objects": [ + { + "id": "a", + "id_val": "a", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestDelete/hoist_children.d2,0:0:0-0:1:1", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/hoist_children.d2,0:0:0-0:1:1", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "a" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "c", + "id_val": "c", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestDelete/hoist_children.d2,1:2:7-1:3:8", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/hoist_children.d2,1:2:7-1:3:8", + "value": [ + { + "string": "c", + "raw_string": "c" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "c" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ] + }, + "err": "" +} diff --git a/testdata/d2oracle/TestDelete/hoist_edge_children.exp.json b/testdata/d2oracle/TestDelete/hoist_edge_children.exp.json new file mode 100644 index 000000000..76fbfc09c --- /dev/null +++ b/testdata/d2oracle/TestDelete/hoist_edge_children.exp.json @@ -0,0 +1,248 @@ +{ + "graph": { + "ast": { + "range": "d2/testdata/d2oracle/TestDelete/hoist_edge_children.d2,0:0:0-2:0:9", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestDelete/hoist_edge_children.d2,0:0:0-0:1:1", + "key": { + "range": "d2/testdata/d2oracle/TestDelete/hoist_edge_children.d2,0:0:0-0:1:1", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/hoist_edge_children.d2,0:0:0-0:1:1", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + } + ] + }, + "primary": {}, + "value": {} + } + }, + { + "map_key": { + "range": "d2/testdata/d2oracle/TestDelete/hoist_edge_children.d2,1:0:2-1:6:8", + "edges": [ + { + "range": "d2/testdata/d2oracle/TestDelete/hoist_edge_children.d2,1:0:2-1:6:8", + "src": { + "range": "d2/testdata/d2oracle/TestDelete/hoist_edge_children.d2,1:0:2-1:2:4", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/hoist_edge_children.d2,1:0:2-1:1:3", + "value": [ + { + "string": "c", + "raw_string": "c" + } + ] + } + } + ] + }, + "src_arrow": "", + "dst": { + "range": "d2/testdata/d2oracle/TestDelete/hoist_edge_children.d2,1:4:6-1:6:8", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/hoist_edge_children.d2,1:5:7-1:6:8", + "value": [ + { + "string": "d", + "raw_string": "d" + } + ] + } + } + ] + }, + "dst_arrow": ">" + } + ], + "primary": {}, + "value": {} + } + } + ] + }, + "root": { + "id": "", + "id_val": "", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + "edges": [ + { + "index": 0, + "minWidth": 0, + "minHeight": 0, + "label_dimensions": { + "width": 0, + "height": 0 + }, + "isCurve": false, + "src_arrow": false, + "dst_arrow": true, + "references": [ + { + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ], + "objects": [ + { + "id": "b", + "id_val": "b", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestDelete/hoist_edge_children.d2,0:0:0-0:1:1", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/hoist_edge_children.d2,0:0:0-0:1:1", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "b" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "c", + "id_val": "c", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestDelete/hoist_edge_children.d2,1:0:2-1:2:4", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/hoist_edge_children.d2,1:0:2-1:1:3", + "value": [ + { + "string": "c", + "raw_string": "c" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "c" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "d", + "id_val": "d", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestDelete/hoist_edge_children.d2,1:4:6-1:6:8", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/hoist_edge_children.d2,1:5:7-1:6:8", + "value": [ + { + "string": "d", + "raw_string": "d" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "d" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ] + }, + "err": "" +} diff --git a/testdata/d2oracle/TestDelete/implicit_flat_style.exp.json b/testdata/d2oracle/TestDelete/implicit_flat_style.exp.json new file mode 100644 index 000000000..5961955ca --- /dev/null +++ b/testdata/d2oracle/TestDelete/implicit_flat_style.exp.json @@ -0,0 +1,94 @@ +{ + "graph": { + "ast": { + "range": "d2/testdata/d2oracle/TestDelete/implicit_flat_style.d2,0:0:0-1:0:2", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestDelete/implicit_flat_style.d2,0:0:0-0:1:1", + "key": { + "range": "d2/testdata/d2oracle/TestDelete/implicit_flat_style.d2,0:0:0-0:1:1", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/implicit_flat_style.d2,0:0:0-0:1:1", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "primary": {}, + "value": {} + } + } + ] + }, + "root": { + "id": "", + "id_val": "", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + "edges": null, + "objects": [ + { + "id": "x", + "id_val": "x", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestDelete/implicit_flat_style.d2,0:0:0-0:1:1", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/implicit_flat_style.d2,0:0:0-0:1:1", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "x" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ] + }, + "err": "" +} diff --git a/testdata/d2oracle/TestDelete/key_with_edges.exp.json b/testdata/d2oracle/TestDelete/key_with_edges.exp.json new file mode 100644 index 000000000..86af57e00 --- /dev/null +++ b/testdata/d2oracle/TestDelete/key_with_edges.exp.json @@ -0,0 +1,283 @@ +{ + "graph": { + "ast": { + "range": "d2/testdata/d2oracle/TestDelete/key_with_edges.d2,0:0:0-2:0:22", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestDelete/key_with_edges.d2,0:0:0-0:10:10", + "key": { + "range": "d2/testdata/d2oracle/TestDelete/key_with_edges.d2,0:0:0-0:10:10", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/key_with_edges.d2,0:0:0-0:5:5", + "value": [ + { + "string": "hello", + "raw_string": "hello" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/key_with_edges.d2,0:6:6-0:10:10", + "value": [ + { + "string": "meow", + "raw_string": "meow" + } + ] + } + } + ] + }, + "primary": {}, + "value": {} + } + }, + { + "map_key": { + "range": "d2/testdata/d2oracle/TestDelete/key_with_edges.d2,1:0:11-1:10:21", + "key": { + "range": "d2/testdata/d2oracle/TestDelete/key_with_edges.d2,1:0:11-1:10:21", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/key_with_edges.d2,1:0:11-1:5:16", + "value": [ + { + "string": "hello", + "raw_string": "hello" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/key_with_edges.d2,1:6:17-1:10:21", + "value": [ + { + "string": "bark", + "raw_string": "bark" + } + ] + } + } + ] + }, + "primary": {}, + "value": {} + } + } + ] + }, + "root": { + "id": "", + "id_val": "", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + "edges": null, + "objects": [ + { + "id": "hello", + "id_val": "hello", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestDelete/key_with_edges.d2,0:0:0-0:10:10", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/key_with_edges.d2,0:0:0-0:5:5", + "value": [ + { + "string": "hello", + "raw_string": "hello" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/key_with_edges.d2,0:6:6-0:10:10", + "value": [ + { + "string": "meow", + "raw_string": "meow" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + }, + { + "key": { + "range": "d2/testdata/d2oracle/TestDelete/key_with_edges.d2,1:0:11-1:10:21", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/key_with_edges.d2,1:0:11-1:5:16", + "value": [ + { + "string": "hello", + "raw_string": "hello" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/key_with_edges.d2,1:6:17-1:10:21", + "value": [ + { + "string": "bark", + "raw_string": "bark" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "hello" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "meow", + "id_val": "meow", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestDelete/key_with_edges.d2,0:0:0-0:10:10", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/key_with_edges.d2,0:0:0-0:5:5", + "value": [ + { + "string": "hello", + "raw_string": "hello" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/key_with_edges.d2,0:6:6-0:10:10", + "value": [ + { + "string": "meow", + "raw_string": "meow" + } + ] + } + } + ] + }, + "key_path_index": 1, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "meow" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "bark", + "id_val": "bark", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestDelete/key_with_edges.d2,1:0:11-1:10:21", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/key_with_edges.d2,1:0:11-1:5:16", + "value": [ + { + "string": "hello", + "raw_string": "hello" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/key_with_edges.d2,1:6:17-1:10:21", + "value": [ + { + "string": "bark", + "raw_string": "bark" + } + ] + } + } + ] + }, + "key_path_index": 1, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "bark" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ] + }, + "err": "" +} diff --git a/testdata/d2oracle/TestDelete/key_with_edges_2.exp.json b/testdata/d2oracle/TestDelete/key_with_edges_2.exp.json new file mode 100644 index 000000000..e28a0ee89 --- /dev/null +++ b/testdata/d2oracle/TestDelete/key_with_edges_2.exp.json @@ -0,0 +1,167 @@ +{ + "graph": { + "ast": { + "range": "d2/testdata/d2oracle/TestDelete/key_with_edges_2.d2,0:0:0-1:0:11", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestDelete/key_with_edges_2.d2,0:0:0-0:10:10", + "key": { + "range": "d2/testdata/d2oracle/TestDelete/key_with_edges_2.d2,0:0:0-0:10:10", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/key_with_edges_2.d2,0:0:0-0:5:5", + "value": [ + { + "string": "hello", + "raw_string": "hello" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/key_with_edges_2.d2,0:6:6-0:10:10", + "value": [ + { + "string": "bark", + "raw_string": "bark" + } + ] + } + } + ] + }, + "primary": {}, + "value": {} + } + } + ] + }, + "root": { + "id": "", + "id_val": "", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + "edges": null, + "objects": [ + { + "id": "hello", + "id_val": "hello", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestDelete/key_with_edges_2.d2,0:0:0-0:10:10", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/key_with_edges_2.d2,0:0:0-0:5:5", + "value": [ + { + "string": "hello", + "raw_string": "hello" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/key_with_edges_2.d2,0:6:6-0:10:10", + "value": [ + { + "string": "bark", + "raw_string": "bark" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "hello" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "bark", + "id_val": "bark", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestDelete/key_with_edges_2.d2,0:0:0-0:10:10", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/key_with_edges_2.d2,0:0:0-0:5:5", + "value": [ + { + "string": "hello", + "raw_string": "hello" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/key_with_edges_2.d2,0:6:6-0:10:10", + "value": [ + { + "string": "bark", + "raw_string": "bark" + } + ] + } + } + ] + }, + "key_path_index": 1, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "bark" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ] + }, + "err": "" +} diff --git a/testdata/d2oracle/TestDelete/key_with_edges_3.exp.json b/testdata/d2oracle/TestDelete/key_with_edges_3.exp.json new file mode 100644 index 000000000..ae39b7716 --- /dev/null +++ b/testdata/d2oracle/TestDelete/key_with_edges_3.exp.json @@ -0,0 +1,167 @@ +{ + "graph": { + "ast": { + "range": "d2/testdata/d2oracle/TestDelete/key_with_edges_3.d2,0:0:0-1:0:11", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestDelete/key_with_edges_3.d2,0:0:0-0:10:10", + "key": { + "range": "d2/testdata/d2oracle/TestDelete/key_with_edges_3.d2,0:0:0-0:10:10", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/key_with_edges_3.d2,0:0:0-0:5:5", + "value": [ + { + "string": "hello", + "raw_string": "hello" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/key_with_edges_3.d2,0:6:6-0:10:10", + "value": [ + { + "string": "bark", + "raw_string": "bark" + } + ] + } + } + ] + }, + "primary": {}, + "value": {} + } + } + ] + }, + "root": { + "id": "", + "id_val": "", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + "edges": null, + "objects": [ + { + "id": "hello", + "id_val": "hello", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestDelete/key_with_edges_3.d2,0:0:0-0:10:10", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/key_with_edges_3.d2,0:0:0-0:5:5", + "value": [ + { + "string": "hello", + "raw_string": "hello" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/key_with_edges_3.d2,0:6:6-0:10:10", + "value": [ + { + "string": "bark", + "raw_string": "bark" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "hello" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "bark", + "id_val": "bark", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestDelete/key_with_edges_3.d2,0:0:0-0:10:10", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/key_with_edges_3.d2,0:0:0-0:5:5", + "value": [ + { + "string": "hello", + "raw_string": "hello" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/key_with_edges_3.d2,0:6:6-0:10:10", + "value": [ + { + "string": "bark", + "raw_string": "bark" + } + ] + } + } + ] + }, + "key_path_index": 1, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "bark" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ] + }, + "err": "" +} diff --git a/testdata/d2oracle/TestDelete/key_with_edges_4.exp.json b/testdata/d2oracle/TestDelete/key_with_edges_4.exp.json new file mode 100644 index 000000000..cbe160768 --- /dev/null +++ b/testdata/d2oracle/TestDelete/key_with_edges_4.exp.json @@ -0,0 +1,283 @@ +{ + "graph": { + "ast": { + "range": "d2/testdata/d2oracle/TestDelete/key_with_edges_4.d2,0:0:0-2:0:22", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestDelete/key_with_edges_4.d2,0:0:0-0:10:10", + "key": { + "range": "d2/testdata/d2oracle/TestDelete/key_with_edges_4.d2,0:0:0-0:10:10", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/key_with_edges_4.d2,0:0:0-0:5:5", + "value": [ + { + "string": "hello", + "raw_string": "hello" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/key_with_edges_4.d2,0:6:6-0:10:10", + "value": [ + { + "string": "meow", + "raw_string": "meow" + } + ] + } + } + ] + }, + "primary": {}, + "value": {} + } + }, + { + "map_key": { + "range": "d2/testdata/d2oracle/TestDelete/key_with_edges_4.d2,1:0:11-1:10:21", + "key": { + "range": "d2/testdata/d2oracle/TestDelete/key_with_edges_4.d2,1:0:11-1:10:21", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/key_with_edges_4.d2,1:0:11-1:5:16", + "value": [ + { + "string": "hello", + "raw_string": "hello" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/key_with_edges_4.d2,1:6:17-1:10:21", + "value": [ + { + "string": "bark", + "raw_string": "bark" + } + ] + } + } + ] + }, + "primary": {}, + "value": {} + } + } + ] + }, + "root": { + "id": "", + "id_val": "", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + "edges": null, + "objects": [ + { + "id": "hello", + "id_val": "hello", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestDelete/key_with_edges_4.d2,0:0:0-0:10:10", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/key_with_edges_4.d2,0:0:0-0:5:5", + "value": [ + { + "string": "hello", + "raw_string": "hello" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/key_with_edges_4.d2,0:6:6-0:10:10", + "value": [ + { + "string": "meow", + "raw_string": "meow" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + }, + { + "key": { + "range": "d2/testdata/d2oracle/TestDelete/key_with_edges_4.d2,1:0:11-1:10:21", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/key_with_edges_4.d2,1:0:11-1:5:16", + "value": [ + { + "string": "hello", + "raw_string": "hello" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/key_with_edges_4.d2,1:6:17-1:10:21", + "value": [ + { + "string": "bark", + "raw_string": "bark" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "hello" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "meow", + "id_val": "meow", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestDelete/key_with_edges_4.d2,0:0:0-0:10:10", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/key_with_edges_4.d2,0:0:0-0:5:5", + "value": [ + { + "string": "hello", + "raw_string": "hello" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/key_with_edges_4.d2,0:6:6-0:10:10", + "value": [ + { + "string": "meow", + "raw_string": "meow" + } + ] + } + } + ] + }, + "key_path_index": 1, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "meow" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "bark", + "id_val": "bark", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestDelete/key_with_edges_4.d2,1:0:11-1:10:21", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/key_with_edges_4.d2,1:0:11-1:5:16", + "value": [ + { + "string": "hello", + "raw_string": "hello" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/key_with_edges_4.d2,1:6:17-1:10:21", + "value": [ + { + "string": "bark", + "raw_string": "bark" + } + ] + } + } + ] + }, + "key_path_index": 1, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "bark" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ] + }, + "err": "" +} diff --git a/testdata/d2oracle/TestDelete/multi_near.exp.json b/testdata/d2oracle/TestDelete/multi_near.exp.json new file mode 100644 index 000000000..2e97b7e1e --- /dev/null +++ b/testdata/d2oracle/TestDelete/multi_near.exp.json @@ -0,0 +1,391 @@ +{ + "graph": { + "ast": { + "range": "d2/testdata/d2oracle/TestDelete/multi_near.d2,0:0:0-9:0:57", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestDelete/multi_near.d2,0:0:0-0:3:3", + "key": { + "range": "d2/testdata/d2oracle/TestDelete/multi_near.d2,0:0:0-0:3:3", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/multi_near.d2,0:0:0-0:3:3", + "value": [ + { + "string": "API", + "raw_string": "API" + } + ] + } + } + ] + }, + "primary": {}, + "value": {} + } + }, + { + "map_key": { + "range": "d2/testdata/d2oracle/TestDelete/multi_near.d2,1:0:4-3:1:29", + "key": { + "range": "d2/testdata/d2oracle/TestDelete/multi_near.d2,1:0:4-1:8:12", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/multi_near.d2,1:0:4-1:8:12", + "value": [ + { + "string": "Bluefish", + "raw_string": "Bluefish" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "map": { + "range": "d2/testdata/d2oracle/TestDelete/multi_near.d2,1:10:14-3:0:28", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestDelete/multi_near.d2,2:2:18-2:11:27", + "key": { + "range": "d2/testdata/d2oracle/TestDelete/multi_near.d2,2:2:18-2:6:22", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/multi_near.d2,2:2:18-2:6:22", + "value": [ + { + "string": "near", + "raw_string": "near" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/multi_near.d2,2:8:24-2:11:27", + "value": [ + { + "string": "API", + "raw_string": "API" + } + ] + } + } + } + } + ] + } + } + } + }, + { + "map_key": { + "range": "d2/testdata/d2oracle/TestDelete/multi_near.d2,4:0:30-6:1:50", + "key": { + "range": "d2/testdata/d2oracle/TestDelete/multi_near.d2,4:0:30-4:2:32", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/multi_near.d2,4:0:30-4:2:32", + "value": [ + { + "string": "Yo", + "raw_string": "Yo" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "map": { + "range": "d2/testdata/d2oracle/TestDelete/multi_near.d2,4:4:34-6:0:49", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestDelete/multi_near.d2,5:2:38-5:12:48", + "key": { + "range": "d2/testdata/d2oracle/TestDelete/multi_near.d2,5:2:38-5:6:42", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/multi_near.d2,5:2:38-5:6:42", + "value": [ + { + "string": "near", + "raw_string": "near" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/multi_near.d2,5:8:44-5:12:48", + "value": [ + { + "string": "Blah", + "raw_string": "Blah" + } + ] + } + } + } + } + ] + } + } + } + }, + { + "map_key": { + "range": "d2/testdata/d2oracle/TestDelete/multi_near.d2,8:0:52-8:4:56", + "key": { + "range": "d2/testdata/d2oracle/TestDelete/multi_near.d2,8:0:52-8:4:56", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/multi_near.d2,8:0:52-8:4:56", + "value": [ + { + "string": "Blah", + "raw_string": "Blah" + } + ] + } + } + ] + }, + "primary": {}, + "value": {} + } + } + ] + }, + "root": { + "id": "", + "id_val": "", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + "edges": null, + "objects": [ + { + "id": "API", + "id_val": "API", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestDelete/multi_near.d2,0:0:0-0:3:3", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/multi_near.d2,0:0:0-0:3:3", + "value": [ + { + "string": "API", + "raw_string": "API" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "API" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "Bluefish", + "id_val": "Bluefish", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestDelete/multi_near.d2,1:0:4-1:8:12", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/multi_near.d2,1:0:4-1:8:12", + "value": [ + { + "string": "Bluefish", + "raw_string": "Bluefish" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "Bluefish" + }, + "style": {}, + "near_key": { + "range": ",0:0:0-0:3:3", + "path": [ + { + "unquoted_string": { + "range": ",0:0:0-0:3:3", + "value": [ + { + "string": "API", + "raw_string": "API" + } + ] + } + } + ] + }, + "shape": { + "value": "" + } + } + }, + { + "id": "Yo", + "id_val": "Yo", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestDelete/multi_near.d2,4:0:30-4:2:32", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/multi_near.d2,4:0:30-4:2:32", + "value": [ + { + "string": "Yo", + "raw_string": "Yo" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "Yo" + }, + "style": {}, + "near_key": { + "range": ",0:0:0-0:4:4", + "path": [ + { + "unquoted_string": { + "range": ",0:0:0-0:4:4", + "value": [ + { + "string": "Blah", + "raw_string": "Blah" + } + ] + } + } + ] + }, + "shape": { + "value": "" + } + } + }, + { + "id": "Blah", + "id_val": "Blah", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestDelete/multi_near.d2,8:0:52-8:4:56", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/multi_near.d2,8:0:52-8:4:56", + "value": [ + { + "string": "Blah", + "raw_string": "Blah" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "Blah" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ] + }, + "err": "" +} diff --git a/testdata/d2oracle/TestDelete/multi_path_map_conflict.exp.json b/testdata/d2oracle/TestDelete/multi_path_map_conflict.exp.json new file mode 100644 index 000000000..f19368cc7 --- /dev/null +++ b/testdata/d2oracle/TestDelete/multi_path_map_conflict.exp.json @@ -0,0 +1,275 @@ +{ + "graph": { + "ast": { + "range": "d2/testdata/d2oracle/TestDelete/multi_path_map_conflict.d2,0:0:0-6:0:24", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestDelete/multi_path_map_conflict.d2,0:0:0-2:1:12", + "key": { + "range": "d2/testdata/d2oracle/TestDelete/multi_path_map_conflict.d2,0:0:0-0:1:1", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/multi_path_map_conflict.d2,0:0:0-0:1:1", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "map": { + "range": "d2/testdata/d2oracle/TestDelete/multi_path_map_conflict.d2,0:3:3-2:0:11", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestDelete/multi_path_map_conflict.d2,1:2:7-1:5:10", + "key": { + "range": "d2/testdata/d2oracle/TestDelete/multi_path_map_conflict.d2,1:2:7-1:5:10", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/multi_path_map_conflict.d2,1:2:7-1:5:10", + "value": [ + { + "string": "z 2", + "raw_string": "z 2" + } + ] + } + } + ] + }, + "primary": {}, + "value": {} + } + } + ] + } + } + } + }, + { + "map_key": { + "range": "d2/testdata/d2oracle/TestDelete/multi_path_map_conflict.d2,3:0:13-5:1:23", + "key": { + "range": "d2/testdata/d2oracle/TestDelete/multi_path_map_conflict.d2,3:0:13-3:1:14", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/multi_path_map_conflict.d2,3:0:13-3:1:14", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "map": { + "range": "d2/testdata/d2oracle/TestDelete/multi_path_map_conflict.d2,3:3:16-5:0:22", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestDelete/multi_path_map_conflict.d2,4:2:20-4:3:21", + "key": { + "range": "d2/testdata/d2oracle/TestDelete/multi_path_map_conflict.d2,4:2:20-4:3:21", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/multi_path_map_conflict.d2,4:2:20-4:3:21", + "value": [ + { + "string": "z", + "raw_string": "z" + } + ] + } + } + ] + }, + "primary": {}, + "value": {} + } + } + ] + } + } + } + } + ] + }, + "root": { + "id": "", + "id_val": "", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + "edges": null, + "objects": [ + { + "id": "x", + "id_val": "x", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestDelete/multi_path_map_conflict.d2,0:0:0-0:1:1", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/multi_path_map_conflict.d2,0:0:0-0:1:1", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + }, + { + "key": { + "range": "d2/testdata/d2oracle/TestDelete/multi_path_map_conflict.d2,3:0:13-3:1:14", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/multi_path_map_conflict.d2,3:0:13-3:1:14", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "x" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "z 2", + "id_val": "z 2", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestDelete/multi_path_map_conflict.d2,1:2:7-1:5:10", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/multi_path_map_conflict.d2,1:2:7-1:5:10", + "value": [ + { + "string": "z 2", + "raw_string": "z 2" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "z 2" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "z", + "id_val": "z", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestDelete/multi_path_map_conflict.d2,4:2:20-4:3:21", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/multi_path_map_conflict.d2,4:2:20-4:3:21", + "value": [ + { + "string": "z", + "raw_string": "z" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "z" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ] + }, + "err": "" +} diff --git a/testdata/d2oracle/TestDelete/multi_path_map_no_conflict.exp.json b/testdata/d2oracle/TestDelete/multi_path_map_no_conflict.exp.json new file mode 100644 index 000000000..1fa0bbe92 --- /dev/null +++ b/testdata/d2oracle/TestDelete/multi_path_map_no_conflict.exp.json @@ -0,0 +1,226 @@ +{ + "graph": { + "ast": { + "range": "d2/testdata/d2oracle/TestDelete/multi_path_map_no_conflict.d2,0:0:0-5:0:14", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestDelete/multi_path_map_no_conflict.d2,0:0:0-2:1:10", + "key": { + "range": "d2/testdata/d2oracle/TestDelete/multi_path_map_no_conflict.d2,0:0:0-0:1:1", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/multi_path_map_no_conflict.d2,0:0:0-0:1:1", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "map": { + "range": "d2/testdata/d2oracle/TestDelete/multi_path_map_no_conflict.d2,0:3:3-2:0:9", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestDelete/multi_path_map_no_conflict.d2,1:2:7-1:3:8", + "key": { + "range": "d2/testdata/d2oracle/TestDelete/multi_path_map_no_conflict.d2,1:2:7-1:3:8", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/multi_path_map_no_conflict.d2,1:2:7-1:3:8", + "value": [ + { + "string": "z", + "raw_string": "z" + } + ] + } + } + ] + }, + "primary": {}, + "value": {} + } + } + ] + } + } + } + }, + { + "map_key": { + "range": "d2/testdata/d2oracle/TestDelete/multi_path_map_no_conflict.d2,4:0:12-4:1:13", + "key": { + "range": "d2/testdata/d2oracle/TestDelete/multi_path_map_no_conflict.d2,4:0:12-4:1:13", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/multi_path_map_no_conflict.d2,4:0:12-4:1:13", + "value": [ + { + "string": "z", + "raw_string": "z" + } + ] + } + } + ] + }, + "primary": {}, + "value": {} + } + } + ] + }, + "root": { + "id": "", + "id_val": "", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + "edges": null, + "objects": [ + { + "id": "y", + "id_val": "y", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestDelete/multi_path_map_no_conflict.d2,0:0:0-0:1:1", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/multi_path_map_no_conflict.d2,0:0:0-0:1:1", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "y" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "z", + "id_val": "z", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestDelete/multi_path_map_no_conflict.d2,1:2:7-1:3:8", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/multi_path_map_no_conflict.d2,1:2:7-1:3:8", + "value": [ + { + "string": "z", + "raw_string": "z" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "z" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "z", + "id_val": "z", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestDelete/multi_path_map_no_conflict.d2,4:0:12-4:1:13", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/multi_path_map_no_conflict.d2,4:0:12-4:1:13", + "value": [ + { + "string": "z", + "raw_string": "z" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "z" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ] + }, + "err": "" +} diff --git a/testdata/d2oracle/TestDelete/multiple_flat_middle_container.exp.json b/testdata/d2oracle/TestDelete/multiple_flat_middle_container.exp.json new file mode 100644 index 000000000..e3d219613 --- /dev/null +++ b/testdata/d2oracle/TestDelete/multiple_flat_middle_container.exp.json @@ -0,0 +1,283 @@ +{ + "graph": { + "ast": { + "range": "d2/testdata/d2oracle/TestDelete/multiple_flat_middle_container.d2,0:0:0-2:0:8", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestDelete/multiple_flat_middle_container.d2,0:0:0-0:3:3", + "key": { + "range": "d2/testdata/d2oracle/TestDelete/multiple_flat_middle_container.d2,0:0:0-0:3:3", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/multiple_flat_middle_container.d2,0:0:0-0:1:1", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/multiple_flat_middle_container.d2,0:2:2-0:3:3", + "value": [ + { + "string": "c", + "raw_string": "c" + } + ] + } + } + ] + }, + "primary": {}, + "value": {} + } + }, + { + "map_key": { + "range": "d2/testdata/d2oracle/TestDelete/multiple_flat_middle_container.d2,1:0:4-1:3:7", + "key": { + "range": "d2/testdata/d2oracle/TestDelete/multiple_flat_middle_container.d2,1:0:4-1:3:7", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/multiple_flat_middle_container.d2,1:0:4-1:1:5", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/multiple_flat_middle_container.d2,1:2:6-1:3:7", + "value": [ + { + "string": "d", + "raw_string": "d" + } + ] + } + } + ] + }, + "primary": {}, + "value": {} + } + } + ] + }, + "root": { + "id": "", + "id_val": "", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + "edges": null, + "objects": [ + { + "id": "a", + "id_val": "a", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestDelete/multiple_flat_middle_container.d2,0:0:0-0:3:3", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/multiple_flat_middle_container.d2,0:0:0-0:1:1", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/multiple_flat_middle_container.d2,0:2:2-0:3:3", + "value": [ + { + "string": "c", + "raw_string": "c" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + }, + { + "key": { + "range": "d2/testdata/d2oracle/TestDelete/multiple_flat_middle_container.d2,1:0:4-1:3:7", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/multiple_flat_middle_container.d2,1:0:4-1:1:5", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/multiple_flat_middle_container.d2,1:2:6-1:3:7", + "value": [ + { + "string": "d", + "raw_string": "d" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "a" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "c", + "id_val": "c", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestDelete/multiple_flat_middle_container.d2,0:0:0-0:3:3", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/multiple_flat_middle_container.d2,0:0:0-0:1:1", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/multiple_flat_middle_container.d2,0:2:2-0:3:3", + "value": [ + { + "string": "c", + "raw_string": "c" + } + ] + } + } + ] + }, + "key_path_index": 1, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "c" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "d", + "id_val": "d", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestDelete/multiple_flat_middle_container.d2,1:0:4-1:3:7", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/multiple_flat_middle_container.d2,1:0:4-1:1:5", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/multiple_flat_middle_container.d2,1:2:6-1:3:7", + "value": [ + { + "string": "d", + "raw_string": "d" + } + ] + } + } + ] + }, + "key_path_index": 1, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "d" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ] + }, + "err": "" +} diff --git a/testdata/d2oracle/TestDelete/multiple_flat_style.exp.json b/testdata/d2oracle/TestDelete/multiple_flat_style.exp.json new file mode 100644 index 000000000..1dfc04fcd --- /dev/null +++ b/testdata/d2oracle/TestDelete/multiple_flat_style.exp.json @@ -0,0 +1,148 @@ +{ + "graph": { + "ast": { + "range": "d2/testdata/d2oracle/TestDelete/multiple_flat_style.d2,0:0:0-1:0:21", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestDelete/multiple_flat_style.d2,0:0:0-0:20:20", + "key": { + "range": "d2/testdata/d2oracle/TestDelete/multiple_flat_style.d2,0:0:0-0:15:15", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/multiple_flat_style.d2,0:0:0-0:1:1", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/multiple_flat_style.d2,0:2:2-0:7:7", + "value": [ + { + "string": "style", + "raw_string": "style" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/multiple_flat_style.d2,0:8:8-0:15:15", + "value": [ + { + "string": "opacity", + "raw_string": "opacity" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "number": { + "range": "d2/testdata/d2oracle/TestDelete/multiple_flat_style.d2,0:17:17-0:20:20", + "raw": "0.4", + "value": "2/5" + } + } + } + } + ] + }, + "root": { + "id": "", + "id_val": "", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + "edges": [], + "objects": [ + { + "id": "x", + "id_val": "x", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestDelete/multiple_flat_style.d2,0:0:0-0:15:15", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/multiple_flat_style.d2,0:0:0-0:1:1", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/multiple_flat_style.d2,0:2:2-0:7:7", + "value": [ + { + "string": "style", + "raw_string": "style" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/multiple_flat_style.d2,0:8:8-0:15:15", + "value": [ + { + "string": "opacity", + "raw_string": "opacity" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "x" + }, + "style": { + "opacity": { + "value": "0.4" + } + }, + "near_key": null, + "shape": { + "value": "" + } + } + } + ] + }, + "err": "" +} diff --git a/testdata/d2oracle/TestDelete/multiple_map_styles.exp.json b/testdata/d2oracle/TestDelete/multiple_map_styles.exp.json new file mode 100644 index 000000000..683339df4 --- /dev/null +++ b/testdata/d2oracle/TestDelete/multiple_map_styles.exp.json @@ -0,0 +1,162 @@ +{ + "graph": { + "ast": { + "range": "d2/testdata/d2oracle/TestDelete/multiple_map_styles.d2,0:0:0-5:0:39", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestDelete/multiple_map_styles.d2,0:0:0-4:1:38", + "key": { + "range": "d2/testdata/d2oracle/TestDelete/multiple_map_styles.d2,0:0:0-0:1:1", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/multiple_map_styles.d2,0:0:0-0:1:1", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "map": { + "range": "d2/testdata/d2oracle/TestDelete/multiple_map_styles.d2,0:3:3-4:0:37", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestDelete/multiple_map_styles.d2,1:2:7-3:3:36", + "key": { + "range": "d2/testdata/d2oracle/TestDelete/multiple_map_styles.d2,1:2:7-1:7:12", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/multiple_map_styles.d2,1:2:7-1:7:12", + "value": [ + { + "string": "style", + "raw_string": "style" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "map": { + "range": "d2/testdata/d2oracle/TestDelete/multiple_map_styles.d2,1:9:14-3:2:35", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestDelete/multiple_map_styles.d2,2:4:20-2:16:32", + "key": { + "range": "d2/testdata/d2oracle/TestDelete/multiple_map_styles.d2,2:4:20-2:11:27", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/multiple_map_styles.d2,2:4:20-2:11:27", + "value": [ + { + "string": "opacity", + "raw_string": "opacity" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "number": { + "range": "d2/testdata/d2oracle/TestDelete/multiple_map_styles.d2,2:13:29-2:16:32", + "raw": "0.4", + "value": "2/5" + } + } + } + } + ] + } + } + } + } + ] + } + } + } + } + ] + }, + "root": { + "id": "", + "id_val": "", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + "edges": [], + "objects": [ + { + "id": "x", + "id_val": "x", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestDelete/multiple_map_styles.d2,0:0:0-0:1:1", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/multiple_map_styles.d2,0:0:0-0:1:1", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "x" + }, + "style": { + "opacity": { + "value": "0.4" + } + }, + "near_key": null, + "shape": { + "value": "" + } + } + } + ] + }, + "err": "" +} diff --git a/testdata/d2oracle/TestDelete/near#01.exp.json b/testdata/d2oracle/TestDelete/near#01.exp.json new file mode 100644 index 000000000..c92648c1c --- /dev/null +++ b/testdata/d2oracle/TestDelete/near#01.exp.json @@ -0,0 +1,95 @@ +{ + "graph": { + "ast": { + "range": "d2/testdata/d2oracle/TestDelete/near#01.d2,0:0:0-1:0:2", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestDelete/near#01.d2,0:0:0-0:1:1", + "key": { + "range": "d2/testdata/d2oracle/TestDelete/near#01.d2,0:0:0-0:1:1", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/near#01.d2,0:0:0-0:1:1", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "primary": {}, + "value": {} + } + } + ] + }, + "root": { + "id": "", + "id_val": "", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + "edges": null, + "objects": [ + { + "id": "x", + "id_val": "x", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestDelete/near#01.d2,0:0:0-0:1:1", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/near#01.d2,0:0:0-0:1:1", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0, + "scope_key": "" + } + ], + "attributes": { + "label": { + "value": "x" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ] + }, + "err": "" +} diff --git a/testdata/d2oracle/TestDelete/near.exp.json b/testdata/d2oracle/TestDelete/near.exp.json new file mode 100644 index 000000000..e24ccc8ec --- /dev/null +++ b/testdata/d2oracle/TestDelete/near.exp.json @@ -0,0 +1,94 @@ +{ + "graph": { + "ast": { + "range": "d2/testdata/d2oracle/TestDelete/near.d2,0:0:0-1:0:2", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestDelete/near.d2,0:0:0-0:1:1", + "key": { + "range": "d2/testdata/d2oracle/TestDelete/near.d2,0:0:0-0:1:1", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/near.d2,0:0:0-0:1:1", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "primary": {}, + "value": {} + } + } + ] + }, + "root": { + "id": "", + "id_val": "", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + "edges": null, + "objects": [ + { + "id": "x", + "id_val": "x", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestDelete/near.d2,0:0:0-0:1:1", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/near.d2,0:0:0-0:1:1", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "x" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ] + }, + "err": "" +} diff --git a/testdata/d2oracle/TestDelete/nested.exp.json b/testdata/d2oracle/TestDelete/nested.exp.json new file mode 100644 index 000000000..b48a53a3e --- /dev/null +++ b/testdata/d2oracle/TestDelete/nested.exp.json @@ -0,0 +1,262 @@ +{ + "graph": { + "ast": { + "range": "d2/testdata/d2oracle/TestDelete/nested.d2,0:0:0-1:0:6", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestDelete/nested.d2,0:0:0-0:5:5", + "key": { + "range": "d2/testdata/d2oracle/TestDelete/nested.d2,0:0:0-0:5:5", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/nested.d2,0:0:0-0:1:1", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/nested.d2,0:2:2-0:3:3", + "value": [ + { + "string": "c", + "raw_string": "c" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/nested.d2,0:4:4-0:5:5", + "value": [ + { + "string": "d", + "raw_string": "d" + } + ] + } + } + ] + }, + "primary": {}, + "value": {} + } + } + ] + }, + "root": { + "id": "", + "id_val": "", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + "edges": null, + "objects": [ + { + "id": "a", + "id_val": "a", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestDelete/nested.d2,0:0:0-0:5:5", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/nested.d2,0:0:0-0:1:1", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/nested.d2,0:2:2-0:3:3", + "value": [ + { + "string": "c", + "raw_string": "c" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/nested.d2,0:4:4-0:5:5", + "value": [ + { + "string": "d", + "raw_string": "d" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "a" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "c", + "id_val": "c", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestDelete/nested.d2,0:0:0-0:5:5", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/nested.d2,0:0:0-0:1:1", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/nested.d2,0:2:2-0:3:3", + "value": [ + { + "string": "c", + "raw_string": "c" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/nested.d2,0:4:4-0:5:5", + "value": [ + { + "string": "d", + "raw_string": "d" + } + ] + } + } + ] + }, + "key_path_index": 1, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "c" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "d", + "id_val": "d", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestDelete/nested.d2,0:0:0-0:5:5", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/nested.d2,0:0:0-0:1:1", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/nested.d2,0:2:2-0:3:3", + "value": [ + { + "string": "c", + "raw_string": "c" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/nested.d2,0:4:4-0:5:5", + "value": [ + { + "string": "d", + "raw_string": "d" + } + ] + } + } + ] + }, + "key_path_index": 2, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "d" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ] + }, + "err": "" +} diff --git a/testdata/d2oracle/TestDelete/nested_2.exp.json b/testdata/d2oracle/TestDelete/nested_2.exp.json new file mode 100644 index 000000000..96cd07897 --- /dev/null +++ b/testdata/d2oracle/TestDelete/nested_2.exp.json @@ -0,0 +1,262 @@ +{ + "graph": { + "ast": { + "range": "d2/testdata/d2oracle/TestDelete/nested_2.d2,0:0:0-1:0:6", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestDelete/nested_2.d2,0:0:0-0:5:5", + "key": { + "range": "d2/testdata/d2oracle/TestDelete/nested_2.d2,0:0:0-0:5:5", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/nested_2.d2,0:0:0-0:1:1", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/nested_2.d2,0:2:2-0:3:3", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/nested_2.d2,0:4:4-0:5:5", + "value": [ + { + "string": "c", + "raw_string": "c" + } + ] + } + } + ] + }, + "primary": {}, + "value": {} + } + } + ] + }, + "root": { + "id": "", + "id_val": "", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + "edges": null, + "objects": [ + { + "id": "a", + "id_val": "a", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestDelete/nested_2.d2,0:0:0-0:5:5", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/nested_2.d2,0:0:0-0:1:1", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/nested_2.d2,0:2:2-0:3:3", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/nested_2.d2,0:4:4-0:5:5", + "value": [ + { + "string": "c", + "raw_string": "c" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "a" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "b", + "id_val": "b", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestDelete/nested_2.d2,0:0:0-0:5:5", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/nested_2.d2,0:0:0-0:1:1", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/nested_2.d2,0:2:2-0:3:3", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/nested_2.d2,0:4:4-0:5:5", + "value": [ + { + "string": "c", + "raw_string": "c" + } + ] + } + } + ] + }, + "key_path_index": 1, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "b" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "c", + "id_val": "c", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestDelete/nested_2.d2,0:0:0-0:5:5", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/nested_2.d2,0:0:0-0:1:1", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/nested_2.d2,0:2:2-0:3:3", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/nested_2.d2,0:4:4-0:5:5", + "value": [ + { + "string": "c", + "raw_string": "c" + } + ] + } + } + ] + }, + "key_path_index": 2, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "c" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ] + }, + "err": "" +} diff --git a/testdata/d2oracle/TestDelete/nested_edge_key_style.exp.json b/testdata/d2oracle/TestDelete/nested_edge_key_style.exp.json new file mode 100644 index 000000000..81d77418a --- /dev/null +++ b/testdata/d2oracle/TestDelete/nested_edge_key_style.exp.json @@ -0,0 +1,254 @@ +{ + "graph": { + "ast": { + "range": "d2/testdata/d2oracle/TestDelete/nested_edge_key_style.d2,0:0:0-3:0:16", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestDelete/nested_edge_key_style.d2,0:0:0-2:1:15", + "key": { + "range": "d2/testdata/d2oracle/TestDelete/nested_edge_key_style.d2,0:0:0-0:1:1", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/nested_edge_key_style.d2,0:0:0-0:1:1", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "map": { + "range": "d2/testdata/d2oracle/TestDelete/nested_edge_key_style.d2,0:3:3-2:0:14", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestDelete/nested_edge_key_style.d2,1:2:7-1:8:13", + "edges": [ + { + "range": "d2/testdata/d2oracle/TestDelete/nested_edge_key_style.d2,1:2:7-1:8:13", + "src": { + "range": "d2/testdata/d2oracle/TestDelete/nested_edge_key_style.d2,1:2:7-1:4:9", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/nested_edge_key_style.d2,1:2:7-1:3:8", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "src_arrow": "", + "dst": { + "range": "d2/testdata/d2oracle/TestDelete/nested_edge_key_style.d2,1:6:11-1:8:13", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/nested_edge_key_style.d2,1:7:12-1:8:13", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + } + ] + }, + "dst_arrow": ">" + } + ], + "primary": {}, + "value": {} + } + } + ] + } + } + } + } + ] + }, + "root": { + "id": "", + "id_val": "", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + "edges": [ + { + "index": 0, + "minWidth": 0, + "minHeight": 0, + "label_dimensions": { + "width": 0, + "height": 0 + }, + "isCurve": false, + "src_arrow": false, + "dst_arrow": true, + "references": [ + { + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ], + "objects": [ + { + "id": "a", + "id_val": "a", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestDelete/nested_edge_key_style.d2,0:0:0-0:1:1", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/nested_edge_key_style.d2,0:0:0-0:1:1", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "a" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "x", + "id_val": "x", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestDelete/nested_edge_key_style.d2,1:2:7-1:4:9", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/nested_edge_key_style.d2,1:2:7-1:3:8", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "x" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "y", + "id_val": "y", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestDelete/nested_edge_key_style.d2,1:6:11-1:8:13", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/nested_edge_key_style.d2,1:7:12-1:8:13", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "y" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ] + }, + "err": "" +} diff --git a/testdata/d2oracle/TestDelete/nested_flat_style.exp.json b/testdata/d2oracle/TestDelete/nested_flat_style.exp.json new file mode 100644 index 000000000..0ace3fb9e --- /dev/null +++ b/testdata/d2oracle/TestDelete/nested_flat_style.exp.json @@ -0,0 +1,94 @@ +{ + "graph": { + "ast": { + "range": "d2/testdata/d2oracle/TestDelete/nested_flat_style.d2,0:0:0-1:0:2", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestDelete/nested_flat_style.d2,0:0:0-0:1:1", + "key": { + "range": "d2/testdata/d2oracle/TestDelete/nested_flat_style.d2,0:0:0-0:1:1", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/nested_flat_style.d2,0:0:0-0:1:1", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "primary": {}, + "value": {} + } + } + ] + }, + "root": { + "id": "", + "id_val": "", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + "edges": null, + "objects": [ + { + "id": "x", + "id_val": "x", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestDelete/nested_flat_style.d2,0:0:0-0:1:1", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/nested_flat_style.d2,0:0:0-0:1:1", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "x" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ] + }, + "err": "" +} diff --git a/testdata/d2oracle/TestDelete/nested_reserved.exp.json b/testdata/d2oracle/TestDelete/nested_reserved.exp.json new file mode 100644 index 000000000..119eb0ea5 --- /dev/null +++ b/testdata/d2oracle/TestDelete/nested_reserved.exp.json @@ -0,0 +1,358 @@ +{ + "graph": { + "ast": { + "range": "d2/testdata/d2oracle/TestDelete/nested_reserved.d2,0:0:0-2:0:15", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestDelete/nested_reserved.d2,0:0:0-0:3:3", + "key": { + "range": "d2/testdata/d2oracle/TestDelete/nested_reserved.d2,0:0:0-0:3:3", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/nested_reserved.d2,0:0:0-0:1:1", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/nested_reserved.d2,0:2:2-0:3:3", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + } + ] + }, + "primary": {}, + "value": {} + } + }, + { + "map_key": { + "range": "d2/testdata/d2oracle/TestDelete/nested_reserved.d2,1:0:4-1:10:14", + "key": { + "range": "d2/testdata/d2oracle/TestDelete/nested_reserved.d2,1:0:4-1:10:14", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/nested_reserved.d2,1:0:4-1:1:5", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/nested_reserved.d2,1:2:6-1:3:7", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/nested_reserved.d2,1:4:8-1:10:14", + "value": [ + { + "string": "jingle", + "raw_string": "jingle" + } + ] + } + } + ] + }, + "primary": {}, + "value": {} + } + } + ] + }, + "root": { + "id": "", + "id_val": "", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + "edges": null, + "objects": [ + { + "id": "x", + "id_val": "x", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestDelete/nested_reserved.d2,0:0:0-0:3:3", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/nested_reserved.d2,0:0:0-0:1:1", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/nested_reserved.d2,0:2:2-0:3:3", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + }, + { + "key": { + "range": "d2/testdata/d2oracle/TestDelete/nested_reserved.d2,1:0:4-1:10:14", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/nested_reserved.d2,1:0:4-1:1:5", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/nested_reserved.d2,1:2:6-1:3:7", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/nested_reserved.d2,1:4:8-1:10:14", + "value": [ + { + "string": "jingle", + "raw_string": "jingle" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "x" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "y", + "id_val": "y", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestDelete/nested_reserved.d2,0:0:0-0:3:3", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/nested_reserved.d2,0:0:0-0:1:1", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/nested_reserved.d2,0:2:2-0:3:3", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + } + ] + }, + "key_path_index": 1, + "map_key_edge_index": 0 + }, + { + "key": { + "range": "d2/testdata/d2oracle/TestDelete/nested_reserved.d2,1:0:4-1:10:14", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/nested_reserved.d2,1:0:4-1:1:5", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/nested_reserved.d2,1:2:6-1:3:7", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/nested_reserved.d2,1:4:8-1:10:14", + "value": [ + { + "string": "jingle", + "raw_string": "jingle" + } + ] + } + } + ] + }, + "key_path_index": 1, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "y" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "jingle", + "id_val": "jingle", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestDelete/nested_reserved.d2,1:0:4-1:10:14", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/nested_reserved.d2,1:0:4-1:1:5", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/nested_reserved.d2,1:2:6-1:3:7", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/nested_reserved.d2,1:4:8-1:10:14", + "value": [ + { + "string": "jingle", + "raw_string": "jingle" + } + ] + } + } + ] + }, + "key_path_index": 2, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "jingle" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ] + }, + "err": "" +} diff --git a/testdata/d2oracle/TestDelete/nested_underscore_update.exp.json b/testdata/d2oracle/TestDelete/nested_underscore_update.exp.json new file mode 100644 index 000000000..8e101cf94 --- /dev/null +++ b/testdata/d2oracle/TestDelete/nested_underscore_update.exp.json @@ -0,0 +1,185 @@ +{ + "graph": { + "ast": { + "range": "d2/testdata/d2oracle/TestDelete/nested_underscore_update.d2,0:0:0-3:0:20", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestDelete/nested_underscore_update.d2,0:0:0-2:1:19", + "key": { + "range": "d2/testdata/d2oracle/TestDelete/nested_underscore_update.d2,0:0:0-0:5:5", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/nested_underscore_update.d2,0:0:0-0:5:5", + "value": [ + { + "string": "books", + "raw_string": "books" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "map": { + "range": "d2/testdata/d2oracle/TestDelete/nested_underscore_update.d2,0:7:7-2:0:18", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestDelete/nested_underscore_update.d2,1:2:11-1:8:17", + "key": { + "range": "d2/testdata/d2oracle/TestDelete/nested_underscore_update.d2,1:2:11-1:8:17", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/nested_underscore_update.d2,1:2:11-1:3:12", + "value": [ + { + "string": "_", + "raw_string": "_" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/nested_underscore_update.d2,1:4:13-1:8:17", + "value": [ + { + "string": "pipe", + "raw_string": "pipe" + } + ] + } + } + ] + }, + "primary": {}, + "value": {} + } + } + ] + } + } + } + } + ] + }, + "root": { + "id": "", + "id_val": "", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + "edges": null, + "objects": [ + { + "id": "books", + "id_val": "books", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestDelete/nested_underscore_update.d2,0:0:0-0:5:5", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/nested_underscore_update.d2,0:0:0-0:5:5", + "value": [ + { + "string": "books", + "raw_string": "books" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "books" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "pipe", + "id_val": "pipe", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestDelete/nested_underscore_update.d2,1:2:11-1:8:17", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/nested_underscore_update.d2,1:2:11-1:3:12", + "value": [ + { + "string": "_", + "raw_string": "_" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/nested_underscore_update.d2,1:4:13-1:8:17", + "value": [ + { + "string": "pipe", + "raw_string": "pipe" + } + ] + } + } + ] + }, + "key_path_index": 1, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "pipe" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ] + }, + "err": "" +} diff --git a/testdata/d2oracle/TestDelete/nested_xyz.exp.json b/testdata/d2oracle/TestDelete/nested_xyz.exp.json new file mode 100644 index 000000000..bc1bffd35 --- /dev/null +++ b/testdata/d2oracle/TestDelete/nested_xyz.exp.json @@ -0,0 +1,265 @@ +{ + "graph": { + "ast": { + "range": "d2/testdata/d2oracle/TestDelete/nested_xyz.d2,0:0:0-1:0:6", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestDelete/nested_xyz.d2,0:0:0-0:5:5", + "key": { + "range": "d2/testdata/d2oracle/TestDelete/nested_xyz.d2,0:0:0-0:5:5", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/nested_xyz.d2,0:0:0-0:1:1", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/nested_xyz.d2,0:2:2-0:3:3", + "value": [ + { + "string": "c", + "raw_string": "c" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/nested_xyz.d2,0:4:4-0:5:5", + "value": [ + { + "string": "d", + "raw_string": "d" + } + ] + } + } + ] + }, + "primary": {}, + "value": {} + } + } + ] + }, + "root": { + "id": "", + "id_val": "", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + "edges": null, + "objects": [ + { + "id": "a", + "id_val": "a", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestDelete/nested_xyz.d2,0:0:0-0:5:5", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/nested_xyz.d2,0:0:0-0:1:1", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/nested_xyz.d2,0:2:2-0:3:3", + "value": [ + { + "string": "c", + "raw_string": "c" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/nested_xyz.d2,0:4:4-0:5:5", + "value": [ + { + "string": "d", + "raw_string": "d" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0, + "scope_key": "" + } + ], + "attributes": { + "label": { + "value": "a" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "c", + "id_val": "c", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestDelete/nested_xyz.d2,0:0:0-0:5:5", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/nested_xyz.d2,0:0:0-0:1:1", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/nested_xyz.d2,0:2:2-0:3:3", + "value": [ + { + "string": "c", + "raw_string": "c" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/nested_xyz.d2,0:4:4-0:5:5", + "value": [ + { + "string": "d", + "raw_string": "d" + } + ] + } + } + ] + }, + "key_path_index": 1, + "map_key_edge_index": 0, + "scope_key": "" + } + ], + "attributes": { + "label": { + "value": "c" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "d", + "id_val": "d", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestDelete/nested_xyz.d2,0:0:0-0:5:5", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/nested_xyz.d2,0:0:0-0:1:1", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/nested_xyz.d2,0:2:2-0:3:3", + "value": [ + { + "string": "c", + "raw_string": "c" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/nested_xyz.d2,0:4:4-0:5:5", + "value": [ + { + "string": "d", + "raw_string": "d" + } + ] + } + } + ] + }, + "key_path_index": 2, + "map_key_edge_index": 0, + "scope_key": "" + } + ], + "attributes": { + "label": { + "value": "d" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ] + }, + "err": "" +} diff --git a/testdata/d2oracle/TestDelete/node_in_edge.exp.json b/testdata/d2oracle/TestDelete/node_in_edge.exp.json new file mode 100644 index 000000000..3052f799d --- /dev/null +++ b/testdata/d2oracle/TestDelete/node_in_edge.exp.json @@ -0,0 +1,470 @@ +{ + "graph": { + "ast": { + "range": "d2/testdata/d2oracle/TestDelete/node_in_edge.d2,0:0:0-5:0:34", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestDelete/node_in_edge.d2,0:0:0-0:6:6", + "edges": [ + { + "range": "d2/testdata/d2oracle/TestDelete/node_in_edge.d2,0:0:0-0:6:6", + "src": { + "range": "d2/testdata/d2oracle/TestDelete/node_in_edge.d2,0:0:0-0:2:2", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/node_in_edge.d2,0:0:0-0:1:1", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "src_arrow": "", + "dst": { + "range": "d2/testdata/d2oracle/TestDelete/node_in_edge.d2,0:4:4-0:6:6", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/node_in_edge.d2,0:5:5-0:6:6", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + } + ] + }, + "dst_arrow": ">" + } + ], + "primary": {}, + "value": {} + } + }, + { + "map_key": { + "range": "d2/testdata/d2oracle/TestDelete/node_in_edge.d2,1:0:7-1:6:13", + "edges": [ + { + "range": "d2/testdata/d2oracle/TestDelete/node_in_edge.d2,1:0:7-1:6:13", + "src": { + "range": "d2/testdata/d2oracle/TestDelete/node_in_edge.d2,1:0:7-1:2:9", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/node_in_edge.d2,1:0:7-1:1:8", + "value": [ + { + "string": "q", + "raw_string": "q" + } + ] + } + } + ] + }, + "src_arrow": "", + "dst": { + "range": "d2/testdata/d2oracle/TestDelete/node_in_edge.d2,1:4:11-1:6:13", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/node_in_edge.d2,1:5:12-1:6:13", + "value": [ + { + "string": "p", + "raw_string": "p" + } + ] + } + } + ] + }, + "dst_arrow": ">" + } + ], + "primary": {}, + "value": {} + } + }, + { + "map_key": { + "range": "d2/testdata/d2oracle/TestDelete/node_in_edge.d2,2:0:14-4:1:33", + "key": { + "range": "d2/testdata/d2oracle/TestDelete/node_in_edge.d2,2:0:14-2:2:16", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/node_in_edge.d2,2:0:14-2:2:16", + "value": [ + { + "string": "ok", + "raw_string": "ok" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "map": { + "range": "d2/testdata/d2oracle/TestDelete/node_in_edge.d2,2:4:18-4:0:32", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestDelete/node_in_edge.d2,3:2:22-3:11:31", + "key": { + "range": "d2/testdata/d2oracle/TestDelete/node_in_edge.d2,3:2:22-3:11:31", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/node_in_edge.d2,3:2:22-3:11:31", + "value": [ + { + "string": "what's up", + "raw_string": "what's up" + } + ] + } + } + ] + }, + "primary": {}, + "value": {} + } + } + ] + } + } + } + } + ] + }, + "root": { + "id": "", + "id_val": "", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + "edges": [ + { + "index": 0, + "minWidth": 0, + "minHeight": 0, + "label_dimensions": { + "width": 0, + "height": 0 + }, + "isCurve": false, + "src_arrow": false, + "dst_arrow": true, + "references": [ + { + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "index": 0, + "minWidth": 0, + "minHeight": 0, + "label_dimensions": { + "width": 0, + "height": 0 + }, + "isCurve": false, + "src_arrow": false, + "dst_arrow": true, + "references": [ + { + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ], + "objects": [ + { + "id": "ok", + "id_val": "ok", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestDelete/node_in_edge.d2,2:0:14-2:2:16", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/node_in_edge.d2,2:0:14-2:2:16", + "value": [ + { + "string": "ok", + "raw_string": "ok" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "ok" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "\"what's up\"", + "id_val": "what's up", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestDelete/node_in_edge.d2,3:2:22-3:11:31", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/node_in_edge.d2,3:2:22-3:11:31", + "value": [ + { + "string": "what's up", + "raw_string": "what's up" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "what's up" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "x", + "id_val": "x", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestDelete/node_in_edge.d2,0:0:0-0:2:2", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/node_in_edge.d2,0:0:0-0:1:1", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "x" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "y", + "id_val": "y", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestDelete/node_in_edge.d2,0:4:4-0:6:6", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/node_in_edge.d2,0:5:5-0:6:6", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "y" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "q", + "id_val": "q", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestDelete/node_in_edge.d2,1:0:7-1:2:9", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/node_in_edge.d2,1:0:7-1:1:8", + "value": [ + { + "string": "q", + "raw_string": "q" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "q" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "p", + "id_val": "p", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestDelete/node_in_edge.d2,1:4:11-1:6:13", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/node_in_edge.d2,1:5:12-1:6:13", + "value": [ + { + "string": "p", + "raw_string": "p" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "p" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ] + }, + "err": "" +} diff --git a/testdata/d2oracle/TestDelete/node_in_edge_last.exp.json b/testdata/d2oracle/TestDelete/node_in_edge_last.exp.json new file mode 100644 index 000000000..45740d4b1 --- /dev/null +++ b/testdata/d2oracle/TestDelete/node_in_edge_last.exp.json @@ -0,0 +1,638 @@ +{ + "graph": { + "ast": { + "range": "d2/testdata/d2oracle/TestDelete/node_in_edge_last.d2,0:0:0-4:0:38", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestDelete/node_in_edge_last.d2,0:0:0-0:16:16", + "edges": [ + { + "range": "d2/testdata/d2oracle/TestDelete/node_in_edge_last.d2,0:0:0-0:7:7", + "src": { + "range": "d2/testdata/d2oracle/TestDelete/node_in_edge_last.d2,0:0:0-0:2:2", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/node_in_edge_last.d2,0:0:0-0:1:1", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "src_arrow": "", + "dst": { + "range": "d2/testdata/d2oracle/TestDelete/node_in_edge_last.d2,0:4:4-0:7:7", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/node_in_edge_last.d2,0:5:5-0:6:6", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + } + ] + }, + "dst_arrow": ">" + }, + { + "range": "d2/testdata/d2oracle/TestDelete/node_in_edge_last.d2,0:4:4-0:12:12", + "src": { + "range": "d2/testdata/d2oracle/TestDelete/node_in_edge_last.d2,0:4:4-0:7:7", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/node_in_edge_last.d2,0:5:5-0:6:6", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + } + ] + }, + "src_arrow": "", + "dst": { + "range": "d2/testdata/d2oracle/TestDelete/node_in_edge_last.d2,0:9:9-0:12:12", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/node_in_edge_last.d2,0:10:10-0:11:11", + "value": [ + { + "string": "z", + "raw_string": "z" + } + ] + } + } + ] + }, + "dst_arrow": ">" + }, + { + "range": "d2/testdata/d2oracle/TestDelete/node_in_edge_last.d2,0:9:9-0:16:16", + "src": { + "range": "d2/testdata/d2oracle/TestDelete/node_in_edge_last.d2,0:9:9-0:12:12", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/node_in_edge_last.d2,0:10:10-0:11:11", + "value": [ + { + "string": "z", + "raw_string": "z" + } + ] + } + } + ] + }, + "src_arrow": "", + "dst": { + "range": "d2/testdata/d2oracle/TestDelete/node_in_edge_last.d2,0:14:14-0:16:16", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/node_in_edge_last.d2,0:15:15-0:16:16", + "value": [ + { + "string": "q", + "raw_string": "q" + } + ] + } + } + ] + }, + "dst_arrow": ">" + } + ], + "primary": {}, + "value": {} + } + }, + { + "map_key": { + "range": "d2/testdata/d2oracle/TestDelete/node_in_edge_last.d2,1:0:17-3:1:37", + "key": { + "range": "d2/testdata/d2oracle/TestDelete/node_in_edge_last.d2,1:0:17-1:3:20", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/node_in_edge_last.d2,1:0:17-1:1:18", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/node_in_edge_last.d2,1:2:19-1:3:20", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "map": { + "range": "d2/testdata/d2oracle/TestDelete/node_in_edge_last.d2,1:5:22-3:0:36", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestDelete/node_in_edge_last.d2,2:2:26-2:11:35", + "key": { + "range": "d2/testdata/d2oracle/TestDelete/node_in_edge_last.d2,2:2:26-2:11:35", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/node_in_edge_last.d2,2:2:26-2:11:35", + "value": [ + { + "string": "what's up", + "raw_string": "what's up" + } + ] + } + } + ] + }, + "primary": {}, + "value": {} + } + } + ] + } + } + } + } + ] + }, + "root": { + "id": "", + "id_val": "", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + "edges": [ + { + "index": 0, + "minWidth": 0, + "minHeight": 0, + "label_dimensions": { + "width": 0, + "height": 0 + }, + "isCurve": false, + "src_arrow": false, + "dst_arrow": true, + "references": [ + { + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "index": 0, + "minWidth": 0, + "minHeight": 0, + "label_dimensions": { + "width": 0, + "height": 0 + }, + "isCurve": false, + "src_arrow": false, + "dst_arrow": true, + "references": [ + { + "map_key_edge_index": 1 + } + ], + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "index": 0, + "minWidth": 0, + "minHeight": 0, + "label_dimensions": { + "width": 0, + "height": 0 + }, + "isCurve": false, + "src_arrow": false, + "dst_arrow": true, + "references": [ + { + "map_key_edge_index": 2 + } + ], + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ], + "objects": [ + { + "id": "a", + "id_val": "a", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestDelete/node_in_edge_last.d2,1:0:17-1:3:20", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/node_in_edge_last.d2,1:0:17-1:1:18", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/node_in_edge_last.d2,1:2:19-1:3:20", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "a" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "b", + "id_val": "b", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestDelete/node_in_edge_last.d2,1:0:17-1:3:20", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/node_in_edge_last.d2,1:0:17-1:1:18", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/node_in_edge_last.d2,1:2:19-1:3:20", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + } + ] + }, + "key_path_index": 1, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "b" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "\"what's up\"", + "id_val": "what's up", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestDelete/node_in_edge_last.d2,2:2:26-2:11:35", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/node_in_edge_last.d2,2:2:26-2:11:35", + "value": [ + { + "string": "what's up", + "raw_string": "what's up" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "what's up" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "x", + "id_val": "x", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestDelete/node_in_edge_last.d2,0:0:0-0:2:2", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/node_in_edge_last.d2,0:0:0-0:1:1", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "x" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "y", + "id_val": "y", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestDelete/node_in_edge_last.d2,0:4:4-0:7:7", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/node_in_edge_last.d2,0:5:5-0:6:6", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + }, + { + "key": { + "range": "d2/testdata/d2oracle/TestDelete/node_in_edge_last.d2,0:4:4-0:7:7", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/node_in_edge_last.d2,0:5:5-0:6:6", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 1 + } + ], + "attributes": { + "label": { + "value": "y" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "z", + "id_val": "z", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestDelete/node_in_edge_last.d2,0:9:9-0:12:12", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/node_in_edge_last.d2,0:10:10-0:11:11", + "value": [ + { + "string": "z", + "raw_string": "z" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 1 + }, + { + "key": { + "range": "d2/testdata/d2oracle/TestDelete/node_in_edge_last.d2,0:9:9-0:12:12", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/node_in_edge_last.d2,0:10:10-0:11:11", + "value": [ + { + "string": "z", + "raw_string": "z" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 2 + } + ], + "attributes": { + "label": { + "value": "z" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "q", + "id_val": "q", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestDelete/node_in_edge_last.d2,0:14:14-0:16:16", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/node_in_edge_last.d2,0:15:15-0:16:16", + "value": [ + { + "string": "q", + "raw_string": "q" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 2 + } + ], + "attributes": { + "label": { + "value": "q" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ] + }, + "err": "" +} diff --git a/testdata/d2oracle/TestDelete/only_delete_edge_reserved.exp.json b/testdata/d2oracle/TestDelete/only_delete_edge_reserved.exp.json new file mode 100644 index 000000000..30d5e1158 --- /dev/null +++ b/testdata/d2oracle/TestDelete/only_delete_edge_reserved.exp.json @@ -0,0 +1,325 @@ +{ + "graph": { + "ast": { + "range": "d2/testdata/d2oracle/TestDelete/only_delete_edge_reserved.d2,0:0:0-3:0:38", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestDelete/only_delete_edge_reserved.d2,0:0:0-0:28:28", + "key": { + "range": "d2/testdata/d2oracle/TestDelete/only_delete_edge_reserved.d2,0:0:0-0:1:1", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/only_delete_edge_reserved.d2,0:0:0-0:1:1", + "value": [ + { + "string": "A", + "raw_string": "A" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "map": { + "range": "d2/testdata/d2oracle/TestDelete/only_delete_edge_reserved.d2,0:3:3-0:27:27", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestDelete/only_delete_edge_reserved.d2,0:4:4-0:27:27", + "key": { + "range": "d2/testdata/d2oracle/TestDelete/only_delete_edge_reserved.d2,0:4:4-0:16:16", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/only_delete_edge_reserved.d2,0:4:4-0:9:9", + "value": [ + { + "string": "style", + "raw_string": "style" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/only_delete_edge_reserved.d2,0:10:10-0:16:16", + "value": [ + { + "string": "stroke", + "raw_string": "stroke" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "double_quoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/only_delete_edge_reserved.d2,0:18:18-0:27:27", + "value": [ + { + "string": "#000e3d", + "raw_string": "#000e3d" + } + ] + } + } + } + } + ] + } + } + } + }, + { + "map_key": { + "range": "d2/testdata/d2oracle/TestDelete/only_delete_edge_reserved.d2,1:0:29-1:1:30", + "key": { + "range": "d2/testdata/d2oracle/TestDelete/only_delete_edge_reserved.d2,1:0:29-1:1:30", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/only_delete_edge_reserved.d2,1:0:29-1:1:30", + "value": [ + { + "string": "B", + "raw_string": "B" + } + ] + } + } + ] + }, + "primary": {}, + "value": {} + } + }, + { + "map_key": { + "range": "d2/testdata/d2oracle/TestDelete/only_delete_edge_reserved.d2,2:0:31-2:6:37", + "edges": [ + { + "range": "d2/testdata/d2oracle/TestDelete/only_delete_edge_reserved.d2,2:0:31-2:6:37", + "src": { + "range": "d2/testdata/d2oracle/TestDelete/only_delete_edge_reserved.d2,2:0:31-2:2:33", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/only_delete_edge_reserved.d2,2:0:31-2:1:32", + "value": [ + { + "string": "A", + "raw_string": "A" + } + ] + } + } + ] + }, + "src_arrow": "", + "dst": { + "range": "d2/testdata/d2oracle/TestDelete/only_delete_edge_reserved.d2,2:4:35-2:6:37", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/only_delete_edge_reserved.d2,2:5:36-2:6:37", + "value": [ + { + "string": "B", + "raw_string": "B" + } + ] + } + } + ] + }, + "dst_arrow": ">" + } + ], + "primary": {}, + "value": {} + } + } + ] + }, + "root": { + "id": "", + "id_val": "", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + "edges": [ + { + "index": 0, + "minWidth": 0, + "minHeight": 0, + "label_dimensions": { + "width": 0, + "height": 0 + }, + "isCurve": false, + "src_arrow": false, + "dst_arrow": true, + "references": [ + { + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ], + "objects": [ + { + "id": "A", + "id_val": "A", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestDelete/only_delete_edge_reserved.d2,0:0:0-0:1:1", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/only_delete_edge_reserved.d2,0:0:0-0:1:1", + "value": [ + { + "string": "A", + "raw_string": "A" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + }, + { + "key": { + "range": "d2/testdata/d2oracle/TestDelete/only_delete_edge_reserved.d2,2:0:31-2:2:33", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/only_delete_edge_reserved.d2,2:0:31-2:1:32", + "value": [ + { + "string": "A", + "raw_string": "A" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "A" + }, + "style": { + "stroke": { + "value": "#000e3d" + } + }, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "B", + "id_val": "B", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestDelete/only_delete_edge_reserved.d2,1:0:29-1:1:30", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/only_delete_edge_reserved.d2,1:0:29-1:1:30", + "value": [ + { + "string": "B", + "raw_string": "B" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + }, + { + "key": { + "range": "d2/testdata/d2oracle/TestDelete/only_delete_edge_reserved.d2,2:4:35-2:6:37", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/only_delete_edge_reserved.d2,2:5:36-2:6:37", + "value": [ + { + "string": "B", + "raw_string": "B" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "B" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ] + }, + "err": "" +} diff --git a/testdata/d2oracle/TestDelete/only_delete_obj_reserved.exp.json b/testdata/d2oracle/TestDelete/only_delete_obj_reserved.exp.json new file mode 100644 index 000000000..f46008172 --- /dev/null +++ b/testdata/d2oracle/TestDelete/only_delete_obj_reserved.exp.json @@ -0,0 +1,325 @@ +{ + "graph": { + "ast": { + "range": "d2/testdata/d2oracle/TestDelete/only_delete_obj_reserved.d2,0:0:0-3:0:38", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestDelete/only_delete_obj_reserved.d2,0:0:0-0:1:1", + "key": { + "range": "d2/testdata/d2oracle/TestDelete/only_delete_obj_reserved.d2,0:0:0-0:1:1", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/only_delete_obj_reserved.d2,0:0:0-0:1:1", + "value": [ + { + "string": "A", + "raw_string": "A" + } + ] + } + } + ] + }, + "primary": {}, + "value": {} + } + }, + { + "map_key": { + "range": "d2/testdata/d2oracle/TestDelete/only_delete_obj_reserved.d2,1:0:2-1:1:3", + "key": { + "range": "d2/testdata/d2oracle/TestDelete/only_delete_obj_reserved.d2,1:0:2-1:1:3", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/only_delete_obj_reserved.d2,1:0:2-1:1:3", + "value": [ + { + "string": "B", + "raw_string": "B" + } + ] + } + } + ] + }, + "primary": {}, + "value": {} + } + }, + { + "map_key": { + "range": "d2/testdata/d2oracle/TestDelete/only_delete_obj_reserved.d2,2:0:4-2:33:37", + "edges": [ + { + "range": "d2/testdata/d2oracle/TestDelete/only_delete_obj_reserved.d2,2:0:4-2:6:10", + "src": { + "range": "d2/testdata/d2oracle/TestDelete/only_delete_obj_reserved.d2,2:0:4-2:2:6", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/only_delete_obj_reserved.d2,2:0:4-2:1:5", + "value": [ + { + "string": "A", + "raw_string": "A" + } + ] + } + } + ] + }, + "src_arrow": "", + "dst": { + "range": "d2/testdata/d2oracle/TestDelete/only_delete_obj_reserved.d2,2:4:8-2:6:10", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/only_delete_obj_reserved.d2,2:5:9-2:6:10", + "value": [ + { + "string": "B", + "raw_string": "B" + } + ] + } + } + ] + }, + "dst_arrow": ">" + } + ], + "primary": {}, + "value": { + "map": { + "range": "d2/testdata/d2oracle/TestDelete/only_delete_obj_reserved.d2,2:8:12-2:32:36", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestDelete/only_delete_obj_reserved.d2,2:9:13-2:32:36", + "key": { + "range": "d2/testdata/d2oracle/TestDelete/only_delete_obj_reserved.d2,2:9:13-2:21:25", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/only_delete_obj_reserved.d2,2:9:13-2:14:18", + "value": [ + { + "string": "style", + "raw_string": "style" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/only_delete_obj_reserved.d2,2:15:19-2:21:25", + "value": [ + { + "string": "stroke", + "raw_string": "stroke" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "double_quoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/only_delete_obj_reserved.d2,2:23:27-2:32:36", + "value": [ + { + "string": "#2b50c2", + "raw_string": "#2b50c2" + } + ] + } + } + } + } + ] + } + } + } + } + ] + }, + "root": { + "id": "", + "id_val": "", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + "edges": [ + { + "index": 0, + "minWidth": 0, + "minHeight": 0, + "label_dimensions": { + "width": 0, + "height": 0 + }, + "isCurve": false, + "src_arrow": false, + "dst_arrow": true, + "references": [ + { + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "" + }, + "style": { + "stroke": { + "value": "#2b50c2" + } + }, + "near_key": null, + "shape": { + "value": "" + } + } + } + ], + "objects": [ + { + "id": "A", + "id_val": "A", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestDelete/only_delete_obj_reserved.d2,0:0:0-0:1:1", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/only_delete_obj_reserved.d2,0:0:0-0:1:1", + "value": [ + { + "string": "A", + "raw_string": "A" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + }, + { + "key": { + "range": "d2/testdata/d2oracle/TestDelete/only_delete_obj_reserved.d2,2:0:4-2:2:6", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/only_delete_obj_reserved.d2,2:0:4-2:1:5", + "value": [ + { + "string": "A", + "raw_string": "A" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "A" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "B", + "id_val": "B", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestDelete/only_delete_obj_reserved.d2,1:0:2-1:1:3", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/only_delete_obj_reserved.d2,1:0:2-1:1:3", + "value": [ + { + "string": "B", + "raw_string": "B" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + }, + { + "key": { + "range": "d2/testdata/d2oracle/TestDelete/only_delete_obj_reserved.d2,2:4:8-2:6:10", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/only_delete_obj_reserved.d2,2:5:9-2:6:10", + "value": [ + { + "string": "B", + "raw_string": "B" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "B" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ] + }, + "err": "" +} diff --git a/testdata/d2oracle/TestDelete/order_1.exp.json b/testdata/d2oracle/TestDelete/order_1.exp.json new file mode 100644 index 000000000..7736e550d --- /dev/null +++ b/testdata/d2oracle/TestDelete/order_1.exp.json @@ -0,0 +1,248 @@ +{ + "graph": { + "ast": { + "range": "d2/testdata/d2oracle/TestDelete/order_1.d2,0:0:0-2:0:9", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestDelete/order_1.d2,0:0:0-0:1:1", + "key": { + "range": "d2/testdata/d2oracle/TestDelete/order_1.d2,0:0:0-0:1:1", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/order_1.d2,0:0:0-0:1:1", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "primary": {}, + "value": {} + } + }, + { + "map_key": { + "range": "d2/testdata/d2oracle/TestDelete/order_1.d2,1:0:2-1:6:8", + "edges": [ + { + "range": "d2/testdata/d2oracle/TestDelete/order_1.d2,1:0:2-1:6:8", + "src": { + "range": "d2/testdata/d2oracle/TestDelete/order_1.d2,1:0:2-1:2:4", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/order_1.d2,1:0:2-1:1:3", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + } + ] + }, + "src_arrow": "", + "dst": { + "range": "d2/testdata/d2oracle/TestDelete/order_1.d2,1:4:6-1:6:8", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/order_1.d2,1:5:7-1:6:8", + "value": [ + { + "string": "z", + "raw_string": "z" + } + ] + } + } + ] + }, + "dst_arrow": ">" + } + ], + "primary": {}, + "value": {} + } + } + ] + }, + "root": { + "id": "", + "id_val": "", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + "edges": [ + { + "index": 0, + "minWidth": 0, + "minHeight": 0, + "label_dimensions": { + "width": 0, + "height": 0 + }, + "isCurve": false, + "src_arrow": false, + "dst_arrow": true, + "references": [ + { + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ], + "objects": [ + { + "id": "x", + "id_val": "x", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestDelete/order_1.d2,0:0:0-0:1:1", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/order_1.d2,0:0:0-0:1:1", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "x" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "y", + "id_val": "y", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestDelete/order_1.d2,1:0:2-1:2:4", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/order_1.d2,1:0:2-1:1:3", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "y" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "z", + "id_val": "z", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestDelete/order_1.d2,1:4:6-1:6:8", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/order_1.d2,1:5:7-1:6:8", + "value": [ + { + "string": "z", + "raw_string": "z" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "z" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ] + }, + "err": "" +} diff --git a/testdata/d2oracle/TestDelete/order_2.exp.json b/testdata/d2oracle/TestDelete/order_2.exp.json new file mode 100644 index 000000000..f9e0ba499 --- /dev/null +++ b/testdata/d2oracle/TestDelete/order_2.exp.json @@ -0,0 +1,157 @@ +{ + "graph": { + "ast": { + "range": "d2/testdata/d2oracle/TestDelete/order_2.d2,0:0:0-2:0:4", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestDelete/order_2.d2,0:0:0-0:1:1", + "key": { + "range": "d2/testdata/d2oracle/TestDelete/order_2.d2,0:0:0-0:1:1", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/order_2.d2,0:0:0-0:1:1", + "value": [ + { + "string": "p", + "raw_string": "p" + } + ] + } + } + ] + }, + "primary": {}, + "value": {} + } + }, + { + "map_key": { + "range": "d2/testdata/d2oracle/TestDelete/order_2.d2,1:0:2-1:1:3", + "key": { + "range": "d2/testdata/d2oracle/TestDelete/order_2.d2,1:0:2-1:1:3", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/order_2.d2,1:0:2-1:1:3", + "value": [ + { + "string": "z", + "raw_string": "z" + } + ] + } + } + ] + }, + "primary": {}, + "value": {} + } + } + ] + }, + "root": { + "id": "", + "id_val": "", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + "edges": null, + "objects": [ + { + "id": "p", + "id_val": "p", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestDelete/order_2.d2,0:0:0-0:1:1", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/order_2.d2,0:0:0-0:1:1", + "value": [ + { + "string": "p", + "raw_string": "p" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "p" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "z", + "id_val": "z", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestDelete/order_2.d2,1:0:2-1:1:3", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/order_2.d2,1:0:2-1:1:3", + "value": [ + { + "string": "z", + "raw_string": "z" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "z" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ] + }, + "err": "" +} diff --git a/testdata/d2oracle/TestDelete/order_3.exp.json b/testdata/d2oracle/TestDelete/order_3.exp.json new file mode 100644 index 000000000..4306a6ed1 --- /dev/null +++ b/testdata/d2oracle/TestDelete/order_3.exp.json @@ -0,0 +1,157 @@ +{ + "graph": { + "ast": { + "range": "d2/testdata/d2oracle/TestDelete/order_3.d2,0:0:0-2:0:4", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestDelete/order_3.d2,0:0:0-0:1:1", + "key": { + "range": "d2/testdata/d2oracle/TestDelete/order_3.d2,0:0:0-0:1:1", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/order_3.d2,0:0:0-0:1:1", + "value": [ + { + "string": "p", + "raw_string": "p" + } + ] + } + } + ] + }, + "primary": {}, + "value": {} + } + }, + { + "map_key": { + "range": "d2/testdata/d2oracle/TestDelete/order_3.d2,1:0:2-1:1:3", + "key": { + "range": "d2/testdata/d2oracle/TestDelete/order_3.d2,1:0:2-1:1:3", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/order_3.d2,1:0:2-1:1:3", + "value": [ + { + "string": "z", + "raw_string": "z" + } + ] + } + } + ] + }, + "primary": {}, + "value": {} + } + } + ] + }, + "root": { + "id": "", + "id_val": "", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + "edges": null, + "objects": [ + { + "id": "p", + "id_val": "p", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestDelete/order_3.d2,0:0:0-0:1:1", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/order_3.d2,0:0:0-0:1:1", + "value": [ + { + "string": "p", + "raw_string": "p" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "p" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "z", + "id_val": "z", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestDelete/order_3.d2,1:0:2-1:1:3", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/order_3.d2,1:0:2-1:1:3", + "value": [ + { + "string": "z", + "raw_string": "z" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "z" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ] + }, + "err": "" +} diff --git a/testdata/d2oracle/TestDelete/order_4.exp.json b/testdata/d2oracle/TestDelete/order_4.exp.json new file mode 100644 index 000000000..49dd878c7 --- /dev/null +++ b/testdata/d2oracle/TestDelete/order_4.exp.json @@ -0,0 +1,94 @@ +{ + "graph": { + "ast": { + "range": "d2/testdata/d2oracle/TestDelete/order_4.d2,0:0:0-1:0:2", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestDelete/order_4.d2,0:0:0-0:1:1", + "key": { + "range": "d2/testdata/d2oracle/TestDelete/order_4.d2,0:0:0-0:1:1", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/order_4.d2,0:0:0-0:1:1", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + } + ] + }, + "primary": {}, + "value": {} + } + } + ] + }, + "root": { + "id": "", + "id_val": "", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + "edges": null, + "objects": [ + { + "id": "y", + "id_val": "y", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestDelete/order_4.d2,0:0:0-0:1:1", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/order_4.d2,0:0:0-0:1:1", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "y" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ] + }, + "err": "" +} diff --git a/testdata/d2oracle/TestDelete/order_5.exp.json b/testdata/d2oracle/TestDelete/order_5.exp.json new file mode 100644 index 000000000..54f05a0dc --- /dev/null +++ b/testdata/d2oracle/TestDelete/order_5.exp.json @@ -0,0 +1,407 @@ +{ + "graph": { + "ast": { + "range": "d2/testdata/d2oracle/TestDelete/order_5.d2,0:0:0-4:0:25", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestDelete/order_5.d2,0:0:0-3:1:24", + "key": { + "range": "d2/testdata/d2oracle/TestDelete/order_5.d2,0:0:0-0:1:1", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/order_5.d2,0:0:0-0:1:1", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "map": { + "range": "d2/testdata/d2oracle/TestDelete/order_5.d2,0:3:3-3:0:23", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestDelete/order_5.d2,1:2:7-1:8:13", + "edges": [ + { + "range": "d2/testdata/d2oracle/TestDelete/order_5.d2,1:2:7-1:8:13", + "src": { + "range": "d2/testdata/d2oracle/TestDelete/order_5.d2,1:2:7-1:4:9", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/order_5.d2,1:2:7-1:3:8", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + } + ] + }, + "src_arrow": "", + "dst": { + "range": "d2/testdata/d2oracle/TestDelete/order_5.d2,1:6:11-1:8:13", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/order_5.d2,1:7:12-1:8:13", + "value": [ + { + "string": "c", + "raw_string": "c" + } + ] + } + } + ] + }, + "dst_arrow": ">" + } + ], + "primary": {}, + "value": {} + } + }, + { + "map_key": { + "range": "d2/testdata/d2oracle/TestDelete/order_5.d2,2:2:16-2:8:22", + "edges": [ + { + "range": "d2/testdata/d2oracle/TestDelete/order_5.d2,2:2:16-2:8:22", + "src": { + "range": "d2/testdata/d2oracle/TestDelete/order_5.d2,2:2:16-2:4:18", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/order_5.d2,2:2:16-2:3:17", + "value": [ + { + "string": "q", + "raw_string": "q" + } + ] + } + } + ] + }, + "src_arrow": "", + "dst": { + "range": "d2/testdata/d2oracle/TestDelete/order_5.d2,2:6:20-2:8:22", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/order_5.d2,2:7:21-2:8:22", + "value": [ + { + "string": "p", + "raw_string": "p" + } + ] + } + } + ] + }, + "dst_arrow": ">" + } + ], + "primary": {}, + "value": {} + } + } + ] + } + } + } + } + ] + }, + "root": { + "id": "", + "id_val": "", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + "edges": [ + { + "index": 0, + "minWidth": 0, + "minHeight": 0, + "label_dimensions": { + "width": 0, + "height": 0 + }, + "isCurve": false, + "src_arrow": false, + "dst_arrow": true, + "references": [ + { + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "index": 0, + "minWidth": 0, + "minHeight": 0, + "label_dimensions": { + "width": 0, + "height": 0 + }, + "isCurve": false, + "src_arrow": false, + "dst_arrow": true, + "references": [ + { + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ], + "objects": [ + { + "id": "x", + "id_val": "x", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestDelete/order_5.d2,0:0:0-0:1:1", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/order_5.d2,0:0:0-0:1:1", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "x" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "b", + "id_val": "b", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestDelete/order_5.d2,1:2:7-1:4:9", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/order_5.d2,1:2:7-1:3:8", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "b" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "c", + "id_val": "c", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestDelete/order_5.d2,1:6:11-1:8:13", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/order_5.d2,1:7:12-1:8:13", + "value": [ + { + "string": "c", + "raw_string": "c" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "c" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "q", + "id_val": "q", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestDelete/order_5.d2,2:2:16-2:4:18", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/order_5.d2,2:2:16-2:3:17", + "value": [ + { + "string": "q", + "raw_string": "q" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "q" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "p", + "id_val": "p", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestDelete/order_5.d2,2:6:20-2:8:22", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/order_5.d2,2:7:21-2:8:22", + "value": [ + { + "string": "p", + "raw_string": "p" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "p" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ] + }, + "err": "" +} diff --git a/testdata/d2oracle/TestDelete/order_6.exp.json b/testdata/d2oracle/TestDelete/order_6.exp.json new file mode 100644 index 000000000..3f444d35e --- /dev/null +++ b/testdata/d2oracle/TestDelete/order_6.exp.json @@ -0,0 +1,374 @@ +{ + "graph": { + "ast": { + "range": "d2/testdata/d2oracle/TestDelete/order_6.d2,0:0:0-4:0:19", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestDelete/order_6.d2,0:0:0-2:1:12", + "key": { + "range": "d2/testdata/d2oracle/TestDelete/order_6.d2,0:0:0-0:1:1", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/order_6.d2,0:0:0-0:1:1", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "map": { + "range": "d2/testdata/d2oracle/TestDelete/order_6.d2,0:3:3-2:0:11", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestDelete/order_6.d2,1:2:7-1:5:10", + "key": { + "range": "d2/testdata/d2oracle/TestDelete/order_6.d2,1:2:7-1:5:10", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/order_6.d2,1:2:7-1:5:10", + "value": [ + { + "string": "lol", + "raw_string": "lol" + } + ] + } + } + ] + }, + "primary": {}, + "value": {} + } + } + ] + } + } + } + }, + { + "map_key": { + "range": "d2/testdata/d2oracle/TestDelete/order_6.d2,3:0:13-3:5:18", + "key": { + "range": "d2/testdata/d2oracle/TestDelete/order_6.d2,3:0:13-3:5:18", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/order_6.d2,3:0:13-3:1:14", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/order_6.d2,3:2:15-3:3:16", + "value": [ + { + "string": "p", + "raw_string": "p" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/order_6.d2,3:4:17-3:5:18", + "value": [ + { + "string": "q", + "raw_string": "q" + } + ] + } + } + ] + }, + "primary": {}, + "value": {} + } + } + ] + }, + "root": { + "id": "", + "id_val": "", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + "edges": null, + "objects": [ + { + "id": "x", + "id_val": "x", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestDelete/order_6.d2,0:0:0-0:1:1", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/order_6.d2,0:0:0-0:1:1", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + }, + { + "key": { + "range": "d2/testdata/d2oracle/TestDelete/order_6.d2,3:0:13-3:5:18", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/order_6.d2,3:0:13-3:1:14", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/order_6.d2,3:2:15-3:3:16", + "value": [ + { + "string": "p", + "raw_string": "p" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/order_6.d2,3:4:17-3:5:18", + "value": [ + { + "string": "q", + "raw_string": "q" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "x" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "lol", + "id_val": "lol", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestDelete/order_6.d2,1:2:7-1:5:10", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/order_6.d2,1:2:7-1:5:10", + "value": [ + { + "string": "lol", + "raw_string": "lol" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "lol" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "p", + "id_val": "p", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestDelete/order_6.d2,3:0:13-3:5:18", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/order_6.d2,3:0:13-3:1:14", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/order_6.d2,3:2:15-3:3:16", + "value": [ + { + "string": "p", + "raw_string": "p" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/order_6.d2,3:4:17-3:5:18", + "value": [ + { + "string": "q", + "raw_string": "q" + } + ] + } + } + ] + }, + "key_path_index": 1, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "p" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "q", + "id_val": "q", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestDelete/order_6.d2,3:0:13-3:5:18", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/order_6.d2,3:0:13-3:1:14", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/order_6.d2,3:2:15-3:3:16", + "value": [ + { + "string": "p", + "raw_string": "p" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/order_6.d2,3:4:17-3:5:18", + "value": [ + { + "string": "q", + "raw_string": "q" + } + ] + } + } + ] + }, + "key_path_index": 2, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "q" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ] + }, + "err": "" +} diff --git a/testdata/d2oracle/TestDelete/order_7.exp.json b/testdata/d2oracle/TestDelete/order_7.exp.json new file mode 100644 index 000000000..2b0738219 --- /dev/null +++ b/testdata/d2oracle/TestDelete/order_7.exp.json @@ -0,0 +1,491 @@ +{ + "graph": { + "ast": { + "range": "d2/testdata/d2oracle/TestDelete/order_7.d2,0:0:0-4:0:24", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestDelete/order_7.d2,0:0:0-2:1:12", + "key": { + "range": "d2/testdata/d2oracle/TestDelete/order_7.d2,0:0:0-0:1:1", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/order_7.d2,0:0:0-0:1:1", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "map": { + "range": "d2/testdata/d2oracle/TestDelete/order_7.d2,0:3:3-2:0:11", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestDelete/order_7.d2,1:2:7-1:5:10", + "key": { + "range": "d2/testdata/d2oracle/TestDelete/order_7.d2,1:2:7-1:5:10", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/order_7.d2,1:2:7-1:5:10", + "value": [ + { + "string": "lol", + "raw_string": "lol" + } + ] + } + } + ] + }, + "primary": {}, + "value": {} + } + } + ] + } + } + } + }, + { + "map_key": { + "range": "d2/testdata/d2oracle/TestDelete/order_7.d2,3:0:13-3:10:23", + "key": { + "range": "d2/testdata/d2oracle/TestDelete/order_7.d2,3:0:13-3:10:23", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/order_7.d2,3:0:13-3:1:14", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/order_7.d2,3:2:15-3:3:16", + "value": [ + { + "string": "p", + "raw_string": "p" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/order_7.d2,3:4:17-3:5:18", + "value": [ + { + "string": "q", + "raw_string": "q" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/order_7.d2,3:6:19-3:10:23", + "value": [ + { + "string": "more", + "raw_string": "more" + } + ] + } + } + ] + }, + "primary": {}, + "value": {} + } + } + ] + }, + "root": { + "id": "", + "id_val": "", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + "edges": null, + "objects": [ + { + "id": "x", + "id_val": "x", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestDelete/order_7.d2,0:0:0-0:1:1", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/order_7.d2,0:0:0-0:1:1", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + }, + { + "key": { + "range": "d2/testdata/d2oracle/TestDelete/order_7.d2,3:0:13-3:10:23", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/order_7.d2,3:0:13-3:1:14", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/order_7.d2,3:2:15-3:3:16", + "value": [ + { + "string": "p", + "raw_string": "p" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/order_7.d2,3:4:17-3:5:18", + "value": [ + { + "string": "q", + "raw_string": "q" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/order_7.d2,3:6:19-3:10:23", + "value": [ + { + "string": "more", + "raw_string": "more" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "x" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "lol", + "id_val": "lol", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestDelete/order_7.d2,1:2:7-1:5:10", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/order_7.d2,1:2:7-1:5:10", + "value": [ + { + "string": "lol", + "raw_string": "lol" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "lol" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "p", + "id_val": "p", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestDelete/order_7.d2,3:0:13-3:10:23", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/order_7.d2,3:0:13-3:1:14", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/order_7.d2,3:2:15-3:3:16", + "value": [ + { + "string": "p", + "raw_string": "p" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/order_7.d2,3:4:17-3:5:18", + "value": [ + { + "string": "q", + "raw_string": "q" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/order_7.d2,3:6:19-3:10:23", + "value": [ + { + "string": "more", + "raw_string": "more" + } + ] + } + } + ] + }, + "key_path_index": 1, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "p" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "q", + "id_val": "q", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestDelete/order_7.d2,3:0:13-3:10:23", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/order_7.d2,3:0:13-3:1:14", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/order_7.d2,3:2:15-3:3:16", + "value": [ + { + "string": "p", + "raw_string": "p" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/order_7.d2,3:4:17-3:5:18", + "value": [ + { + "string": "q", + "raw_string": "q" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/order_7.d2,3:6:19-3:10:23", + "value": [ + { + "string": "more", + "raw_string": "more" + } + ] + } + } + ] + }, + "key_path_index": 2, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "q" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "more", + "id_val": "more", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestDelete/order_7.d2,3:0:13-3:10:23", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/order_7.d2,3:0:13-3:1:14", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/order_7.d2,3:2:15-3:3:16", + "value": [ + { + "string": "p", + "raw_string": "p" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/order_7.d2,3:4:17-3:5:18", + "value": [ + { + "string": "q", + "raw_string": "q" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/order_7.d2,3:6:19-3:10:23", + "value": [ + { + "string": "more", + "raw_string": "more" + } + ] + } + } + ] + }, + "key_path_index": 3, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "more" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ] + }, + "err": "" +} diff --git a/testdata/d2oracle/TestDelete/order_8.exp.json b/testdata/d2oracle/TestDelete/order_8.exp.json new file mode 100644 index 000000000..cb864c709 --- /dev/null +++ b/testdata/d2oracle/TestDelete/order_8.exp.json @@ -0,0 +1,346 @@ +{ + "graph": { + "ast": { + "range": "d2/testdata/d2oracle/TestDelete/order_8.d2,0:0:0-7:0:22", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestDelete/order_8.d2,0:0:0-0:4:4", + "key": { + "range": "d2/testdata/d2oracle/TestDelete/order_8.d2,0:0:0-0:4:4", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/order_8.d2,0:0:0-0:4:4", + "value": [ + { + "string": "bark", + "raw_string": "bark" + } + ] + } + } + ] + }, + "primary": {}, + "value": {} + } + }, + { + "map_key": { + "range": "d2/testdata/d2oracle/TestDelete/order_8.d2,1:0:5-1:1:6", + "key": { + "range": "d2/testdata/d2oracle/TestDelete/order_8.d2,1:0:5-1:1:6", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/order_8.d2,1:0:5-1:1:6", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + } + ] + }, + "primary": {}, + "value": {} + } + }, + { + "map_key": { + "range": "d2/testdata/d2oracle/TestDelete/order_8.d2,3:0:8-3:5:13", + "key": { + "range": "d2/testdata/d2oracle/TestDelete/order_8.d2,3:0:8-3:5:13", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/order_8.d2,3:0:8-3:5:13", + "value": [ + { + "string": "zebra", + "raw_string": "zebra" + } + ] + } + } + ] + }, + "primary": {}, + "value": {} + } + }, + { + "map_key": { + "range": "d2/testdata/d2oracle/TestDelete/order_8.d2,4:0:14-4:1:15", + "key": { + "range": "d2/testdata/d2oracle/TestDelete/order_8.d2,4:0:14-4:1:15", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/order_8.d2,4:0:14-4:1:15", + "value": [ + { + "string": "q", + "raw_string": "q" + } + ] + } + } + ] + }, + "primary": {}, + "value": {} + } + }, + { + "map_key": { + "range": "d2/testdata/d2oracle/TestDelete/order_8.d2,6:0:17-6:4:21", + "key": { + "range": "d2/testdata/d2oracle/TestDelete/order_8.d2,6:0:17-6:4:21", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/order_8.d2,6:0:17-6:4:21", + "value": [ + { + "string": "kang", + "raw_string": "kang" + } + ] + } + } + ] + }, + "primary": {}, + "value": {} + } + } + ] + }, + "root": { + "id": "", + "id_val": "", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + "edges": null, + "objects": [ + { + "id": "bark", + "id_val": "bark", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestDelete/order_8.d2,0:0:0-0:4:4", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/order_8.d2,0:0:0-0:4:4", + "value": [ + { + "string": "bark", + "raw_string": "bark" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "bark" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "y", + "id_val": "y", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestDelete/order_8.d2,1:0:5-1:1:6", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/order_8.d2,1:0:5-1:1:6", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "y" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "zebra", + "id_val": "zebra", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestDelete/order_8.d2,3:0:8-3:5:13", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/order_8.d2,3:0:8-3:5:13", + "value": [ + { + "string": "zebra", + "raw_string": "zebra" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "zebra" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "q", + "id_val": "q", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestDelete/order_8.d2,4:0:14-4:1:15", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/order_8.d2,4:0:14-4:1:15", + "value": [ + { + "string": "q", + "raw_string": "q" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "q" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "kang", + "id_val": "kang", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestDelete/order_8.d2,6:0:17-6:4:21", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/order_8.d2,6:0:17-6:4:21", + "value": [ + { + "string": "kang", + "raw_string": "kang" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "kang" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ] + }, + "err": "" +} diff --git a/testdata/d2oracle/TestDelete/remove_near.exp.json b/testdata/d2oracle/TestDelete/remove_near.exp.json new file mode 100644 index 000000000..9d54ddefb --- /dev/null +++ b/testdata/d2oracle/TestDelete/remove_near.exp.json @@ -0,0 +1,157 @@ +{ + "graph": { + "ast": { + "range": "d2/testdata/d2oracle/TestDelete/remove_near.d2,0:0:0-2:0:4", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestDelete/remove_near.d2,0:0:0-0:1:1", + "key": { + "range": "d2/testdata/d2oracle/TestDelete/remove_near.d2,0:0:0-0:1:1", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/remove_near.d2,0:0:0-0:1:1", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "primary": {}, + "value": {} + } + }, + { + "map_key": { + "range": "d2/testdata/d2oracle/TestDelete/remove_near.d2,1:0:2-1:1:3", + "key": { + "range": "d2/testdata/d2oracle/TestDelete/remove_near.d2,1:0:2-1:1:3", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/remove_near.d2,1:0:2-1:1:3", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + } + ] + }, + "primary": {}, + "value": {} + } + } + ] + }, + "root": { + "id": "", + "id_val": "", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + "edges": null, + "objects": [ + { + "id": "x", + "id_val": "x", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestDelete/remove_near.d2,0:0:0-0:1:1", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/remove_near.d2,0:0:0-0:1:1", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "x" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "y", + "id_val": "y", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestDelete/remove_near.d2,1:0:2-1:1:3", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/remove_near.d2,1:0:2-1:1:3", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "y" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ] + }, + "err": "" +} diff --git a/testdata/d2oracle/TestDelete/shape_class.exp.json b/testdata/d2oracle/TestDelete/shape_class.exp.json new file mode 100644 index 000000000..bfca467d8 --- /dev/null +++ b/testdata/d2oracle/TestDelete/shape_class.exp.json @@ -0,0 +1,94 @@ +{ + "graph": { + "ast": { + "range": "d2/testdata/d2oracle/TestDelete/shape_class.d2,0:0:0-2:0:39", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestDelete/shape_class.d2,1:0:1-1:37:38", + "key": { + "range": "d2/testdata/d2oracle/TestDelete/shape_class.d2,1:0:1-1:37:38", + "path": [ + { + "double_quoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/shape_class.d2,1:0:1-1:37:38", + "value": [ + { + "string": "github.com/terrastruct/d2parser.git", + "raw_string": "github.com/terrastruct/d2parser.git" + } + ] + } + } + ] + }, + "primary": {}, + "value": {} + } + } + ] + }, + "root": { + "id": "", + "id_val": "", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + "edges": null, + "objects": [ + { + "id": "\"github.com/terrastruct/d2parser.git\"", + "id_val": "github.com/terrastruct/d2parser.git", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestDelete/shape_class.d2,1:0:1-1:37:38", + "path": [ + { + "double_quoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/shape_class.d2,1:0:1-1:37:38", + "value": [ + { + "string": "github.com/terrastruct/d2parser.git", + "raw_string": "github.com/terrastruct/d2parser.git" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "github.com/terrastruct/d2parser.git" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ] + }, + "err": "" +} diff --git a/testdata/d2oracle/TestDelete/shape_sql_table.exp.json b/testdata/d2oracle/TestDelete/shape_sql_table.exp.json new file mode 100644 index 000000000..9fdb4cb6c --- /dev/null +++ b/testdata/d2oracle/TestDelete/shape_sql_table.exp.json @@ -0,0 +1,483 @@ +{ + "graph": { + "ast": { + "range": "d2/testdata/d2oracle/TestDelete/shape_sql_table.d2,0:0:0-10:0:128", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestDelete/shape_sql_table.d2,0:0:0-9:1:127", + "key": { + "range": "d2/testdata/d2oracle/TestDelete/shape_sql_table.d2,0:0:0-0:5:5", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/shape_sql_table.d2,0:0:0-0:5:5", + "value": [ + { + "string": "cloud", + "raw_string": "cloud" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "map": { + "range": "d2/testdata/d2oracle/TestDelete/shape_sql_table.d2,0:7:7-9:0:126", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestDelete/shape_sql_table.d2,1:2:11-4:3:82", + "key": { + "range": "d2/testdata/d2oracle/TestDelete/shape_sql_table.d2,1:2:11-1:7:16", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/shape_sql_table.d2,1:2:11-1:7:16", + "value": [ + { + "string": "disks", + "raw_string": "disks" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "map": { + "range": "d2/testdata/d2oracle/TestDelete/shape_sql_table.d2,1:9:18-4:2:81", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestDelete/shape_sql_table.d2,2:4:24-2:20:40", + "key": { + "range": "d2/testdata/d2oracle/TestDelete/shape_sql_table.d2,2:4:24-2:9:29", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/shape_sql_table.d2,2:4:24-2:9:29", + "value": [ + { + "string": "shape", + "raw_string": "shape" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/shape_sql_table.d2,2:11:31-2:20:40", + "value": [ + { + "string": "sql_table", + "raw_string": "sql_table" + } + ] + } + } + } + }, + { + "map_key": { + "range": "d2/testdata/d2oracle/TestDelete/shape_sql_table.d2,3:4:45-3:37:78", + "key": { + "range": "d2/testdata/d2oracle/TestDelete/shape_sql_table.d2,3:4:45-3:6:47", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/shape_sql_table.d2,3:4:45-3:6:47", + "value": [ + { + "string": "id", + "raw_string": "id" + } + ] + } + } + ] + }, + "primary": { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/shape_sql_table.d2,3:8:49-3:11:52", + "value": [ + { + "string": "int", + "raw_string": "int" + } + ] + } + }, + "value": { + "map": { + "range": "d2/testdata/d2oracle/TestDelete/shape_sql_table.d2,3:12:53-3:36:77", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestDelete/shape_sql_table.d2,3:13:54-3:36:77", + "key": { + "range": "d2/testdata/d2oracle/TestDelete/shape_sql_table.d2,3:13:54-3:23:64", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/shape_sql_table.d2,3:13:54-3:23:64", + "value": [ + { + "string": "constraint", + "raw_string": "constraint" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/shape_sql_table.d2,3:25:66-3:36:77", + "value": [ + { + "string": "primary_key", + "raw_string": "primary_key" + } + ] + } + } + } + } + ] + } + } + } + } + ] + } + } + } + }, + { + "map_key": { + "range": "d2/testdata/d2oracle/TestDelete/shape_sql_table.d2,6:2:88-6:10:96", + "key": { + "range": "d2/testdata/d2oracle/TestDelete/shape_sql_table.d2,6:2:88-6:10:96", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/shape_sql_table.d2,6:2:88-6:7:93", + "value": [ + { + "string": "disks", + "raw_string": "disks" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/shape_sql_table.d2,6:8:94-6:10:96", + "value": [ + { + "string": "id", + "raw_string": "id" + } + ] + } + } + ] + }, + "primary": {}, + "value": {} + } + }, + { + "map_key": { + "range": "d2/testdata/d2oracle/TestDelete/shape_sql_table.d2,8:2:100-8:27:125", + "edges": [ + { + "range": "d2/testdata/d2oracle/TestDelete/shape_sql_table.d2,8:2:100-8:27:125", + "src": { + "range": "d2/testdata/d2oracle/TestDelete/shape_sql_table.d2,8:2:100-8:19:117", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/shape_sql_table.d2,8:2:100-8:18:116", + "value": [ + { + "string": "AWS S3 Vancouver", + "raw_string": "AWS S3 Vancouver" + } + ] + } + } + ] + }, + "src_arrow": "", + "dst": { + "range": "d2/testdata/d2oracle/TestDelete/shape_sql_table.d2,8:21:119-8:27:125", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/shape_sql_table.d2,8:22:120-8:27:125", + "value": [ + { + "string": "disks", + "raw_string": "disks" + } + ] + } + } + ] + }, + "dst_arrow": ">" + } + ], + "primary": {}, + "value": {} + } + } + ] + } + } + } + } + ] + }, + "root": { + "id": "", + "id_val": "", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + "edges": [ + { + "index": 0, + "minWidth": 0, + "minHeight": 0, + "label_dimensions": { + "width": 0, + "height": 0 + }, + "isCurve": false, + "src_arrow": false, + "dst_arrow": true, + "references": [ + { + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ], + "objects": [ + { + "id": "cloud", + "id_val": "cloud", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestDelete/shape_sql_table.d2,0:0:0-0:5:5", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/shape_sql_table.d2,0:0:0-0:5:5", + "value": [ + { + "string": "cloud", + "raw_string": "cloud" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "cloud" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "disks", + "id_val": "disks", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestDelete/shape_sql_table.d2,1:2:11-1:7:16", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/shape_sql_table.d2,1:2:11-1:7:16", + "value": [ + { + "string": "disks", + "raw_string": "disks" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + }, + { + "key": { + "range": "d2/testdata/d2oracle/TestDelete/shape_sql_table.d2,6:2:88-6:10:96", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/shape_sql_table.d2,6:2:88-6:7:93", + "value": [ + { + "string": "disks", + "raw_string": "disks" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/shape_sql_table.d2,6:8:94-6:10:96", + "value": [ + { + "string": "id", + "raw_string": "id" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + }, + { + "key": { + "range": "d2/testdata/d2oracle/TestDelete/shape_sql_table.d2,8:21:119-8:27:125", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/shape_sql_table.d2,8:22:120-8:27:125", + "value": [ + { + "string": "disks", + "raw_string": "disks" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "sql_table": { + "columns": [ + { + "name": "id", + "type": "int", + "constraint": "primary_key", + "reference": "" + } + ] + }, + "attributes": { + "label": { + "value": "disks" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "sql_table" + } + } + }, + { + "id": "AWS S3 Vancouver", + "id_val": "AWS S3 Vancouver", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestDelete/shape_sql_table.d2,8:2:100-8:19:117", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/shape_sql_table.d2,8:2:100-8:18:116", + "value": [ + { + "string": "AWS S3 Vancouver", + "raw_string": "AWS S3 Vancouver" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "AWS S3 Vancouver" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ] + }, + "err": "" +} diff --git a/testdata/d2oracle/TestDelete/singular_flat_style.exp.json b/testdata/d2oracle/TestDelete/singular_flat_style.exp.json new file mode 100644 index 000000000..7fa82fe34 --- /dev/null +++ b/testdata/d2oracle/TestDelete/singular_flat_style.exp.json @@ -0,0 +1,94 @@ +{ + "graph": { + "ast": { + "range": "d2/testdata/d2oracle/TestDelete/singular_flat_style.d2,0:0:0-1:0:2", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestDelete/singular_flat_style.d2,0:0:0-0:1:1", + "key": { + "range": "d2/testdata/d2oracle/TestDelete/singular_flat_style.d2,0:0:0-0:1:1", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/singular_flat_style.d2,0:0:0-0:1:1", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "primary": {}, + "value": {} + } + } + ] + }, + "root": { + "id": "", + "id_val": "", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + "edges": null, + "objects": [ + { + "id": "x", + "id_val": "x", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestDelete/singular_flat_style.d2,0:0:0-0:1:1", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/singular_flat_style.d2,0:0:0-0:1:1", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "x" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ] + }, + "err": "" +} diff --git a/testdata/d2oracle/TestDelete/singular_map_style.exp.json b/testdata/d2oracle/TestDelete/singular_map_style.exp.json new file mode 100644 index 000000000..801890643 --- /dev/null +++ b/testdata/d2oracle/TestDelete/singular_map_style.exp.json @@ -0,0 +1,94 @@ +{ + "graph": { + "ast": { + "range": "d2/testdata/d2oracle/TestDelete/singular_map_style.d2,0:0:0-1:0:2", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestDelete/singular_map_style.d2,0:0:0-0:1:1", + "key": { + "range": "d2/testdata/d2oracle/TestDelete/singular_map_style.d2,0:0:0-0:1:1", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/singular_map_style.d2,0:0:0-0:1:1", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "primary": {}, + "value": {} + } + } + ] + }, + "root": { + "id": "", + "id_val": "", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + "edges": null, + "objects": [ + { + "id": "x", + "id_val": "x", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestDelete/singular_map_style.d2,0:0:0-0:1:1", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/singular_map_style.d2,0:0:0-0:1:1", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "x" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ] + }, + "err": "" +} diff --git a/testdata/d2oracle/TestDelete/style_from_multiple_map_styles.exp.json b/testdata/d2oracle/TestDelete/style_from_multiple_map_styles.exp.json new file mode 100644 index 000000000..1c8aeb266 --- /dev/null +++ b/testdata/d2oracle/TestDelete/style_from_multiple_map_styles.exp.json @@ -0,0 +1,162 @@ +{ + "graph": { + "ast": { + "range": "d2/testdata/d2oracle/TestDelete/style_from_multiple_map_styles.d2,0:0:0-5:0:39", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestDelete/style_from_multiple_map_styles.d2,0:0:0-4:1:38", + "key": { + "range": "d2/testdata/d2oracle/TestDelete/style_from_multiple_map_styles.d2,0:0:0-0:1:1", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/style_from_multiple_map_styles.d2,0:0:0-0:1:1", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "map": { + "range": "d2/testdata/d2oracle/TestDelete/style_from_multiple_map_styles.d2,0:3:3-4:0:37", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestDelete/style_from_multiple_map_styles.d2,1:2:7-3:3:36", + "key": { + "range": "d2/testdata/d2oracle/TestDelete/style_from_multiple_map_styles.d2,1:2:7-1:7:12", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/style_from_multiple_map_styles.d2,1:2:7-1:7:12", + "value": [ + { + "string": "style", + "raw_string": "style" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "map": { + "range": "d2/testdata/d2oracle/TestDelete/style_from_multiple_map_styles.d2,1:9:14-3:2:35", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestDelete/style_from_multiple_map_styles.d2,2:4:20-2:16:32", + "key": { + "range": "d2/testdata/d2oracle/TestDelete/style_from_multiple_map_styles.d2,2:4:20-2:11:27", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/style_from_multiple_map_styles.d2,2:4:20-2:11:27", + "value": [ + { + "string": "opacity", + "raw_string": "opacity" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "number": { + "range": "d2/testdata/d2oracle/TestDelete/style_from_multiple_map_styles.d2,2:13:29-2:16:32", + "raw": "0.4", + "value": "2/5" + } + } + } + } + ] + } + } + } + } + ] + } + } + } + } + ] + }, + "root": { + "id": "", + "id_val": "", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + "edges": [], + "objects": [ + { + "id": "x", + "id_val": "x", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestDelete/style_from_multiple_map_styles.d2,0:0:0-0:1:1", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/style_from_multiple_map_styles.d2,0:0:0-0:1:1", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "x" + }, + "style": { + "opacity": { + "value": "0.4" + } + }, + "near_key": null, + "shape": { + "value": "" + } + } + } + ] + }, + "err": "" +} diff --git a/testdata/d2oracle/TestDelete/style_from_multiple_styles.exp.json b/testdata/d2oracle/TestDelete/style_from_multiple_styles.exp.json new file mode 100644 index 000000000..0546d2d7d --- /dev/null +++ b/testdata/d2oracle/TestDelete/style_from_multiple_styles.exp.json @@ -0,0 +1,162 @@ +{ + "graph": { + "ast": { + "range": "d2/testdata/d2oracle/TestDelete/style_from_multiple_styles.d2,0:0:0-5:0:39", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestDelete/style_from_multiple_styles.d2,0:0:0-4:1:38", + "key": { + "range": "d2/testdata/d2oracle/TestDelete/style_from_multiple_styles.d2,0:0:0-0:1:1", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/style_from_multiple_styles.d2,0:0:0-0:1:1", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "map": { + "range": "d2/testdata/d2oracle/TestDelete/style_from_multiple_styles.d2,0:3:3-4:0:37", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestDelete/style_from_multiple_styles.d2,1:2:7-3:3:36", + "key": { + "range": "d2/testdata/d2oracle/TestDelete/style_from_multiple_styles.d2,1:2:7-1:7:12", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/style_from_multiple_styles.d2,1:2:7-1:7:12", + "value": [ + { + "string": "style", + "raw_string": "style" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "map": { + "range": "d2/testdata/d2oracle/TestDelete/style_from_multiple_styles.d2,1:9:14-3:2:35", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestDelete/style_from_multiple_styles.d2,2:4:20-2:16:32", + "key": { + "range": "d2/testdata/d2oracle/TestDelete/style_from_multiple_styles.d2,2:4:20-2:11:27", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/style_from_multiple_styles.d2,2:4:20-2:11:27", + "value": [ + { + "string": "opacity", + "raw_string": "opacity" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "number": { + "range": "d2/testdata/d2oracle/TestDelete/style_from_multiple_styles.d2,2:13:29-2:16:32", + "raw": "0.4", + "value": "2/5" + } + } + } + } + ] + } + } + } + } + ] + } + } + } + } + ] + }, + "root": { + "id": "", + "id_val": "", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + "edges": [], + "objects": [ + { + "id": "x", + "id_val": "x", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestDelete/style_from_multiple_styles.d2,0:0:0-0:1:1", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/style_from_multiple_styles.d2,0:0:0-0:1:1", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "x" + }, + "style": { + "opacity": { + "value": "0.4" + } + }, + "near_key": null, + "shape": { + "value": "" + } + } + } + ] + }, + "err": "" +} diff --git a/testdata/d2oracle/TestDelete/style_from_only_map_style.exp.json b/testdata/d2oracle/TestDelete/style_from_only_map_style.exp.json new file mode 100644 index 000000000..d3cb374e0 --- /dev/null +++ b/testdata/d2oracle/TestDelete/style_from_only_map_style.exp.json @@ -0,0 +1,94 @@ +{ + "graph": { + "ast": { + "range": "d2/testdata/d2oracle/TestDelete/style_from_only_map_style.d2,0:0:0-1:0:2", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestDelete/style_from_only_map_style.d2,0:0:0-0:1:1", + "key": { + "range": "d2/testdata/d2oracle/TestDelete/style_from_only_map_style.d2,0:0:0-0:1:1", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/style_from_only_map_style.d2,0:0:0-0:1:1", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "primary": {}, + "value": {} + } + } + ] + }, + "root": { + "id": "", + "id_val": "", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + "edges": null, + "objects": [ + { + "id": "x", + "id_val": "x", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestDelete/style_from_only_map_style.d2,0:0:0-0:1:1", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/style_from_only_map_style.d2,0:0:0-0:1:1", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "x" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ] + }, + "err": "" +} diff --git a/testdata/d2oracle/TestDelete/underscore_no_conflict.exp.json b/testdata/d2oracle/TestDelete/underscore_no_conflict.exp.json new file mode 100644 index 000000000..a5f4bf890 --- /dev/null +++ b/testdata/d2oracle/TestDelete/underscore_no_conflict.exp.json @@ -0,0 +1,248 @@ +{ + "graph": { + "ast": { + "range": "d2/testdata/d2oracle/TestDelete/underscore_no_conflict.d2,0:0:0-5:0:18", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestDelete/underscore_no_conflict.d2,0:0:0-4:1:17", + "key": { + "range": "d2/testdata/d2oracle/TestDelete/underscore_no_conflict.d2,0:0:0-0:1:1", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/underscore_no_conflict.d2,0:0:0-0:1:1", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "map": { + "range": "d2/testdata/d2oracle/TestDelete/underscore_no_conflict.d2,0:3:3-4:0:16", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestDelete/underscore_no_conflict.d2,1:2:7-1:5:10", + "key": { + "range": "d2/testdata/d2oracle/TestDelete/underscore_no_conflict.d2,1:2:7-1:5:10", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/underscore_no_conflict.d2,1:2:7-1:3:8", + "value": [ + { + "string": "_", + "raw_string": "_" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/underscore_no_conflict.d2,1:4:9-1:5:10", + "value": [ + { + "string": "z", + "raw_string": "z" + } + ] + } + } + ] + }, + "primary": {}, + "value": {} + } + }, + { + "map_key": { + "range": "d2/testdata/d2oracle/TestDelete/underscore_no_conflict.d2,3:2:14-3:3:15", + "key": { + "range": "d2/testdata/d2oracle/TestDelete/underscore_no_conflict.d2,3:2:14-3:3:15", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/underscore_no_conflict.d2,3:2:14-3:3:15", + "value": [ + { + "string": "z", + "raw_string": "z" + } + ] + } + } + ] + }, + "primary": {}, + "value": {} + } + } + ] + } + } + } + } + ] + }, + "root": { + "id": "", + "id_val": "", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + "edges": null, + "objects": [ + { + "id": "x", + "id_val": "x", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestDelete/underscore_no_conflict.d2,0:0:0-0:1:1", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/underscore_no_conflict.d2,0:0:0-0:1:1", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "x" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "z", + "id_val": "z", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestDelete/underscore_no_conflict.d2,1:2:7-1:5:10", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/underscore_no_conflict.d2,1:2:7-1:3:8", + "value": [ + { + "string": "_", + "raw_string": "_" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/underscore_no_conflict.d2,1:4:9-1:5:10", + "value": [ + { + "string": "z", + "raw_string": "z" + } + ] + } + } + ] + }, + "key_path_index": 1, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "z" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "z", + "id_val": "z", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestDelete/underscore_no_conflict.d2,3:2:14-3:3:15", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/underscore_no_conflict.d2,3:2:14-3:3:15", + "value": [ + { + "string": "z", + "raw_string": "z" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "z" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ] + }, + "err": "" +} diff --git a/testdata/d2oracle/TestDelete/underscore_remove.exp.json b/testdata/d2oracle/TestDelete/underscore_remove.exp.json new file mode 100644 index 000000000..88abfd541 --- /dev/null +++ b/testdata/d2oracle/TestDelete/underscore_remove.exp.json @@ -0,0 +1,401 @@ +{ + "graph": { + "ast": { + "range": "d2/testdata/d2oracle/TestDelete/underscore_remove.d2,0:0:0-3:0:16", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestDelete/underscore_remove.d2,0:0:0-0:1:1", + "key": { + "range": "d2/testdata/d2oracle/TestDelete/underscore_remove.d2,0:0:0-0:1:1", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/underscore_remove.d2,0:0:0-0:1:1", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + } + ] + }, + "primary": {}, + "value": {} + } + }, + { + "map_key": { + "range": "d2/testdata/d2oracle/TestDelete/underscore_remove.d2,1:0:2-1:6:8", + "edges": [ + { + "range": "d2/testdata/d2oracle/TestDelete/underscore_remove.d2,1:0:2-1:6:8", + "src": { + "range": "d2/testdata/d2oracle/TestDelete/underscore_remove.d2,1:0:2-1:2:4", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/underscore_remove.d2,1:0:2-1:1:3", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + } + ] + }, + "src_arrow": "", + "dst": { + "range": "d2/testdata/d2oracle/TestDelete/underscore_remove.d2,1:4:6-1:6:8", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/underscore_remove.d2,1:5:7-1:6:8", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + } + ] + }, + "dst_arrow": ">" + } + ], + "primary": {}, + "value": {} + } + }, + { + "map_key": { + "range": "d2/testdata/d2oracle/TestDelete/underscore_remove.d2,2:0:9-2:6:15", + "edges": [ + { + "range": "d2/testdata/d2oracle/TestDelete/underscore_remove.d2,2:0:9-2:6:15", + "src": { + "range": "d2/testdata/d2oracle/TestDelete/underscore_remove.d2,2:0:9-2:2:11", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/underscore_remove.d2,2:0:9-2:1:10", + "value": [ + { + "string": "c", + "raw_string": "c" + } + ] + } + } + ] + }, + "src_arrow": "", + "dst": { + "range": "d2/testdata/d2oracle/TestDelete/underscore_remove.d2,2:4:13-2:6:15", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/underscore_remove.d2,2:5:14-2:6:15", + "value": [ + { + "string": "d", + "raw_string": "d" + } + ] + } + } + ] + }, + "dst_arrow": ">" + } + ], + "primary": {}, + "value": {} + } + } + ] + }, + "root": { + "id": "", + "id_val": "", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + "edges": [ + { + "index": 0, + "minWidth": 0, + "minHeight": 0, + "label_dimensions": { + "width": 0, + "height": 0 + }, + "isCurve": false, + "src_arrow": false, + "dst_arrow": true, + "references": [ + { + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "index": 0, + "minWidth": 0, + "minHeight": 0, + "label_dimensions": { + "width": 0, + "height": 0 + }, + "isCurve": false, + "src_arrow": false, + "dst_arrow": true, + "references": [ + { + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ], + "objects": [ + { + "id": "y", + "id_val": "y", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestDelete/underscore_remove.d2,0:0:0-0:1:1", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/underscore_remove.d2,0:0:0-0:1:1", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "y" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "a", + "id_val": "a", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestDelete/underscore_remove.d2,1:0:2-1:2:4", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/underscore_remove.d2,1:0:2-1:1:3", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "a" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "b", + "id_val": "b", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestDelete/underscore_remove.d2,1:4:6-1:6:8", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/underscore_remove.d2,1:5:7-1:6:8", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "b" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "c", + "id_val": "c", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestDelete/underscore_remove.d2,2:0:9-2:2:11", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/underscore_remove.d2,2:0:9-2:1:10", + "value": [ + { + "string": "c", + "raw_string": "c" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "c" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "d", + "id_val": "d", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestDelete/underscore_remove.d2,2:4:13-2:6:15", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestDelete/underscore_remove.d2,2:5:14-2:6:15", + "value": [ + { + "string": "d", + "raw_string": "d" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "d" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ] + }, + "err": "" +} diff --git a/testdata/d2oracle/TestDeleteIDDeltas/base.exp.json b/testdata/d2oracle/TestDeleteIDDeltas/base.exp.json new file mode 100644 index 000000000..33816d4e8 --- /dev/null +++ b/testdata/d2oracle/TestDeleteIDDeltas/base.exp.json @@ -0,0 +1,100 @@ +{ + "id_deltas": [ + { + "type": "node", + "before": "x.y.z", + "after": "x.z" + }, + { + "type": "node", + "before": "x.y.z.w", + "after": "x.z.w" + }, + { + "type": "node", + "before": "x.y.z.w.e", + "after": "x.z.w.e" + }, + { + "type": "node", + "before": "x.y.z.w.e.p", + "after": "x.z.w.e.p" + }, + { + "type": "node", + "before": "x.y.z.w.e.p.l", + "after": "x.z.w.e.p.l" + }, + { + "type": "node", + "before": "x.y.z.1", + "after": "x.z.1" + }, + { + "type": "node", + "before": "x.y.z.1.2", + "after": "x.z.1.2" + }, + { + "type": "node", + "before": "x.y.z.1.2.3", + "after": "x.z.1.2.3" + }, + { + "type": "node", + "before": "x.y.z.1.2.3.4", + "after": "x.z.1.2.3.4" + }, + { + "type": "node", + "before": "x.y.3", + "after": "x.3" + }, + { + "type": "node", + "before": "x.y.3.4", + "after": "x.3.4" + }, + { + "type": "node", + "before": "x.y.3.4.5", + "after": "x.3.4.5" + }, + { + "type": "node", + "before": "x.y.3.4.5.6", + "after": "x.3.4.5.6" + }, + { + "type": "node", + "before": "x.y.3.4.6", + "after": "x.3.4.6" + }, + { + "type": "node", + "before": "x.y.3.4.6.7", + "after": "x.3.4.6.7" + }, + { + "type": "node", + "before": "x.y.p", + "after": "x.p" + }, + { + "type": "edge", + "before": "(x.y.p -> x.y.q)[0]", + "after": "(x.p -> x.y.q)[0]" + }, + { + "type": "node", + "before": "x.y.q", + "after": "x.q" + }, + { + "type": "edge", + "before": "(x.y.p -> x.y.q)[0]", + "after": "(x.y.p -> x.q)[0]" + } + ], + "err": "" +} diff --git a/testdata/d2oracle/TestMove/append_multiple_styles.exp.json b/testdata/d2oracle/TestMove/append_multiple_styles.exp.json new file mode 100644 index 000000000..6394efc88 --- /dev/null +++ b/testdata/d2oracle/TestMove/append_multiple_styles.exp.json @@ -0,0 +1,345 @@ +{ + "graph": { + "ast": { + "range": "d2/testdata/d2oracle/TestMove/append_multiple_styles.d2,0:0:0-12:0:104", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestMove/append_multiple_styles.d2,0:0:0-11:1:103", + "key": { + "range": "d2/testdata/d2oracle/TestMove/append_multiple_styles.d2,0:0:0-0:1:1", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/append_multiple_styles.d2,0:0:0-0:1:1", + "value": [ + { + "string": "d", + "raw_string": "d" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "map": { + "range": "d2/testdata/d2oracle/TestMove/append_multiple_styles.d2,0:3:3-11:0:102", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestMove/append_multiple_styles.d2,1:2:7-5:3:53", + "key": { + "range": "d2/testdata/d2oracle/TestMove/append_multiple_styles.d2,1:2:7-1:3:8", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/append_multiple_styles.d2,1:2:7-1:3:8", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "map": { + "range": "d2/testdata/d2oracle/TestMove/append_multiple_styles.d2,1:5:10-5:2:52", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestMove/append_multiple_styles.d2,2:4:16-4:5:49", + "key": { + "range": "d2/testdata/d2oracle/TestMove/append_multiple_styles.d2,2:4:16-2:9:21", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/append_multiple_styles.d2,2:4:16-2:9:21", + "value": [ + { + "string": "style", + "raw_string": "style" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "map": { + "range": "d2/testdata/d2oracle/TestMove/append_multiple_styles.d2,2:11:23-4:4:48", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestMove/append_multiple_styles.d2,3:6:31-3:18:43", + "key": { + "range": "d2/testdata/d2oracle/TestMove/append_multiple_styles.d2,3:6:31-3:13:38", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/append_multiple_styles.d2,3:6:31-3:13:38", + "value": [ + { + "string": "opacity", + "raw_string": "opacity" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "number": { + "range": "d2/testdata/d2oracle/TestMove/append_multiple_styles.d2,3:15:40-3:18:43", + "raw": "0.4", + "value": "2/5" + } + } + } + } + ] + } + } + } + } + ] + } + } + } + }, + { + "map_key": { + "range": "d2/testdata/d2oracle/TestMove/append_multiple_styles.d2,6:2:56-10:3:101", + "key": { + "range": "d2/testdata/d2oracle/TestMove/append_multiple_styles.d2,6:2:56-6:3:57", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/append_multiple_styles.d2,6:2:56-6:3:57", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "map": { + "range": "d2/testdata/d2oracle/TestMove/append_multiple_styles.d2,6:5:59-10:2:100", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestMove/append_multiple_styles.d2,7:4:65-9:5:97", + "key": { + "range": "d2/testdata/d2oracle/TestMove/append_multiple_styles.d2,7:4:65-7:9:70", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/append_multiple_styles.d2,7:4:65-7:9:70", + "value": [ + { + "string": "style", + "raw_string": "style" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "map": { + "range": "d2/testdata/d2oracle/TestMove/append_multiple_styles.d2,7:11:72-9:4:96", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestMove/append_multiple_styles.d2,8:6:80-8:17:91", + "key": { + "range": "d2/testdata/d2oracle/TestMove/append_multiple_styles.d2,8:6:80-8:10:84", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/append_multiple_styles.d2,8:6:80-8:10:84", + "value": [ + { + "string": "fill", + "raw_string": "fill" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "double_quoted_string": { + "range": "d2/testdata/d2oracle/TestMove/append_multiple_styles.d2,8:12:86-8:17:91", + "value": [ + { + "string": "red", + "raw_string": "red" + } + ] + } + } + } + } + ] + } + } + } + } + ] + } + } + } + } + ] + } + } + } + } + ] + }, + "root": { + "id": "", + "id_val": "", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + "edges": [], + "objects": [ + { + "id": "d", + "id_val": "d", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/append_multiple_styles.d2,0:0:0-0:1:1", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/append_multiple_styles.d2,0:0:0-0:1:1", + "value": [ + { + "string": "d", + "raw_string": "d" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "d" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "a", + "id_val": "a", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/append_multiple_styles.d2,1:2:7-1:3:8", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/append_multiple_styles.d2,1:2:7-1:3:8", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + }, + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/append_multiple_styles.d2,6:2:56-6:3:57", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/append_multiple_styles.d2,6:2:56-6:3:57", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "a" + }, + "style": { + "opacity": { + "value": "0.4" + }, + "fill": { + "value": "red" + } + }, + "near_key": null, + "shape": { + "value": "" + } + } + } + ] + }, + "err": "" +} diff --git a/testdata/d2oracle/TestMove/basic.exp.json b/testdata/d2oracle/TestMove/basic.exp.json new file mode 100644 index 000000000..025afe3fe --- /dev/null +++ b/testdata/d2oracle/TestMove/basic.exp.json @@ -0,0 +1,94 @@ +{ + "graph": { + "ast": { + "range": "d2/testdata/d2oracle/TestMove/basic.d2,0:0:0-1:0:2", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestMove/basic.d2,0:0:0-0:1:1", + "key": { + "range": "d2/testdata/d2oracle/TestMove/basic.d2,0:0:0-0:1:1", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/basic.d2,0:0:0-0:1:1", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + } + ] + }, + "primary": {}, + "value": {} + } + } + ] + }, + "root": { + "id": "", + "id_val": "", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + "edges": null, + "objects": [ + { + "id": "b", + "id_val": "b", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/basic.d2,0:0:0-0:1:1", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/basic.d2,0:0:0-0:1:1", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "b" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ] + }, + "err": "" +} diff --git a/testdata/d2oracle/TestMove/basic_nested.exp.json b/testdata/d2oracle/TestMove/basic_nested.exp.json new file mode 100644 index 000000000..ed1d2fd62 --- /dev/null +++ b/testdata/d2oracle/TestMove/basic_nested.exp.json @@ -0,0 +1,163 @@ +{ + "graph": { + "ast": { + "range": "d2/testdata/d2oracle/TestMove/basic_nested.d2,0:0:0-3:0:11", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestMove/basic_nested.d2,0:0:0-2:1:10", + "key": { + "range": "d2/testdata/d2oracle/TestMove/basic_nested.d2,0:0:0-0:1:1", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/basic_nested.d2,0:0:0-0:1:1", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "map": { + "range": "d2/testdata/d2oracle/TestMove/basic_nested.d2,0:3:3-2:0:9", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestMove/basic_nested.d2,1:2:7-1:3:8", + "key": { + "range": "d2/testdata/d2oracle/TestMove/basic_nested.d2,1:2:7-1:3:8", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/basic_nested.d2,1:2:7-1:3:8", + "value": [ + { + "string": "c", + "raw_string": "c" + } + ] + } + } + ] + }, + "primary": {}, + "value": {} + } + } + ] + } + } + } + } + ] + }, + "root": { + "id": "", + "id_val": "", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + "edges": null, + "objects": [ + { + "id": "a", + "id_val": "a", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/basic_nested.d2,0:0:0-0:1:1", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/basic_nested.d2,0:0:0-0:1:1", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "a" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "c", + "id_val": "c", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/basic_nested.d2,1:2:7-1:3:8", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/basic_nested.d2,1:2:7-1:3:8", + "value": [ + { + "string": "c", + "raw_string": "c" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "c" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ] + }, + "err": "" +} diff --git a/testdata/d2oracle/TestMove/basic_out_of_container.exp.json b/testdata/d2oracle/TestMove/basic_out_of_container.exp.json new file mode 100644 index 000000000..3f1cf248c --- /dev/null +++ b/testdata/d2oracle/TestMove/basic_out_of_container.exp.json @@ -0,0 +1,157 @@ +{ + "graph": { + "ast": { + "range": "d2/testdata/d2oracle/TestMove/basic_out_of_container.d2,0:0:0-2:0:4", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestMove/basic_out_of_container.d2,0:0:0-0:1:1", + "key": { + "range": "d2/testdata/d2oracle/TestMove/basic_out_of_container.d2,0:0:0-0:1:1", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/basic_out_of_container.d2,0:0:0-0:1:1", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + } + ] + }, + "primary": {}, + "value": {} + } + }, + { + "map_key": { + "range": "d2/testdata/d2oracle/TestMove/basic_out_of_container.d2,1:0:2-1:1:3", + "key": { + "range": "d2/testdata/d2oracle/TestMove/basic_out_of_container.d2,1:0:2-1:1:3", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/basic_out_of_container.d2,1:0:2-1:1:3", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + } + ] + }, + "primary": {}, + "value": {} + } + } + ] + }, + "root": { + "id": "", + "id_val": "", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + "edges": null, + "objects": [ + { + "id": "a", + "id_val": "a", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/basic_out_of_container.d2,0:0:0-0:1:1", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/basic_out_of_container.d2,0:0:0-0:1:1", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "a" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "b", + "id_val": "b", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/basic_out_of_container.d2,1:0:2-1:1:3", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/basic_out_of_container.d2,1:0:2-1:1:3", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "b" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ] + }, + "err": "" +} diff --git a/testdata/d2oracle/TestMove/between_containers.exp.json b/testdata/d2oracle/TestMove/between_containers.exp.json new file mode 100644 index 000000000..277b3590a --- /dev/null +++ b/testdata/d2oracle/TestMove/between_containers.exp.json @@ -0,0 +1,226 @@ +{ + "graph": { + "ast": { + "range": "d2/testdata/d2oracle/TestMove/between_containers.d2,0:0:0-4:0:13", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestMove/between_containers.d2,0:0:0-0:1:1", + "key": { + "range": "d2/testdata/d2oracle/TestMove/between_containers.d2,0:0:0-0:1:1", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/between_containers.d2,0:0:0-0:1:1", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + } + ] + }, + "primary": {}, + "value": {} + } + }, + { + "map_key": { + "range": "d2/testdata/d2oracle/TestMove/between_containers.d2,1:0:2-3:1:12", + "key": { + "range": "d2/testdata/d2oracle/TestMove/between_containers.d2,1:0:2-1:1:3", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/between_containers.d2,1:0:2-1:1:3", + "value": [ + { + "string": "c", + "raw_string": "c" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "map": { + "range": "d2/testdata/d2oracle/TestMove/between_containers.d2,1:3:5-3:0:11", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestMove/between_containers.d2,2:2:9-2:3:10", + "key": { + "range": "d2/testdata/d2oracle/TestMove/between_containers.d2,2:2:9-2:3:10", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/between_containers.d2,2:2:9-2:3:10", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + } + ] + }, + "primary": {}, + "value": {} + } + } + ] + } + } + } + } + ] + }, + "root": { + "id": "", + "id_val": "", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + "edges": null, + "objects": [ + { + "id": "a", + "id_val": "a", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/between_containers.d2,0:0:0-0:1:1", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/between_containers.d2,0:0:0-0:1:1", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "a" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "c", + "id_val": "c", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/between_containers.d2,1:0:2-1:1:3", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/between_containers.d2,1:0:2-1:1:3", + "value": [ + { + "string": "c", + "raw_string": "c" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "c" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "b", + "id_val": "b", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/between_containers.d2,2:2:9-2:3:10", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/between_containers.d2,2:2:9-2:3:10", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "b" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ] + }, + "err": "" +} diff --git a/testdata/d2oracle/TestMove/chain_connected_nested.exp.json b/testdata/d2oracle/TestMove/chain_connected_nested.exp.json new file mode 100644 index 000000000..16aed2451 --- /dev/null +++ b/testdata/d2oracle/TestMove/chain_connected_nested.exp.json @@ -0,0 +1,352 @@ +{ + "graph": { + "ast": { + "range": "d2/testdata/d2oracle/TestMove/chain_connected_nested.d2,0:0:0-2:0:14", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestMove/chain_connected_nested.d2,0:0:0-0:11:11", + "edges": [ + { + "range": "d2/testdata/d2oracle/TestMove/chain_connected_nested.d2,0:0:0-0:7:7", + "src": { + "range": "d2/testdata/d2oracle/TestMove/chain_connected_nested.d2,0:0:0-0:2:2", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/chain_connected_nested.d2,0:0:0-0:1:1", + "value": [ + { + "string": "z", + "raw_string": "z" + } + ] + } + } + ] + }, + "src_arrow": "", + "dst": { + "range": "d2/testdata/d2oracle/TestMove/chain_connected_nested.d2,0:4:4-0:7:7", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/chain_connected_nested.d2,0:5:5-0:6:6", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "dst_arrow": ">" + }, + { + "range": "d2/testdata/d2oracle/TestMove/chain_connected_nested.d2,0:4:4-0:11:11", + "src": { + "range": "d2/testdata/d2oracle/TestMove/chain_connected_nested.d2,0:4:4-0:7:7", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/chain_connected_nested.d2,0:5:5-0:6:6", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "src_arrow": "", + "dst": { + "range": "d2/testdata/d2oracle/TestMove/chain_connected_nested.d2,0:9:9-0:11:11", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/chain_connected_nested.d2,0:10:10-0:11:11", + "value": [ + { + "string": "z", + "raw_string": "z" + } + ] + } + } + ] + }, + "dst_arrow": ">" + } + ], + "primary": {}, + "value": {} + } + }, + { + "map_key": { + "range": "d2/testdata/d2oracle/TestMove/chain_connected_nested.d2,1:0:12-1:1:13", + "key": { + "range": "d2/testdata/d2oracle/TestMove/chain_connected_nested.d2,1:0:12-1:1:13", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/chain_connected_nested.d2,1:0:12-1:1:13", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + } + ] + }, + "primary": {}, + "value": {} + } + } + ] + }, + "root": { + "id": "", + "id_val": "", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + "edges": [ + { + "index": 0, + "minWidth": 0, + "minHeight": 0, + "label_dimensions": { + "width": 0, + "height": 0 + }, + "isCurve": false, + "src_arrow": false, + "dst_arrow": true, + "references": [ + { + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "index": 0, + "minWidth": 0, + "minHeight": 0, + "label_dimensions": { + "width": 0, + "height": 0 + }, + "isCurve": false, + "src_arrow": false, + "dst_arrow": true, + "references": [ + { + "map_key_edge_index": 1 + } + ], + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ], + "objects": [ + { + "id": "y", + "id_val": "y", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/chain_connected_nested.d2,1:0:12-1:1:13", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/chain_connected_nested.d2,1:0:12-1:1:13", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "y" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "z", + "id_val": "z", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/chain_connected_nested.d2,0:0:0-0:2:2", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/chain_connected_nested.d2,0:0:0-0:1:1", + "value": [ + { + "string": "z", + "raw_string": "z" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + }, + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/chain_connected_nested.d2,0:9:9-0:11:11", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/chain_connected_nested.d2,0:10:10-0:11:11", + "value": [ + { + "string": "z", + "raw_string": "z" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 1 + } + ], + "attributes": { + "label": { + "value": "z" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "x", + "id_val": "x", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/chain_connected_nested.d2,0:4:4-0:7:7", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/chain_connected_nested.d2,0:5:5-0:6:6", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + }, + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/chain_connected_nested.d2,0:4:4-0:7:7", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/chain_connected_nested.d2,0:5:5-0:6:6", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 1 + } + ], + "attributes": { + "label": { + "value": "x" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ] + }, + "err": "" +} diff --git a/testdata/d2oracle/TestMove/chain_connected_nested_no_extra_create.exp.json b/testdata/d2oracle/TestMove/chain_connected_nested_no_extra_create.exp.json new file mode 100644 index 000000000..c97e6fdc1 --- /dev/null +++ b/testdata/d2oracle/TestMove/chain_connected_nested_no_extra_create.exp.json @@ -0,0 +1,382 @@ +{ + "graph": { + "ast": { + "range": "d2/testdata/d2oracle/TestMove/chain_connected_nested_no_extra_create.d2,0:0:0-1:0:14", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestMove/chain_connected_nested_no_extra_create.d2,0:0:0-0:13:13", + "edges": [ + { + "range": "d2/testdata/d2oracle/TestMove/chain_connected_nested_no_extra_create.d2,0:0:0-0:9:9", + "src": { + "range": "d2/testdata/d2oracle/TestMove/chain_connected_nested_no_extra_create.d2,0:0:0-0:4:4", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/chain_connected_nested_no_extra_create.d2,0:0:0-0:1:1", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/chain_connected_nested_no_extra_create.d2,0:2:2-0:3:3", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + } + ] + }, + "src_arrow": "", + "dst": { + "range": "d2/testdata/d2oracle/TestMove/chain_connected_nested_no_extra_create.d2,0:6:6-0:9:9", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/chain_connected_nested_no_extra_create.d2,0:7:7-0:8:8", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "dst_arrow": ">" + }, + { + "range": "d2/testdata/d2oracle/TestMove/chain_connected_nested_no_extra_create.d2,0:6:6-0:13:13", + "src": { + "range": "d2/testdata/d2oracle/TestMove/chain_connected_nested_no_extra_create.d2,0:6:6-0:9:9", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/chain_connected_nested_no_extra_create.d2,0:7:7-0:8:8", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "src_arrow": "", + "dst": { + "range": "d2/testdata/d2oracle/TestMove/chain_connected_nested_no_extra_create.d2,0:11:11-0:13:13", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/chain_connected_nested_no_extra_create.d2,0:12:12-0:13:13", + "value": [ + { + "string": "z", + "raw_string": "z" + } + ] + } + } + ] + }, + "dst_arrow": ">" + } + ], + "primary": {}, + "value": {} + } + } + ] + }, + "root": { + "id": "", + "id_val": "", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + "edges": [ + { + "index": 0, + "minWidth": 0, + "minHeight": 0, + "label_dimensions": { + "width": 0, + "height": 0 + }, + "isCurve": false, + "src_arrow": false, + "dst_arrow": true, + "references": [ + { + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "index": 0, + "minWidth": 0, + "minHeight": 0, + "label_dimensions": { + "width": 0, + "height": 0 + }, + "isCurve": false, + "src_arrow": false, + "dst_arrow": true, + "references": [ + { + "map_key_edge_index": 1 + } + ], + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ], + "objects": [ + { + "id": "y", + "id_val": "y", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/chain_connected_nested_no_extra_create.d2,0:0:0-0:4:4", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/chain_connected_nested_no_extra_create.d2,0:0:0-0:1:1", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/chain_connected_nested_no_extra_create.d2,0:2:2-0:3:3", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "y" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "b", + "id_val": "b", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/chain_connected_nested_no_extra_create.d2,0:0:0-0:4:4", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/chain_connected_nested_no_extra_create.d2,0:0:0-0:1:1", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/chain_connected_nested_no_extra_create.d2,0:2:2-0:3:3", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + } + ] + }, + "key_path_index": 1, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "b" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "x", + "id_val": "x", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/chain_connected_nested_no_extra_create.d2,0:6:6-0:9:9", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/chain_connected_nested_no_extra_create.d2,0:7:7-0:8:8", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + }, + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/chain_connected_nested_no_extra_create.d2,0:6:6-0:9:9", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/chain_connected_nested_no_extra_create.d2,0:7:7-0:8:8", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 1 + } + ], + "attributes": { + "label": { + "value": "x" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "z", + "id_val": "z", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/chain_connected_nested_no_extra_create.d2,0:11:11-0:13:13", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/chain_connected_nested_no_extra_create.d2,0:12:12-0:13:13", + "value": [ + { + "string": "z", + "raw_string": "z" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 1 + } + ], + "attributes": { + "label": { + "value": "z" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ] + }, + "err": "" +} diff --git a/testdata/d2oracle/TestMove/chian_connected_nested.exp.json b/testdata/d2oracle/TestMove/chian_connected_nested.exp.json new file mode 100644 index 000000000..7bf53c34e --- /dev/null +++ b/testdata/d2oracle/TestMove/chian_connected_nested.exp.json @@ -0,0 +1,353 @@ +{ + "graph": { + "ast": { + "range": "d2/testdata/d2oracle/TestMove/chian_connected_nested.d2,0:0:0-2:0:14", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestMove/chian_connected_nested.d2,0:0:0-0:11:11", + "edges": [ + { + "range": "d2/testdata/d2oracle/TestMove/chian_connected_nested.d2,0:0:0-0:7:7", + "src": { + "range": "d2/testdata/d2oracle/TestMove/chian_connected_nested.d2,0:0:0-0:2:2", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/chian_connected_nested.d2,0:0:0-0:1:1", + "value": [ + { + "string": "z", + "raw_string": "z" + } + ] + } + } + ] + }, + "src_arrow": "", + "dst": { + "range": "d2/testdata/d2oracle/TestMove/chian_connected_nested.d2,0:4:4-0:7:7", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/chian_connected_nested.d2,0:5:5-0:6:6", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "dst_arrow": ">" + }, + { + "range": "d2/testdata/d2oracle/TestMove/chian_connected_nested.d2,0:4:4-0:11:11", + "src": { + "range": "d2/testdata/d2oracle/TestMove/chian_connected_nested.d2,0:4:4-0:7:7", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/chian_connected_nested.d2,0:5:5-0:6:6", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "src_arrow": "", + "dst": { + "range": "d2/testdata/d2oracle/TestMove/chian_connected_nested.d2,0:9:9-0:11:11", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/chian_connected_nested.d2,0:10:10-0:11:11", + "value": [ + { + "string": "z", + "raw_string": "z" + } + ] + } + } + ] + }, + "dst_arrow": ">" + } + ], + "primary": {}, + "value": {} + } + }, + { + "map_key": { + "range": "d2/testdata/d2oracle/TestMove/chian_connected_nested.d2,1:0:12-1:1:13", + "key": { + "range": "d2/testdata/d2oracle/TestMove/chian_connected_nested.d2,1:0:12-1:1:13", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/chian_connected_nested.d2,1:0:12-1:1:13", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + } + ] + }, + "primary": {}, + "value": {} + } + } + ] + }, + "root": { + "id": "", + "id_val": "", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + "edges": [ + { + "index": 0, + "label_dimensions": { + "width": 0, + "height": 0 + }, + "src_arrow": false, + "dst_arrow": true, + "references": [ + { + "map_key_edge_index": 0, + "scope_key": "" + } + ], + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "index": 0, + "label_dimensions": { + "width": 0, + "height": 0 + }, + "src_arrow": false, + "dst_arrow": true, + "references": [ + { + "map_key_edge_index": 1, + "scope_key": "" + } + ], + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ], + "objects": [ + { + "id": "y", + "id_val": "y", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/chian_connected_nested.d2,1:0:12-1:1:13", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/chian_connected_nested.d2,1:0:12-1:1:13", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0, + "scope_key": "" + } + ], + "attributes": { + "label": { + "value": "y" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "z", + "id_val": "z", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/chian_connected_nested.d2,0:0:0-0:2:2", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/chian_connected_nested.d2,0:0:0-0:1:1", + "value": [ + { + "string": "z", + "raw_string": "z" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0, + "scope_key": "" + }, + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/chian_connected_nested.d2,0:9:9-0:11:11", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/chian_connected_nested.d2,0:10:10-0:11:11", + "value": [ + { + "string": "z", + "raw_string": "z" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 1, + "scope_key": "" + } + ], + "attributes": { + "label": { + "value": "z" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "x", + "id_val": "x", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/chian_connected_nested.d2,0:4:4-0:7:7", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/chian_connected_nested.d2,0:5:5-0:6:6", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0, + "scope_key": "" + }, + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/chian_connected_nested.d2,0:4:4-0:7:7", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/chian_connected_nested.d2,0:5:5-0:6:6", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 1, + "scope_key": "" + } + ], + "attributes": { + "label": { + "value": "x" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ] + }, + "err": "" +} diff --git a/testdata/d2oracle/TestMove/connected_nested.exp.json b/testdata/d2oracle/TestMove/connected_nested.exp.json new file mode 100644 index 000000000..030919340 --- /dev/null +++ b/testdata/d2oracle/TestMove/connected_nested.exp.json @@ -0,0 +1,248 @@ +{ + "graph": { + "ast": { + "range": "d2/testdata/d2oracle/TestMove/connected_nested.d2,0:0:0-2:0:9", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestMove/connected_nested.d2,0:0:0-0:6:6", + "edges": [ + { + "range": "d2/testdata/d2oracle/TestMove/connected_nested.d2,0:0:0-0:6:6", + "src": { + "range": "d2/testdata/d2oracle/TestMove/connected_nested.d2,0:0:0-0:2:2", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/connected_nested.d2,0:0:0-0:1:1", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "src_arrow": "", + "dst": { + "range": "d2/testdata/d2oracle/TestMove/connected_nested.d2,0:4:4-0:6:6", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/connected_nested.d2,0:5:5-0:6:6", + "value": [ + { + "string": "z", + "raw_string": "z" + } + ] + } + } + ] + }, + "dst_arrow": ">" + } + ], + "primary": {}, + "value": {} + } + }, + { + "map_key": { + "range": "d2/testdata/d2oracle/TestMove/connected_nested.d2,1:0:7-1:1:8", + "key": { + "range": "d2/testdata/d2oracle/TestMove/connected_nested.d2,1:0:7-1:1:8", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/connected_nested.d2,1:0:7-1:1:8", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + } + ] + }, + "primary": {}, + "value": {} + } + } + ] + }, + "root": { + "id": "", + "id_val": "", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + "edges": [ + { + "index": 0, + "minWidth": 0, + "minHeight": 0, + "label_dimensions": { + "width": 0, + "height": 0 + }, + "isCurve": false, + "src_arrow": false, + "dst_arrow": true, + "references": [ + { + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ], + "objects": [ + { + "id": "y", + "id_val": "y", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/connected_nested.d2,1:0:7-1:1:8", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/connected_nested.d2,1:0:7-1:1:8", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "y" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "x", + "id_val": "x", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/connected_nested.d2,0:0:0-0:2:2", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/connected_nested.d2,0:0:0-0:1:1", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "x" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "z", + "id_val": "z", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/connected_nested.d2,0:4:4-0:6:6", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/connected_nested.d2,0:5:5-0:6:6", + "value": [ + { + "string": "z", + "raw_string": "z" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "z" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ] + }, + "err": "" +} diff --git a/testdata/d2oracle/TestMove/container_near.exp.json b/testdata/d2oracle/TestMove/container_near.exp.json new file mode 100644 index 000000000..a5a36f06f --- /dev/null +++ b/testdata/d2oracle/TestMove/container_near.exp.json @@ -0,0 +1,507 @@ +{ + "graph": { + "ast": { + "range": "d2/testdata/d2oracle/TestMove/container_near.d2,0:0:0-9:0:51", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestMove/container_near.d2,0:0:0-5:1:39", + "key": { + "range": "d2/testdata/d2oracle/TestMove/container_near.d2,0:0:0-0:1:1", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/container_near.d2,0:0:0-0:1:1", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "map": { + "range": "d2/testdata/d2oracle/TestMove/container_near.d2,0:3:3-5:0:38", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestMove/container_near.d2,1:2:7-3:3:31", + "key": { + "range": "d2/testdata/d2oracle/TestMove/container_near.d2,1:2:7-1:3:8", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/container_near.d2,1:2:7-1:3:8", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "map": { + "range": "d2/testdata/d2oracle/TestMove/container_near.d2,1:5:10-3:2:30", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestMove/container_near.d2,2:4:16-2:15:27", + "key": { + "range": "d2/testdata/d2oracle/TestMove/container_near.d2,2:4:16-2:8:20", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/container_near.d2,2:4:16-2:8:20", + "value": [ + { + "string": "near", + "raw_string": "near" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/container_near.d2,2:10:22-2:15:27", + "value": [ + { + "string": "x.a.z", + "raw_string": "x.a.z" + } + ] + } + } + } + } + ] + } + } + } + }, + { + "map_key": { + "range": "d2/testdata/d2oracle/TestMove/container_near.d2,4:2:34-4:5:37", + "key": { + "range": "d2/testdata/d2oracle/TestMove/container_near.d2,4:2:34-4:5:37", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/container_near.d2,4:2:34-4:3:35", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/container_near.d2,4:4:36-4:5:37", + "value": [ + { + "string": "z", + "raw_string": "z" + } + ] + } + } + ] + }, + "primary": {}, + "value": {} + } + } + ] + } + } + } + }, + { + "map_key": { + "range": "d2/testdata/d2oracle/TestMove/container_near.d2,6:0:40-8:1:50", + "key": { + "range": "d2/testdata/d2oracle/TestMove/container_near.d2,6:0:40-6:1:41", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/container_near.d2,6:0:40-6:1:41", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "map": { + "range": "d2/testdata/d2oracle/TestMove/container_near.d2,6:3:43-8:0:49", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestMove/container_near.d2,7:2:47-7:3:48", + "key": { + "range": "d2/testdata/d2oracle/TestMove/container_near.d2,7:2:47-7:3:48", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/container_near.d2,7:2:47-7:3:48", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + } + ] + }, + "primary": {}, + "value": {} + } + } + ] + } + } + } + } + ] + }, + "root": { + "id": "", + "id_val": "", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + "edges": null, + "objects": [ + { + "id": "x", + "id_val": "x", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/container_near.d2,0:0:0-0:1:1", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/container_near.d2,0:0:0-0:1:1", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "x" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "y", + "id_val": "y", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/container_near.d2,1:2:7-1:3:8", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/container_near.d2,1:2:7-1:3:8", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "y" + }, + "style": {}, + "near_key": { + "range": ",0:0:0-0:5:5", + "path": [ + { + "unquoted_string": { + "range": ",0:0:0-0:1:1", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + }, + { + "unquoted_string": { + "range": ",0:2:2-0:3:3", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + }, + { + "unquoted_string": { + "range": ",0:4:4-0:5:5", + "value": [ + { + "string": "z", + "raw_string": "z" + } + ] + } + } + ] + }, + "shape": { + "value": "" + } + } + }, + { + "id": "a", + "id_val": "a", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/container_near.d2,4:2:34-4:5:37", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/container_near.d2,4:2:34-4:3:35", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/container_near.d2,4:4:36-4:5:37", + "value": [ + { + "string": "z", + "raw_string": "z" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "a" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "z", + "id_val": "z", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/container_near.d2,4:2:34-4:5:37", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/container_near.d2,4:2:34-4:3:35", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/container_near.d2,4:4:36-4:5:37", + "value": [ + { + "string": "z", + "raw_string": "z" + } + ] + } + } + ] + }, + "key_path_index": 1, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "z" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "y", + "id_val": "y", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/container_near.d2,6:0:40-6:1:41", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/container_near.d2,6:0:40-6:1:41", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "y" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "a", + "id_val": "a", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/container_near.d2,7:2:47-7:3:48", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/container_near.d2,7:2:47-7:3:48", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "a" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ] + }, + "err": "" +} diff --git a/testdata/d2oracle/TestMove/edge_across_containers.exp.json b/testdata/d2oracle/TestMove/edge_across_containers.exp.json new file mode 100644 index 000000000..e16514bda --- /dev/null +++ b/testdata/d2oracle/TestMove/edge_across_containers.exp.json @@ -0,0 +1,403 @@ +{ + "graph": { + "ast": { + "range": "d2/testdata/d2oracle/TestMove/edge_across_containers.d2,0:0:0-4:0:22", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestMove/edge_across_containers.d2,0:0:0-2:1:19", + "key": { + "range": "d2/testdata/d2oracle/TestMove/edge_across_containers.d2,0:0:0-0:1:1", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/edge_across_containers.d2,0:0:0-0:1:1", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "map": { + "range": "d2/testdata/d2oracle/TestMove/edge_across_containers.d2,0:3:3-2:0:18", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestMove/edge_across_containers.d2,1:2:7-1:12:17", + "edges": [ + { + "range": "d2/testdata/d2oracle/TestMove/edge_across_containers.d2,1:2:7-1:12:17", + "src": { + "range": "d2/testdata/d2oracle/TestMove/edge_across_containers.d2,1:2:7-1:8:13", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/edge_across_containers.d2,1:2:7-1:3:8", + "value": [ + { + "string": "_", + "raw_string": "_" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/edge_across_containers.d2,1:4:9-1:5:10", + "value": [ + { + "string": "d", + "raw_string": "d" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/edge_across_containers.d2,1:6:11-1:7:12", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + } + ] + }, + "src_arrow": "", + "dst": { + "range": "d2/testdata/d2oracle/TestMove/edge_across_containers.d2,1:10:15-1:12:17", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/edge_across_containers.d2,1:11:16-1:12:17", + "value": [ + { + "string": "c", + "raw_string": "c" + } + ] + } + } + ] + }, + "dst_arrow": ">" + } + ], + "primary": {}, + "value": {} + } + } + ] + } + } + } + }, + { + "map_key": { + "range": "d2/testdata/d2oracle/TestMove/edge_across_containers.d2,3:0:20-3:1:21", + "key": { + "range": "d2/testdata/d2oracle/TestMove/edge_across_containers.d2,3:0:20-3:1:21", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/edge_across_containers.d2,3:0:20-3:1:21", + "value": [ + { + "string": "d", + "raw_string": "d" + } + ] + } + } + ] + }, + "primary": {}, + "value": {} + } + } + ] + }, + "root": { + "id": "", + "id_val": "", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + "edges": [ + { + "index": 0, + "minWidth": 0, + "minHeight": 0, + "label_dimensions": { + "width": 0, + "height": 0 + }, + "isCurve": false, + "src_arrow": false, + "dst_arrow": true, + "references": [ + { + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ], + "objects": [ + { + "id": "a", + "id_val": "a", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/edge_across_containers.d2,0:0:0-0:1:1", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/edge_across_containers.d2,0:0:0-0:1:1", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "a" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "d", + "id_val": "d", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/edge_across_containers.d2,3:0:20-3:1:21", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/edge_across_containers.d2,3:0:20-3:1:21", + "value": [ + { + "string": "d", + "raw_string": "d" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + }, + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/edge_across_containers.d2,1:2:7-1:8:13", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/edge_across_containers.d2,1:2:7-1:3:8", + "value": [ + { + "string": "_", + "raw_string": "_" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/edge_across_containers.d2,1:4:9-1:5:10", + "value": [ + { + "string": "d", + "raw_string": "d" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/edge_across_containers.d2,1:6:11-1:7:12", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + } + ] + }, + "key_path_index": 1, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "d" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "b", + "id_val": "b", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/edge_across_containers.d2,1:2:7-1:8:13", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/edge_across_containers.d2,1:2:7-1:3:8", + "value": [ + { + "string": "_", + "raw_string": "_" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/edge_across_containers.d2,1:4:9-1:5:10", + "value": [ + { + "string": "d", + "raw_string": "d" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/edge_across_containers.d2,1:6:11-1:7:12", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + } + ] + }, + "key_path_index": 2, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "b" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "c", + "id_val": "c", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/edge_across_containers.d2,1:10:15-1:12:17", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/edge_across_containers.d2,1:11:16-1:12:17", + "value": [ + { + "string": "c", + "raw_string": "c" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "c" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ] + }, + "err": "" +} diff --git a/testdata/d2oracle/TestMove/edge_basic.exp.json b/testdata/d2oracle/TestMove/edge_basic.exp.json new file mode 100644 index 000000000..b82200541 --- /dev/null +++ b/testdata/d2oracle/TestMove/edge_basic.exp.json @@ -0,0 +1,185 @@ +{ + "graph": { + "ast": { + "range": "d2/testdata/d2oracle/TestMove/edge_basic.d2,0:0:0-1:0:7", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestMove/edge_basic.d2,0:0:0-0:6:6", + "edges": [ + { + "range": "d2/testdata/d2oracle/TestMove/edge_basic.d2,0:0:0-0:6:6", + "src": { + "range": "d2/testdata/d2oracle/TestMove/edge_basic.d2,0:0:0-0:2:2", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/edge_basic.d2,0:0:0-0:1:1", + "value": [ + { + "string": "c", + "raw_string": "c" + } + ] + } + } + ] + }, + "src_arrow": "", + "dst": { + "range": "d2/testdata/d2oracle/TestMove/edge_basic.d2,0:4:4-0:6:6", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/edge_basic.d2,0:5:5-0:6:6", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + } + ] + }, + "dst_arrow": ">" + } + ], + "primary": {}, + "value": {} + } + } + ] + }, + "root": { + "id": "", + "id_val": "", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + "edges": [ + { + "index": 0, + "minWidth": 0, + "minHeight": 0, + "label_dimensions": { + "width": 0, + "height": 0 + }, + "isCurve": false, + "src_arrow": false, + "dst_arrow": true, + "references": [ + { + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ], + "objects": [ + { + "id": "c", + "id_val": "c", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/edge_basic.d2,0:0:0-0:2:2", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/edge_basic.d2,0:0:0-0:1:1", + "value": [ + { + "string": "c", + "raw_string": "c" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "c" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "b", + "id_val": "b", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/edge_basic.d2,0:4:4-0:6:6", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/edge_basic.d2,0:5:5-0:6:6", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "b" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ] + }, + "err": "" +} diff --git a/testdata/d2oracle/TestMove/edge_chain_basic.exp.json b/testdata/d2oracle/TestMove/edge_chain_basic.exp.json new file mode 100644 index 000000000..fa6cea6af --- /dev/null +++ b/testdata/d2oracle/TestMove/edge_chain_basic.exp.json @@ -0,0 +1,309 @@ +{ + "graph": { + "ast": { + "range": "d2/testdata/d2oracle/TestMove/edge_chain_basic.d2,0:0:0-1:0:12", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestMove/edge_chain_basic.d2,0:0:0-0:11:11", + "edges": [ + { + "range": "d2/testdata/d2oracle/TestMove/edge_chain_basic.d2,0:0:0-0:7:7", + "src": { + "range": "d2/testdata/d2oracle/TestMove/edge_chain_basic.d2,0:0:0-0:2:2", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/edge_chain_basic.d2,0:0:0-0:1:1", + "value": [ + { + "string": "d", + "raw_string": "d" + } + ] + } + } + ] + }, + "src_arrow": "", + "dst": { + "range": "d2/testdata/d2oracle/TestMove/edge_chain_basic.d2,0:4:4-0:7:7", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/edge_chain_basic.d2,0:5:5-0:6:6", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + } + ] + }, + "dst_arrow": ">" + }, + { + "range": "d2/testdata/d2oracle/TestMove/edge_chain_basic.d2,0:4:4-0:11:11", + "src": { + "range": "d2/testdata/d2oracle/TestMove/edge_chain_basic.d2,0:4:4-0:7:7", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/edge_chain_basic.d2,0:5:5-0:6:6", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + } + ] + }, + "src_arrow": "", + "dst": { + "range": "d2/testdata/d2oracle/TestMove/edge_chain_basic.d2,0:9:9-0:11:11", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/edge_chain_basic.d2,0:10:10-0:11:11", + "value": [ + { + "string": "c", + "raw_string": "c" + } + ] + } + } + ] + }, + "dst_arrow": ">" + } + ], + "primary": {}, + "value": {} + } + } + ] + }, + "root": { + "id": "", + "id_val": "", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + "edges": [ + { + "index": 0, + "minWidth": 0, + "minHeight": 0, + "label_dimensions": { + "width": 0, + "height": 0 + }, + "isCurve": false, + "src_arrow": false, + "dst_arrow": true, + "references": [ + { + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "index": 0, + "minWidth": 0, + "minHeight": 0, + "label_dimensions": { + "width": 0, + "height": 0 + }, + "isCurve": false, + "src_arrow": false, + "dst_arrow": true, + "references": [ + { + "map_key_edge_index": 1 + } + ], + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ], + "objects": [ + { + "id": "d", + "id_val": "d", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/edge_chain_basic.d2,0:0:0-0:2:2", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/edge_chain_basic.d2,0:0:0-0:1:1", + "value": [ + { + "string": "d", + "raw_string": "d" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "d" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "b", + "id_val": "b", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/edge_chain_basic.d2,0:4:4-0:7:7", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/edge_chain_basic.d2,0:5:5-0:6:6", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + }, + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/edge_chain_basic.d2,0:4:4-0:7:7", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/edge_chain_basic.d2,0:5:5-0:6:6", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 1 + } + ], + "attributes": { + "label": { + "value": "b" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "c", + "id_val": "c", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/edge_chain_basic.d2,0:9:9-0:11:11", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/edge_chain_basic.d2,0:10:10-0:11:11", + "value": [ + { + "string": "c", + "raw_string": "c" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 1 + } + ], + "attributes": { + "label": { + "value": "c" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ] + }, + "err": "" +} diff --git a/testdata/d2oracle/TestMove/edge_chain_circular.exp.json b/testdata/d2oracle/TestMove/edge_chain_circular.exp.json new file mode 100644 index 000000000..f190d1a29 --- /dev/null +++ b/testdata/d2oracle/TestMove/edge_chain_circular.exp.json @@ -0,0 +1,402 @@ +{ + "graph": { + "ast": { + "range": "d2/testdata/d2oracle/TestMove/edge_chain_circular.d2,0:0:0-3:0:25", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestMove/edge_chain_circular.d2,0:0:0-2:1:24", + "key": { + "range": "d2/testdata/d2oracle/TestMove/edge_chain_circular.d2,0:0:0-0:1:1", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/edge_chain_circular.d2,0:0:0-0:1:1", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "map": { + "range": "d2/testdata/d2oracle/TestMove/edge_chain_circular.d2,0:3:3-2:0:23", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestMove/edge_chain_circular.d2,1:2:7-1:17:22", + "edges": [ + { + "range": "d2/testdata/d2oracle/TestMove/edge_chain_circular.d2,1:2:7-1:11:16", + "src": { + "range": "d2/testdata/d2oracle/TestMove/edge_chain_circular.d2,1:2:7-1:6:11", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/edge_chain_circular.d2,1:2:7-1:3:8", + "value": [ + { + "string": "_", + "raw_string": "_" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/edge_chain_circular.d2,1:4:9-1:5:10", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + } + ] + }, + "src_arrow": "", + "dst": { + "range": "d2/testdata/d2oracle/TestMove/edge_chain_circular.d2,1:8:13-1:11:16", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/edge_chain_circular.d2,1:9:14-1:10:15", + "value": [ + { + "string": "c", + "raw_string": "c" + } + ] + } + } + ] + }, + "dst_arrow": ">" + }, + { + "range": "d2/testdata/d2oracle/TestMove/edge_chain_circular.d2,1:8:13-1:17:22", + "src": { + "range": "d2/testdata/d2oracle/TestMove/edge_chain_circular.d2,1:8:13-1:11:16", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/edge_chain_circular.d2,1:9:14-1:10:15", + "value": [ + { + "string": "c", + "raw_string": "c" + } + ] + } + } + ] + }, + "src_arrow": "", + "dst": { + "range": "d2/testdata/d2oracle/TestMove/edge_chain_circular.d2,1:13:18-1:17:22", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/edge_chain_circular.d2,1:14:19-1:15:20", + "value": [ + { + "string": "_", + "raw_string": "_" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/edge_chain_circular.d2,1:16:21-1:17:22", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + } + ] + }, + "dst_arrow": ">" + } + ], + "primary": {}, + "value": {} + } + } + ] + } + } + } + } + ] + }, + "root": { + "id": "", + "id_val": "", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + "edges": [ + { + "index": 0, + "minWidth": 0, + "minHeight": 0, + "label_dimensions": { + "width": 0, + "height": 0 + }, + "isCurve": false, + "src_arrow": false, + "dst_arrow": true, + "references": [ + { + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "index": 0, + "minWidth": 0, + "minHeight": 0, + "label_dimensions": { + "width": 0, + "height": 0 + }, + "isCurve": false, + "src_arrow": false, + "dst_arrow": true, + "references": [ + { + "map_key_edge_index": 1 + } + ], + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ], + "objects": [ + { + "id": "a", + "id_val": "a", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/edge_chain_circular.d2,0:0:0-0:1:1", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/edge_chain_circular.d2,0:0:0-0:1:1", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "a" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "b", + "id_val": "b", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/edge_chain_circular.d2,1:2:7-1:6:11", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/edge_chain_circular.d2,1:2:7-1:3:8", + "value": [ + { + "string": "_", + "raw_string": "_" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/edge_chain_circular.d2,1:4:9-1:5:10", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + } + ] + }, + "key_path_index": 1, + "map_key_edge_index": 0 + }, + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/edge_chain_circular.d2,1:13:18-1:17:22", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/edge_chain_circular.d2,1:14:19-1:15:20", + "value": [ + { + "string": "_", + "raw_string": "_" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/edge_chain_circular.d2,1:16:21-1:17:22", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + } + ] + }, + "key_path_index": 1, + "map_key_edge_index": 1 + } + ], + "attributes": { + "label": { + "value": "b" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "c", + "id_val": "c", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/edge_chain_circular.d2,1:8:13-1:11:16", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/edge_chain_circular.d2,1:9:14-1:10:15", + "value": [ + { + "string": "c", + "raw_string": "c" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + }, + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/edge_chain_circular.d2,1:8:13-1:11:16", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/edge_chain_circular.d2,1:9:14-1:10:15", + "value": [ + { + "string": "c", + "raw_string": "c" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 1 + } + ], + "attributes": { + "label": { + "value": "c" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ] + }, + "err": "" +} diff --git a/testdata/d2oracle/TestMove/edge_chain_into_container.exp.json b/testdata/d2oracle/TestMove/edge_chain_into_container.exp.json new file mode 100644 index 000000000..a1227cd4b --- /dev/null +++ b/testdata/d2oracle/TestMove/edge_chain_into_container.exp.json @@ -0,0 +1,425 @@ +{ + "graph": { + "ast": { + "range": "d2/testdata/d2oracle/TestMove/edge_chain_into_container.d2,0:0:0-2:0:16", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestMove/edge_chain_into_container.d2,0:0:0-0:13:13", + "edges": [ + { + "range": "d2/testdata/d2oracle/TestMove/edge_chain_into_container.d2,0:0:0-0:9:9", + "src": { + "range": "d2/testdata/d2oracle/TestMove/edge_chain_into_container.d2,0:0:0-0:4:4", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/edge_chain_into_container.d2,0:0:0-0:1:1", + "value": [ + { + "string": "d", + "raw_string": "d" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/edge_chain_into_container.d2,0:2:2-0:3:3", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + } + ] + }, + "src_arrow": "", + "dst": { + "range": "d2/testdata/d2oracle/TestMove/edge_chain_into_container.d2,0:6:6-0:9:9", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/edge_chain_into_container.d2,0:7:7-0:8:8", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + } + ] + }, + "dst_arrow": ">" + }, + { + "range": "d2/testdata/d2oracle/TestMove/edge_chain_into_container.d2,0:6:6-0:13:13", + "src": { + "range": "d2/testdata/d2oracle/TestMove/edge_chain_into_container.d2,0:6:6-0:9:9", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/edge_chain_into_container.d2,0:7:7-0:8:8", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + } + ] + }, + "src_arrow": "", + "dst": { + "range": "d2/testdata/d2oracle/TestMove/edge_chain_into_container.d2,0:11:11-0:13:13", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/edge_chain_into_container.d2,0:12:12-0:13:13", + "value": [ + { + "string": "c", + "raw_string": "c" + } + ] + } + } + ] + }, + "dst_arrow": ">" + } + ], + "primary": {}, + "value": {} + } + }, + { + "map_key": { + "range": "d2/testdata/d2oracle/TestMove/edge_chain_into_container.d2,1:0:14-1:1:15", + "key": { + "range": "d2/testdata/d2oracle/TestMove/edge_chain_into_container.d2,1:0:14-1:1:15", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/edge_chain_into_container.d2,1:0:14-1:1:15", + "value": [ + { + "string": "d", + "raw_string": "d" + } + ] + } + } + ] + }, + "primary": {}, + "value": {} + } + } + ] + }, + "root": { + "id": "", + "id_val": "", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + "edges": [ + { + "index": 0, + "minWidth": 0, + "minHeight": 0, + "label_dimensions": { + "width": 0, + "height": 0 + }, + "isCurve": false, + "src_arrow": false, + "dst_arrow": true, + "references": [ + { + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "index": 0, + "minWidth": 0, + "minHeight": 0, + "label_dimensions": { + "width": 0, + "height": 0 + }, + "isCurve": false, + "src_arrow": false, + "dst_arrow": true, + "references": [ + { + "map_key_edge_index": 1 + } + ], + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ], + "objects": [ + { + "id": "d", + "id_val": "d", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/edge_chain_into_container.d2,1:0:14-1:1:15", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/edge_chain_into_container.d2,1:0:14-1:1:15", + "value": [ + { + "string": "d", + "raw_string": "d" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + }, + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/edge_chain_into_container.d2,0:0:0-0:4:4", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/edge_chain_into_container.d2,0:0:0-0:1:1", + "value": [ + { + "string": "d", + "raw_string": "d" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/edge_chain_into_container.d2,0:2:2-0:3:3", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "d" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "a", + "id_val": "a", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/edge_chain_into_container.d2,0:0:0-0:4:4", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/edge_chain_into_container.d2,0:0:0-0:1:1", + "value": [ + { + "string": "d", + "raw_string": "d" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/edge_chain_into_container.d2,0:2:2-0:3:3", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + } + ] + }, + "key_path_index": 1, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "a" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "b", + "id_val": "b", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/edge_chain_into_container.d2,0:6:6-0:9:9", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/edge_chain_into_container.d2,0:7:7-0:8:8", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + }, + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/edge_chain_into_container.d2,0:6:6-0:9:9", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/edge_chain_into_container.d2,0:7:7-0:8:8", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 1 + } + ], + "attributes": { + "label": { + "value": "b" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "c", + "id_val": "c", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/edge_chain_into_container.d2,0:11:11-0:13:13", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/edge_chain_into_container.d2,0:12:12-0:13:13", + "value": [ + { + "string": "c", + "raw_string": "c" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 1 + } + ], + "attributes": { + "label": { + "value": "c" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ] + }, + "err": "" +} diff --git a/testdata/d2oracle/TestMove/edge_chain_out_container.exp.json b/testdata/d2oracle/TestMove/edge_chain_out_container.exp.json new file mode 100644 index 000000000..c4f8fe4ab --- /dev/null +++ b/testdata/d2oracle/TestMove/edge_chain_out_container.exp.json @@ -0,0 +1,422 @@ +{ + "graph": { + "ast": { + "range": "d2/testdata/d2oracle/TestMove/edge_chain_out_container.d2,0:0:0-3:0:23", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestMove/edge_chain_out_container.d2,0:0:0-2:1:22", + "key": { + "range": "d2/testdata/d2oracle/TestMove/edge_chain_out_container.d2,0:0:0-0:1:1", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/edge_chain_out_container.d2,0:0:0-0:1:1", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "map": { + "range": "d2/testdata/d2oracle/TestMove/edge_chain_out_container.d2,0:3:3-2:0:21", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestMove/edge_chain_out_container.d2,1:2:7-1:15:20", + "edges": [ + { + "range": "d2/testdata/d2oracle/TestMove/edge_chain_out_container.d2,1:2:7-1:11:16", + "src": { + "range": "d2/testdata/d2oracle/TestMove/edge_chain_out_container.d2,1:2:7-1:4:9", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/edge_chain_out_container.d2,1:2:7-1:3:8", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + } + ] + }, + "src_arrow": "", + "dst": { + "range": "d2/testdata/d2oracle/TestMove/edge_chain_out_container.d2,1:6:11-1:11:16", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/edge_chain_out_container.d2,1:7:12-1:8:13", + "value": [ + { + "string": "_", + "raw_string": "_" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/edge_chain_out_container.d2,1:9:14-1:10:15", + "value": [ + { + "string": "c", + "raw_string": "c" + } + ] + } + } + ] + }, + "dst_arrow": ">" + }, + { + "range": "d2/testdata/d2oracle/TestMove/edge_chain_out_container.d2,1:6:11-1:15:20", + "src": { + "range": "d2/testdata/d2oracle/TestMove/edge_chain_out_container.d2,1:6:11-1:11:16", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/edge_chain_out_container.d2,1:7:12-1:8:13", + "value": [ + { + "string": "_", + "raw_string": "_" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/edge_chain_out_container.d2,1:9:14-1:10:15", + "value": [ + { + "string": "c", + "raw_string": "c" + } + ] + } + } + ] + }, + "src_arrow": "", + "dst": { + "range": "d2/testdata/d2oracle/TestMove/edge_chain_out_container.d2,1:13:18-1:15:20", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/edge_chain_out_container.d2,1:14:19-1:15:20", + "value": [ + { + "string": "d", + "raw_string": "d" + } + ] + } + } + ] + }, + "dst_arrow": ">" + } + ], + "primary": {}, + "value": {} + } + } + ] + } + } + } + } + ] + }, + "root": { + "id": "", + "id_val": "", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + "edges": [ + { + "index": 0, + "minWidth": 0, + "minHeight": 0, + "label_dimensions": { + "width": 0, + "height": 0 + }, + "isCurve": false, + "src_arrow": false, + "dst_arrow": true, + "references": [ + { + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "index": 0, + "minWidth": 0, + "minHeight": 0, + "label_dimensions": { + "width": 0, + "height": 0 + }, + "isCurve": false, + "src_arrow": false, + "dst_arrow": true, + "references": [ + { + "map_key_edge_index": 1 + } + ], + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ], + "objects": [ + { + "id": "a", + "id_val": "a", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/edge_chain_out_container.d2,0:0:0-0:1:1", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/edge_chain_out_container.d2,0:0:0-0:1:1", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "a" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "b", + "id_val": "b", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/edge_chain_out_container.d2,1:2:7-1:4:9", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/edge_chain_out_container.d2,1:2:7-1:3:8", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "b" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "c", + "id_val": "c", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/edge_chain_out_container.d2,1:6:11-1:11:16", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/edge_chain_out_container.d2,1:7:12-1:8:13", + "value": [ + { + "string": "_", + "raw_string": "_" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/edge_chain_out_container.d2,1:9:14-1:10:15", + "value": [ + { + "string": "c", + "raw_string": "c" + } + ] + } + } + ] + }, + "key_path_index": 1, + "map_key_edge_index": 0 + }, + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/edge_chain_out_container.d2,1:6:11-1:11:16", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/edge_chain_out_container.d2,1:7:12-1:8:13", + "value": [ + { + "string": "_", + "raw_string": "_" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/edge_chain_out_container.d2,1:9:14-1:10:15", + "value": [ + { + "string": "c", + "raw_string": "c" + } + ] + } + } + ] + }, + "key_path_index": 1, + "map_key_edge_index": 1 + } + ], + "attributes": { + "label": { + "value": "c" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "d", + "id_val": "d", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/edge_chain_out_container.d2,1:13:18-1:15:20", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/edge_chain_out_container.d2,1:14:19-1:15:20", + "value": [ + { + "string": "d", + "raw_string": "d" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 1 + } + ], + "attributes": { + "label": { + "value": "d" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ] + }, + "err": "" +} diff --git a/testdata/d2oracle/TestMove/edge_chain_recursive.exp.json b/testdata/d2oracle/TestMove/edge_chain_recursive.exp.json new file mode 100644 index 000000000..1d2214197 --- /dev/null +++ b/testdata/d2oracle/TestMove/edge_chain_recursive.exp.json @@ -0,0 +1,403 @@ +{ + "graph": { + "ast": { + "range": "d2/testdata/d2oracle/TestMove/edge_chain_recursive.d2,0:0:0-3:0:25", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestMove/edge_chain_recursive.d2,0:0:0-2:1:24", + "key": { + "range": "d2/testdata/d2oracle/TestMove/edge_chain_recursive.d2,0:0:0-0:1:1", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/edge_chain_recursive.d2,0:0:0-0:1:1", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "map": { + "range": "d2/testdata/d2oracle/TestMove/edge_chain_recursive.d2,0:3:3-2:0:23", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestMove/edge_chain_recursive.d2,1:2:7-1:17:22", + "edges": [ + { + "range": "d2/testdata/d2oracle/TestMove/edge_chain_recursive.d2,1:2:7-1:11:16", + "src": { + "range": "d2/testdata/d2oracle/TestMove/edge_chain_recursive.d2,1:2:7-1:6:11", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/edge_chain_recursive.d2,1:2:7-1:3:8", + "value": [ + { + "string": "_", + "raw_string": "_" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/edge_chain_recursive.d2,1:4:9-1:5:10", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + } + ] + }, + "src_arrow": "", + "dst": { + "range": "d2/testdata/d2oracle/TestMove/edge_chain_recursive.d2,1:8:13-1:11:16", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/edge_chain_recursive.d2,1:9:14-1:10:15", + "value": [ + { + "string": "c", + "raw_string": "c" + } + ] + } + } + ] + }, + "dst_arrow": ">" + }, + { + "range": "d2/testdata/d2oracle/TestMove/edge_chain_recursive.d2,1:8:13-1:17:22", + "src": { + "range": "d2/testdata/d2oracle/TestMove/edge_chain_recursive.d2,1:8:13-1:11:16", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/edge_chain_recursive.d2,1:9:14-1:10:15", + "value": [ + { + "string": "c", + "raw_string": "c" + } + ] + } + } + ] + }, + "src_arrow": "", + "dst": { + "range": "d2/testdata/d2oracle/TestMove/edge_chain_recursive.d2,1:13:18-1:17:22", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/edge_chain_recursive.d2,1:14:19-1:15:20", + "value": [ + { + "string": "_", + "raw_string": "_" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/edge_chain_recursive.d2,1:16:21-1:17:22", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + } + ] + }, + "dst_arrow": ">" + } + ], + "primary": {}, + "value": {} + } + } + ] + } + } + } + } + ] + }, + "root": { + "id": "", + "id_val": "", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + "edges": [ + { + "index": 0, + "label_dimensions": { + "width": 0, + "height": 0 + }, + "src_arrow": false, + "dst_arrow": true, + "references": [ + { + "map_key_edge_index": 0, + "scope_key": "a" + } + ], + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "index": 0, + "label_dimensions": { + "width": 0, + "height": 0 + }, + "src_arrow": false, + "dst_arrow": true, + "references": [ + { + "map_key_edge_index": 1, + "scope_key": "a" + } + ], + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ], + "objects": [ + { + "id": "a", + "id_val": "a", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/edge_chain_recursive.d2,0:0:0-0:1:1", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/edge_chain_recursive.d2,0:0:0-0:1:1", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0, + "scope_key": "" + } + ], + "attributes": { + "label": { + "value": "a" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "b", + "id_val": "b", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/edge_chain_recursive.d2,1:2:7-1:6:11", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/edge_chain_recursive.d2,1:2:7-1:3:8", + "value": [ + { + "string": "_", + "raw_string": "_" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/edge_chain_recursive.d2,1:4:9-1:5:10", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + } + ] + }, + "key_path_index": 1, + "map_key_edge_index": 0, + "scope_key": "" + }, + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/edge_chain_recursive.d2,1:13:18-1:17:22", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/edge_chain_recursive.d2,1:14:19-1:15:20", + "value": [ + { + "string": "_", + "raw_string": "_" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/edge_chain_recursive.d2,1:16:21-1:17:22", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + } + ] + }, + "key_path_index": 1, + "map_key_edge_index": 1, + "scope_key": "" + } + ], + "attributes": { + "label": { + "value": "b" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "c", + "id_val": "c", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/edge_chain_recursive.d2,1:8:13-1:11:16", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/edge_chain_recursive.d2,1:9:14-1:10:15", + "value": [ + { + "string": "c", + "raw_string": "c" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0, + "scope_key": "a" + }, + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/edge_chain_recursive.d2,1:8:13-1:11:16", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/edge_chain_recursive.d2,1:9:14-1:10:15", + "value": [ + { + "string": "c", + "raw_string": "c" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 1, + "scope_key": "a" + } + ], + "attributes": { + "label": { + "value": "c" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ] + }, + "err": "" +} diff --git a/testdata/d2oracle/TestMove/edge_conflict.exp.json b/testdata/d2oracle/TestMove/edge_conflict.exp.json new file mode 100644 index 000000000..517ea0676 --- /dev/null +++ b/testdata/d2oracle/TestMove/edge_conflict.exp.json @@ -0,0 +1,443 @@ +{ + "graph": { + "ast": { + "range": "d2/testdata/d2oracle/TestMove/edge_conflict.d2,0:0:0-4:0:26", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestMove/edge_conflict.d2,0:0:0-0:14:14", + "edges": [ + { + "range": "d2/testdata/d2oracle/TestMove/edge_conflict.d2,0:0:0-0:14:14", + "src": { + "range": "d2/testdata/d2oracle/TestMove/edge_conflict.d2,0:0:0-0:6:6", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/edge_conflict.d2,0:0:0-0:3:3", + "value": [ + { + "string": "y 2", + "raw_string": "y 2" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/edge_conflict.d2,0:4:4-0:5:5", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + } + ] + }, + "src_arrow": "", + "dst": { + "range": "d2/testdata/d2oracle/TestMove/edge_conflict.d2,0:8:8-0:14:14", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/edge_conflict.d2,0:9:9-0:12:12", + "value": [ + { + "string": "y 2", + "raw_string": "y 2" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/edge_conflict.d2,0:13:13-0:14:14", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + } + ] + }, + "dst_arrow": ">" + } + ], + "primary": {}, + "value": {} + } + }, + { + "map_key": { + "range": "d2/testdata/d2oracle/TestMove/edge_conflict.d2,1:0:15-3:1:25", + "key": { + "range": "d2/testdata/d2oracle/TestMove/edge_conflict.d2,1:0:15-1:1:16", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/edge_conflict.d2,1:0:15-1:1:16", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "map": { + "range": "d2/testdata/d2oracle/TestMove/edge_conflict.d2,1:3:18-3:0:24", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestMove/edge_conflict.d2,2:2:22-2:3:23", + "key": { + "range": "d2/testdata/d2oracle/TestMove/edge_conflict.d2,2:2:22-2:3:23", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/edge_conflict.d2,2:2:22-2:3:23", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "primary": {}, + "value": {} + } + } + ] + } + } + } + } + ] + }, + "root": { + "id": "", + "id_val": "", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + "edges": [ + { + "index": 0, + "minWidth": 0, + "minHeight": 0, + "label_dimensions": { + "width": 0, + "height": 0 + }, + "isCurve": false, + "src_arrow": false, + "dst_arrow": true, + "references": [ + { + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ], + "objects": [ + { + "id": "y", + "id_val": "y", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/edge_conflict.d2,1:0:15-1:1:16", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/edge_conflict.d2,1:0:15-1:1:16", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "y" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "x", + "id_val": "x", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/edge_conflict.d2,2:2:22-2:3:23", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/edge_conflict.d2,2:2:22-2:3:23", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "x" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "y 2", + "id_val": "y 2", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/edge_conflict.d2,0:0:0-0:6:6", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/edge_conflict.d2,0:0:0-0:3:3", + "value": [ + { + "string": "y 2", + "raw_string": "y 2" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/edge_conflict.d2,0:4:4-0:5:5", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + }, + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/edge_conflict.d2,0:8:8-0:14:14", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/edge_conflict.d2,0:9:9-0:12:12", + "value": [ + { + "string": "y 2", + "raw_string": "y 2" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/edge_conflict.d2,0:13:13-0:14:14", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "y 2" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "a", + "id_val": "a", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/edge_conflict.d2,0:0:0-0:6:6", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/edge_conflict.d2,0:0:0-0:3:3", + "value": [ + { + "string": "y 2", + "raw_string": "y 2" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/edge_conflict.d2,0:4:4-0:5:5", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + } + ] + }, + "key_path_index": 1, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "a" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "b", + "id_val": "b", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/edge_conflict.d2,0:8:8-0:14:14", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/edge_conflict.d2,0:9:9-0:12:12", + "value": [ + { + "string": "y 2", + "raw_string": "y 2" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/edge_conflict.d2,0:13:13-0:14:14", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + } + ] + }, + "key_path_index": 1, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "b" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ] + }, + "err": "" +} diff --git a/testdata/d2oracle/TestMove/edge_into_container.exp.json b/testdata/d2oracle/TestMove/edge_into_container.exp.json new file mode 100644 index 000000000..f2ab40dd1 --- /dev/null +++ b/testdata/d2oracle/TestMove/edge_into_container.exp.json @@ -0,0 +1,370 @@ +{ + "graph": { + "ast": { + "range": "d2/testdata/d2oracle/TestMove/edge_into_container.d2,0:0:0-4:0:20", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestMove/edge_into_container.d2,0:0:0-2:1:10", + "key": { + "range": "d2/testdata/d2oracle/TestMove/edge_into_container.d2,0:0:0-0:1:1", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/edge_into_container.d2,0:0:0-0:1:1", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "map": { + "range": "d2/testdata/d2oracle/TestMove/edge_into_container.d2,0:3:3-2:0:9", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestMove/edge_into_container.d2,1:2:7-1:3:8", + "key": { + "range": "d2/testdata/d2oracle/TestMove/edge_into_container.d2,1:2:7-1:3:8", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/edge_into_container.d2,1:2:7-1:3:8", + "value": [ + { + "string": "d", + "raw_string": "d" + } + ] + } + } + ] + }, + "primary": {}, + "value": {} + } + } + ] + } + } + } + }, + { + "map_key": { + "range": "d2/testdata/d2oracle/TestMove/edge_into_container.d2,3:0:11-3:8:19", + "edges": [ + { + "range": "d2/testdata/d2oracle/TestMove/edge_into_container.d2,3:0:11-3:8:19", + "src": { + "range": "d2/testdata/d2oracle/TestMove/edge_into_container.d2,3:0:11-3:4:15", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/edge_into_container.d2,3:0:11-3:1:12", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/edge_into_container.d2,3:2:13-3:3:14", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + } + ] + }, + "src_arrow": "", + "dst": { + "range": "d2/testdata/d2oracle/TestMove/edge_into_container.d2,3:6:17-3:8:19", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/edge_into_container.d2,3:7:18-3:8:19", + "value": [ + { + "string": "c", + "raw_string": "c" + } + ] + } + } + ] + }, + "dst_arrow": ">" + } + ], + "primary": {}, + "value": {} + } + } + ] + }, + "root": { + "id": "", + "id_val": "", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + "edges": [ + { + "index": 0, + "minWidth": 0, + "minHeight": 0, + "label_dimensions": { + "width": 0, + "height": 0 + }, + "isCurve": false, + "src_arrow": false, + "dst_arrow": true, + "references": [ + { + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ], + "objects": [ + { + "id": "a", + "id_val": "a", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/edge_into_container.d2,0:0:0-0:1:1", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/edge_into_container.d2,0:0:0-0:1:1", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + }, + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/edge_into_container.d2,3:0:11-3:4:15", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/edge_into_container.d2,3:0:11-3:1:12", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/edge_into_container.d2,3:2:13-3:3:14", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "a" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "d", + "id_val": "d", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/edge_into_container.d2,1:2:7-1:3:8", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/edge_into_container.d2,1:2:7-1:3:8", + "value": [ + { + "string": "d", + "raw_string": "d" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "d" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "b", + "id_val": "b", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/edge_into_container.d2,3:0:11-3:4:15", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/edge_into_container.d2,3:0:11-3:1:12", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/edge_into_container.d2,3:2:13-3:3:14", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + } + ] + }, + "key_path_index": 1, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "b" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "c", + "id_val": "c", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/edge_into_container.d2,3:6:17-3:8:19", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/edge_into_container.d2,3:7:18-3:8:19", + "value": [ + { + "string": "c", + "raw_string": "c" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "c" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ] + }, + "err": "" +} diff --git a/testdata/d2oracle/TestMove/edge_nested_basic.exp.json b/testdata/d2oracle/TestMove/edge_nested_basic.exp.json new file mode 100644 index 000000000..f2658dc1a --- /dev/null +++ b/testdata/d2oracle/TestMove/edge_nested_basic.exp.json @@ -0,0 +1,254 @@ +{ + "graph": { + "ast": { + "range": "d2/testdata/d2oracle/TestMove/edge_nested_basic.d2,0:0:0-3:0:16", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestMove/edge_nested_basic.d2,0:0:0-2:1:15", + "key": { + "range": "d2/testdata/d2oracle/TestMove/edge_nested_basic.d2,0:0:0-0:1:1", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/edge_nested_basic.d2,0:0:0-0:1:1", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "map": { + "range": "d2/testdata/d2oracle/TestMove/edge_nested_basic.d2,0:3:3-2:0:14", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestMove/edge_nested_basic.d2,1:2:7-1:8:13", + "edges": [ + { + "range": "d2/testdata/d2oracle/TestMove/edge_nested_basic.d2,1:2:7-1:8:13", + "src": { + "range": "d2/testdata/d2oracle/TestMove/edge_nested_basic.d2,1:2:7-1:4:9", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/edge_nested_basic.d2,1:2:7-1:3:8", + "value": [ + { + "string": "d", + "raw_string": "d" + } + ] + } + } + ] + }, + "src_arrow": "", + "dst": { + "range": "d2/testdata/d2oracle/TestMove/edge_nested_basic.d2,1:6:11-1:8:13", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/edge_nested_basic.d2,1:7:12-1:8:13", + "value": [ + { + "string": "c", + "raw_string": "c" + } + ] + } + } + ] + }, + "dst_arrow": ">" + } + ], + "primary": {}, + "value": {} + } + } + ] + } + } + } + } + ] + }, + "root": { + "id": "", + "id_val": "", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + "edges": [ + { + "index": 0, + "minWidth": 0, + "minHeight": 0, + "label_dimensions": { + "width": 0, + "height": 0 + }, + "isCurve": false, + "src_arrow": false, + "dst_arrow": true, + "references": [ + { + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ], + "objects": [ + { + "id": "a", + "id_val": "a", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/edge_nested_basic.d2,0:0:0-0:1:1", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/edge_nested_basic.d2,0:0:0-0:1:1", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "a" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "d", + "id_val": "d", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/edge_nested_basic.d2,1:2:7-1:4:9", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/edge_nested_basic.d2,1:2:7-1:3:8", + "value": [ + { + "string": "d", + "raw_string": "d" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "d" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "c", + "id_val": "c", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/edge_nested_basic.d2,1:6:11-1:8:13", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/edge_nested_basic.d2,1:7:12-1:8:13", + "value": [ + { + "string": "c", + "raw_string": "c" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "c" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ] + }, + "err": "" +} diff --git a/testdata/d2oracle/TestMove/edge_out_of_container.exp.json b/testdata/d2oracle/TestMove/edge_out_of_container.exp.json new file mode 100644 index 000000000..13f4ebe2a --- /dev/null +++ b/testdata/d2oracle/TestMove/edge_out_of_container.exp.json @@ -0,0 +1,276 @@ +{ + "graph": { + "ast": { + "range": "d2/testdata/d2oracle/TestMove/edge_out_of_container.d2,0:0:0-3:0:18", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestMove/edge_out_of_container.d2,0:0:0-2:1:17", + "key": { + "range": "d2/testdata/d2oracle/TestMove/edge_out_of_container.d2,0:0:0-0:1:1", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/edge_out_of_container.d2,0:0:0-0:1:1", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "map": { + "range": "d2/testdata/d2oracle/TestMove/edge_out_of_container.d2,0:3:3-2:0:16", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestMove/edge_out_of_container.d2,1:2:7-1:10:15", + "edges": [ + { + "range": "d2/testdata/d2oracle/TestMove/edge_out_of_container.d2,1:2:7-1:10:15", + "src": { + "range": "d2/testdata/d2oracle/TestMove/edge_out_of_container.d2,1:2:7-1:6:11", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/edge_out_of_container.d2,1:2:7-1:3:8", + "value": [ + { + "string": "_", + "raw_string": "_" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/edge_out_of_container.d2,1:4:9-1:5:10", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + } + ] + }, + "src_arrow": "", + "dst": { + "range": "d2/testdata/d2oracle/TestMove/edge_out_of_container.d2,1:8:13-1:10:15", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/edge_out_of_container.d2,1:9:14-1:10:15", + "value": [ + { + "string": "c", + "raw_string": "c" + } + ] + } + } + ] + }, + "dst_arrow": ">" + } + ], + "primary": {}, + "value": {} + } + } + ] + } + } + } + } + ] + }, + "root": { + "id": "", + "id_val": "", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + "edges": [ + { + "index": 0, + "minWidth": 0, + "minHeight": 0, + "label_dimensions": { + "width": 0, + "height": 0 + }, + "isCurve": false, + "src_arrow": false, + "dst_arrow": true, + "references": [ + { + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ], + "objects": [ + { + "id": "a", + "id_val": "a", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/edge_out_of_container.d2,0:0:0-0:1:1", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/edge_out_of_container.d2,0:0:0-0:1:1", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "a" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "b", + "id_val": "b", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/edge_out_of_container.d2,1:2:7-1:6:11", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/edge_out_of_container.d2,1:2:7-1:3:8", + "value": [ + { + "string": "_", + "raw_string": "_" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/edge_out_of_container.d2,1:4:9-1:5:10", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + } + ] + }, + "key_path_index": 1, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "b" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "c", + "id_val": "c", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/edge_out_of_container.d2,1:8:13-1:10:15", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/edge_out_of_container.d2,1:9:14-1:10:15", + "value": [ + { + "string": "c", + "raw_string": "c" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "c" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ] + }, + "err": "" +} diff --git a/testdata/d2oracle/TestMove/extend_map.exp.json b/testdata/d2oracle/TestMove/extend_map.exp.json new file mode 100644 index 000000000..609a8ade6 --- /dev/null +++ b/testdata/d2oracle/TestMove/extend_map.exp.json @@ -0,0 +1,344 @@ +{ + "graph": { + "ast": { + "range": "d2/testdata/d2oracle/TestMove/extend_map.d2,0:0:0-8:0:35", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestMove/extend_map.d2,0:0:0-2:1:10", + "key": { + "range": "d2/testdata/d2oracle/TestMove/extend_map.d2,0:0:0-0:1:1", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/extend_map.d2,0:0:0-0:1:1", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "map": { + "range": "d2/testdata/d2oracle/TestMove/extend_map.d2,0:3:3-2:0:9", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestMove/extend_map.d2,1:2:7-1:3:8", + "key": { + "range": "d2/testdata/d2oracle/TestMove/extend_map.d2,1:2:7-1:3:8", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/extend_map.d2,1:2:7-1:3:8", + "value": [ + { + "string": "e", + "raw_string": "e" + } + ] + } + } + ] + }, + "primary": {}, + "value": {} + } + } + ] + } + } + } + }, + { + "map_key": { + "range": "d2/testdata/d2oracle/TestMove/extend_map.d2,3:0:11-7:1:34", + "key": { + "range": "d2/testdata/d2oracle/TestMove/extend_map.d2,3:0:11-3:1:12", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/extend_map.d2,3:0:11-3:1:12", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "map": { + "range": "d2/testdata/d2oracle/TestMove/extend_map.d2,3:3:14-7:0:33", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestMove/extend_map.d2,4:2:18-6:3:32", + "key": { + "range": "d2/testdata/d2oracle/TestMove/extend_map.d2,4:2:18-4:3:19", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/extend_map.d2,4:2:18-4:3:19", + "value": [ + { + "string": "c", + "raw_string": "c" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "map": { + "range": "d2/testdata/d2oracle/TestMove/extend_map.d2,4:5:21-6:2:31", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestMove/extend_map.d2,5:4:27-5:5:28", + "key": { + "range": "d2/testdata/d2oracle/TestMove/extend_map.d2,5:4:27-5:5:28", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/extend_map.d2,5:4:27-5:5:28", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + } + ] + }, + "primary": {}, + "value": {} + } + } + ] + } + } + } + } + ] + } + } + } + } + ] + }, + "root": { + "id": "", + "id_val": "", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + "edges": null, + "objects": [ + { + "id": "a", + "id_val": "a", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/extend_map.d2,0:0:0-0:1:1", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/extend_map.d2,0:0:0-0:1:1", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + }, + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/extend_map.d2,3:0:11-3:1:12", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/extend_map.d2,3:0:11-3:1:12", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "a" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "e", + "id_val": "e", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/extend_map.d2,1:2:7-1:3:8", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/extend_map.d2,1:2:7-1:3:8", + "value": [ + { + "string": "e", + "raw_string": "e" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "e" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "c", + "id_val": "c", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/extend_map.d2,4:2:18-4:3:19", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/extend_map.d2,4:2:18-4:3:19", + "value": [ + { + "string": "c", + "raw_string": "c" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "c" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "b", + "id_val": "b", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/extend_map.d2,5:4:27-5:5:28", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/extend_map.d2,5:4:27-5:5:28", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "b" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ] + }, + "err": "" +} diff --git a/testdata/d2oracle/TestMove/extend_stationary_path.exp.json b/testdata/d2oracle/TestMove/extend_stationary_path.exp.json new file mode 100644 index 000000000..d3140b0ed --- /dev/null +++ b/testdata/d2oracle/TestMove/extend_stationary_path.exp.json @@ -0,0 +1,403 @@ +{ + "graph": { + "ast": { + "range": "d2/testdata/d2oracle/TestMove/extend_stationary_path.d2,0:0:0-6:0:30", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestMove/extend_stationary_path.d2,0:0:0-0:5:5", + "key": { + "range": "d2/testdata/d2oracle/TestMove/extend_stationary_path.d2,0:0:0-0:5:5", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/extend_stationary_path.d2,0:0:0-0:1:1", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/extend_stationary_path.d2,0:2:2-0:3:3", + "value": [ + { + "string": "c", + "raw_string": "c" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/extend_stationary_path.d2,0:4:4-0:5:5", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + } + ] + }, + "primary": {}, + "value": {} + } + }, + { + "map_key": { + "range": "d2/testdata/d2oracle/TestMove/extend_stationary_path.d2,1:0:6-5:1:29", + "key": { + "range": "d2/testdata/d2oracle/TestMove/extend_stationary_path.d2,1:0:6-1:1:7", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/extend_stationary_path.d2,1:0:6-1:1:7", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "map": { + "range": "d2/testdata/d2oracle/TestMove/extend_stationary_path.d2,1:3:9-5:0:28", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestMove/extend_stationary_path.d2,2:2:13-4:3:27", + "key": { + "range": "d2/testdata/d2oracle/TestMove/extend_stationary_path.d2,2:2:13-2:3:14", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/extend_stationary_path.d2,2:2:13-2:3:14", + "value": [ + { + "string": "c", + "raw_string": "c" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "map": { + "range": "d2/testdata/d2oracle/TestMove/extend_stationary_path.d2,2:5:16-4:2:26", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestMove/extend_stationary_path.d2,3:4:22-3:5:23", + "key": { + "range": "d2/testdata/d2oracle/TestMove/extend_stationary_path.d2,3:4:22-3:5:23", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/extend_stationary_path.d2,3:4:22-3:5:23", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + } + ] + }, + "primary": {}, + "value": {} + } + } + ] + } + } + } + } + ] + } + } + } + } + ] + }, + "root": { + "id": "", + "id_val": "", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + "edges": null, + "objects": [ + { + "id": "a", + "id_val": "a", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/extend_stationary_path.d2,0:0:0-0:5:5", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/extend_stationary_path.d2,0:0:0-0:1:1", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/extend_stationary_path.d2,0:2:2-0:3:3", + "value": [ + { + "string": "c", + "raw_string": "c" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/extend_stationary_path.d2,0:4:4-0:5:5", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + }, + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/extend_stationary_path.d2,1:0:6-1:1:7", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/extend_stationary_path.d2,1:0:6-1:1:7", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "a" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "c", + "id_val": "c", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/extend_stationary_path.d2,0:0:0-0:5:5", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/extend_stationary_path.d2,0:0:0-0:1:1", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/extend_stationary_path.d2,0:2:2-0:3:3", + "value": [ + { + "string": "c", + "raw_string": "c" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/extend_stationary_path.d2,0:4:4-0:5:5", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + } + ] + }, + "key_path_index": 1, + "map_key_edge_index": 0 + }, + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/extend_stationary_path.d2,2:2:13-2:3:14", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/extend_stationary_path.d2,2:2:13-2:3:14", + "value": [ + { + "string": "c", + "raw_string": "c" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "c" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "b", + "id_val": "b", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/extend_stationary_path.d2,0:0:0-0:5:5", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/extend_stationary_path.d2,0:0:0-0:1:1", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/extend_stationary_path.d2,0:2:2-0:3:3", + "value": [ + { + "string": "c", + "raw_string": "c" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/extend_stationary_path.d2,0:4:4-0:5:5", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + } + ] + }, + "key_path_index": 2, + "map_key_edge_index": 0 + }, + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/extend_stationary_path.d2,3:4:22-3:5:23", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/extend_stationary_path.d2,3:4:22-3:5:23", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "b" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ] + }, + "err": "" +} diff --git a/testdata/d2oracle/TestMove/flat_between_containers.exp.json b/testdata/d2oracle/TestMove/flat_between_containers.exp.json new file mode 100644 index 000000000..aaa43ad01 --- /dev/null +++ b/testdata/d2oracle/TestMove/flat_between_containers.exp.json @@ -0,0 +1,226 @@ +{ + "graph": { + "ast": { + "range": "d2/testdata/d2oracle/TestMove/flat_between_containers.d2,0:0:0-4:0:13", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestMove/flat_between_containers.d2,0:0:0-0:1:1", + "key": { + "range": "d2/testdata/d2oracle/TestMove/flat_between_containers.d2,0:0:0-0:1:1", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/flat_between_containers.d2,0:0:0-0:1:1", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + } + ] + }, + "primary": {}, + "value": {} + } + }, + { + "map_key": { + "range": "d2/testdata/d2oracle/TestMove/flat_between_containers.d2,1:0:2-3:1:12", + "key": { + "range": "d2/testdata/d2oracle/TestMove/flat_between_containers.d2,1:0:2-1:1:3", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/flat_between_containers.d2,1:0:2-1:1:3", + "value": [ + { + "string": "c", + "raw_string": "c" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "map": { + "range": "d2/testdata/d2oracle/TestMove/flat_between_containers.d2,1:3:5-3:0:11", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestMove/flat_between_containers.d2,2:2:9-2:3:10", + "key": { + "range": "d2/testdata/d2oracle/TestMove/flat_between_containers.d2,2:2:9-2:3:10", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/flat_between_containers.d2,2:2:9-2:3:10", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + } + ] + }, + "primary": {}, + "value": {} + } + } + ] + } + } + } + } + ] + }, + "root": { + "id": "", + "id_val": "", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + "edges": null, + "objects": [ + { + "id": "a", + "id_val": "a", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/flat_between_containers.d2,0:0:0-0:1:1", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/flat_between_containers.d2,0:0:0-0:1:1", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "a" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "c", + "id_val": "c", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/flat_between_containers.d2,1:0:2-1:1:3", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/flat_between_containers.d2,1:0:2-1:1:3", + "value": [ + { + "string": "c", + "raw_string": "c" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "c" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "b", + "id_val": "b", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/flat_between_containers.d2,2:2:9-2:3:10", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/flat_between_containers.d2,2:2:9-2:3:10", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "b" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ] + }, + "err": "" +} diff --git a/testdata/d2oracle/TestMove/flat_merge.exp.json b/testdata/d2oracle/TestMove/flat_merge.exp.json new file mode 100644 index 000000000..526868268 --- /dev/null +++ b/testdata/d2oracle/TestMove/flat_merge.exp.json @@ -0,0 +1,299 @@ +{ + "graph": { + "ast": { + "range": "d2/testdata/d2oracle/TestMove/flat_merge.d2,0:0:0-5:0:23", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestMove/flat_merge.d2,0:0:0-0:1:1", + "key": { + "range": "d2/testdata/d2oracle/TestMove/flat_merge.d2,0:0:0-0:1:1", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/flat_merge.d2,0:0:0-0:1:1", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + } + ] + }, + "primary": {}, + "value": {} + } + }, + { + "map_key": { + "range": "d2/testdata/d2oracle/TestMove/flat_merge.d2,1:0:2-4:1:22", + "key": { + "range": "d2/testdata/d2oracle/TestMove/flat_merge.d2,1:0:2-1:1:3", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/flat_merge.d2,1:0:2-1:1:3", + "value": [ + { + "string": "c", + "raw_string": "c" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "map": { + "range": "d2/testdata/d2oracle/TestMove/flat_merge.d2,1:3:5-4:0:21", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestMove/flat_merge.d2,2:2:9-2:9:16", + "key": { + "range": "d2/testdata/d2oracle/TestMove/flat_merge.d2,2:2:9-2:3:10", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/flat_merge.d2,2:2:9-2:3:10", + "value": [ + { + "string": "d", + "raw_string": "d" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/flat_merge.d2,2:5:12-2:9:16", + "value": [ + { + "string": "meow", + "raw_string": "meow" + } + ] + } + } + } + }, + { + "map_key": { + "range": "d2/testdata/d2oracle/TestMove/flat_merge.d2,3:2:19-3:3:20", + "key": { + "range": "d2/testdata/d2oracle/TestMove/flat_merge.d2,3:2:19-3:3:20", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/flat_merge.d2,3:2:19-3:3:20", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + } + ] + }, + "primary": {}, + "value": {} + } + } + ] + } + } + } + } + ] + }, + "root": { + "id": "", + "id_val": "", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + "edges": null, + "objects": [ + { + "id": "a", + "id_val": "a", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/flat_merge.d2,0:0:0-0:1:1", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/flat_merge.d2,0:0:0-0:1:1", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "a" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "c", + "id_val": "c", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/flat_merge.d2,1:0:2-1:1:3", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/flat_merge.d2,1:0:2-1:1:3", + "value": [ + { + "string": "c", + "raw_string": "c" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "c" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "d", + "id_val": "d", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/flat_merge.d2,2:2:9-2:3:10", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/flat_merge.d2,2:2:9-2:3:10", + "value": [ + { + "string": "d", + "raw_string": "d" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "meow" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "b", + "id_val": "b", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/flat_merge.d2,3:2:19-3:3:20", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/flat_merge.d2,3:2:19-3:3:20", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "b" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ] + }, + "err": "" +} diff --git a/testdata/d2oracle/TestMove/flat_middle_container.exp.json b/testdata/d2oracle/TestMove/flat_middle_container.exp.json new file mode 100644 index 000000000..12777817a --- /dev/null +++ b/testdata/d2oracle/TestMove/flat_middle_container.exp.json @@ -0,0 +1,299 @@ +{ + "graph": { + "ast": { + "range": "d2/testdata/d2oracle/TestMove/flat_middle_container.d2,0:0:0-4:0:15", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestMove/flat_middle_container.d2,0:0:0-0:3:3", + "key": { + "range": "d2/testdata/d2oracle/TestMove/flat_middle_container.d2,0:0:0-0:3:3", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/flat_middle_container.d2,0:0:0-0:1:1", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/flat_middle_container.d2,0:2:2-0:3:3", + "value": [ + { + "string": "c", + "raw_string": "c" + } + ] + } + } + ] + }, + "primary": {}, + "value": {} + } + }, + { + "map_key": { + "range": "d2/testdata/d2oracle/TestMove/flat_middle_container.d2,1:0:4-3:1:14", + "key": { + "range": "d2/testdata/d2oracle/TestMove/flat_middle_container.d2,1:0:4-1:1:5", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/flat_middle_container.d2,1:0:4-1:1:5", + "value": [ + { + "string": "d", + "raw_string": "d" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "map": { + "range": "d2/testdata/d2oracle/TestMove/flat_middle_container.d2,1:3:7-3:0:13", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestMove/flat_middle_container.d2,2:2:11-2:3:12", + "key": { + "range": "d2/testdata/d2oracle/TestMove/flat_middle_container.d2,2:2:11-2:3:12", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/flat_middle_container.d2,2:2:11-2:3:12", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + } + ] + }, + "primary": {}, + "value": {} + } + } + ] + } + } + } + } + ] + }, + "root": { + "id": "", + "id_val": "", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + "edges": null, + "objects": [ + { + "id": "a", + "id_val": "a", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/flat_middle_container.d2,0:0:0-0:3:3", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/flat_middle_container.d2,0:0:0-0:1:1", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/flat_middle_container.d2,0:2:2-0:3:3", + "value": [ + { + "string": "c", + "raw_string": "c" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "a" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "c", + "id_val": "c", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/flat_middle_container.d2,0:0:0-0:3:3", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/flat_middle_container.d2,0:0:0-0:1:1", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/flat_middle_container.d2,0:2:2-0:3:3", + "value": [ + { + "string": "c", + "raw_string": "c" + } + ] + } + } + ] + }, + "key_path_index": 1, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "c" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "d", + "id_val": "d", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/flat_middle_container.d2,1:0:4-1:1:5", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/flat_middle_container.d2,1:0:4-1:1:5", + "value": [ + { + "string": "d", + "raw_string": "d" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "d" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "b", + "id_val": "b", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/flat_middle_container.d2,2:2:11-2:3:12", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/flat_middle_container.d2,2:2:11-2:3:12", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "b" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ] + }, + "err": "" +} diff --git a/testdata/d2oracle/TestMove/flat_nested_merge.exp.json b/testdata/d2oracle/TestMove/flat_nested_merge.exp.json new file mode 100644 index 000000000..40c5f8d20 --- /dev/null +++ b/testdata/d2oracle/TestMove/flat_nested_merge.exp.json @@ -0,0 +1,815 @@ +{ + "graph": { + "ast": { + "range": "d2/testdata/d2oracle/TestMove/flat_nested_merge.d2,0:0:0-5:0:29", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestMove/flat_nested_merge.d2,0:0:0-0:7:7", + "key": { + "range": "d2/testdata/d2oracle/TestMove/flat_nested_merge.d2,0:0:0-0:7:7", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/flat_nested_merge.d2,0:0:0-0:1:1", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/flat_nested_merge.d2,0:2:2-0:3:3", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/flat_nested_merge.d2,0:4:4-0:5:5", + "value": [ + { + "string": "d", + "raw_string": "d" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/flat_nested_merge.d2,0:6:6-0:7:7", + "value": [ + { + "string": "e", + "raw_string": "e" + } + ] + } + } + ] + }, + "primary": {}, + "value": {} + } + }, + { + "map_key": { + "range": "d2/testdata/d2oracle/TestMove/flat_nested_merge.d2,1:0:8-4:1:28", + "key": { + "range": "d2/testdata/d2oracle/TestMove/flat_nested_merge.d2,1:0:8-1:3:11", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/flat_nested_merge.d2,1:0:8-1:1:9", + "value": [ + { + "string": "p", + "raw_string": "p" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/flat_nested_merge.d2,1:2:10-1:3:11", + "value": [ + { + "string": "q", + "raw_string": "q" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "map": { + "range": "d2/testdata/d2oracle/TestMove/flat_nested_merge.d2,1:5:13-4:0:27", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestMove/flat_nested_merge.d2,2:2:17-2:7:22", + "key": { + "range": "d2/testdata/d2oracle/TestMove/flat_nested_merge.d2,2:2:17-2:7:22", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/flat_nested_merge.d2,2:2:17-2:3:18", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/flat_nested_merge.d2,2:4:19-2:5:20", + "value": [ + { + "string": "m", + "raw_string": "m" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/flat_nested_merge.d2,2:6:21-2:7:22", + "value": [ + { + "string": "o", + "raw_string": "o" + } + ] + } + } + ] + }, + "primary": {}, + "value": {} + } + }, + { + "map_key": { + "range": "d2/testdata/d2oracle/TestMove/flat_nested_merge.d2,3:2:25-3:3:26", + "key": { + "range": "d2/testdata/d2oracle/TestMove/flat_nested_merge.d2,3:2:25-3:3:26", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/flat_nested_merge.d2,3:2:25-3:3:26", + "value": [ + { + "string": "z", + "raw_string": "z" + } + ] + } + } + ] + }, + "primary": {}, + "value": {} + } + } + ] + } + } + } + } + ] + }, + "root": { + "id": "", + "id_val": "", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + "edges": null, + "objects": [ + { + "id": "a", + "id_val": "a", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/flat_nested_merge.d2,0:0:0-0:7:7", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/flat_nested_merge.d2,0:0:0-0:1:1", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/flat_nested_merge.d2,0:2:2-0:3:3", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/flat_nested_merge.d2,0:4:4-0:5:5", + "value": [ + { + "string": "d", + "raw_string": "d" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/flat_nested_merge.d2,0:6:6-0:7:7", + "value": [ + { + "string": "e", + "raw_string": "e" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "a" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "b", + "id_val": "b", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/flat_nested_merge.d2,0:0:0-0:7:7", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/flat_nested_merge.d2,0:0:0-0:1:1", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/flat_nested_merge.d2,0:2:2-0:3:3", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/flat_nested_merge.d2,0:4:4-0:5:5", + "value": [ + { + "string": "d", + "raw_string": "d" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/flat_nested_merge.d2,0:6:6-0:7:7", + "value": [ + { + "string": "e", + "raw_string": "e" + } + ] + } + } + ] + }, + "key_path_index": 1, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "b" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "d", + "id_val": "d", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/flat_nested_merge.d2,0:0:0-0:7:7", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/flat_nested_merge.d2,0:0:0-0:1:1", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/flat_nested_merge.d2,0:2:2-0:3:3", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/flat_nested_merge.d2,0:4:4-0:5:5", + "value": [ + { + "string": "d", + "raw_string": "d" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/flat_nested_merge.d2,0:6:6-0:7:7", + "value": [ + { + "string": "e", + "raw_string": "e" + } + ] + } + } + ] + }, + "key_path_index": 2, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "d" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "e", + "id_val": "e", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/flat_nested_merge.d2,0:0:0-0:7:7", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/flat_nested_merge.d2,0:0:0-0:1:1", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/flat_nested_merge.d2,0:2:2-0:3:3", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/flat_nested_merge.d2,0:4:4-0:5:5", + "value": [ + { + "string": "d", + "raw_string": "d" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/flat_nested_merge.d2,0:6:6-0:7:7", + "value": [ + { + "string": "e", + "raw_string": "e" + } + ] + } + } + ] + }, + "key_path_index": 3, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "e" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "p", + "id_val": "p", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/flat_nested_merge.d2,1:0:8-1:3:11", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/flat_nested_merge.d2,1:0:8-1:1:9", + "value": [ + { + "string": "p", + "raw_string": "p" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/flat_nested_merge.d2,1:2:10-1:3:11", + "value": [ + { + "string": "q", + "raw_string": "q" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "p" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "q", + "id_val": "q", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/flat_nested_merge.d2,1:0:8-1:3:11", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/flat_nested_merge.d2,1:0:8-1:1:9", + "value": [ + { + "string": "p", + "raw_string": "p" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/flat_nested_merge.d2,1:2:10-1:3:11", + "value": [ + { + "string": "q", + "raw_string": "q" + } + ] + } + } + ] + }, + "key_path_index": 1, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "q" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "b", + "id_val": "b", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/flat_nested_merge.d2,2:2:17-2:7:22", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/flat_nested_merge.d2,2:2:17-2:3:18", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/flat_nested_merge.d2,2:4:19-2:5:20", + "value": [ + { + "string": "m", + "raw_string": "m" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/flat_nested_merge.d2,2:6:21-2:7:22", + "value": [ + { + "string": "o", + "raw_string": "o" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "b" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "m", + "id_val": "m", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/flat_nested_merge.d2,2:2:17-2:7:22", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/flat_nested_merge.d2,2:2:17-2:3:18", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/flat_nested_merge.d2,2:4:19-2:5:20", + "value": [ + { + "string": "m", + "raw_string": "m" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/flat_nested_merge.d2,2:6:21-2:7:22", + "value": [ + { + "string": "o", + "raw_string": "o" + } + ] + } + } + ] + }, + "key_path_index": 1, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "m" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "o", + "id_val": "o", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/flat_nested_merge.d2,2:2:17-2:7:22", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/flat_nested_merge.d2,2:2:17-2:3:18", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/flat_nested_merge.d2,2:4:19-2:5:20", + "value": [ + { + "string": "m", + "raw_string": "m" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/flat_nested_merge.d2,2:6:21-2:7:22", + "value": [ + { + "string": "o", + "raw_string": "o" + } + ] + } + } + ] + }, + "key_path_index": 2, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "o" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "z", + "id_val": "z", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/flat_nested_merge.d2,3:2:25-3:3:26", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/flat_nested_merge.d2,3:2:25-3:3:26", + "value": [ + { + "string": "z", + "raw_string": "z" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "z" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ] + }, + "err": "" +} diff --git a/testdata/d2oracle/TestMove/flat_nested_merge_multiple_refs.exp.json b/testdata/d2oracle/TestMove/flat_nested_merge_multiple_refs.exp.json new file mode 100644 index 000000000..b5bec35ab --- /dev/null +++ b/testdata/d2oracle/TestMove/flat_nested_merge_multiple_refs.exp.json @@ -0,0 +1,953 @@ +{ + "graph": { + "ast": { + "range": "d2/testdata/d2oracle/TestMove/flat_nested_merge_multiple_refs.d2,0:0:0-10:0:54", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestMove/flat_nested_merge_multiple_refs.d2,0:0:0-7:1:39", + "key": { + "range": "d2/testdata/d2oracle/TestMove/flat_nested_merge_multiple_refs.d2,0:0:0-0:1:1", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/flat_nested_merge_multiple_refs.d2,0:0:0-0:1:1", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "map": { + "range": "d2/testdata/d2oracle/TestMove/flat_nested_merge_multiple_refs.d2,0:3:3-7:0:38", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestMove/flat_nested_merge_multiple_refs.d2,1:2:7-4:3:29", + "key": { + "range": "d2/testdata/d2oracle/TestMove/flat_nested_merge_multiple_refs.d2,1:2:7-1:5:10", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/flat_nested_merge_multiple_refs.d2,1:2:7-1:3:8", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/flat_nested_merge_multiple_refs.d2,1:4:9-1:5:10", + "value": [ + { + "string": "c", + "raw_string": "c" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "map": { + "range": "d2/testdata/d2oracle/TestMove/flat_nested_merge_multiple_refs.d2,1:7:12-4:2:28", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestMove/flat_nested_merge_multiple_refs.d2,2:4:18-2:5:19", + "key": { + "range": "d2/testdata/d2oracle/TestMove/flat_nested_merge_multiple_refs.d2,2:4:18-2:5:19", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/flat_nested_merge_multiple_refs.d2,2:4:18-2:5:19", + "value": [ + { + "string": "d", + "raw_string": "d" + } + ] + } + } + ] + }, + "primary": {}, + "value": {} + } + }, + { + "map_key": { + "range": "d2/testdata/d2oracle/TestMove/flat_nested_merge_multiple_refs.d2,3:4:24-3:5:25", + "key": { + "range": "d2/testdata/d2oracle/TestMove/flat_nested_merge_multiple_refs.d2,3:4:24-3:5:25", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/flat_nested_merge_multiple_refs.d2,3:4:24-3:5:25", + "value": [ + { + "string": "e", + "raw_string": "e" + } + ] + } + } + ] + }, + "primary": {}, + "value": {} + } + } + ] + } + } + } + }, + { + "map_key": { + "range": "d2/testdata/d2oracle/TestMove/flat_nested_merge_multiple_refs.d2,5:2:32-5:3:33", + "key": { + "range": "d2/testdata/d2oracle/TestMove/flat_nested_merge_multiple_refs.d2,5:2:32-5:3:33", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/flat_nested_merge_multiple_refs.d2,5:2:32-5:3:33", + "value": [ + { + "string": "f", + "raw_string": "f" + } + ] + } + } + ] + }, + "primary": {}, + "value": {} + } + }, + { + "map_key": { + "range": "d2/testdata/d2oracle/TestMove/flat_nested_merge_multiple_refs.d2,6:2:36-6:3:37", + "key": { + "range": "d2/testdata/d2oracle/TestMove/flat_nested_merge_multiple_refs.d2,6:2:36-6:3:37", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/flat_nested_merge_multiple_refs.d2,6:2:36-6:3:37", + "value": [ + { + "string": "g", + "raw_string": "g" + } + ] + } + } + ] + }, + "primary": {}, + "value": {} + } + } + ] + } + } + } + }, + { + "map_key": { + "range": "d2/testdata/d2oracle/TestMove/flat_nested_merge_multiple_refs.d2,8:0:40-8:5:45", + "key": { + "range": "d2/testdata/d2oracle/TestMove/flat_nested_merge_multiple_refs.d2,8:0:40-8:5:45", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/flat_nested_merge_multiple_refs.d2,8:0:40-8:1:41", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/flat_nested_merge_multiple_refs.d2,8:2:42-8:3:43", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/flat_nested_merge_multiple_refs.d2,8:4:44-8:5:45", + "value": [ + { + "string": "c", + "raw_string": "c" + } + ] + } + } + ] + }, + "primary": {}, + "value": {} + } + }, + { + "map_key": { + "range": "d2/testdata/d2oracle/TestMove/flat_nested_merge_multiple_refs.d2,9:0:46-9:7:53", + "key": { + "range": "d2/testdata/d2oracle/TestMove/flat_nested_merge_multiple_refs.d2,9:0:46-9:7:53", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/flat_nested_merge_multiple_refs.d2,9:0:46-9:1:47", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/flat_nested_merge_multiple_refs.d2,9:2:48-9:3:49", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/flat_nested_merge_multiple_refs.d2,9:4:50-9:5:51", + "value": [ + { + "string": "c", + "raw_string": "c" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/flat_nested_merge_multiple_refs.d2,9:6:52-9:7:53", + "value": [ + { + "string": "q", + "raw_string": "q" + } + ] + } + } + ] + }, + "primary": {}, + "value": {} + } + } + ] + }, + "root": { + "id": "", + "id_val": "", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + "edges": null, + "objects": [ + { + "id": "a", + "id_val": "a", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/flat_nested_merge_multiple_refs.d2,0:0:0-0:1:1", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/flat_nested_merge_multiple_refs.d2,0:0:0-0:1:1", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + }, + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/flat_nested_merge_multiple_refs.d2,8:0:40-8:5:45", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/flat_nested_merge_multiple_refs.d2,8:0:40-8:1:41", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/flat_nested_merge_multiple_refs.d2,8:2:42-8:3:43", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/flat_nested_merge_multiple_refs.d2,8:4:44-8:5:45", + "value": [ + { + "string": "c", + "raw_string": "c" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + }, + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/flat_nested_merge_multiple_refs.d2,9:0:46-9:7:53", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/flat_nested_merge_multiple_refs.d2,9:0:46-9:1:47", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/flat_nested_merge_multiple_refs.d2,9:2:48-9:3:49", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/flat_nested_merge_multiple_refs.d2,9:4:50-9:5:51", + "value": [ + { + "string": "c", + "raw_string": "c" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/flat_nested_merge_multiple_refs.d2,9:6:52-9:7:53", + "value": [ + { + "string": "q", + "raw_string": "q" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "a" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "b", + "id_val": "b", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/flat_nested_merge_multiple_refs.d2,1:2:7-1:5:10", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/flat_nested_merge_multiple_refs.d2,1:2:7-1:3:8", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/flat_nested_merge_multiple_refs.d2,1:4:9-1:5:10", + "value": [ + { + "string": "c", + "raw_string": "c" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + }, + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/flat_nested_merge_multiple_refs.d2,8:0:40-8:5:45", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/flat_nested_merge_multiple_refs.d2,8:0:40-8:1:41", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/flat_nested_merge_multiple_refs.d2,8:2:42-8:3:43", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/flat_nested_merge_multiple_refs.d2,8:4:44-8:5:45", + "value": [ + { + "string": "c", + "raw_string": "c" + } + ] + } + } + ] + }, + "key_path_index": 1, + "map_key_edge_index": 0 + }, + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/flat_nested_merge_multiple_refs.d2,9:0:46-9:7:53", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/flat_nested_merge_multiple_refs.d2,9:0:46-9:1:47", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/flat_nested_merge_multiple_refs.d2,9:2:48-9:3:49", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/flat_nested_merge_multiple_refs.d2,9:4:50-9:5:51", + "value": [ + { + "string": "c", + "raw_string": "c" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/flat_nested_merge_multiple_refs.d2,9:6:52-9:7:53", + "value": [ + { + "string": "q", + "raw_string": "q" + } + ] + } + } + ] + }, + "key_path_index": 1, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "b" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "c", + "id_val": "c", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/flat_nested_merge_multiple_refs.d2,1:2:7-1:5:10", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/flat_nested_merge_multiple_refs.d2,1:2:7-1:3:8", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/flat_nested_merge_multiple_refs.d2,1:4:9-1:5:10", + "value": [ + { + "string": "c", + "raw_string": "c" + } + ] + } + } + ] + }, + "key_path_index": 1, + "map_key_edge_index": 0 + }, + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/flat_nested_merge_multiple_refs.d2,8:0:40-8:5:45", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/flat_nested_merge_multiple_refs.d2,8:0:40-8:1:41", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/flat_nested_merge_multiple_refs.d2,8:2:42-8:3:43", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/flat_nested_merge_multiple_refs.d2,8:4:44-8:5:45", + "value": [ + { + "string": "c", + "raw_string": "c" + } + ] + } + } + ] + }, + "key_path_index": 2, + "map_key_edge_index": 0 + }, + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/flat_nested_merge_multiple_refs.d2,9:0:46-9:7:53", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/flat_nested_merge_multiple_refs.d2,9:0:46-9:1:47", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/flat_nested_merge_multiple_refs.d2,9:2:48-9:3:49", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/flat_nested_merge_multiple_refs.d2,9:4:50-9:5:51", + "value": [ + { + "string": "c", + "raw_string": "c" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/flat_nested_merge_multiple_refs.d2,9:6:52-9:7:53", + "value": [ + { + "string": "q", + "raw_string": "q" + } + ] + } + } + ] + }, + "key_path_index": 2, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "c" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "d", + "id_val": "d", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/flat_nested_merge_multiple_refs.d2,2:4:18-2:5:19", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/flat_nested_merge_multiple_refs.d2,2:4:18-2:5:19", + "value": [ + { + "string": "d", + "raw_string": "d" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "d" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "e", + "id_val": "e", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/flat_nested_merge_multiple_refs.d2,3:4:24-3:5:25", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/flat_nested_merge_multiple_refs.d2,3:4:24-3:5:25", + "value": [ + { + "string": "e", + "raw_string": "e" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "e" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "f", + "id_val": "f", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/flat_nested_merge_multiple_refs.d2,5:2:32-5:3:33", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/flat_nested_merge_multiple_refs.d2,5:2:32-5:3:33", + "value": [ + { + "string": "f", + "raw_string": "f" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "f" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "g", + "id_val": "g", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/flat_nested_merge_multiple_refs.d2,6:2:36-6:3:37", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/flat_nested_merge_multiple_refs.d2,6:2:36-6:3:37", + "value": [ + { + "string": "g", + "raw_string": "g" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "g" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "q", + "id_val": "q", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/flat_nested_merge_multiple_refs.d2,9:0:46-9:7:53", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/flat_nested_merge_multiple_refs.d2,9:0:46-9:1:47", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/flat_nested_merge_multiple_refs.d2,9:2:48-9:3:49", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/flat_nested_merge_multiple_refs.d2,9:4:50-9:5:51", + "value": [ + { + "string": "c", + "raw_string": "c" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/flat_nested_merge_multiple_refs.d2,9:6:52-9:7:53", + "value": [ + { + "string": "q", + "raw_string": "q" + } + ] + } + } + ] + }, + "key_path_index": 3, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "q" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ] + }, + "err": "" +} diff --git a/testdata/d2oracle/TestMove/flat_reparent_with_map_value.exp.json b/testdata/d2oracle/TestMove/flat_reparent_with_map_value.exp.json new file mode 100644 index 000000000..3377ac707 --- /dev/null +++ b/testdata/d2oracle/TestMove/flat_reparent_with_map_value.exp.json @@ -0,0 +1,196 @@ +{ + "graph": { + "ast": { + "range": "d2/testdata/d2oracle/TestMove/flat_reparent_with_map_value.d2,0:0:0-4:0:26", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestMove/flat_reparent_with_map_value.d2,0:0:0-0:1:1", + "key": { + "range": "d2/testdata/d2oracle/TestMove/flat_reparent_with_map_value.d2,0:0:0-0:1:1", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/flat_reparent_with_map_value.d2,0:0:0-0:1:1", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + } + ] + }, + "primary": {}, + "value": {} + } + }, + { + "map_key": { + "range": "d2/testdata/d2oracle/TestMove/flat_reparent_with_map_value.d2,1:0:2-3:1:25", + "key": { + "range": "d2/testdata/d2oracle/TestMove/flat_reparent_with_map_value.d2,1:0:2-1:1:3", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/flat_reparent_with_map_value.d2,1:0:2-1:1:3", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "map": { + "range": "d2/testdata/d2oracle/TestMove/flat_reparent_with_map_value.d2,1:3:5-3:0:24", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestMove/flat_reparent_with_map_value.d2,2:2:9-2:16:23", + "key": { + "range": "d2/testdata/d2oracle/TestMove/flat_reparent_with_map_value.d2,2:2:9-2:7:14", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/flat_reparent_with_map_value.d2,2:2:9-2:7:14", + "value": [ + { + "string": "shape", + "raw_string": "shape" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/flat_reparent_with_map_value.d2,2:9:16-2:16:23", + "value": [ + { + "string": "hexagon", + "raw_string": "hexagon" + } + ] + } + } + } + } + ] + } + } + } + } + ] + }, + "root": { + "id": "", + "id_val": "", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + "edges": null, + "objects": [ + { + "id": "a", + "id_val": "a", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/flat_reparent_with_map_value.d2,0:0:0-0:1:1", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/flat_reparent_with_map_value.d2,0:0:0-0:1:1", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "a" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "b", + "id_val": "b", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/flat_reparent_with_map_value.d2,1:0:2-1:1:3", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/flat_reparent_with_map_value.d2,1:0:2-1:1:3", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "b" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "hexagon" + } + } + } + ] + }, + "err": "" +} diff --git a/testdata/d2oracle/TestMove/flat_reparent_with_mixed_map_value.exp.json b/testdata/d2oracle/TestMove/flat_reparent_with_mixed_map_value.exp.json new file mode 100644 index 000000000..d0859286b --- /dev/null +++ b/testdata/d2oracle/TestMove/flat_reparent_with_mixed_map_value.exp.json @@ -0,0 +1,277 @@ +{ + "graph": { + "ast": { + "range": "d2/testdata/d2oracle/TestMove/flat_reparent_with_mixed_map_value.d2,0:0:0-8:0:72", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestMove/flat_reparent_with_mixed_map_value.d2,0:0:0-3:1:26", + "key": { + "range": "d2/testdata/d2oracle/TestMove/flat_reparent_with_mixed_map_value.d2,0:0:0-0:1:1", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/flat_reparent_with_mixed_map_value.d2,0:0:0-0:1:1", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "map": { + "range": "d2/testdata/d2oracle/TestMove/flat_reparent_with_mixed_map_value.d2,0:3:3-3:0:25", + "nodes": [ + { + "comment": { + "range": "d2/testdata/d2oracle/TestMove/flat_reparent_with_mixed_map_value.d2,1:2:7-1:15:20", + "value": "this is not" + } + }, + { + "map_key": { + "range": "d2/testdata/d2oracle/TestMove/flat_reparent_with_mixed_map_value.d2,2:2:23-2:3:24", + "key": { + "range": "d2/testdata/d2oracle/TestMove/flat_reparent_with_mixed_map_value.d2,2:2:23-2:3:24", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/flat_reparent_with_mixed_map_value.d2,2:2:23-2:3:24", + "value": [ + { + "string": "c", + "raw_string": "c" + } + ] + } + } + ] + }, + "primary": {}, + "value": {} + } + } + ] + } + } + } + }, + { + "map_key": { + "range": "d2/testdata/d2oracle/TestMove/flat_reparent_with_mixed_map_value.d2,4:0:27-7:1:71", + "key": { + "range": "d2/testdata/d2oracle/TestMove/flat_reparent_with_mixed_map_value.d2,4:0:27-4:1:28", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/flat_reparent_with_mixed_map_value.d2,4:0:27-4:1:28", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "map": { + "range": "d2/testdata/d2oracle/TestMove/flat_reparent_with_mixed_map_value.d2,4:3:30-7:0:70", + "nodes": [ + { + "comment": { + "range": "d2/testdata/d2oracle/TestMove/flat_reparent_with_mixed_map_value.d2,5:2:34-5:20:52", + "value": "this is reserved" + } + }, + { + "map_key": { + "range": "d2/testdata/d2oracle/TestMove/flat_reparent_with_mixed_map_value.d2,6:2:55-6:16:69", + "key": { + "range": "d2/testdata/d2oracle/TestMove/flat_reparent_with_mixed_map_value.d2,6:2:55-6:7:60", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/flat_reparent_with_mixed_map_value.d2,6:2:55-6:7:60", + "value": [ + { + "string": "shape", + "raw_string": "shape" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/flat_reparent_with_mixed_map_value.d2,6:9:62-6:16:69", + "value": [ + { + "string": "hexagon", + "raw_string": "hexagon" + } + ] + } + } + } + } + ] + } + } + } + } + ] + }, + "root": { + "id": "", + "id_val": "", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + "edges": null, + "objects": [ + { + "id": "a", + "id_val": "a", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/flat_reparent_with_mixed_map_value.d2,0:0:0-0:1:1", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/flat_reparent_with_mixed_map_value.d2,0:0:0-0:1:1", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "a" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "c", + "id_val": "c", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/flat_reparent_with_mixed_map_value.d2,2:2:23-2:3:24", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/flat_reparent_with_mixed_map_value.d2,2:2:23-2:3:24", + "value": [ + { + "string": "c", + "raw_string": "c" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "c" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "b", + "id_val": "b", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/flat_reparent_with_mixed_map_value.d2,4:0:27-4:1:28", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/flat_reparent_with_mixed_map_value.d2,4:0:27-4:1:28", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "b" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "hexagon" + } + } + } + ] + }, + "err": "" +} diff --git a/testdata/d2oracle/TestMove/flat_reparent_with_value.exp.json b/testdata/d2oracle/TestMove/flat_reparent_with_value.exp.json new file mode 100644 index 000000000..c038ada76 --- /dev/null +++ b/testdata/d2oracle/TestMove/flat_reparent_with_value.exp.json @@ -0,0 +1,167 @@ +{ + "graph": { + "ast": { + "range": "d2/testdata/d2oracle/TestMove/flat_reparent_with_value.d2,0:0:0-2:0:10", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestMove/flat_reparent_with_value.d2,0:0:0-0:1:1", + "key": { + "range": "d2/testdata/d2oracle/TestMove/flat_reparent_with_value.d2,0:0:0-0:1:1", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/flat_reparent_with_value.d2,0:0:0-0:1:1", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + } + ] + }, + "primary": {}, + "value": {} + } + }, + { + "map_key": { + "range": "d2/testdata/d2oracle/TestMove/flat_reparent_with_value.d2,1:0:2-1:7:9", + "key": { + "range": "d2/testdata/d2oracle/TestMove/flat_reparent_with_value.d2,1:0:2-1:1:3", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/flat_reparent_with_value.d2,1:0:2-1:1:3", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "double_quoted_string": { + "range": "d2/testdata/d2oracle/TestMove/flat_reparent_with_value.d2,1:3:5-1:7:9", + "value": [ + { + "string": "yo", + "raw_string": "yo" + } + ] + } + } + } + } + ] + }, + "root": { + "id": "", + "id_val": "", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + "edges": null, + "objects": [ + { + "id": "a", + "id_val": "a", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/flat_reparent_with_value.d2,0:0:0-0:1:1", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/flat_reparent_with_value.d2,0:0:0-0:1:1", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "a" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "b", + "id_val": "b", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/flat_reparent_with_value.d2,1:0:2-1:1:3", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/flat_reparent_with_value.d2,1:0:2-1:1:3", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "yo" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ] + }, + "err": "" +} diff --git a/testdata/d2oracle/TestMove/flat_style.exp.json b/testdata/d2oracle/TestMove/flat_style.exp.json new file mode 100644 index 000000000..91e711e56 --- /dev/null +++ b/testdata/d2oracle/TestMove/flat_style.exp.json @@ -0,0 +1,317 @@ +{ + "graph": { + "ast": { + "range": "d2/testdata/d2oracle/TestMove/flat_style.d2,0:0:0-4:0:52", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestMove/flat_style.d2,0:0:0-3:1:51", + "key": { + "range": "d2/testdata/d2oracle/TestMove/flat_style.d2,0:0:0-0:1:1", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/flat_style.d2,0:0:0-0:1:1", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "map": { + "range": "d2/testdata/d2oracle/TestMove/flat_style.d2,0:3:3-3:0:50", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestMove/flat_style.d2,1:2:7-1:22:27", + "key": { + "range": "d2/testdata/d2oracle/TestMove/flat_style.d2,1:2:7-1:17:22", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/flat_style.d2,1:2:7-1:3:8", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/flat_style.d2,1:4:9-1:9:14", + "value": [ + { + "string": "style", + "raw_string": "style" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/flat_style.d2,1:10:15-1:17:22", + "value": [ + { + "string": "opacity", + "raw_string": "opacity" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "number": { + "range": "d2/testdata/d2oracle/TestMove/flat_style.d2,1:19:24-1:22:27", + "raw": "0.4", + "value": "2/5" + } + } + } + }, + { + "map_key": { + "range": "d2/testdata/d2oracle/TestMove/flat_style.d2,2:2:30-2:21:49", + "key": { + "range": "d2/testdata/d2oracle/TestMove/flat_style.d2,2:2:30-2:14:42", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/flat_style.d2,2:2:30-2:3:31", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/flat_style.d2,2:4:32-2:9:37", + "value": [ + { + "string": "style", + "raw_string": "style" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/flat_style.d2,2:10:38-2:14:42", + "value": [ + { + "string": "fill", + "raw_string": "fill" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/flat_style.d2,2:16:44-2:21:49", + "value": [ + { + "string": "black", + "raw_string": "black" + } + ] + } + } + } + } + ] + } + } + } + } + ] + }, + "root": { + "id": "", + "id_val": "", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + "edges": [], + "objects": [ + { + "id": "b", + "id_val": "b", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/flat_style.d2,0:0:0-0:1:1", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/flat_style.d2,0:0:0-0:1:1", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "b" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "a", + "id_val": "a", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/flat_style.d2,1:2:7-1:17:22", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/flat_style.d2,1:2:7-1:3:8", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/flat_style.d2,1:4:9-1:9:14", + "value": [ + { + "string": "style", + "raw_string": "style" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/flat_style.d2,1:10:15-1:17:22", + "value": [ + { + "string": "opacity", + "raw_string": "opacity" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + }, + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/flat_style.d2,2:2:30-2:14:42", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/flat_style.d2,2:2:30-2:3:31", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/flat_style.d2,2:4:32-2:9:37", + "value": [ + { + "string": "style", + "raw_string": "style" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/flat_style.d2,2:10:38-2:14:42", + "value": [ + { + "string": "fill", + "raw_string": "fill" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "a" + }, + "style": { + "opacity": { + "value": "0.4" + }, + "fill": { + "value": "black" + } + }, + "near_key": null, + "shape": { + "value": "" + } + } + } + ] + }, + "err": "" +} diff --git a/testdata/d2oracle/TestMove/full_edge_slice.exp.json b/testdata/d2oracle/TestMove/full_edge_slice.exp.json new file mode 100644 index 000000000..0d5875894 --- /dev/null +++ b/testdata/d2oracle/TestMove/full_edge_slice.exp.json @@ -0,0 +1,548 @@ +{ + "graph": { + "ast": { + "range": "d2/testdata/d2oracle/TestMove/full_edge_slice.d2,0:0:0-6:0:33", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestMove/full_edge_slice.d2,0:0:0-3:1:21", + "key": { + "range": "d2/testdata/d2oracle/TestMove/full_edge_slice.d2,0:0:0-0:1:1", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/full_edge_slice.d2,0:0:0-0:1:1", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "map": { + "range": "d2/testdata/d2oracle/TestMove/full_edge_slice.d2,0:3:3-3:0:20", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestMove/full_edge_slice.d2,1:2:7-1:3:8", + "key": { + "range": "d2/testdata/d2oracle/TestMove/full_edge_slice.d2,1:2:7-1:3:8", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/full_edge_slice.d2,1:2:7-1:3:8", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + } + ] + }, + "primary": {}, + "value": {} + } + }, + { + "map_key": { + "range": "d2/testdata/d2oracle/TestMove/full_edge_slice.d2,2:2:11-2:10:19", + "edges": [ + { + "range": "d2/testdata/d2oracle/TestMove/full_edge_slice.d2,2:2:11-2:10:19", + "src": { + "range": "d2/testdata/d2oracle/TestMove/full_edge_slice.d2,2:2:11-2:6:15", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/full_edge_slice.d2,2:2:11-2:3:12", + "value": [ + { + "string": "_", + "raw_string": "_" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/full_edge_slice.d2,2:4:13-2:5:14", + "value": [ + { + "string": "c", + "raw_string": "c" + } + ] + } + } + ] + }, + "src_arrow": "", + "dst": { + "range": "d2/testdata/d2oracle/TestMove/full_edge_slice.d2,2:8:17-2:10:19", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/full_edge_slice.d2,2:9:18-2:10:19", + "value": [ + { + "string": "d", + "raw_string": "d" + } + ] + } + } + ] + }, + "dst_arrow": ">" + } + ], + "primary": {}, + "value": {} + } + } + ] + } + } + } + }, + { + "map_key": { + "range": "d2/testdata/d2oracle/TestMove/full_edge_slice.d2,4:0:22-4:8:30", + "edges": [ + { + "range": "d2/testdata/d2oracle/TestMove/full_edge_slice.d2,4:0:22-4:8:30", + "src": { + "range": "d2/testdata/d2oracle/TestMove/full_edge_slice.d2,4:0:22-4:2:24", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/full_edge_slice.d2,4:0:22-4:1:23", + "value": [ + { + "string": "c", + "raw_string": "c" + } + ] + } + } + ] + }, + "src_arrow": "", + "dst": { + "range": "d2/testdata/d2oracle/TestMove/full_edge_slice.d2,4:4:26-4:8:30", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/full_edge_slice.d2,4:5:27-4:6:28", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/full_edge_slice.d2,4:7:29-4:8:30", + "value": [ + { + "string": "d", + "raw_string": "d" + } + ] + } + } + ] + }, + "dst_arrow": ">" + } + ], + "primary": {}, + "value": {} + } + }, + { + "map_key": { + "range": "d2/testdata/d2oracle/TestMove/full_edge_slice.d2,5:0:31-5:1:32", + "key": { + "range": "d2/testdata/d2oracle/TestMove/full_edge_slice.d2,5:0:31-5:1:32", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/full_edge_slice.d2,5:0:31-5:1:32", + "value": [ + { + "string": "c", + "raw_string": "c" + } + ] + } + } + ] + }, + "primary": {}, + "value": {} + } + } + ] + }, + "root": { + "id": "", + "id_val": "", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + "edges": [ + { + "index": 0, + "minWidth": 0, + "minHeight": 0, + "label_dimensions": { + "width": 0, + "height": 0 + }, + "isCurve": false, + "src_arrow": false, + "dst_arrow": true, + "references": [ + { + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "index": 1, + "minWidth": 0, + "minHeight": 0, + "label_dimensions": { + "width": 0, + "height": 0 + }, + "isCurve": false, + "src_arrow": false, + "dst_arrow": true, + "references": [ + { + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ], + "objects": [ + { + "id": "a", + "id_val": "a", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/full_edge_slice.d2,0:0:0-0:1:1", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/full_edge_slice.d2,0:0:0-0:1:1", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + }, + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/full_edge_slice.d2,4:4:26-4:8:30", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/full_edge_slice.d2,4:5:27-4:6:28", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/full_edge_slice.d2,4:7:29-4:8:30", + "value": [ + { + "string": "d", + "raw_string": "d" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "a" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "b", + "id_val": "b", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/full_edge_slice.d2,1:2:7-1:3:8", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/full_edge_slice.d2,1:2:7-1:3:8", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "b" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "c", + "id_val": "c", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/full_edge_slice.d2,5:0:31-5:1:32", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/full_edge_slice.d2,5:0:31-5:1:32", + "value": [ + { + "string": "c", + "raw_string": "c" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + }, + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/full_edge_slice.d2,2:2:11-2:6:15", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/full_edge_slice.d2,2:2:11-2:3:12", + "value": [ + { + "string": "_", + "raw_string": "_" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/full_edge_slice.d2,2:4:13-2:5:14", + "value": [ + { + "string": "c", + "raw_string": "c" + } + ] + } + } + ] + }, + "key_path_index": 1, + "map_key_edge_index": 0 + }, + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/full_edge_slice.d2,4:0:22-4:2:24", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/full_edge_slice.d2,4:0:22-4:1:23", + "value": [ + { + "string": "c", + "raw_string": "c" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "c" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "d", + "id_val": "d", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/full_edge_slice.d2,2:8:17-2:10:19", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/full_edge_slice.d2,2:9:18-2:10:19", + "value": [ + { + "string": "d", + "raw_string": "d" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + }, + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/full_edge_slice.d2,4:4:26-4:8:30", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/full_edge_slice.d2,4:5:27-4:6:28", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/full_edge_slice.d2,4:7:29-4:8:30", + "value": [ + { + "string": "d", + "raw_string": "d" + } + ] + } + } + ] + }, + "key_path_index": 1, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "d" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ] + }, + "err": "" +} diff --git a/testdata/d2oracle/TestMove/full_slice.exp.json b/testdata/d2oracle/TestMove/full_slice.exp.json new file mode 100644 index 000000000..7ac527570 --- /dev/null +++ b/testdata/d2oracle/TestMove/full_slice.exp.json @@ -0,0 +1,226 @@ +{ + "graph": { + "ast": { + "range": "d2/testdata/d2oracle/TestMove/full_slice.d2,0:0:0-4:0:13", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestMove/full_slice.d2,0:0:0-2:1:10", + "key": { + "range": "d2/testdata/d2oracle/TestMove/full_slice.d2,0:0:0-0:1:1", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/full_slice.d2,0:0:0-0:1:1", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "map": { + "range": "d2/testdata/d2oracle/TestMove/full_slice.d2,0:3:3-2:0:9", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestMove/full_slice.d2,1:2:7-1:3:8", + "key": { + "range": "d2/testdata/d2oracle/TestMove/full_slice.d2,1:2:7-1:3:8", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/full_slice.d2,1:2:7-1:3:8", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + } + ] + }, + "primary": {}, + "value": {} + } + } + ] + } + } + } + }, + { + "map_key": { + "range": "d2/testdata/d2oracle/TestMove/full_slice.d2,3:0:11-3:1:12", + "key": { + "range": "d2/testdata/d2oracle/TestMove/full_slice.d2,3:0:11-3:1:12", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/full_slice.d2,3:0:11-3:1:12", + "value": [ + { + "string": "c", + "raw_string": "c" + } + ] + } + } + ] + }, + "primary": {}, + "value": {} + } + } + ] + }, + "root": { + "id": "", + "id_val": "", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + "edges": null, + "objects": [ + { + "id": "a", + "id_val": "a", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/full_slice.d2,0:0:0-0:1:1", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/full_slice.d2,0:0:0-0:1:1", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "a" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "b", + "id_val": "b", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/full_slice.d2,1:2:7-1:3:8", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/full_slice.d2,1:2:7-1:3:8", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "b" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "c", + "id_val": "c", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/full_slice.d2,3:0:11-3:1:12", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/full_slice.d2,3:0:11-3:1:12", + "value": [ + { + "string": "c", + "raw_string": "c" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "c" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ] + }, + "err": "" +} diff --git a/testdata/d2oracle/TestMove/gnarly_1.exp.json b/testdata/d2oracle/TestMove/gnarly_1.exp.json new file mode 100644 index 000000000..dc97d0024 --- /dev/null +++ b/testdata/d2oracle/TestMove/gnarly_1.exp.json @@ -0,0 +1,1224 @@ +{ + "graph": { + "ast": { + "range": "d2/testdata/d2oracle/TestMove/gnarly_1.d2,0:0:0-9:0:64", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestMove/gnarly_1.d2,0:0:0-0:14:14", + "edges": [ + { + "range": "d2/testdata/d2oracle/TestMove/gnarly_1.d2,0:0:0-0:14:14", + "src": { + "range": "d2/testdata/d2oracle/TestMove/gnarly_1.d2,0:0:0-0:6:6", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/gnarly_1.d2,0:0:0-0:1:1", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/gnarly_1.d2,0:2:2-0:3:3", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/gnarly_1.d2,0:4:4-0:5:5", + "value": [ + { + "string": "c", + "raw_string": "c" + } + ] + } + } + ] + }, + "src_arrow": "", + "dst": { + "range": "d2/testdata/d2oracle/TestMove/gnarly_1.d2,0:8:8-0:14:14", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/gnarly_1.d2,0:9:9-0:10:10", + "value": [ + { + "string": "d", + "raw_string": "d" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/gnarly_1.d2,0:11:11-0:12:12", + "value": [ + { + "string": "e", + "raw_string": "e" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/gnarly_1.d2,0:13:13-0:14:14", + "value": [ + { + "string": "f", + "raw_string": "f" + } + ] + } + } + ] + }, + "dst_arrow": ">" + } + ], + "primary": {}, + "value": {} + } + }, + { + "map_key": { + "range": "d2/testdata/d2oracle/TestMove/gnarly_1.d2,1:0:15-3:1:31", + "key": { + "range": "d2/testdata/d2oracle/TestMove/gnarly_1.d2,1:0:15-1:1:16", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/gnarly_1.d2,1:0:15-1:1:16", + "value": [ + { + "string": "d", + "raw_string": "d" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "map": { + "range": "d2/testdata/d2oracle/TestMove/gnarly_1.d2,1:3:18-3:0:30", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestMove/gnarly_1.d2,2:2:22-2:9:29", + "key": { + "range": "d2/testdata/d2oracle/TestMove/gnarly_1.d2,2:2:22-2:3:23", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/gnarly_1.d2,2:2:22-2:3:23", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/gnarly_1.d2,2:5:25-2:9:29", + "value": [ + { + "string": "meow", + "raw_string": "meow" + } + ] + } + } + } + } + ] + } + } + } + }, + { + "map_key": { + "range": "d2/testdata/d2oracle/TestMove/gnarly_1.d2,4:0:32-4:8:40", + "key": { + "range": "d2/testdata/d2oracle/TestMove/gnarly_1.d2,4:0:32-4:1:33", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/gnarly_1.d2,4:0:32-4:1:33", + "value": [ + { + "string": "p", + "raw_string": "p" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "double_quoted_string": { + "range": "d2/testdata/d2oracle/TestMove/gnarly_1.d2,4:3:35-4:8:40", + "value": [ + { + "string": "eyy", + "raw_string": "eyy" + } + ] + } + } + } + }, + { + "map_key": { + "range": "d2/testdata/d2oracle/TestMove/gnarly_1.d2,5:0:41-5:1:42", + "key": { + "range": "d2/testdata/d2oracle/TestMove/gnarly_1.d2,5:0:41-5:1:42", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/gnarly_1.d2,5:0:41-5:1:42", + "value": [ + { + "string": "q", + "raw_string": "q" + } + ] + } + } + ] + }, + "primary": {}, + "value": {} + } + }, + { + "map_key": { + "range": "d2/testdata/d2oracle/TestMove/gnarly_1.d2,6:0:43-6:10:53", + "edges": [ + { + "range": "d2/testdata/d2oracle/TestMove/gnarly_1.d2,6:0:43-6:10:53", + "src": { + "range": "d2/testdata/d2oracle/TestMove/gnarly_1.d2,6:0:43-6:4:47", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/gnarly_1.d2,6:0:43-6:1:44", + "value": [ + { + "string": "p", + "raw_string": "p" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/gnarly_1.d2,6:2:45-6:3:46", + "value": [ + { + "string": "p", + "raw_string": "p" + } + ] + } + } + ] + }, + "src_arrow": "", + "dst": { + "range": "d2/testdata/d2oracle/TestMove/gnarly_1.d2,6:6:49-6:10:53", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/gnarly_1.d2,6:7:50-6:8:51", + "value": [ + { + "string": "q", + "raw_string": "q" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/gnarly_1.d2,6:9:52-6:10:53", + "value": [ + { + "string": "q", + "raw_string": "q" + } + ] + } + } + ] + }, + "dst_arrow": ">" + } + ], + "primary": {}, + "value": {} + } + }, + { + "map_key": { + "range": "d2/testdata/d2oracle/TestMove/gnarly_1.d2,8:0:55-8:8:63", + "edges": [ + { + "range": "d2/testdata/d2oracle/TestMove/gnarly_1.d2,8:0:55-8:8:63", + "src": { + "range": "d2/testdata/d2oracle/TestMove/gnarly_1.d2,8:0:55-8:4:59", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/gnarly_1.d2,8:0:55-8:1:56", + "value": [ + { + "string": "p", + "raw_string": "p" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/gnarly_1.d2,8:2:57-8:3:58", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "src_arrow": "", + "dst": { + "range": "d2/testdata/d2oracle/TestMove/gnarly_1.d2,8:6:61-8:8:63", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/gnarly_1.d2,8:7:62-8:8:63", + "value": [ + { + "string": "d", + "raw_string": "d" + } + ] + } + } + ] + }, + "dst_arrow": ">" + } + ], + "primary": {}, + "value": {} + } + } + ] + }, + "root": { + "id": "", + "id_val": "", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + "edges": [ + { + "index": 0, + "minWidth": 0, + "minHeight": 0, + "label_dimensions": { + "width": 0, + "height": 0 + }, + "isCurve": false, + "src_arrow": false, + "dst_arrow": true, + "references": [ + { + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "index": 0, + "minWidth": 0, + "minHeight": 0, + "label_dimensions": { + "width": 0, + "height": 0 + }, + "isCurve": false, + "src_arrow": false, + "dst_arrow": true, + "references": [ + { + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "index": 0, + "minWidth": 0, + "minHeight": 0, + "label_dimensions": { + "width": 0, + "height": 0 + }, + "isCurve": false, + "src_arrow": false, + "dst_arrow": true, + "references": [ + { + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ], + "objects": [ + { + "id": "d", + "id_val": "d", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/gnarly_1.d2,1:0:15-1:1:16", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/gnarly_1.d2,1:0:15-1:1:16", + "value": [ + { + "string": "d", + "raw_string": "d" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + }, + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/gnarly_1.d2,0:8:8-0:14:14", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/gnarly_1.d2,0:9:9-0:10:10", + "value": [ + { + "string": "d", + "raw_string": "d" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/gnarly_1.d2,0:11:11-0:12:12", + "value": [ + { + "string": "e", + "raw_string": "e" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/gnarly_1.d2,0:13:13-0:14:14", + "value": [ + { + "string": "f", + "raw_string": "f" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + }, + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/gnarly_1.d2,8:6:61-8:8:63", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/gnarly_1.d2,8:7:62-8:8:63", + "value": [ + { + "string": "d", + "raw_string": "d" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "d" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "b", + "id_val": "b", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/gnarly_1.d2,2:2:22-2:3:23", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/gnarly_1.d2,2:2:22-2:3:23", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "meow" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "p", + "id_val": "p", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/gnarly_1.d2,4:0:32-4:1:33", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/gnarly_1.d2,4:0:32-4:1:33", + "value": [ + { + "string": "p", + "raw_string": "p" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + }, + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/gnarly_1.d2,6:0:43-6:4:47", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/gnarly_1.d2,6:0:43-6:1:44", + "value": [ + { + "string": "p", + "raw_string": "p" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/gnarly_1.d2,6:2:45-6:3:46", + "value": [ + { + "string": "p", + "raw_string": "p" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + }, + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/gnarly_1.d2,8:0:55-8:4:59", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/gnarly_1.d2,8:0:55-8:1:56", + "value": [ + { + "string": "p", + "raw_string": "p" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/gnarly_1.d2,8:2:57-8:3:58", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "eyy" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "q", + "id_val": "q", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/gnarly_1.d2,5:0:41-5:1:42", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/gnarly_1.d2,5:0:41-5:1:42", + "value": [ + { + "string": "q", + "raw_string": "q" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + }, + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/gnarly_1.d2,6:6:49-6:10:53", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/gnarly_1.d2,6:7:50-6:8:51", + "value": [ + { + "string": "q", + "raw_string": "q" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/gnarly_1.d2,6:9:52-6:10:53", + "value": [ + { + "string": "q", + "raw_string": "q" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "q" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "a", + "id_val": "a", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/gnarly_1.d2,0:0:0-0:6:6", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/gnarly_1.d2,0:0:0-0:1:1", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/gnarly_1.d2,0:2:2-0:3:3", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/gnarly_1.d2,0:4:4-0:5:5", + "value": [ + { + "string": "c", + "raw_string": "c" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "a" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "b", + "id_val": "b", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/gnarly_1.d2,0:0:0-0:6:6", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/gnarly_1.d2,0:0:0-0:1:1", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/gnarly_1.d2,0:2:2-0:3:3", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/gnarly_1.d2,0:4:4-0:5:5", + "value": [ + { + "string": "c", + "raw_string": "c" + } + ] + } + } + ] + }, + "key_path_index": 1, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "b" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "c", + "id_val": "c", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/gnarly_1.d2,0:0:0-0:6:6", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/gnarly_1.d2,0:0:0-0:1:1", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/gnarly_1.d2,0:2:2-0:3:3", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/gnarly_1.d2,0:4:4-0:5:5", + "value": [ + { + "string": "c", + "raw_string": "c" + } + ] + } + } + ] + }, + "key_path_index": 2, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "c" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "e", + "id_val": "e", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/gnarly_1.d2,0:8:8-0:14:14", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/gnarly_1.d2,0:9:9-0:10:10", + "value": [ + { + "string": "d", + "raw_string": "d" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/gnarly_1.d2,0:11:11-0:12:12", + "value": [ + { + "string": "e", + "raw_string": "e" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/gnarly_1.d2,0:13:13-0:14:14", + "value": [ + { + "string": "f", + "raw_string": "f" + } + ] + } + } + ] + }, + "key_path_index": 1, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "e" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "f", + "id_val": "f", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/gnarly_1.d2,0:8:8-0:14:14", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/gnarly_1.d2,0:9:9-0:10:10", + "value": [ + { + "string": "d", + "raw_string": "d" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/gnarly_1.d2,0:11:11-0:12:12", + "value": [ + { + "string": "e", + "raw_string": "e" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/gnarly_1.d2,0:13:13-0:14:14", + "value": [ + { + "string": "f", + "raw_string": "f" + } + ] + } + } + ] + }, + "key_path_index": 2, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "f" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "p", + "id_val": "p", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/gnarly_1.d2,6:0:43-6:4:47", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/gnarly_1.d2,6:0:43-6:1:44", + "value": [ + { + "string": "p", + "raw_string": "p" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/gnarly_1.d2,6:2:45-6:3:46", + "value": [ + { + "string": "p", + "raw_string": "p" + } + ] + } + } + ] + }, + "key_path_index": 1, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "p" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "q", + "id_val": "q", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/gnarly_1.d2,6:6:49-6:10:53", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/gnarly_1.d2,6:7:50-6:8:51", + "value": [ + { + "string": "q", + "raw_string": "q" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/gnarly_1.d2,6:9:52-6:10:53", + "value": [ + { + "string": "q", + "raw_string": "q" + } + ] + } + } + ] + }, + "key_path_index": 1, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "q" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "x", + "id_val": "x", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/gnarly_1.d2,8:0:55-8:4:59", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/gnarly_1.d2,8:0:55-8:1:56", + "value": [ + { + "string": "p", + "raw_string": "p" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/gnarly_1.d2,8:2:57-8:3:58", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "key_path_index": 1, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "x" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ] + }, + "err": "" +} diff --git a/testdata/d2oracle/TestMove/hoist_container_children.exp.json b/testdata/d2oracle/TestMove/hoist_container_children.exp.json new file mode 100644 index 000000000..6e0786e35 --- /dev/null +++ b/testdata/d2oracle/TestMove/hoist_container_children.exp.json @@ -0,0 +1,289 @@ +{ + "graph": { + "ast": { + "range": "d2/testdata/d2oracle/TestMove/hoist_container_children.d2,0:0:0-6:0:16", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestMove/hoist_container_children.d2,0:0:0-0:1:1", + "key": { + "range": "d2/testdata/d2oracle/TestMove/hoist_container_children.d2,0:0:0-0:1:1", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/hoist_container_children.d2,0:0:0-0:1:1", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + } + ] + }, + "primary": {}, + "value": {} + } + }, + { + "map_key": { + "range": "d2/testdata/d2oracle/TestMove/hoist_container_children.d2,1:0:2-1:1:3", + "key": { + "range": "d2/testdata/d2oracle/TestMove/hoist_container_children.d2,1:0:2-1:1:3", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/hoist_container_children.d2,1:0:2-1:1:3", + "value": [ + { + "string": "c", + "raw_string": "c" + } + ] + } + } + ] + }, + "primary": {}, + "value": {} + } + }, + { + "map_key": { + "range": "d2/testdata/d2oracle/TestMove/hoist_container_children.d2,3:0:5-5:1:15", + "key": { + "range": "d2/testdata/d2oracle/TestMove/hoist_container_children.d2,3:0:5-3:1:6", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/hoist_container_children.d2,3:0:5-3:1:6", + "value": [ + { + "string": "d", + "raw_string": "d" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "map": { + "range": "d2/testdata/d2oracle/TestMove/hoist_container_children.d2,3:3:8-5:0:14", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestMove/hoist_container_children.d2,4:2:12-4:3:13", + "key": { + "range": "d2/testdata/d2oracle/TestMove/hoist_container_children.d2,4:2:12-4:3:13", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/hoist_container_children.d2,4:2:12-4:3:13", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + } + ] + }, + "primary": {}, + "value": {} + } + } + ] + } + } + } + } + ] + }, + "root": { + "id": "", + "id_val": "", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + "edges": null, + "objects": [ + { + "id": "b", + "id_val": "b", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/hoist_container_children.d2,0:0:0-0:1:1", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/hoist_container_children.d2,0:0:0-0:1:1", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "b" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "c", + "id_val": "c", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/hoist_container_children.d2,1:0:2-1:1:3", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/hoist_container_children.d2,1:0:2-1:1:3", + "value": [ + { + "string": "c", + "raw_string": "c" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "c" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "d", + "id_val": "d", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/hoist_container_children.d2,3:0:5-3:1:6", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/hoist_container_children.d2,3:0:5-3:1:6", + "value": [ + { + "string": "d", + "raw_string": "d" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "d" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "a", + "id_val": "a", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/hoist_container_children.d2,4:2:12-4:3:13", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/hoist_container_children.d2,4:2:12-4:3:13", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "a" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ] + }, + "err": "" +} diff --git a/testdata/d2oracle/TestMove/into_container_existing_map.exp.json b/testdata/d2oracle/TestMove/into_container_existing_map.exp.json new file mode 100644 index 000000000..757d6113a --- /dev/null +++ b/testdata/d2oracle/TestMove/into_container_existing_map.exp.json @@ -0,0 +1,226 @@ +{ + "graph": { + "ast": { + "range": "d2/testdata/d2oracle/TestMove/into_container_existing_map.d2,0:0:0-4:0:15", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestMove/into_container_existing_map.d2,0:0:0-3:1:14", + "key": { + "range": "d2/testdata/d2oracle/TestMove/into_container_existing_map.d2,0:0:0-0:1:1", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/into_container_existing_map.d2,0:0:0-0:1:1", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "map": { + "range": "d2/testdata/d2oracle/TestMove/into_container_existing_map.d2,0:3:3-3:0:13", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestMove/into_container_existing_map.d2,1:2:7-1:3:8", + "key": { + "range": "d2/testdata/d2oracle/TestMove/into_container_existing_map.d2,1:2:7-1:3:8", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/into_container_existing_map.d2,1:2:7-1:3:8", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + } + ] + }, + "primary": {}, + "value": {} + } + }, + { + "map_key": { + "range": "d2/testdata/d2oracle/TestMove/into_container_existing_map.d2,2:2:11-2:3:12", + "key": { + "range": "d2/testdata/d2oracle/TestMove/into_container_existing_map.d2,2:2:11-2:3:12", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/into_container_existing_map.d2,2:2:11-2:3:12", + "value": [ + { + "string": "c", + "raw_string": "c" + } + ] + } + } + ] + }, + "primary": {}, + "value": {} + } + } + ] + } + } + } + } + ] + }, + "root": { + "id": "", + "id_val": "", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + "edges": null, + "objects": [ + { + "id": "a", + "id_val": "a", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/into_container_existing_map.d2,0:0:0-0:1:1", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/into_container_existing_map.d2,0:0:0-0:1:1", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "a" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "b", + "id_val": "b", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/into_container_existing_map.d2,1:2:7-1:3:8", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/into_container_existing_map.d2,1:2:7-1:3:8", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "b" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "c", + "id_val": "c", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/into_container_existing_map.d2,2:2:11-2:3:12", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/into_container_existing_map.d2,2:2:11-2:3:12", + "value": [ + { + "string": "c", + "raw_string": "c" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "c" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ] + }, + "err": "" +} diff --git a/testdata/d2oracle/TestMove/into_container_nonexisting_map.exp.json b/testdata/d2oracle/TestMove/into_container_nonexisting_map.exp.json new file mode 100644 index 000000000..287d58556 --- /dev/null +++ b/testdata/d2oracle/TestMove/into_container_nonexisting_map.exp.json @@ -0,0 +1,163 @@ +{ + "graph": { + "ast": { + "range": "d2/testdata/d2oracle/TestMove/into_container_nonexisting_map.d2,0:0:0-3:0:11", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestMove/into_container_nonexisting_map.d2,0:0:0-2:1:10", + "key": { + "range": "d2/testdata/d2oracle/TestMove/into_container_nonexisting_map.d2,0:0:0-0:1:1", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/into_container_nonexisting_map.d2,0:0:0-0:1:1", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "map": { + "range": "d2/testdata/d2oracle/TestMove/into_container_nonexisting_map.d2,0:3:3-2:0:9", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestMove/into_container_nonexisting_map.d2,1:2:7-1:3:8", + "key": { + "range": "d2/testdata/d2oracle/TestMove/into_container_nonexisting_map.d2,1:2:7-1:3:8", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/into_container_nonexisting_map.d2,1:2:7-1:3:8", + "value": [ + { + "string": "c", + "raw_string": "c" + } + ] + } + } + ] + }, + "primary": {}, + "value": {} + } + } + ] + } + } + } + } + ] + }, + "root": { + "id": "", + "id_val": "", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + "edges": null, + "objects": [ + { + "id": "a", + "id_val": "a", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/into_container_nonexisting_map.d2,0:0:0-0:1:1", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/into_container_nonexisting_map.d2,0:0:0-0:1:1", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "a" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "c", + "id_val": "c", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/into_container_nonexisting_map.d2,1:2:7-1:3:8", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/into_container_nonexisting_map.d2,1:2:7-1:3:8", + "value": [ + { + "string": "c", + "raw_string": "c" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "c" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ] + }, + "err": "" +} diff --git a/testdata/d2oracle/TestMove/into_container_with_flat_keys.exp.json b/testdata/d2oracle/TestMove/into_container_with_flat_keys.exp.json new file mode 100644 index 000000000..7880e171f --- /dev/null +++ b/testdata/d2oracle/TestMove/into_container_with_flat_keys.exp.json @@ -0,0 +1,307 @@ +{ + "graph": { + "ast": { + "range": "d2/testdata/d2oracle/TestMove/into_container_with_flat_keys.d2,0:0:0-7:0:95", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestMove/into_container_with_flat_keys.d2,0:0:0-6:1:94", + "key": { + "range": "d2/testdata/d2oracle/TestMove/into_container_with_flat_keys.d2,0:0:0-0:1:1", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/into_container_with_flat_keys.d2,0:0:0-0:1:1", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "map": { + "range": "d2/testdata/d2oracle/TestMove/into_container_with_flat_keys.d2,0:3:3-6:0:93", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestMove/into_container_with_flat_keys.d2,1:2:7-5:3:92", + "key": { + "range": "d2/testdata/d2oracle/TestMove/into_container_with_flat_keys.d2,1:2:7-1:3:8", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/into_container_with_flat_keys.d2,1:2:7-1:3:8", + "value": [ + { + "string": "c", + "raw_string": "c" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "map": { + "range": "d2/testdata/d2oracle/TestMove/into_container_with_flat_keys.d2,1:5:10-5:2:91", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestMove/into_container_with_flat_keys.d2,2:4:16-2:22:34", + "key": { + "range": "d2/testdata/d2oracle/TestMove/into_container_with_flat_keys.d2,2:4:16-2:17:29", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/into_container_with_flat_keys.d2,2:4:16-2:9:21", + "value": [ + { + "string": "style", + "raw_string": "style" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/into_container_with_flat_keys.d2,2:10:22-2:17:29", + "value": [ + { + "string": "opacity", + "raw_string": "opacity" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "number": { + "range": "d2/testdata/d2oracle/TestMove/into_container_with_flat_keys.d2,2:19:31-2:22:34", + "raw": "0.4", + "value": "2/5" + } + } + } + }, + { + "map_key": { + "range": "d2/testdata/d2oracle/TestMove/into_container_with_flat_keys.d2,3:4:39-3:25:60", + "key": { + "range": "d2/testdata/d2oracle/TestMove/into_container_with_flat_keys.d2,3:4:39-3:14:49", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/into_container_with_flat_keys.d2,3:4:39-3:9:44", + "value": [ + { + "string": "style", + "raw_string": "style" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/into_container_with_flat_keys.d2,3:10:45-3:14:49", + "value": [ + { + "string": "fill", + "raw_string": "fill" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "double_quoted_string": { + "range": "d2/testdata/d2oracle/TestMove/into_container_with_flat_keys.d2,3:16:51-3:25:60", + "value": [ + { + "string": "#FFFFFF", + "raw_string": "#FFFFFF" + } + ] + } + } + } + }, + { + "map_key": { + "range": "d2/testdata/d2oracle/TestMove/into_container_with_flat_keys.d2,4:4:65-4:27:88", + "key": { + "range": "d2/testdata/d2oracle/TestMove/into_container_with_flat_keys.d2,4:4:65-4:16:77", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/into_container_with_flat_keys.d2,4:4:65-4:9:70", + "value": [ + { + "string": "style", + "raw_string": "style" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/into_container_with_flat_keys.d2,4:10:71-4:16:77", + "value": [ + { + "string": "stroke", + "raw_string": "stroke" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "double_quoted_string": { + "range": "d2/testdata/d2oracle/TestMove/into_container_with_flat_keys.d2,4:18:79-4:27:88", + "value": [ + { + "string": "#FFFFFF", + "raw_string": "#FFFFFF" + } + ] + } + } + } + } + ] + } + } + } + } + ] + } + } + } + } + ] + }, + "root": { + "id": "", + "id_val": "", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + "edges": [], + "objects": [ + { + "id": "a", + "id_val": "a", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/into_container_with_flat_keys.d2,0:0:0-0:1:1", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/into_container_with_flat_keys.d2,0:0:0-0:1:1", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "a" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "c", + "id_val": "c", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/into_container_with_flat_keys.d2,1:2:7-1:3:8", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/into_container_with_flat_keys.d2,1:2:7-1:3:8", + "value": [ + { + "string": "c", + "raw_string": "c" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "c" + }, + "style": { + "opacity": { + "value": "0.4" + }, + "stroke": { + "value": "#FFFFFF" + }, + "fill": { + "value": "#FFFFFF" + } + }, + "near_key": null, + "shape": { + "value": "" + } + } + } + ] + }, + "err": "" +} diff --git a/testdata/d2oracle/TestMove/into_container_with_flat_style.exp.json b/testdata/d2oracle/TestMove/into_container_with_flat_style.exp.json new file mode 100644 index 000000000..8a1739c9c --- /dev/null +++ b/testdata/d2oracle/TestMove/into_container_with_flat_style.exp.json @@ -0,0 +1,207 @@ +{ + "graph": { + "ast": { + "range": "d2/testdata/d2oracle/TestMove/into_container_with_flat_style.d2,0:0:0-4:0:36", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestMove/into_container_with_flat_style.d2,0:0:0-3:1:35", + "key": { + "range": "d2/testdata/d2oracle/TestMove/into_container_with_flat_style.d2,0:0:0-0:1:1", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/into_container_with_flat_style.d2,0:0:0-0:1:1", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "map": { + "range": "d2/testdata/d2oracle/TestMove/into_container_with_flat_style.d2,0:3:3-3:0:34", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestMove/into_container_with_flat_style.d2,1:2:7-1:24:29", + "key": { + "range": "d2/testdata/d2oracle/TestMove/into_container_with_flat_style.d2,1:2:7-1:21:26", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/into_container_with_flat_style.d2,1:2:7-1:7:12", + "value": [ + { + "string": "style", + "raw_string": "style" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/into_container_with_flat_style.d2,1:8:13-1:21:26", + "value": [ + { + "string": "border-radius", + "raw_string": "border-radius" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "number": { + "range": "d2/testdata/d2oracle/TestMove/into_container_with_flat_style.d2,1:23:28-1:24:29", + "raw": "5", + "value": "5" + } + } + } + }, + { + "map_key": { + "range": "d2/testdata/d2oracle/TestMove/into_container_with_flat_style.d2,2:2:32-2:3:33", + "key": { + "range": "d2/testdata/d2oracle/TestMove/into_container_with_flat_style.d2,2:2:32-2:3:33", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/into_container_with_flat_style.d2,2:2:32-2:3:33", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + } + ] + }, + "primary": {}, + "value": {} + } + } + ] + } + } + } + } + ] + }, + "root": { + "id": "", + "id_val": "", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + "edges": [], + "objects": [ + { + "id": "x", + "id_val": "x", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/into_container_with_flat_style.d2,0:0:0-0:1:1", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/into_container_with_flat_style.d2,0:0:0-0:1:1", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "x" + }, + "style": { + "borderRadius": { + "value": "5" + } + }, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "y", + "id_val": "y", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/into_container_with_flat_style.d2,2:2:32-2:3:33", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/into_container_with_flat_style.d2,2:2:32-2:3:33", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "y" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ] + }, + "err": "" +} diff --git a/testdata/d2oracle/TestMove/into_container_with_map.exp.json b/testdata/d2oracle/TestMove/into_container_with_map.exp.json new file mode 100644 index 000000000..673233ea6 --- /dev/null +++ b/testdata/d2oracle/TestMove/into_container_with_map.exp.json @@ -0,0 +1,269 @@ +{ + "graph": { + "ast": { + "range": "d2/testdata/d2oracle/TestMove/into_container_with_map.d2,0:0:0-6:0:64", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestMove/into_container_with_map.d2,0:0:0-5:1:63", + "key": { + "range": "d2/testdata/d2oracle/TestMove/into_container_with_map.d2,0:0:0-0:1:1", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/into_container_with_map.d2,0:0:0-0:1:1", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "map": { + "range": "d2/testdata/d2oracle/TestMove/into_container_with_map.d2,0:3:3-5:0:62", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestMove/into_container_with_map.d2,1:2:7-4:4:61", + "key": { + "range": "d2/testdata/d2oracle/TestMove/into_container_with_map.d2,1:2:7-1:3:8", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/into_container_with_map.d2,1:2:7-1:3:8", + "value": [ + { + "string": "c", + "raw_string": "c" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "map": { + "range": "d2/testdata/d2oracle/TestMove/into_container_with_map.d2,1:5:10-4:3:60", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestMove/into_container_with_map.d2,1:6:11-4:3:60", + "key": { + "range": "d2/testdata/d2oracle/TestMove/into_container_with_map.d2,1:6:11-1:11:16", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/into_container_with_map.d2,1:6:11-1:11:16", + "value": [ + { + "string": "style", + "raw_string": "style" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "map": { + "range": "d2/testdata/d2oracle/TestMove/into_container_with_map.d2,1:13:18-4:2:59", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestMove/into_container_with_map.d2,2:4:24-2:16:36", + "key": { + "range": "d2/testdata/d2oracle/TestMove/into_container_with_map.d2,2:4:24-2:11:31", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/into_container_with_map.d2,2:4:24-2:11:31", + "value": [ + { + "string": "opacity", + "raw_string": "opacity" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "number": { + "range": "d2/testdata/d2oracle/TestMove/into_container_with_map.d2,2:13:33-2:16:36", + "raw": "0.4", + "value": "2/5" + } + } + } + }, + { + "map_key": { + "range": "d2/testdata/d2oracle/TestMove/into_container_with_map.d2,3:4:41-3:19:56", + "key": { + "range": "d2/testdata/d2oracle/TestMove/into_container_with_map.d2,3:4:41-3:8:45", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/into_container_with_map.d2,3:4:41-3:8:45", + "value": [ + { + "string": "fill", + "raw_string": "fill" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "double_quoted_string": { + "range": "d2/testdata/d2oracle/TestMove/into_container_with_map.d2,3:10:47-3:19:56", + "value": [ + { + "string": "#FFFFFF", + "raw_string": "#FFFFFF" + } + ] + } + } + } + } + ] + } + } + } + } + ] + } + } + } + } + ] + } + } + } + } + ] + }, + "root": { + "id": "", + "id_val": "", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + "edges": [], + "objects": [ + { + "id": "a", + "id_val": "a", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/into_container_with_map.d2,0:0:0-0:1:1", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/into_container_with_map.d2,0:0:0-0:1:1", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0, + "scope_key": "" + } + ], + "attributes": { + "label": { + "value": "a" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "c", + "id_val": "c", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/into_container_with_map.d2,1:2:7-1:3:8", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/into_container_with_map.d2,1:2:7-1:3:8", + "value": [ + { + "string": "c", + "raw_string": "c" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0, + "scope_key": "a" + } + ], + "attributes": { + "label": { + "value": "c" + }, + "style": { + "opacity": { + "value": "0.4" + }, + "fill": { + "value": "#FFFFFF" + } + }, + "near_key": null, + "shape": { + "value": "" + } + } + } + ] + }, + "err": "" +} diff --git a/testdata/d2oracle/TestMove/map_transplant.exp.json b/testdata/d2oracle/TestMove/map_transplant.exp.json new file mode 100644 index 000000000..a78c71763 --- /dev/null +++ b/testdata/d2oracle/TestMove/map_transplant.exp.json @@ -0,0 +1,390 @@ +{ + "graph": { + "ast": { + "range": "d2/testdata/d2oracle/TestMove/map_transplant.d2,0:0:0-13:0:79", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestMove/map_transplant.d2,0:0:0-0:1:1", + "key": { + "range": "d2/testdata/d2oracle/TestMove/map_transplant.d2,0:0:0-0:1:1", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/map_transplant.d2,0:0:0-0:1:1", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + } + ] + }, + "primary": {}, + "value": {} + } + }, + { + "map_key": { + "range": "d2/testdata/d2oracle/TestMove/map_transplant.d2,2:0:3-2:1:4", + "key": { + "range": "d2/testdata/d2oracle/TestMove/map_transplant.d2,2:0:3-2:1:4", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/map_transplant.d2,2:0:3-2:1:4", + "value": [ + { + "string": "c", + "raw_string": "c" + } + ] + } + } + ] + }, + "primary": {}, + "value": {} + } + }, + { + "map_key": { + "range": "d2/testdata/d2oracle/TestMove/map_transplant.d2,4:0:6-12:1:78", + "key": { + "range": "d2/testdata/d2oracle/TestMove/map_transplant.d2,4:0:6-4:1:7", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/map_transplant.d2,4:0:6-4:1:7", + "value": [ + { + "string": "d", + "raw_string": "d" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "map": { + "range": "d2/testdata/d2oracle/TestMove/map_transplant.d2,4:3:9-12:0:77", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestMove/map_transplant.d2,5:2:13-11:3:76", + "key": { + "range": "d2/testdata/d2oracle/TestMove/map_transplant.d2,5:2:13-5:3:14", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/map_transplant.d2,5:2:13-5:3:14", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "map": { + "range": "d2/testdata/d2oracle/TestMove/map_transplant.d2,5:5:16-11:2:75", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestMove/map_transplant.d2,6:4:22-8:5:55", + "key": { + "range": "d2/testdata/d2oracle/TestMove/map_transplant.d2,6:4:22-6:9:27", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/map_transplant.d2,6:4:22-6:9:27", + "value": [ + { + "string": "style", + "raw_string": "style" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "map": { + "range": "d2/testdata/d2oracle/TestMove/map_transplant.d2,6:11:29-8:4:54", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestMove/map_transplant.d2,7:6:37-7:18:49", + "key": { + "range": "d2/testdata/d2oracle/TestMove/map_transplant.d2,7:6:37-7:13:44", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/map_transplant.d2,7:6:37-7:13:44", + "value": [ + { + "string": "opacity", + "raw_string": "opacity" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "number": { + "range": "d2/testdata/d2oracle/TestMove/map_transplant.d2,7:15:46-7:18:49", + "raw": "0.4", + "value": "2/5" + } + } + } + } + ] + } + } + } + }, + { + "map_key": { + "range": "d2/testdata/d2oracle/TestMove/map_transplant.d2,10:4:61-10:15:72", + "key": { + "range": "d2/testdata/d2oracle/TestMove/map_transplant.d2,10:4:61-10:9:66", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/map_transplant.d2,10:4:61-10:9:66", + "value": [ + { + "string": "label", + "raw_string": "label" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "double_quoted_string": { + "range": "d2/testdata/d2oracle/TestMove/map_transplant.d2,10:11:68-10:15:72", + "value": [ + { + "string": "yo", + "raw_string": "yo" + } + ] + } + } + } + } + ] + } + } + } + } + ] + } + } + } + } + ] + }, + "root": { + "id": "", + "id_val": "", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + "edges": [], + "objects": [ + { + "id": "b", + "id_val": "b", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/map_transplant.d2,0:0:0-0:1:1", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/map_transplant.d2,0:0:0-0:1:1", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "b" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "c", + "id_val": "c", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/map_transplant.d2,2:0:3-2:1:4", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/map_transplant.d2,2:0:3-2:1:4", + "value": [ + { + "string": "c", + "raw_string": "c" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "c" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "d", + "id_val": "d", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/map_transplant.d2,4:0:6-4:1:7", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/map_transplant.d2,4:0:6-4:1:7", + "value": [ + { + "string": "d", + "raw_string": "d" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "d" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "a", + "id_val": "a", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/map_transplant.d2,5:2:13-5:3:14", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/map_transplant.d2,5:2:13-5:3:14", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "yo" + }, + "style": { + "opacity": { + "value": "0.4" + } + }, + "near_key": null, + "shape": { + "value": "" + } + } + } + ] + }, + "err": "" +} diff --git a/testdata/d2oracle/TestMove/map_with_label.exp.json b/testdata/d2oracle/TestMove/map_with_label.exp.json new file mode 100644 index 000000000..a22ed5ae8 --- /dev/null +++ b/testdata/d2oracle/TestMove/map_with_label.exp.json @@ -0,0 +1,236 @@ +{ + "graph": { + "ast": { + "range": "d2/testdata/d2oracle/TestMove/map_with_label.d2,0:0:0-5:0:20", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestMove/map_with_label.d2,0:0:0-0:1:1", + "key": { + "range": "d2/testdata/d2oracle/TestMove/map_with_label.d2,0:0:0-0:1:1", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/map_with_label.d2,0:0:0-0:1:1", + "value": [ + { + "string": "c", + "raw_string": "c" + } + ] + } + } + ] + }, + "primary": {}, + "value": {} + } + }, + { + "map_key": { + "range": "d2/testdata/d2oracle/TestMove/map_with_label.d2,2:0:3-4:1:19", + "key": { + "range": "d2/testdata/d2oracle/TestMove/map_with_label.d2,2:0:3-2:1:4", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/map_with_label.d2,2:0:3-2:1:4", + "value": [ + { + "string": "d", + "raw_string": "d" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "map": { + "range": "d2/testdata/d2oracle/TestMove/map_with_label.d2,2:3:6-4:0:18", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestMove/map_with_label.d2,3:2:10-3:9:17", + "key": { + "range": "d2/testdata/d2oracle/TestMove/map_with_label.d2,3:2:10-3:3:11", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/map_with_label.d2,3:2:10-3:3:11", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "double_quoted_string": { + "range": "d2/testdata/d2oracle/TestMove/map_with_label.d2,3:5:13-3:9:17", + "value": [ + { + "string": "yo", + "raw_string": "yo" + } + ] + } + } + } + } + ] + } + } + } + } + ] + }, + "root": { + "id": "", + "id_val": "", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + "edges": null, + "objects": [ + { + "id": "c", + "id_val": "c", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/map_with_label.d2,0:0:0-0:1:1", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/map_with_label.d2,0:0:0-0:1:1", + "value": [ + { + "string": "c", + "raw_string": "c" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "c" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "d", + "id_val": "d", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/map_with_label.d2,2:0:3-2:1:4", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/map_with_label.d2,2:0:3-2:1:4", + "value": [ + { + "string": "d", + "raw_string": "d" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "d" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "a", + "id_val": "a", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/map_with_label.d2,3:2:10-3:3:11", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/map_with_label.d2,3:2:10-3:3:11", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "yo" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ] + }, + "err": "" +} diff --git a/testdata/d2oracle/TestMove/merge_nested.exp.json b/testdata/d2oracle/TestMove/merge_nested.exp.json new file mode 100644 index 000000000..85e341082 --- /dev/null +++ b/testdata/d2oracle/TestMove/merge_nested.exp.json @@ -0,0 +1,501 @@ +{ + "graph": { + "ast": { + "range": "d2/testdata/d2oracle/TestMove/merge_nested.d2,0:0:0-8:0:44", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestMove/merge_nested.d2,0:0:0-7:1:43", + "key": { + "range": "d2/testdata/d2oracle/TestMove/merge_nested.d2,0:0:0-0:1:1", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/merge_nested.d2,0:0:0-0:1:1", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "map": { + "range": "d2/testdata/d2oracle/TestMove/merge_nested.d2,0:3:3-7:0:42", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestMove/merge_nested.d2,1:2:7-6:3:41", + "key": { + "range": "d2/testdata/d2oracle/TestMove/merge_nested.d2,1:2:7-1:3:8", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/merge_nested.d2,1:2:7-1:3:8", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "map": { + "range": "d2/testdata/d2oracle/TestMove/merge_nested.d2,1:5:10-6:2:40", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestMove/merge_nested.d2,2:4:16-2:5:17", + "key": { + "range": "d2/testdata/d2oracle/TestMove/merge_nested.d2,2:4:16-2:5:17", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/merge_nested.d2,2:4:16-2:5:17", + "value": [ + { + "string": "c", + "raw_string": "c" + } + ] + } + } + ] + }, + "primary": {}, + "value": {} + } + }, + { + "map_key": { + "range": "d2/testdata/d2oracle/TestMove/merge_nested.d2,3:4:22-3:5:23", + "key": { + "range": "d2/testdata/d2oracle/TestMove/merge_nested.d2,3:4:22-3:5:23", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/merge_nested.d2,3:4:22-3:5:23", + "value": [ + { + "string": "d", + "raw_string": "d" + } + ] + } + } + ] + }, + "primary": {}, + "value": {} + } + }, + { + "map_key": { + "range": "d2/testdata/d2oracle/TestMove/merge_nested.d2,4:4:28-4:7:31", + "key": { + "range": "d2/testdata/d2oracle/TestMove/merge_nested.d2,4:4:28-4:7:31", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/merge_nested.d2,4:4:28-4:5:29", + "value": [ + { + "string": "e", + "raw_string": "e" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/merge_nested.d2,4:6:30-4:7:31", + "value": [ + { + "string": "g", + "raw_string": "g" + } + ] + } + } + ] + }, + "primary": {}, + "value": {} + } + }, + { + "map_key": { + "range": "d2/testdata/d2oracle/TestMove/merge_nested.d2,5:4:36-5:5:37", + "key": { + "range": "d2/testdata/d2oracle/TestMove/merge_nested.d2,5:4:36-5:5:37", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/merge_nested.d2,5:4:36-5:5:37", + "value": [ + { + "string": "k", + "raw_string": "k" + } + ] + } + } + ] + }, + "primary": {}, + "value": {} + } + } + ] + } + } + } + } + ] + } + } + } + } + ] + }, + "root": { + "id": "", + "id_val": "", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + "edges": null, + "objects": [ + { + "id": "a", + "id_val": "a", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/merge_nested.d2,0:0:0-0:1:1", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/merge_nested.d2,0:0:0-0:1:1", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0, + "scope_key": "" + } + ], + "attributes": { + "label": { + "value": "a" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "b", + "id_val": "b", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/merge_nested.d2,1:2:7-1:3:8", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/merge_nested.d2,1:2:7-1:3:8", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0, + "scope_key": "a" + } + ], + "attributes": { + "label": { + "value": "b" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "c", + "id_val": "c", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/merge_nested.d2,2:4:16-2:5:17", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/merge_nested.d2,2:4:16-2:5:17", + "value": [ + { + "string": "c", + "raw_string": "c" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0, + "scope_key": "a.b" + } + ], + "attributes": { + "label": { + "value": "c" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "d", + "id_val": "d", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/merge_nested.d2,3:4:22-3:5:23", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/merge_nested.d2,3:4:22-3:5:23", + "value": [ + { + "string": "d", + "raw_string": "d" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0, + "scope_key": "a.b" + } + ], + "attributes": { + "label": { + "value": "d" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "e", + "id_val": "e", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/merge_nested.d2,4:4:28-4:7:31", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/merge_nested.d2,4:4:28-4:5:29", + "value": [ + { + "string": "e", + "raw_string": "e" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/merge_nested.d2,4:6:30-4:7:31", + "value": [ + { + "string": "g", + "raw_string": "g" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0, + "scope_key": "a.b" + } + ], + "attributes": { + "label": { + "value": "e" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "g", + "id_val": "g", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/merge_nested.d2,4:4:28-4:7:31", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/merge_nested.d2,4:4:28-4:5:29", + "value": [ + { + "string": "e", + "raw_string": "e" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/merge_nested.d2,4:6:30-4:7:31", + "value": [ + { + "string": "g", + "raw_string": "g" + } + ] + } + } + ] + }, + "key_path_index": 1, + "map_key_edge_index": 0, + "scope_key": "a.b" + } + ], + "attributes": { + "label": { + "value": "g" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "k", + "id_val": "k", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/merge_nested.d2,5:4:36-5:5:37", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/merge_nested.d2,5:4:36-5:5:37", + "value": [ + { + "string": "k", + "raw_string": "k" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0, + "scope_key": "a.b" + } + ], + "attributes": { + "label": { + "value": "k" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ] + }, + "err": "" +} diff --git a/testdata/d2oracle/TestMove/merge_nested_flat.exp.json b/testdata/d2oracle/TestMove/merge_nested_flat.exp.json new file mode 100644 index 000000000..f4290d1b5 --- /dev/null +++ b/testdata/d2oracle/TestMove/merge_nested_flat.exp.json @@ -0,0 +1,609 @@ +{ + "graph": { + "ast": { + "range": "d2/testdata/d2oracle/TestMove/merge_nested_flat.d2,0:0:0-8:0:44", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestMove/merge_nested_flat.d2,0:0:0-7:1:43", + "key": { + "range": "d2/testdata/d2oracle/TestMove/merge_nested_flat.d2,0:0:0-0:1:1", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/merge_nested_flat.d2,0:0:0-0:1:1", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "map": { + "range": "d2/testdata/d2oracle/TestMove/merge_nested_flat.d2,0:3:3-7:0:42", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestMove/merge_nested_flat.d2,1:2:7-1:5:10", + "key": { + "range": "d2/testdata/d2oracle/TestMove/merge_nested_flat.d2,1:2:7-1:5:10", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/merge_nested_flat.d2,1:2:7-1:3:8", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/merge_nested_flat.d2,1:4:9-1:5:10", + "value": [ + { + "string": "c", + "raw_string": "c" + } + ] + } + } + ] + }, + "primary": {}, + "value": {} + } + }, + { + "map_key": { + "range": "d2/testdata/d2oracle/TestMove/merge_nested_flat.d2,2:2:13-2:5:16", + "key": { + "range": "d2/testdata/d2oracle/TestMove/merge_nested_flat.d2,2:2:13-2:5:16", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/merge_nested_flat.d2,2:2:13-2:3:14", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/merge_nested_flat.d2,2:4:15-2:5:16", + "value": [ + { + "string": "d", + "raw_string": "d" + } + ] + } + } + ] + }, + "primary": {}, + "value": {} + } + }, + { + "map_key": { + "range": "d2/testdata/d2oracle/TestMove/merge_nested_flat.d2,3:2:19-6:3:41", + "key": { + "range": "d2/testdata/d2oracle/TestMove/merge_nested_flat.d2,3:2:19-3:3:20", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/merge_nested_flat.d2,3:2:19-3:3:20", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "map": { + "range": "d2/testdata/d2oracle/TestMove/merge_nested_flat.d2,3:5:22-6:2:40", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestMove/merge_nested_flat.d2,4:4:28-4:7:31", + "key": { + "range": "d2/testdata/d2oracle/TestMove/merge_nested_flat.d2,4:4:28-4:7:31", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/merge_nested_flat.d2,4:4:28-4:5:29", + "value": [ + { + "string": "e", + "raw_string": "e" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/merge_nested_flat.d2,4:6:30-4:7:31", + "value": [ + { + "string": "g", + "raw_string": "g" + } + ] + } + } + ] + }, + "primary": {}, + "value": {} + } + }, + { + "map_key": { + "range": "d2/testdata/d2oracle/TestMove/merge_nested_flat.d2,5:4:36-5:5:37", + "key": { + "range": "d2/testdata/d2oracle/TestMove/merge_nested_flat.d2,5:4:36-5:5:37", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/merge_nested_flat.d2,5:4:36-5:5:37", + "value": [ + { + "string": "k", + "raw_string": "k" + } + ] + } + } + ] + }, + "primary": {}, + "value": {} + } + } + ] + } + } + } + } + ] + } + } + } + } + ] + }, + "root": { + "id": "", + "id_val": "", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + "edges": null, + "objects": [ + { + "id": "a", + "id_val": "a", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/merge_nested_flat.d2,0:0:0-0:1:1", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/merge_nested_flat.d2,0:0:0-0:1:1", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0, + "scope_key": "" + } + ], + "attributes": { + "label": { + "value": "a" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "b", + "id_val": "b", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/merge_nested_flat.d2,1:2:7-1:5:10", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/merge_nested_flat.d2,1:2:7-1:3:8", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/merge_nested_flat.d2,1:4:9-1:5:10", + "value": [ + { + "string": "c", + "raw_string": "c" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0, + "scope_key": "a" + }, + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/merge_nested_flat.d2,2:2:13-2:5:16", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/merge_nested_flat.d2,2:2:13-2:3:14", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/merge_nested_flat.d2,2:4:15-2:5:16", + "value": [ + { + "string": "d", + "raw_string": "d" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0, + "scope_key": "a" + }, + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/merge_nested_flat.d2,3:2:19-3:3:20", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/merge_nested_flat.d2,3:2:19-3:3:20", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0, + "scope_key": "a" + } + ], + "attributes": { + "label": { + "value": "b" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "c", + "id_val": "c", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/merge_nested_flat.d2,1:2:7-1:5:10", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/merge_nested_flat.d2,1:2:7-1:3:8", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/merge_nested_flat.d2,1:4:9-1:5:10", + "value": [ + { + "string": "c", + "raw_string": "c" + } + ] + } + } + ] + }, + "key_path_index": 1, + "map_key_edge_index": 0, + "scope_key": "a" + } + ], + "attributes": { + "label": { + "value": "c" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "d", + "id_val": "d", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/merge_nested_flat.d2,2:2:13-2:5:16", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/merge_nested_flat.d2,2:2:13-2:3:14", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/merge_nested_flat.d2,2:4:15-2:5:16", + "value": [ + { + "string": "d", + "raw_string": "d" + } + ] + } + } + ] + }, + "key_path_index": 1, + "map_key_edge_index": 0, + "scope_key": "a" + } + ], + "attributes": { + "label": { + "value": "d" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "e", + "id_val": "e", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/merge_nested_flat.d2,4:4:28-4:7:31", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/merge_nested_flat.d2,4:4:28-4:5:29", + "value": [ + { + "string": "e", + "raw_string": "e" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/merge_nested_flat.d2,4:6:30-4:7:31", + "value": [ + { + "string": "g", + "raw_string": "g" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0, + "scope_key": "a.b" + } + ], + "attributes": { + "label": { + "value": "e" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "g", + "id_val": "g", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/merge_nested_flat.d2,4:4:28-4:7:31", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/merge_nested_flat.d2,4:4:28-4:5:29", + "value": [ + { + "string": "e", + "raw_string": "e" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/merge_nested_flat.d2,4:6:30-4:7:31", + "value": [ + { + "string": "g", + "raw_string": "g" + } + ] + } + } + ] + }, + "key_path_index": 1, + "map_key_edge_index": 0, + "scope_key": "a.b" + } + ], + "attributes": { + "label": { + "value": "g" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "k", + "id_val": "k", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/merge_nested_flat.d2,5:4:36-5:5:37", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/merge_nested_flat.d2,5:4:36-5:5:37", + "value": [ + { + "string": "k", + "raw_string": "k" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0, + "scope_key": "a.b" + } + ], + "attributes": { + "label": { + "value": "k" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ] + }, + "err": "" +} diff --git a/testdata/d2oracle/TestMove/merge_nested_maps.exp.json b/testdata/d2oracle/TestMove/merge_nested_maps.exp.json new file mode 100644 index 000000000..685450c85 --- /dev/null +++ b/testdata/d2oracle/TestMove/merge_nested_maps.exp.json @@ -0,0 +1,787 @@ +{ + "graph": { + "ast": { + "range": "d2/testdata/d2oracle/TestMove/merge_nested_maps.d2,0:0:0-11:0:67", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestMove/merge_nested_maps.d2,0:0:0-10:1:66", + "key": { + "range": "d2/testdata/d2oracle/TestMove/merge_nested_maps.d2,0:0:0-0:1:1", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/merge_nested_maps.d2,0:0:0-0:1:1", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "map": { + "range": "d2/testdata/d2oracle/TestMove/merge_nested_maps.d2,0:3:3-10:0:65", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestMove/merge_nested_maps.d2,1:2:7-1:5:10", + "key": { + "range": "d2/testdata/d2oracle/TestMove/merge_nested_maps.d2,1:2:7-1:5:10", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/merge_nested_maps.d2,1:2:7-1:3:8", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/merge_nested_maps.d2,1:4:9-1:5:10", + "value": [ + { + "string": "c", + "raw_string": "c" + } + ] + } + } + ] + }, + "primary": {}, + "value": {} + } + }, + { + "map_key": { + "range": "d2/testdata/d2oracle/TestMove/merge_nested_maps.d2,2:2:13-2:5:16", + "key": { + "range": "d2/testdata/d2oracle/TestMove/merge_nested_maps.d2,2:2:13-2:5:16", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/merge_nested_maps.d2,2:2:13-2:3:14", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/merge_nested_maps.d2,2:4:15-2:5:16", + "value": [ + { + "string": "d", + "raw_string": "d" + } + ] + } + } + ] + }, + "primary": {}, + "value": {} + } + }, + { + "map_key": { + "range": "d2/testdata/d2oracle/TestMove/merge_nested_maps.d2,3:2:19-3:7:24", + "key": { + "range": "d2/testdata/d2oracle/TestMove/merge_nested_maps.d2,3:2:19-3:7:24", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/merge_nested_maps.d2,3:2:19-3:3:20", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/merge_nested_maps.d2,3:4:21-3:5:22", + "value": [ + { + "string": "e", + "raw_string": "e" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/merge_nested_maps.d2,3:6:23-3:7:24", + "value": [ + { + "string": "g", + "raw_string": "g" + } + ] + } + } + ] + }, + "primary": {}, + "value": {} + } + }, + { + "map_key": { + "range": "d2/testdata/d2oracle/TestMove/merge_nested_maps.d2,4:2:27-9:3:64", + "key": { + "range": "d2/testdata/d2oracle/TestMove/merge_nested_maps.d2,4:2:27-4:3:28", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/merge_nested_maps.d2,4:2:27-4:3:28", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "map": { + "range": "d2/testdata/d2oracle/TestMove/merge_nested_maps.d2,4:5:30-9:2:63", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestMove/merge_nested_maps.d2,5:4:36-7:5:54", + "key": { + "range": "d2/testdata/d2oracle/TestMove/merge_nested_maps.d2,5:4:36-5:5:37", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/merge_nested_maps.d2,5:4:36-5:5:37", + "value": [ + { + "string": "d", + "raw_string": "d" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "map": { + "range": "d2/testdata/d2oracle/TestMove/merge_nested_maps.d2,5:7:39-7:4:53", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestMove/merge_nested_maps.d2,6:6:47-6:7:48", + "key": { + "range": "d2/testdata/d2oracle/TestMove/merge_nested_maps.d2,6:6:47-6:7:48", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/merge_nested_maps.d2,6:6:47-6:7:48", + "value": [ + { + "string": "o", + "raw_string": "o" + } + ] + } + } + ] + }, + "primary": {}, + "value": {} + } + } + ] + } + } + } + }, + { + "map_key": { + "range": "d2/testdata/d2oracle/TestMove/merge_nested_maps.d2,8:4:59-8:5:60", + "key": { + "range": "d2/testdata/d2oracle/TestMove/merge_nested_maps.d2,8:4:59-8:5:60", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/merge_nested_maps.d2,8:4:59-8:5:60", + "value": [ + { + "string": "k", + "raw_string": "k" + } + ] + } + } + ] + }, + "primary": {}, + "value": {} + } + } + ] + } + } + } + } + ] + } + } + } + } + ] + }, + "root": { + "id": "", + "id_val": "", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + "edges": null, + "objects": [ + { + "id": "a", + "id_val": "a", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/merge_nested_maps.d2,0:0:0-0:1:1", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/merge_nested_maps.d2,0:0:0-0:1:1", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "a" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "b", + "id_val": "b", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/merge_nested_maps.d2,1:2:7-1:5:10", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/merge_nested_maps.d2,1:2:7-1:3:8", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/merge_nested_maps.d2,1:4:9-1:5:10", + "value": [ + { + "string": "c", + "raw_string": "c" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + }, + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/merge_nested_maps.d2,2:2:13-2:5:16", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/merge_nested_maps.d2,2:2:13-2:3:14", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/merge_nested_maps.d2,2:4:15-2:5:16", + "value": [ + { + "string": "d", + "raw_string": "d" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + }, + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/merge_nested_maps.d2,3:2:19-3:7:24", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/merge_nested_maps.d2,3:2:19-3:3:20", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/merge_nested_maps.d2,3:4:21-3:5:22", + "value": [ + { + "string": "e", + "raw_string": "e" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/merge_nested_maps.d2,3:6:23-3:7:24", + "value": [ + { + "string": "g", + "raw_string": "g" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + }, + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/merge_nested_maps.d2,4:2:27-4:3:28", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/merge_nested_maps.d2,4:2:27-4:3:28", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "b" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "c", + "id_val": "c", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/merge_nested_maps.d2,1:2:7-1:5:10", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/merge_nested_maps.d2,1:2:7-1:3:8", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/merge_nested_maps.d2,1:4:9-1:5:10", + "value": [ + { + "string": "c", + "raw_string": "c" + } + ] + } + } + ] + }, + "key_path_index": 1, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "c" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "d", + "id_val": "d", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/merge_nested_maps.d2,2:2:13-2:5:16", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/merge_nested_maps.d2,2:2:13-2:3:14", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/merge_nested_maps.d2,2:4:15-2:5:16", + "value": [ + { + "string": "d", + "raw_string": "d" + } + ] + } + } + ] + }, + "key_path_index": 1, + "map_key_edge_index": 0 + }, + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/merge_nested_maps.d2,5:4:36-5:5:37", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/merge_nested_maps.d2,5:4:36-5:5:37", + "value": [ + { + "string": "d", + "raw_string": "d" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "d" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "e", + "id_val": "e", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/merge_nested_maps.d2,3:2:19-3:7:24", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/merge_nested_maps.d2,3:2:19-3:3:20", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/merge_nested_maps.d2,3:4:21-3:5:22", + "value": [ + { + "string": "e", + "raw_string": "e" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/merge_nested_maps.d2,3:6:23-3:7:24", + "value": [ + { + "string": "g", + "raw_string": "g" + } + ] + } + } + ] + }, + "key_path_index": 1, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "e" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "g", + "id_val": "g", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/merge_nested_maps.d2,3:2:19-3:7:24", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/merge_nested_maps.d2,3:2:19-3:3:20", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/merge_nested_maps.d2,3:4:21-3:5:22", + "value": [ + { + "string": "e", + "raw_string": "e" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/merge_nested_maps.d2,3:6:23-3:7:24", + "value": [ + { + "string": "g", + "raw_string": "g" + } + ] + } + } + ] + }, + "key_path_index": 2, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "g" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "o", + "id_val": "o", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/merge_nested_maps.d2,6:6:47-6:7:48", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/merge_nested_maps.d2,6:6:47-6:7:48", + "value": [ + { + "string": "o", + "raw_string": "o" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "o" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "k", + "id_val": "k", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/merge_nested_maps.d2,8:4:59-8:5:60", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/merge_nested_maps.d2,8:4:59-8:5:60", + "value": [ + { + "string": "k", + "raw_string": "k" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "k" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ] + }, + "err": "" +} diff --git a/testdata/d2oracle/TestMove/merge_reserved.exp.json b/testdata/d2oracle/TestMove/merge_reserved.exp.json new file mode 100644 index 000000000..48a0ec88b --- /dev/null +++ b/testdata/d2oracle/TestMove/merge_reserved.exp.json @@ -0,0 +1,634 @@ +{ + "graph": { + "ast": { + "range": "d2/testdata/d2oracle/TestMove/merge_reserved.d2,0:0:0-9:0:70", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestMove/merge_reserved.d2,0:0:0-8:1:69", + "key": { + "range": "d2/testdata/d2oracle/TestMove/merge_reserved.d2,0:0:0-0:1:1", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/merge_reserved.d2,0:0:0-0:1:1", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "map": { + "range": "d2/testdata/d2oracle/TestMove/merge_reserved.d2,0:3:3-8:0:68", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestMove/merge_reserved.d2,1:2:7-1:5:10", + "key": { + "range": "d2/testdata/d2oracle/TestMove/merge_reserved.d2,1:2:7-1:5:10", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/merge_reserved.d2,1:2:7-1:3:8", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/merge_reserved.d2,1:4:9-1:5:10", + "value": [ + { + "string": "c", + "raw_string": "c" + } + ] + } + } + ] + }, + "primary": {}, + "value": {} + } + }, + { + "map_key": { + "range": "d2/testdata/d2oracle/TestMove/merge_reserved.d2,2:2:13-2:15:26", + "key": { + "range": "d2/testdata/d2oracle/TestMove/merge_reserved.d2,2:2:13-2:9:20", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/merge_reserved.d2,2:2:13-2:3:14", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/merge_reserved.d2,2:4:15-2:9:20", + "value": [ + { + "string": "label", + "raw_string": "label" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "double_quoted_string": { + "range": "d2/testdata/d2oracle/TestMove/merge_reserved.d2,2:11:22-2:15:26", + "value": [ + { + "string": "yo", + "raw_string": "yo" + } + ] + } + } + } + }, + { + "map_key": { + "range": "d2/testdata/d2oracle/TestMove/merge_reserved.d2,3:2:29-3:15:42", + "key": { + "range": "d2/testdata/d2oracle/TestMove/merge_reserved.d2,3:2:29-3:9:36", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/merge_reserved.d2,3:2:29-3:3:30", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/merge_reserved.d2,3:4:31-3:9:36", + "value": [ + { + "string": "label", + "raw_string": "label" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "double_quoted_string": { + "range": "d2/testdata/d2oracle/TestMove/merge_reserved.d2,3:11:38-3:15:42", + "value": [ + { + "string": "hi", + "raw_string": "hi" + } + ] + } + } + } + }, + { + "map_key": { + "range": "d2/testdata/d2oracle/TestMove/merge_reserved.d2,4:2:45-7:3:67", + "key": { + "range": "d2/testdata/d2oracle/TestMove/merge_reserved.d2,4:2:45-4:3:46", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/merge_reserved.d2,4:2:45-4:3:46", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "map": { + "range": "d2/testdata/d2oracle/TestMove/merge_reserved.d2,4:5:48-7:2:66", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestMove/merge_reserved.d2,5:4:54-5:7:57", + "key": { + "range": "d2/testdata/d2oracle/TestMove/merge_reserved.d2,5:4:54-5:7:57", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/merge_reserved.d2,5:4:54-5:5:55", + "value": [ + { + "string": "e", + "raw_string": "e" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/merge_reserved.d2,5:6:56-5:7:57", + "value": [ + { + "string": "g", + "raw_string": "g" + } + ] + } + } + ] + }, + "primary": {}, + "value": {} + } + }, + { + "map_key": { + "range": "d2/testdata/d2oracle/TestMove/merge_reserved.d2,6:4:62-6:5:63", + "key": { + "range": "d2/testdata/d2oracle/TestMove/merge_reserved.d2,6:4:62-6:5:63", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/merge_reserved.d2,6:4:62-6:5:63", + "value": [ + { + "string": "k", + "raw_string": "k" + } + ] + } + } + ] + }, + "primary": {}, + "value": {} + } + } + ] + } + } + } + } + ] + } + } + } + } + ] + }, + "root": { + "id": "", + "id_val": "", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + "edges": null, + "objects": [ + { + "id": "a", + "id_val": "a", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/merge_reserved.d2,0:0:0-0:1:1", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/merge_reserved.d2,0:0:0-0:1:1", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "a" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "b", + "id_val": "b", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/merge_reserved.d2,1:2:7-1:5:10", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/merge_reserved.d2,1:2:7-1:3:8", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/merge_reserved.d2,1:4:9-1:5:10", + "value": [ + { + "string": "c", + "raw_string": "c" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + }, + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/merge_reserved.d2,2:2:13-2:9:20", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/merge_reserved.d2,2:2:13-2:3:14", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/merge_reserved.d2,2:4:15-2:9:20", + "value": [ + { + "string": "label", + "raw_string": "label" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + }, + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/merge_reserved.d2,3:2:29-3:9:36", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/merge_reserved.d2,3:2:29-3:3:30", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/merge_reserved.d2,3:4:31-3:9:36", + "value": [ + { + "string": "label", + "raw_string": "label" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + }, + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/merge_reserved.d2,4:2:45-4:3:46", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/merge_reserved.d2,4:2:45-4:3:46", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "hi" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "c", + "id_val": "c", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/merge_reserved.d2,1:2:7-1:5:10", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/merge_reserved.d2,1:2:7-1:3:8", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/merge_reserved.d2,1:4:9-1:5:10", + "value": [ + { + "string": "c", + "raw_string": "c" + } + ] + } + } + ] + }, + "key_path_index": 1, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "c" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "e", + "id_val": "e", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/merge_reserved.d2,5:4:54-5:7:57", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/merge_reserved.d2,5:4:54-5:5:55", + "value": [ + { + "string": "e", + "raw_string": "e" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/merge_reserved.d2,5:6:56-5:7:57", + "value": [ + { + "string": "g", + "raw_string": "g" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "e" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "g", + "id_val": "g", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/merge_reserved.d2,5:4:54-5:7:57", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/merge_reserved.d2,5:4:54-5:5:55", + "value": [ + { + "string": "e", + "raw_string": "e" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/merge_reserved.d2,5:6:56-5:7:57", + "value": [ + { + "string": "g", + "raw_string": "g" + } + ] + } + } + ] + }, + "key_path_index": 1, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "g" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "k", + "id_val": "k", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/merge_reserved.d2,6:4:62-6:5:63", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/merge_reserved.d2,6:4:62-6:5:63", + "value": [ + { + "string": "k", + "raw_string": "k" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "k" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ] + }, + "err": "" +} diff --git a/testdata/d2oracle/TestMove/middle_container.exp.json b/testdata/d2oracle/TestMove/middle_container.exp.json new file mode 100644 index 000000000..b8e777ebb --- /dev/null +++ b/testdata/d2oracle/TestMove/middle_container.exp.json @@ -0,0 +1,226 @@ +{ + "graph": { + "ast": { + "range": "d2/testdata/d2oracle/TestMove/middle_container.d2,0:0:0-4:0:13", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestMove/middle_container.d2,0:0:0-2:1:10", + "key": { + "range": "d2/testdata/d2oracle/TestMove/middle_container.d2,0:0:0-0:1:1", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/middle_container.d2,0:0:0-0:1:1", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "map": { + "range": "d2/testdata/d2oracle/TestMove/middle_container.d2,0:3:3-2:0:9", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestMove/middle_container.d2,1:2:7-1:3:8", + "key": { + "range": "d2/testdata/d2oracle/TestMove/middle_container.d2,1:2:7-1:3:8", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/middle_container.d2,1:2:7-1:3:8", + "value": [ + { + "string": "z", + "raw_string": "z" + } + ] + } + } + ] + }, + "primary": {}, + "value": {} + } + } + ] + } + } + } + }, + { + "map_key": { + "range": "d2/testdata/d2oracle/TestMove/middle_container.d2,3:0:11-3:1:12", + "key": { + "range": "d2/testdata/d2oracle/TestMove/middle_container.d2,3:0:11-3:1:12", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/middle_container.d2,3:0:11-3:1:12", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + } + ] + }, + "primary": {}, + "value": {} + } + } + ] + }, + "root": { + "id": "", + "id_val": "", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + "edges": null, + "objects": [ + { + "id": "x", + "id_val": "x", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/middle_container.d2,0:0:0-0:1:1", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/middle_container.d2,0:0:0-0:1:1", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "x" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "z", + "id_val": "z", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/middle_container.d2,1:2:7-1:3:8", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/middle_container.d2,1:2:7-1:3:8", + "value": [ + { + "string": "z", + "raw_string": "z" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "z" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "y", + "id_val": "y", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/middle_container.d2,3:0:11-3:1:12", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/middle_container.d2,3:0:11-3:1:12", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "y" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ] + }, + "err": "" +} diff --git a/testdata/d2oracle/TestMove/move_container_children.exp.json b/testdata/d2oracle/TestMove/move_container_children.exp.json new file mode 100644 index 000000000..a49451eb6 --- /dev/null +++ b/testdata/d2oracle/TestMove/move_container_children.exp.json @@ -0,0 +1,352 @@ +{ + "graph": { + "ast": { + "range": "d2/testdata/d2oracle/TestMove/move_container_children.d2,0:0:0-7:0:18", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestMove/move_container_children.d2,0:0:0-0:1:1", + "key": { + "range": "d2/testdata/d2oracle/TestMove/move_container_children.d2,0:0:0-0:1:1", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/move_container_children.d2,0:0:0-0:1:1", + "value": [ + { + "string": "p", + "raw_string": "p" + } + ] + } + } + ] + }, + "primary": {}, + "value": {} + } + }, + { + "map_key": { + "range": "d2/testdata/d2oracle/TestMove/move_container_children.d2,1:0:2-1:1:3", + "key": { + "range": "d2/testdata/d2oracle/TestMove/move_container_children.d2,1:0:2-1:1:3", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/move_container_children.d2,1:0:2-1:1:3", + "value": [ + { + "string": "q", + "raw_string": "q" + } + ] + } + } + ] + }, + "primary": {}, + "value": {} + } + }, + { + "map_key": { + "range": "d2/testdata/d2oracle/TestMove/move_container_children.d2,3:0:5-3:1:6", + "key": { + "range": "d2/testdata/d2oracle/TestMove/move_container_children.d2,3:0:5-3:1:6", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/move_container_children.d2,3:0:5-3:1:6", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + } + ] + }, + "primary": {}, + "value": {} + } + }, + { + "map_key": { + "range": "d2/testdata/d2oracle/TestMove/move_container_children.d2,4:0:7-6:1:17", + "key": { + "range": "d2/testdata/d2oracle/TestMove/move_container_children.d2,4:0:7-4:1:8", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/move_container_children.d2,4:0:7-4:1:8", + "value": [ + { + "string": "d", + "raw_string": "d" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "map": { + "range": "d2/testdata/d2oracle/TestMove/move_container_children.d2,4:3:10-6:0:16", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestMove/move_container_children.d2,5:2:14-5:3:15", + "key": { + "range": "d2/testdata/d2oracle/TestMove/move_container_children.d2,5:2:14-5:3:15", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/move_container_children.d2,5:2:14-5:3:15", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + } + ] + }, + "primary": {}, + "value": {} + } + } + ] + } + } + } + } + ] + }, + "root": { + "id": "", + "id_val": "", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + "edges": null, + "objects": [ + { + "id": "p", + "id_val": "p", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/move_container_children.d2,0:0:0-0:1:1", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/move_container_children.d2,0:0:0-0:1:1", + "value": [ + { + "string": "p", + "raw_string": "p" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "p" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "q", + "id_val": "q", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/move_container_children.d2,1:0:2-1:1:3", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/move_container_children.d2,1:0:2-1:1:3", + "value": [ + { + "string": "q", + "raw_string": "q" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "q" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "a", + "id_val": "a", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/move_container_children.d2,3:0:5-3:1:6", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/move_container_children.d2,3:0:5-3:1:6", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "a" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "d", + "id_val": "d", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/move_container_children.d2,4:0:7-4:1:8", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/move_container_children.d2,4:0:7-4:1:8", + "value": [ + { + "string": "d", + "raw_string": "d" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "d" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "b", + "id_val": "b", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/move_container_children.d2,5:2:14-5:3:15", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/move_container_children.d2,5:2:14-5:3:15", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "b" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ] + }, + "err": "" +} diff --git a/testdata/d2oracle/TestMove/move_container_conflict_children.exp.json b/testdata/d2oracle/TestMove/move_container_conflict_children.exp.json new file mode 100644 index 000000000..c1256f42d --- /dev/null +++ b/testdata/d2oracle/TestMove/move_container_conflict_children.exp.json @@ -0,0 +1,352 @@ +{ + "graph": { + "ast": { + "range": "d2/testdata/d2oracle/TestMove/move_container_conflict_children.d2,0:0:0-7:0:20", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestMove/move_container_conflict_children.d2,0:0:0-0:3:3", + "key": { + "range": "d2/testdata/d2oracle/TestMove/move_container_conflict_children.d2,0:0:0-0:3:3", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/move_container_conflict_children.d2,0:0:0-0:3:3", + "value": [ + { + "string": "a 2", + "raw_string": "a 2" + } + ] + } + } + ] + }, + "primary": {}, + "value": {} + } + }, + { + "map_key": { + "range": "d2/testdata/d2oracle/TestMove/move_container_conflict_children.d2,1:0:4-1:1:5", + "key": { + "range": "d2/testdata/d2oracle/TestMove/move_container_conflict_children.d2,1:0:4-1:1:5", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/move_container_conflict_children.d2,1:0:4-1:1:5", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + } + ] + }, + "primary": {}, + "value": {} + } + }, + { + "map_key": { + "range": "d2/testdata/d2oracle/TestMove/move_container_conflict_children.d2,3:0:7-3:1:8", + "key": { + "range": "d2/testdata/d2oracle/TestMove/move_container_conflict_children.d2,3:0:7-3:1:8", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/move_container_conflict_children.d2,3:0:7-3:1:8", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + } + ] + }, + "primary": {}, + "value": {} + } + }, + { + "map_key": { + "range": "d2/testdata/d2oracle/TestMove/move_container_conflict_children.d2,4:0:9-6:1:19", + "key": { + "range": "d2/testdata/d2oracle/TestMove/move_container_conflict_children.d2,4:0:9-4:1:10", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/move_container_conflict_children.d2,4:0:9-4:1:10", + "value": [ + { + "string": "d", + "raw_string": "d" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "map": { + "range": "d2/testdata/d2oracle/TestMove/move_container_conflict_children.d2,4:3:12-6:0:18", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestMove/move_container_conflict_children.d2,5:2:16-5:3:17", + "key": { + "range": "d2/testdata/d2oracle/TestMove/move_container_conflict_children.d2,5:2:16-5:3:17", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/move_container_conflict_children.d2,5:2:16-5:3:17", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "primary": {}, + "value": {} + } + } + ] + } + } + } + } + ] + }, + "root": { + "id": "", + "id_val": "", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + "edges": null, + "objects": [ + { + "id": "a 2", + "id_val": "a 2", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/move_container_conflict_children.d2,0:0:0-0:3:3", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/move_container_conflict_children.d2,0:0:0-0:3:3", + "value": [ + { + "string": "a 2", + "raw_string": "a 2" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "a 2" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "b", + "id_val": "b", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/move_container_conflict_children.d2,1:0:4-1:1:5", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/move_container_conflict_children.d2,1:0:4-1:1:5", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "b" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "a", + "id_val": "a", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/move_container_conflict_children.d2,3:0:7-3:1:8", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/move_container_conflict_children.d2,3:0:7-3:1:8", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "a" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "d", + "id_val": "d", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/move_container_conflict_children.d2,4:0:9-4:1:10", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/move_container_conflict_children.d2,4:0:9-4:1:10", + "value": [ + { + "string": "d", + "raw_string": "d" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "d" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "x", + "id_val": "x", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/move_container_conflict_children.d2,5:2:16-5:3:17", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/move_container_conflict_children.d2,5:2:16-5:3:17", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "x" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ] + }, + "err": "" +} diff --git a/testdata/d2oracle/TestMove/move_into_key_with_value.exp.json b/testdata/d2oracle/TestMove/move_into_key_with_value.exp.json new file mode 100644 index 000000000..4335978ce --- /dev/null +++ b/testdata/d2oracle/TestMove/move_into_key_with_value.exp.json @@ -0,0 +1,173 @@ +{ + "graph": { + "ast": { + "range": "d2/testdata/d2oracle/TestMove/move_into_key_with_value.d2,0:0:0-3:0:16", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestMove/move_into_key_with_value.d2,0:0:0-2:1:15", + "key": { + "range": "d2/testdata/d2oracle/TestMove/move_into_key_with_value.d2,0:0:0-0:1:1", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/move_into_key_with_value.d2,0:0:0-0:1:1", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + } + ] + }, + "primary": { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/move_into_key_with_value.d2,0:3:3-0:7:7", + "value": [ + { + "string": "meow", + "raw_string": "meow" + } + ] + } + }, + "value": { + "map": { + "range": "d2/testdata/d2oracle/TestMove/move_into_key_with_value.d2,0:8:8-2:0:14", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestMove/move_into_key_with_value.d2,1:2:12-1:3:13", + "key": { + "range": "d2/testdata/d2oracle/TestMove/move_into_key_with_value.d2,1:2:12-1:3:13", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/move_into_key_with_value.d2,1:2:12-1:3:13", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + } + ] + }, + "primary": {}, + "value": {} + } + } + ] + } + } + } + } + ] + }, + "root": { + "id": "", + "id_val": "", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + "edges": null, + "objects": [ + { + "id": "a", + "id_val": "a", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/move_into_key_with_value.d2,0:0:0-0:1:1", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/move_into_key_with_value.d2,0:0:0-0:1:1", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "meow" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "b", + "id_val": "b", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/move_into_key_with_value.d2,1:2:12-1:3:13", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/move_into_key_with_value.d2,1:2:12-1:3:13", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "b" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ] + }, + "err": "" +} diff --git a/testdata/d2oracle/TestMove/move_out_of_edge.exp.json b/testdata/d2oracle/TestMove/move_out_of_edge.exp.json new file mode 100644 index 000000000..a74d2c5cd --- /dev/null +++ b/testdata/d2oracle/TestMove/move_out_of_edge.exp.json @@ -0,0 +1,489 @@ +{ + "graph": { + "ast": { + "range": "d2/testdata/d2oracle/TestMove/move_out_of_edge.d2,0:0:0-2:0:15", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestMove/move_out_of_edge.d2,0:0:0-0:12:12", + "edges": [ + { + "range": "d2/testdata/d2oracle/TestMove/move_out_of_edge.d2,0:0:0-0:12:12", + "src": { + "range": "d2/testdata/d2oracle/TestMove/move_out_of_edge.d2,0:0:0-0:4:4", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/move_out_of_edge.d2,0:0:0-0:1:1", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/move_out_of_edge.d2,0:2:2-0:3:3", + "value": [ + { + "string": "c", + "raw_string": "c" + } + ] + } + } + ] + }, + "src_arrow": "", + "dst": { + "range": "d2/testdata/d2oracle/TestMove/move_out_of_edge.d2,0:6:6-0:12:12", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/move_out_of_edge.d2,0:7:7-0:8:8", + "value": [ + { + "string": "d", + "raw_string": "d" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/move_out_of_edge.d2,0:9:9-0:10:10", + "value": [ + { + "string": "e", + "raw_string": "e" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/move_out_of_edge.d2,0:11:11-0:12:12", + "value": [ + { + "string": "f", + "raw_string": "f" + } + ] + } + } + ] + }, + "dst_arrow": ">" + } + ], + "primary": {}, + "value": {} + } + }, + { + "map_key": { + "range": "d2/testdata/d2oracle/TestMove/move_out_of_edge.d2,1:0:13-1:1:14", + "key": { + "range": "d2/testdata/d2oracle/TestMove/move_out_of_edge.d2,1:0:13-1:1:14", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/move_out_of_edge.d2,1:0:13-1:1:14", + "value": [ + { + "string": "q", + "raw_string": "q" + } + ] + } + } + ] + }, + "primary": {}, + "value": {} + } + } + ] + }, + "root": { + "id": "", + "id_val": "", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + "edges": [ + { + "index": 0, + "minWidth": 0, + "minHeight": 0, + "label_dimensions": { + "width": 0, + "height": 0 + }, + "isCurve": false, + "src_arrow": false, + "dst_arrow": true, + "references": [ + { + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ], + "objects": [ + { + "id": "q", + "id_val": "q", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/move_out_of_edge.d2,1:0:13-1:1:14", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/move_out_of_edge.d2,1:0:13-1:1:14", + "value": [ + { + "string": "q", + "raw_string": "q" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "q" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "a", + "id_val": "a", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/move_out_of_edge.d2,0:0:0-0:4:4", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/move_out_of_edge.d2,0:0:0-0:1:1", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/move_out_of_edge.d2,0:2:2-0:3:3", + "value": [ + { + "string": "c", + "raw_string": "c" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "a" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "c", + "id_val": "c", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/move_out_of_edge.d2,0:0:0-0:4:4", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/move_out_of_edge.d2,0:0:0-0:1:1", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/move_out_of_edge.d2,0:2:2-0:3:3", + "value": [ + { + "string": "c", + "raw_string": "c" + } + ] + } + } + ] + }, + "key_path_index": 1, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "c" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "d", + "id_val": "d", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/move_out_of_edge.d2,0:6:6-0:12:12", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/move_out_of_edge.d2,0:7:7-0:8:8", + "value": [ + { + "string": "d", + "raw_string": "d" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/move_out_of_edge.d2,0:9:9-0:10:10", + "value": [ + { + "string": "e", + "raw_string": "e" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/move_out_of_edge.d2,0:11:11-0:12:12", + "value": [ + { + "string": "f", + "raw_string": "f" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "d" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "e", + "id_val": "e", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/move_out_of_edge.d2,0:6:6-0:12:12", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/move_out_of_edge.d2,0:7:7-0:8:8", + "value": [ + { + "string": "d", + "raw_string": "d" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/move_out_of_edge.d2,0:9:9-0:10:10", + "value": [ + { + "string": "e", + "raw_string": "e" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/move_out_of_edge.d2,0:11:11-0:12:12", + "value": [ + { + "string": "f", + "raw_string": "f" + } + ] + } + } + ] + }, + "key_path_index": 1, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "e" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "f", + "id_val": "f", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/move_out_of_edge.d2,0:6:6-0:12:12", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/move_out_of_edge.d2,0:7:7-0:8:8", + "value": [ + { + "string": "d", + "raw_string": "d" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/move_out_of_edge.d2,0:9:9-0:10:10", + "value": [ + { + "string": "e", + "raw_string": "e" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/move_out_of_edge.d2,0:11:11-0:12:12", + "value": [ + { + "string": "f", + "raw_string": "f" + } + ] + } + } + ] + }, + "key_path_index": 2, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "f" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ] + }, + "err": "" +} diff --git a/testdata/d2oracle/TestMove/move_out_of_nested_edge.exp.json b/testdata/d2oracle/TestMove/move_out_of_nested_edge.exp.json new file mode 100644 index 000000000..593084ee0 --- /dev/null +++ b/testdata/d2oracle/TestMove/move_out_of_nested_edge.exp.json @@ -0,0 +1,591 @@ +{ + "graph": { + "ast": { + "range": "d2/testdata/d2oracle/TestMove/move_out_of_nested_edge.d2,0:0:0-4:0:26", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestMove/move_out_of_nested_edge.d2,0:0:0-0:12:12", + "edges": [ + { + "range": "d2/testdata/d2oracle/TestMove/move_out_of_nested_edge.d2,0:0:0-0:12:12", + "src": { + "range": "d2/testdata/d2oracle/TestMove/move_out_of_nested_edge.d2,0:0:0-0:4:4", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/move_out_of_nested_edge.d2,0:0:0-0:1:1", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/move_out_of_nested_edge.d2,0:2:2-0:3:3", + "value": [ + { + "string": "c", + "raw_string": "c" + } + ] + } + } + ] + }, + "src_arrow": "", + "dst": { + "range": "d2/testdata/d2oracle/TestMove/move_out_of_nested_edge.d2,0:6:6-0:12:12", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/move_out_of_nested_edge.d2,0:7:7-0:8:8", + "value": [ + { + "string": "d", + "raw_string": "d" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/move_out_of_nested_edge.d2,0:9:9-0:10:10", + "value": [ + { + "string": "e", + "raw_string": "e" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/move_out_of_nested_edge.d2,0:11:11-0:12:12", + "value": [ + { + "string": "f", + "raw_string": "f" + } + ] + } + } + ] + }, + "dst_arrow": ">" + } + ], + "primary": {}, + "value": {} + } + }, + { + "map_key": { + "range": "d2/testdata/d2oracle/TestMove/move_out_of_nested_edge.d2,1:0:13-3:1:25", + "key": { + "range": "d2/testdata/d2oracle/TestMove/move_out_of_nested_edge.d2,1:0:13-1:3:16", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/move_out_of_nested_edge.d2,1:0:13-1:1:14", + "value": [ + { + "string": "d", + "raw_string": "d" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/move_out_of_nested_edge.d2,1:2:15-1:3:16", + "value": [ + { + "string": "e", + "raw_string": "e" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "map": { + "range": "d2/testdata/d2oracle/TestMove/move_out_of_nested_edge.d2,1:5:18-3:0:24", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestMove/move_out_of_nested_edge.d2,2:2:22-2:3:23", + "key": { + "range": "d2/testdata/d2oracle/TestMove/move_out_of_nested_edge.d2,2:2:22-2:3:23", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/move_out_of_nested_edge.d2,2:2:22-2:3:23", + "value": [ + { + "string": "q", + "raw_string": "q" + } + ] + } + } + ] + }, + "primary": {}, + "value": {} + } + } + ] + } + } + } + } + ] + }, + "root": { + "id": "", + "id_val": "", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + "edges": [ + { + "index": 0, + "minWidth": 0, + "minHeight": 0, + "label_dimensions": { + "width": 0, + "height": 0 + }, + "isCurve": false, + "src_arrow": false, + "dst_arrow": true, + "references": [ + { + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ], + "objects": [ + { + "id": "d", + "id_val": "d", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/move_out_of_nested_edge.d2,1:0:13-1:3:16", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/move_out_of_nested_edge.d2,1:0:13-1:1:14", + "value": [ + { + "string": "d", + "raw_string": "d" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/move_out_of_nested_edge.d2,1:2:15-1:3:16", + "value": [ + { + "string": "e", + "raw_string": "e" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + }, + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/move_out_of_nested_edge.d2,0:6:6-0:12:12", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/move_out_of_nested_edge.d2,0:7:7-0:8:8", + "value": [ + { + "string": "d", + "raw_string": "d" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/move_out_of_nested_edge.d2,0:9:9-0:10:10", + "value": [ + { + "string": "e", + "raw_string": "e" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/move_out_of_nested_edge.d2,0:11:11-0:12:12", + "value": [ + { + "string": "f", + "raw_string": "f" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "d" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "e", + "id_val": "e", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/move_out_of_nested_edge.d2,1:0:13-1:3:16", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/move_out_of_nested_edge.d2,1:0:13-1:1:14", + "value": [ + { + "string": "d", + "raw_string": "d" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/move_out_of_nested_edge.d2,1:2:15-1:3:16", + "value": [ + { + "string": "e", + "raw_string": "e" + } + ] + } + } + ] + }, + "key_path_index": 1, + "map_key_edge_index": 0 + }, + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/move_out_of_nested_edge.d2,0:6:6-0:12:12", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/move_out_of_nested_edge.d2,0:7:7-0:8:8", + "value": [ + { + "string": "d", + "raw_string": "d" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/move_out_of_nested_edge.d2,0:9:9-0:10:10", + "value": [ + { + "string": "e", + "raw_string": "e" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/move_out_of_nested_edge.d2,0:11:11-0:12:12", + "value": [ + { + "string": "f", + "raw_string": "f" + } + ] + } + } + ] + }, + "key_path_index": 1, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "e" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "q", + "id_val": "q", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/move_out_of_nested_edge.d2,2:2:22-2:3:23", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/move_out_of_nested_edge.d2,2:2:22-2:3:23", + "value": [ + { + "string": "q", + "raw_string": "q" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "q" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "a", + "id_val": "a", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/move_out_of_nested_edge.d2,0:0:0-0:4:4", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/move_out_of_nested_edge.d2,0:0:0-0:1:1", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/move_out_of_nested_edge.d2,0:2:2-0:3:3", + "value": [ + { + "string": "c", + "raw_string": "c" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "a" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "c", + "id_val": "c", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/move_out_of_nested_edge.d2,0:0:0-0:4:4", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/move_out_of_nested_edge.d2,0:0:0-0:1:1", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/move_out_of_nested_edge.d2,0:2:2-0:3:3", + "value": [ + { + "string": "c", + "raw_string": "c" + } + ] + } + } + ] + }, + "key_path_index": 1, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "c" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "f", + "id_val": "f", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/move_out_of_nested_edge.d2,0:6:6-0:12:12", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/move_out_of_nested_edge.d2,0:7:7-0:8:8", + "value": [ + { + "string": "d", + "raw_string": "d" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/move_out_of_nested_edge.d2,0:9:9-0:10:10", + "value": [ + { + "string": "e", + "raw_string": "e" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/move_out_of_nested_edge.d2,0:11:11-0:12:12", + "value": [ + { + "string": "f", + "raw_string": "f" + } + ] + } + } + ] + }, + "key_path_index": 2, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "f" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ] + }, + "err": "" +} diff --git a/testdata/d2oracle/TestMove/multiple_nesting_levels.exp.json b/testdata/d2oracle/TestMove/multiple_nesting_levels.exp.json new file mode 100644 index 000000000..81c5607c5 --- /dev/null +++ b/testdata/d2oracle/TestMove/multiple_nesting_levels.exp.json @@ -0,0 +1,886 @@ +{ + "graph": { + "ast": { + "range": "d2/testdata/d2oracle/TestMove/multiple_nesting_levels.d2,0:0:0-11:0:71", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestMove/multiple_nesting_levels.d2,0:0:0-9:1:62", + "key": { + "range": "d2/testdata/d2oracle/TestMove/multiple_nesting_levels.d2,0:0:0-0:1:1", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/multiple_nesting_levels.d2,0:0:0-0:1:1", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "map": { + "range": "d2/testdata/d2oracle/TestMove/multiple_nesting_levels.d2,0:3:3-9:0:61", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestMove/multiple_nesting_levels.d2,1:2:7-7:3:52", + "key": { + "range": "d2/testdata/d2oracle/TestMove/multiple_nesting_levels.d2,1:2:7-1:3:8", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/multiple_nesting_levels.d2,1:2:7-1:3:8", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "map": { + "range": "d2/testdata/d2oracle/TestMove/multiple_nesting_levels.d2,1:5:10-7:2:51", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestMove/multiple_nesting_levels.d2,2:4:16-2:5:17", + "key": { + "range": "d2/testdata/d2oracle/TestMove/multiple_nesting_levels.d2,2:4:16-2:5:17", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/multiple_nesting_levels.d2,2:4:16-2:5:17", + "value": [ + { + "string": "c", + "raw_string": "c" + } + ] + } + } + ] + }, + "primary": {}, + "value": {} + } + }, + { + "map_key": { + "range": "d2/testdata/d2oracle/TestMove/multiple_nesting_levels.d2,3:4:22-6:5:48", + "key": { + "range": "d2/testdata/d2oracle/TestMove/multiple_nesting_levels.d2,3:4:22-3:5:23", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/multiple_nesting_levels.d2,3:4:22-3:5:23", + "value": [ + { + "string": "c", + "raw_string": "c" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "map": { + "range": "d2/testdata/d2oracle/TestMove/multiple_nesting_levels.d2,3:7:25-6:4:47", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestMove/multiple_nesting_levels.d2,4:6:33-4:7:34", + "key": { + "range": "d2/testdata/d2oracle/TestMove/multiple_nesting_levels.d2,4:6:33-4:7:34", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/multiple_nesting_levels.d2,4:6:33-4:7:34", + "value": [ + { + "string": "g", + "raw_string": "g" + } + ] + } + } + ] + }, + "primary": {}, + "value": {} + } + }, + { + "map_key": { + "range": "d2/testdata/d2oracle/TestMove/multiple_nesting_levels.d2,5:6:41-5:7:42", + "key": { + "range": "d2/testdata/d2oracle/TestMove/multiple_nesting_levels.d2,5:6:41-5:7:42", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/multiple_nesting_levels.d2,5:6:41-5:7:42", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "primary": {}, + "value": {} + } + } + ] + } + } + } + } + ] + } + } + } + }, + { + "map_key": { + "range": "d2/testdata/d2oracle/TestMove/multiple_nesting_levels.d2,8:2:55-8:7:60", + "key": { + "range": "d2/testdata/d2oracle/TestMove/multiple_nesting_levels.d2,8:2:55-8:7:60", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/multiple_nesting_levels.d2,8:2:55-8:3:56", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/multiple_nesting_levels.d2,8:4:57-8:5:58", + "value": [ + { + "string": "c", + "raw_string": "c" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/multiple_nesting_levels.d2,8:6:59-8:7:60", + "value": [ + { + "string": "d", + "raw_string": "d" + } + ] + } + } + ] + }, + "primary": {}, + "value": {} + } + } + ] + } + } + } + }, + { + "map_key": { + "range": "d2/testdata/d2oracle/TestMove/multiple_nesting_levels.d2,10:0:63-10:7:70", + "key": { + "range": "d2/testdata/d2oracle/TestMove/multiple_nesting_levels.d2,10:0:63-10:7:70", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/multiple_nesting_levels.d2,10:0:63-10:1:64", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/multiple_nesting_levels.d2,10:2:65-10:3:66", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/multiple_nesting_levels.d2,10:4:67-10:5:68", + "value": [ + { + "string": "c", + "raw_string": "c" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/multiple_nesting_levels.d2,10:6:69-10:7:70", + "value": [ + { + "string": "f", + "raw_string": "f" + } + ] + } + } + ] + }, + "primary": {}, + "value": {} + } + } + ] + }, + "root": { + "id": "", + "id_val": "", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + "edges": null, + "objects": [ + { + "id": "a", + "id_val": "a", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/multiple_nesting_levels.d2,0:0:0-0:1:1", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/multiple_nesting_levels.d2,0:0:0-0:1:1", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + }, + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/multiple_nesting_levels.d2,10:0:63-10:7:70", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/multiple_nesting_levels.d2,10:0:63-10:1:64", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/multiple_nesting_levels.d2,10:2:65-10:3:66", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/multiple_nesting_levels.d2,10:4:67-10:5:68", + "value": [ + { + "string": "c", + "raw_string": "c" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/multiple_nesting_levels.d2,10:6:69-10:7:70", + "value": [ + { + "string": "f", + "raw_string": "f" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "a" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "b", + "id_val": "b", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/multiple_nesting_levels.d2,1:2:7-1:3:8", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/multiple_nesting_levels.d2,1:2:7-1:3:8", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + }, + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/multiple_nesting_levels.d2,8:2:55-8:7:60", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/multiple_nesting_levels.d2,8:2:55-8:3:56", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/multiple_nesting_levels.d2,8:4:57-8:5:58", + "value": [ + { + "string": "c", + "raw_string": "c" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/multiple_nesting_levels.d2,8:6:59-8:7:60", + "value": [ + { + "string": "d", + "raw_string": "d" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + }, + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/multiple_nesting_levels.d2,10:0:63-10:7:70", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/multiple_nesting_levels.d2,10:0:63-10:1:64", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/multiple_nesting_levels.d2,10:2:65-10:3:66", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/multiple_nesting_levels.d2,10:4:67-10:5:68", + "value": [ + { + "string": "c", + "raw_string": "c" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/multiple_nesting_levels.d2,10:6:69-10:7:70", + "value": [ + { + "string": "f", + "raw_string": "f" + } + ] + } + } + ] + }, + "key_path_index": 1, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "b" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "c", + "id_val": "c", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/multiple_nesting_levels.d2,2:4:16-2:5:17", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/multiple_nesting_levels.d2,2:4:16-2:5:17", + "value": [ + { + "string": "c", + "raw_string": "c" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + }, + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/multiple_nesting_levels.d2,3:4:22-3:5:23", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/multiple_nesting_levels.d2,3:4:22-3:5:23", + "value": [ + { + "string": "c", + "raw_string": "c" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + }, + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/multiple_nesting_levels.d2,8:2:55-8:7:60", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/multiple_nesting_levels.d2,8:2:55-8:3:56", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/multiple_nesting_levels.d2,8:4:57-8:5:58", + "value": [ + { + "string": "c", + "raw_string": "c" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/multiple_nesting_levels.d2,8:6:59-8:7:60", + "value": [ + { + "string": "d", + "raw_string": "d" + } + ] + } + } + ] + }, + "key_path_index": 1, + "map_key_edge_index": 0 + }, + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/multiple_nesting_levels.d2,10:0:63-10:7:70", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/multiple_nesting_levels.d2,10:0:63-10:1:64", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/multiple_nesting_levels.d2,10:2:65-10:3:66", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/multiple_nesting_levels.d2,10:4:67-10:5:68", + "value": [ + { + "string": "c", + "raw_string": "c" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/multiple_nesting_levels.d2,10:6:69-10:7:70", + "value": [ + { + "string": "f", + "raw_string": "f" + } + ] + } + } + ] + }, + "key_path_index": 2, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "c" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "g", + "id_val": "g", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/multiple_nesting_levels.d2,4:6:33-4:7:34", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/multiple_nesting_levels.d2,4:6:33-4:7:34", + "value": [ + { + "string": "g", + "raw_string": "g" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "g" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "x", + "id_val": "x", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/multiple_nesting_levels.d2,5:6:41-5:7:42", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/multiple_nesting_levels.d2,5:6:41-5:7:42", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "x" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "d", + "id_val": "d", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/multiple_nesting_levels.d2,8:2:55-8:7:60", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/multiple_nesting_levels.d2,8:2:55-8:3:56", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/multiple_nesting_levels.d2,8:4:57-8:5:58", + "value": [ + { + "string": "c", + "raw_string": "c" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/multiple_nesting_levels.d2,8:6:59-8:7:60", + "value": [ + { + "string": "d", + "raw_string": "d" + } + ] + } + } + ] + }, + "key_path_index": 2, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "d" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "f", + "id_val": "f", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/multiple_nesting_levels.d2,10:0:63-10:7:70", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/multiple_nesting_levels.d2,10:0:63-10:1:64", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/multiple_nesting_levels.d2,10:2:65-10:3:66", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/multiple_nesting_levels.d2,10:4:67-10:5:68", + "value": [ + { + "string": "c", + "raw_string": "c" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/multiple_nesting_levels.d2,10:6:69-10:7:70", + "value": [ + { + "string": "f", + "raw_string": "f" + } + ] + } + } + ] + }, + "key_path_index": 3, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "f" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ] + }, + "err": "" +} diff --git a/testdata/d2oracle/TestMove/near.exp.json b/testdata/d2oracle/TestMove/near.exp.json new file mode 100644 index 000000000..140c4cd03 --- /dev/null +++ b/testdata/d2oracle/TestMove/near.exp.json @@ -0,0 +1,222 @@ +{ + "graph": { + "ast": { + "range": "d2/testdata/d2oracle/TestMove/near.d2,0:0:0-4:0:23", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestMove/near.d2,0:0:0-3:1:22", + "key": { + "range": "d2/testdata/d2oracle/TestMove/near.d2,0:0:0-0:1:1", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/near.d2,0:0:0-0:1:1", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "map": { + "range": "d2/testdata/d2oracle/TestMove/near.d2,0:3:3-3:0:21", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestMove/near.d2,1:2:7-1:11:16", + "key": { + "range": "d2/testdata/d2oracle/TestMove/near.d2,1:2:7-1:6:11", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/near.d2,1:2:7-1:6:11", + "value": [ + { + "string": "near", + "raw_string": "near" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/near.d2,1:8:13-1:11:16", + "value": [ + { + "string": "x.y", + "raw_string": "x.y" + } + ] + } + } + } + }, + { + "map_key": { + "range": "d2/testdata/d2oracle/TestMove/near.d2,2:2:19-2:3:20", + "key": { + "range": "d2/testdata/d2oracle/TestMove/near.d2,2:2:19-2:3:20", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/near.d2,2:2:19-2:3:20", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + } + ] + }, + "primary": {}, + "value": {} + } + } + ] + } + } + } + } + ] + }, + "root": { + "id": "", + "id_val": "", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + "edges": null, + "objects": [ + { + "id": "x", + "id_val": "x", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/near.d2,0:0:0-0:1:1", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/near.d2,0:0:0-0:1:1", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "x" + }, + "style": {}, + "near_key": { + "range": ",0:0:0-0:3:3", + "path": [ + { + "unquoted_string": { + "range": ",0:0:0-0:1:1", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + }, + { + "unquoted_string": { + "range": ",0:2:2-0:3:3", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + } + ] + }, + "shape": { + "value": "" + } + } + }, + { + "id": "y", + "id_val": "y", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/near.d2,2:2:19-2:3:20", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/near.d2,2:2:19-2:3:20", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "y" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ] + }, + "err": "" +} diff --git a/testdata/d2oracle/TestMove/nhooyr_one.exp.json b/testdata/d2oracle/TestMove/nhooyr_one.exp.json new file mode 100644 index 000000000..f1f8ec1c5 --- /dev/null +++ b/testdata/d2oracle/TestMove/nhooyr_one.exp.json @@ -0,0 +1,295 @@ +{ + "graph": { + "ast": { + "range": "d2/testdata/d2oracle/TestMove/nhooyr_one.d2,0:0:0-6:0:22", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestMove/nhooyr_one.d2,0:0:0-2:1:10", + "key": { + "range": "d2/testdata/d2oracle/TestMove/nhooyr_one.d2,0:0:0-0:1:1", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/nhooyr_one.d2,0:0:0-0:1:1", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "map": { + "range": "d2/testdata/d2oracle/TestMove/nhooyr_one.d2,0:3:3-2:0:9", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestMove/nhooyr_one.d2,1:2:7-1:3:8", + "key": { + "range": "d2/testdata/d2oracle/TestMove/nhooyr_one.d2,1:2:7-1:3:8", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/nhooyr_one.d2,1:2:7-1:3:8", + "value": [ + { + "string": "c", + "raw_string": "c" + } + ] + } + } + ] + }, + "primary": {}, + "value": {} + } + } + ] + } + } + } + }, + { + "map_key": { + "range": "d2/testdata/d2oracle/TestMove/nhooyr_one.d2,3:0:11-5:1:21", + "key": { + "range": "d2/testdata/d2oracle/TestMove/nhooyr_one.d2,3:0:11-3:1:12", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/nhooyr_one.d2,3:0:11-3:1:12", + "value": [ + { + "string": "d", + "raw_string": "d" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "map": { + "range": "d2/testdata/d2oracle/TestMove/nhooyr_one.d2,3:3:14-5:0:20", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestMove/nhooyr_one.d2,4:2:18-4:3:19", + "key": { + "range": "d2/testdata/d2oracle/TestMove/nhooyr_one.d2,4:2:18-4:3:19", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/nhooyr_one.d2,4:2:18-4:3:19", + "value": [ + { + "string": "q", + "raw_string": "q" + } + ] + } + } + ] + }, + "primary": {}, + "value": {} + } + } + ] + } + } + } + } + ] + }, + "root": { + "id": "", + "id_val": "", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + "edges": null, + "objects": [ + { + "id": "a", + "id_val": "a", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/nhooyr_one.d2,0:0:0-0:1:1", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/nhooyr_one.d2,0:0:0-0:1:1", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "a" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "c", + "id_val": "c", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/nhooyr_one.d2,1:2:7-1:3:8", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/nhooyr_one.d2,1:2:7-1:3:8", + "value": [ + { + "string": "c", + "raw_string": "c" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "c" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "d", + "id_val": "d", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/nhooyr_one.d2,3:0:11-3:1:12", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/nhooyr_one.d2,3:0:11-3:1:12", + "value": [ + { + "string": "d", + "raw_string": "d" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "d" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "q", + "id_val": "q", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/nhooyr_one.d2,4:2:18-4:3:19", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/nhooyr_one.d2,4:2:18-4:3:19", + "value": [ + { + "string": "q", + "raw_string": "q" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "q" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ] + }, + "err": "" +} diff --git a/testdata/d2oracle/TestMove/nhooyr_two.exp.json b/testdata/d2oracle/TestMove/nhooyr_two.exp.json new file mode 100644 index 000000000..326f0c5d7 --- /dev/null +++ b/testdata/d2oracle/TestMove/nhooyr_two.exp.json @@ -0,0 +1,449 @@ +{ + "graph": { + "ast": { + "range": "d2/testdata/d2oracle/TestMove/nhooyr_two.d2,0:0:0-7:0:34", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestMove/nhooyr_two.d2,0:0:0-2:1:18", + "key": { + "range": "d2/testdata/d2oracle/TestMove/nhooyr_two.d2,0:0:0-0:1:1", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/nhooyr_two.d2,0:0:0-0:1:1", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "map": { + "range": "d2/testdata/d2oracle/TestMove/nhooyr_two.d2,0:3:3-2:0:17", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestMove/nhooyr_two.d2,1:2:7-1:11:16", + "edges": [ + { + "range": "d2/testdata/d2oracle/TestMove/nhooyr_two.d2,1:2:7-1:11:16", + "src": { + "range": "d2/testdata/d2oracle/TestMove/nhooyr_two.d2,1:2:7-1:4:9", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/nhooyr_two.d2,1:2:7-1:3:8", + "value": [ + { + "string": "c", + "raw_string": "c" + } + ] + } + } + ] + }, + "src_arrow": "", + "dst": { + "range": "d2/testdata/d2oracle/TestMove/nhooyr_two.d2,1:6:11-1:11:16", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/nhooyr_two.d2,1:7:12-1:11:16", + "value": [ + { + "string": "meow", + "raw_string": "meow" + } + ] + } + } + ] + }, + "dst_arrow": ">" + } + ], + "primary": {}, + "value": {} + } + } + ] + } + } + } + }, + { + "map_key": { + "range": "d2/testdata/d2oracle/TestMove/nhooyr_two.d2,3:0:19-6:1:33", + "key": { + "range": "d2/testdata/d2oracle/TestMove/nhooyr_two.d2,3:0:19-3:1:20", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/nhooyr_two.d2,3:0:19-3:1:20", + "value": [ + { + "string": "d", + "raw_string": "d" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "map": { + "range": "d2/testdata/d2oracle/TestMove/nhooyr_two.d2,3:3:22-6:0:32", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestMove/nhooyr_two.d2,4:2:26-4:3:27", + "key": { + "range": "d2/testdata/d2oracle/TestMove/nhooyr_two.d2,4:2:26-4:3:27", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/nhooyr_two.d2,4:2:26-4:3:27", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "primary": {}, + "value": {} + } + }, + { + "map_key": { + "range": "d2/testdata/d2oracle/TestMove/nhooyr_two.d2,5:2:30-5:3:31", + "key": { + "range": "d2/testdata/d2oracle/TestMove/nhooyr_two.d2,5:2:30-5:3:31", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/nhooyr_two.d2,5:2:30-5:3:31", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + } + ] + }, + "primary": {}, + "value": {} + } + } + ] + } + } + } + } + ] + }, + "root": { + "id": "", + "id_val": "", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + "edges": [ + { + "index": 0, + "minWidth": 0, + "minHeight": 0, + "label_dimensions": { + "width": 0, + "height": 0 + }, + "isCurve": false, + "src_arrow": false, + "dst_arrow": true, + "references": [ + { + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ], + "objects": [ + { + "id": "a", + "id_val": "a", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/nhooyr_two.d2,0:0:0-0:1:1", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/nhooyr_two.d2,0:0:0-0:1:1", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "a" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "d", + "id_val": "d", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/nhooyr_two.d2,3:0:19-3:1:20", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/nhooyr_two.d2,3:0:19-3:1:20", + "value": [ + { + "string": "d", + "raw_string": "d" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "d" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "x", + "id_val": "x", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/nhooyr_two.d2,4:2:26-4:3:27", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/nhooyr_two.d2,4:2:26-4:3:27", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "x" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "b", + "id_val": "b", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/nhooyr_two.d2,5:2:30-5:3:31", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/nhooyr_two.d2,5:2:30-5:3:31", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "b" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "c", + "id_val": "c", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/nhooyr_two.d2,1:2:7-1:4:9", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/nhooyr_two.d2,1:2:7-1:3:8", + "value": [ + { + "string": "c", + "raw_string": "c" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "c" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "meow", + "id_val": "meow", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/nhooyr_two.d2,1:6:11-1:11:16", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/nhooyr_two.d2,1:7:12-1:11:16", + "value": [ + { + "string": "meow", + "raw_string": "meow" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "meow" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ] + }, + "err": "" +} diff --git a/testdata/d2oracle/TestMove/out_of_container.exp.json b/testdata/d2oracle/TestMove/out_of_container.exp.json new file mode 100644 index 000000000..52d717cba --- /dev/null +++ b/testdata/d2oracle/TestMove/out_of_container.exp.json @@ -0,0 +1,159 @@ +{ + "graph": { + "ast": { + "range": "d2/testdata/d2oracle/TestMove/out_of_container.d2,0:0:0-2:0:4", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestMove/out_of_container.d2,0:0:0-0:1:1", + "key": { + "range": "d2/testdata/d2oracle/TestMove/out_of_container.d2,0:0:0-0:1:1", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/out_of_container.d2,0:0:0-0:1:1", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + } + ] + }, + "primary": {}, + "value": {} + } + }, + { + "map_key": { + "range": "d2/testdata/d2oracle/TestMove/out_of_container.d2,1:0:2-1:1:3", + "key": { + "range": "d2/testdata/d2oracle/TestMove/out_of_container.d2,1:0:2-1:1:3", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/out_of_container.d2,1:0:2-1:1:3", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + } + ] + }, + "primary": {}, + "value": {} + } + } + ] + }, + "root": { + "id": "", + "id_val": "", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + "edges": null, + "objects": [ + { + "id": "a", + "id_val": "a", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/out_of_container.d2,0:0:0-0:1:1", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/out_of_container.d2,0:0:0-0:1:1", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0, + "scope_key": "" + } + ], + "attributes": { + "label": { + "value": "a" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "b", + "id_val": "b", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/out_of_container.d2,1:0:2-1:1:3", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/out_of_container.d2,1:0:2-1:1:3", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0, + "scope_key": "" + } + ], + "attributes": { + "label": { + "value": "b" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ] + }, + "err": "" +} diff --git a/testdata/d2oracle/TestMove/parentheses.exp.json b/testdata/d2oracle/TestMove/parentheses.exp.json new file mode 100644 index 000000000..81e26df25 --- /dev/null +++ b/testdata/d2oracle/TestMove/parentheses.exp.json @@ -0,0 +1,306 @@ +{ + "graph": { + "ast": { + "range": "d2/testdata/d2oracle/TestMove/parentheses.d2,0:0:0-2:0:19", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestMove/parentheses.d2,0:0:0-0:12:12", + "edges": [ + { + "range": "d2/testdata/d2oracle/TestMove/parentheses.d2,0:0:0-0:12:12", + "src": { + "range": "d2/testdata/d2oracle/TestMove/parentheses.d2,0:0:0-0:2:2", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/parentheses.d2,0:0:0-0:1:1", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "src_arrow": "", + "dst": { + "range": "d2/testdata/d2oracle/TestMove/parentheses.d2,0:4:4-0:12:12", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/parentheses.d2,0:5:5-0:6:6", + "value": [ + { + "string": "z", + "raw_string": "z" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/parentheses.d2,0:7:7-0:12:12", + "value": [ + { + "string": "y (z)", + "raw_string": "y (z)" + } + ] + } + } + ] + }, + "dst_arrow": ">" + } + ], + "primary": {}, + "value": {} + } + }, + { + "map_key": { + "range": "d2/testdata/d2oracle/TestMove/parentheses.d2,1:0:13-1:5:18", + "key": { + "range": "d2/testdata/d2oracle/TestMove/parentheses.d2,1:0:13-1:1:14", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/parentheses.d2,1:0:13-1:1:14", + "value": [ + { + "string": "z", + "raw_string": "z" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "double_quoted_string": { + "range": "d2/testdata/d2oracle/TestMove/parentheses.d2,1:3:16-1:5:18", + "value": null + } + } + } + } + ] + }, + "root": { + "id": "", + "id_val": "", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + "edges": [ + { + "index": 0, + "minWidth": 0, + "minHeight": 0, + "label_dimensions": { + "width": 0, + "height": 0 + }, + "isCurve": false, + "src_arrow": false, + "dst_arrow": true, + "references": [ + { + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ], + "objects": [ + { + "id": "z", + "id_val": "z", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/parentheses.d2,1:0:13-1:1:14", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/parentheses.d2,1:0:13-1:1:14", + "value": [ + { + "string": "z", + "raw_string": "z" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + }, + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/parentheses.d2,0:4:4-0:12:12", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/parentheses.d2,0:5:5-0:6:6", + "value": [ + { + "string": "z", + "raw_string": "z" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/parentheses.d2,0:7:7-0:12:12", + "value": [ + { + "string": "y (z)", + "raw_string": "y (z)" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "x", + "id_val": "x", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/parentheses.d2,0:0:0-0:2:2", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/parentheses.d2,0:0:0-0:1:1", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "x" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "\"y (z)\"", + "id_val": "y (z)", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/parentheses.d2,0:4:4-0:12:12", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/parentheses.d2,0:5:5-0:6:6", + "value": [ + { + "string": "z", + "raw_string": "z" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/parentheses.d2,0:7:7-0:12:12", + "value": [ + { + "string": "y (z)", + "raw_string": "y (z)" + } + ] + } + } + ] + }, + "key_path_index": 1, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "y (z)" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ] + }, + "err": "" +} diff --git a/testdata/d2oracle/TestMove/partial_edge_slice.exp.json b/testdata/d2oracle/TestMove/partial_edge_slice.exp.json new file mode 100644 index 000000000..d4f638277 --- /dev/null +++ b/testdata/d2oracle/TestMove/partial_edge_slice.exp.json @@ -0,0 +1,291 @@ +{ + "graph": { + "ast": { + "range": "d2/testdata/d2oracle/TestMove/partial_edge_slice.d2,0:0:0-3:0:11", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestMove/partial_edge_slice.d2,0:0:0-0:1:1", + "key": { + "range": "d2/testdata/d2oracle/TestMove/partial_edge_slice.d2,0:0:0-0:1:1", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/partial_edge_slice.d2,0:0:0-0:1:1", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + } + ] + }, + "primary": {}, + "value": {} + } + }, + { + "map_key": { + "range": "d2/testdata/d2oracle/TestMove/partial_edge_slice.d2,1:0:2-1:6:8", + "edges": [ + { + "range": "d2/testdata/d2oracle/TestMove/partial_edge_slice.d2,1:0:2-1:6:8", + "src": { + "range": "d2/testdata/d2oracle/TestMove/partial_edge_slice.d2,1:0:2-1:2:4", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/partial_edge_slice.d2,1:0:2-1:1:3", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + } + ] + }, + "src_arrow": "", + "dst": { + "range": "d2/testdata/d2oracle/TestMove/partial_edge_slice.d2,1:4:6-1:6:8", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/partial_edge_slice.d2,1:5:7-1:6:8", + "value": [ + { + "string": "c", + "raw_string": "c" + } + ] + } + } + ] + }, + "dst_arrow": ">" + } + ], + "primary": {}, + "value": {} + } + }, + { + "map_key": { + "range": "d2/testdata/d2oracle/TestMove/partial_edge_slice.d2,2:0:9-2:1:10", + "key": { + "range": "d2/testdata/d2oracle/TestMove/partial_edge_slice.d2,2:0:9-2:1:10", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/partial_edge_slice.d2,2:0:9-2:1:10", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + } + ] + }, + "primary": {}, + "value": {} + } + } + ] + }, + "root": { + "id": "", + "id_val": "", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + "edges": [ + { + "index": 0, + "minWidth": 0, + "minHeight": 0, + "label_dimensions": { + "width": 0, + "height": 0 + }, + "isCurve": false, + "src_arrow": false, + "dst_arrow": true, + "references": [ + { + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ], + "objects": [ + { + "id": "a", + "id_val": "a", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/partial_edge_slice.d2,0:0:0-0:1:1", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/partial_edge_slice.d2,0:0:0-0:1:1", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "a" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "b", + "id_val": "b", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/partial_edge_slice.d2,2:0:9-2:1:10", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/partial_edge_slice.d2,2:0:9-2:1:10", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + }, + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/partial_edge_slice.d2,1:0:2-1:2:4", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/partial_edge_slice.d2,1:0:2-1:1:3", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "b" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "c", + "id_val": "c", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/partial_edge_slice.d2,1:4:6-1:6:8", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/partial_edge_slice.d2,1:5:7-1:6:8", + "value": [ + { + "string": "c", + "raw_string": "c" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "c" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ] + }, + "err": "" +} diff --git a/testdata/d2oracle/TestMove/partial_slice.exp.json b/testdata/d2oracle/TestMove/partial_slice.exp.json new file mode 100644 index 000000000..f2284e414 --- /dev/null +++ b/testdata/d2oracle/TestMove/partial_slice.exp.json @@ -0,0 +1,157 @@ +{ + "graph": { + "ast": { + "range": "d2/testdata/d2oracle/TestMove/partial_slice.d2,0:0:0-2:0:4", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestMove/partial_slice.d2,0:0:0-0:1:1", + "key": { + "range": "d2/testdata/d2oracle/TestMove/partial_slice.d2,0:0:0-0:1:1", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/partial_slice.d2,0:0:0-0:1:1", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + } + ] + }, + "primary": {}, + "value": {} + } + }, + { + "map_key": { + "range": "d2/testdata/d2oracle/TestMove/partial_slice.d2,1:0:2-1:1:3", + "key": { + "range": "d2/testdata/d2oracle/TestMove/partial_slice.d2,1:0:2-1:1:3", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/partial_slice.d2,1:0:2-1:1:3", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + } + ] + }, + "primary": {}, + "value": {} + } + } + ] + }, + "root": { + "id": "", + "id_val": "", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + "edges": null, + "objects": [ + { + "id": "a", + "id_val": "a", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/partial_slice.d2,0:0:0-0:1:1", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/partial_slice.d2,0:0:0-0:1:1", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "a" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "b", + "id_val": "b", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/partial_slice.d2,1:0:2-1:1:3", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/partial_slice.d2,1:0:2-1:1:3", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "b" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ] + }, + "err": "" +} diff --git a/testdata/d2oracle/TestMove/rename_2.exp.json b/testdata/d2oracle/TestMove/rename_2.exp.json new file mode 100644 index 000000000..bd79e94b5 --- /dev/null +++ b/testdata/d2oracle/TestMove/rename_2.exp.json @@ -0,0 +1,352 @@ +{ + "graph": { + "ast": { + "range": "d2/testdata/d2oracle/TestMove/rename_2.d2,0:0:0-7:0:22", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestMove/rename_2.d2,0:0:0-0:1:1", + "key": { + "range": "d2/testdata/d2oracle/TestMove/rename_2.d2,0:0:0-0:1:1", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/rename_2.d2,0:0:0-0:1:1", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + } + ] + }, + "primary": {}, + "value": {} + } + }, + { + "map_key": { + "range": "d2/testdata/d2oracle/TestMove/rename_2.d2,1:0:2-1:3:5", + "key": { + "range": "d2/testdata/d2oracle/TestMove/rename_2.d2,1:0:2-1:3:5", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/rename_2.d2,1:0:2-1:3:5", + "value": [ + { + "string": "y 2", + "raw_string": "y 2" + } + ] + } + } + ] + }, + "primary": {}, + "value": {} + } + }, + { + "map_key": { + "range": "d2/testdata/d2oracle/TestMove/rename_2.d2,3:0:7-3:3:10", + "key": { + "range": "d2/testdata/d2oracle/TestMove/rename_2.d2,3:0:7-3:3:10", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/rename_2.d2,3:0:7-3:3:10", + "value": [ + { + "string": "b 2", + "raw_string": "b 2" + } + ] + } + } + ] + }, + "primary": {}, + "value": {} + } + }, + { + "map_key": { + "range": "d2/testdata/d2oracle/TestMove/rename_2.d2,4:0:11-6:1:21", + "key": { + "range": "d2/testdata/d2oracle/TestMove/rename_2.d2,4:0:11-4:1:12", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/rename_2.d2,4:0:11-4:1:12", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "map": { + "range": "d2/testdata/d2oracle/TestMove/rename_2.d2,4:3:14-6:0:20", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestMove/rename_2.d2,5:2:18-5:3:19", + "key": { + "range": "d2/testdata/d2oracle/TestMove/rename_2.d2,5:2:18-5:3:19", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/rename_2.d2,5:2:18-5:3:19", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + } + ] + }, + "primary": {}, + "value": {} + } + } + ] + } + } + } + } + ] + }, + "root": { + "id": "", + "id_val": "", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + "edges": null, + "objects": [ + { + "id": "b", + "id_val": "b", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/rename_2.d2,0:0:0-0:1:1", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/rename_2.d2,0:0:0-0:1:1", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "b" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "y 2", + "id_val": "y 2", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/rename_2.d2,1:0:2-1:3:5", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/rename_2.d2,1:0:2-1:3:5", + "value": [ + { + "string": "y 2", + "raw_string": "y 2" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "y 2" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "b 2", + "id_val": "b 2", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/rename_2.d2,3:0:7-3:3:10", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/rename_2.d2,3:0:7-3:3:10", + "value": [ + { + "string": "b 2", + "raw_string": "b 2" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "b 2" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "x", + "id_val": "x", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/rename_2.d2,4:0:11-4:1:12", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/rename_2.d2,4:0:11-4:1:12", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "x" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "a", + "id_val": "a", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/rename_2.d2,5:2:18-5:3:19", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/rename_2.d2,5:2:18-5:3:19", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "a" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ] + }, + "err": "" +} diff --git a/testdata/d2oracle/TestMove/reuse_map.exp.json b/testdata/d2oracle/TestMove/reuse_map.exp.json new file mode 100644 index 000000000..9098a7fd6 --- /dev/null +++ b/testdata/d2oracle/TestMove/reuse_map.exp.json @@ -0,0 +1,411 @@ +{ + "graph": { + "ast": { + "range": "d2/testdata/d2oracle/TestMove/reuse_map.d2,0:0:0-7:0:39", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestMove/reuse_map.d2,0:0:0-6:1:38", + "key": { + "range": "d2/testdata/d2oracle/TestMove/reuse_map.d2,0:0:0-0:1:1", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/reuse_map.d2,0:0:0-0:1:1", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "map": { + "range": "d2/testdata/d2oracle/TestMove/reuse_map.d2,0:3:3-6:0:37", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestMove/reuse_map.d2,1:2:7-4:3:29", + "key": { + "range": "d2/testdata/d2oracle/TestMove/reuse_map.d2,1:2:7-1:3:8", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/reuse_map.d2,1:2:7-1:3:8", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "map": { + "range": "d2/testdata/d2oracle/TestMove/reuse_map.d2,1:5:10-4:2:28", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestMove/reuse_map.d2,2:4:16-2:7:19", + "key": { + "range": "d2/testdata/d2oracle/TestMove/reuse_map.d2,2:4:16-2:7:19", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/reuse_map.d2,2:4:16-2:7:19", + "value": [ + { + "string": "hey", + "raw_string": "hey" + } + ] + } + } + ] + }, + "primary": {}, + "value": {} + } + }, + { + "map_key": { + "range": "d2/testdata/d2oracle/TestMove/reuse_map.d2,3:4:24-3:5:25", + "key": { + "range": "d2/testdata/d2oracle/TestMove/reuse_map.d2,3:4:24-3:5:25", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/reuse_map.d2,3:4:24-3:5:25", + "value": [ + { + "string": "k", + "raw_string": "k" + } + ] + } + } + ] + }, + "primary": {}, + "value": {} + } + } + ] + } + } + } + }, + { + "map_key": { + "range": "d2/testdata/d2oracle/TestMove/reuse_map.d2,5:2:32-5:6:36", + "key": { + "range": "d2/testdata/d2oracle/TestMove/reuse_map.d2,5:2:32-5:6:36", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/reuse_map.d2,5:2:32-5:3:33", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/reuse_map.d2,5:4:34-5:6:36", + "value": [ + { + "string": "yo", + "raw_string": "yo" + } + ] + } + } + ] + }, + "primary": {}, + "value": {} + } + } + ] + } + } + } + } + ] + }, + "root": { + "id": "", + "id_val": "", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + "edges": null, + "objects": [ + { + "id": "a", + "id_val": "a", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/reuse_map.d2,0:0:0-0:1:1", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/reuse_map.d2,0:0:0-0:1:1", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "a" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "b", + "id_val": "b", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/reuse_map.d2,1:2:7-1:3:8", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/reuse_map.d2,1:2:7-1:3:8", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + }, + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/reuse_map.d2,5:2:32-5:6:36", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/reuse_map.d2,5:2:32-5:3:33", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/reuse_map.d2,5:4:34-5:6:36", + "value": [ + { + "string": "yo", + "raw_string": "yo" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "b" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "hey", + "id_val": "hey", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/reuse_map.d2,2:4:16-2:7:19", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/reuse_map.d2,2:4:16-2:7:19", + "value": [ + { + "string": "hey", + "raw_string": "hey" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "hey" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "k", + "id_val": "k", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/reuse_map.d2,3:4:24-3:5:25", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/reuse_map.d2,3:4:24-3:5:25", + "value": [ + { + "string": "k", + "raw_string": "k" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "k" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "yo", + "id_val": "yo", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/reuse_map.d2,5:2:32-5:6:36", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/reuse_map.d2,5:2:32-5:3:33", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/reuse_map.d2,5:4:34-5:6:36", + "value": [ + { + "string": "yo", + "raw_string": "yo" + } + ] + } + } + ] + }, + "key_path_index": 1, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "yo" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ] + }, + "err": "" +} diff --git a/testdata/d2oracle/TestMove/slice_style.exp.json b/testdata/d2oracle/TestMove/slice_style.exp.json new file mode 100644 index 000000000..ffeedab71 --- /dev/null +++ b/testdata/d2oracle/TestMove/slice_style.exp.json @@ -0,0 +1,244 @@ +{ + "graph": { + "ast": { + "range": "d2/testdata/d2oracle/TestMove/slice_style.d2,0:0:0-3:0:68", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestMove/slice_style.d2,0:0:0-0:1:1", + "key": { + "range": "d2/testdata/d2oracle/TestMove/slice_style.d2,0:0:0-0:1:1", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/slice_style.d2,0:0:0-0:1:1", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + } + ] + }, + "primary": {}, + "value": {} + } + }, + { + "map_key": { + "range": "d2/testdata/d2oracle/TestMove/slice_style.d2,1:0:2-1:63:65", + "key": { + "range": "d2/testdata/d2oracle/TestMove/slice_style.d2,1:0:2-1:6:8", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/slice_style.d2,1:0:2-1:1:3", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/slice_style.d2,1:2:4-1:6:8", + "value": [ + { + "string": "icon", + "raw_string": "icon" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/slice_style.d2,1:8:10-1:63:65", + "value": [ + { + "string": "https://icons.terrastruct.com/essentials/142-target.svg", + "raw_string": "https://icons.terrastruct.com/essentials/142-target.svg" + } + ] + } + } + } + }, + { + "map_key": { + "range": "d2/testdata/d2oracle/TestMove/slice_style.d2,2:0:66-2:1:67", + "key": { + "range": "d2/testdata/d2oracle/TestMove/slice_style.d2,2:0:66-2:1:67", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/slice_style.d2,2:0:66-2:1:67", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + } + ] + }, + "primary": {}, + "value": {} + } + } + ] + }, + "root": { + "id": "", + "id_val": "", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + "edges": null, + "objects": [ + { + "id": "a", + "id_val": "a", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/slice_style.d2,0:0:0-0:1:1", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/slice_style.d2,0:0:0-0:1:1", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "a" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "b", + "id_val": "b", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/slice_style.d2,1:0:2-1:6:8", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/slice_style.d2,1:0:2-1:1:3", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/slice_style.d2,1:2:4-1:6:8", + "value": [ + { + "string": "icon", + "raw_string": "icon" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + }, + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/slice_style.d2,2:0:66-2:1:67", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/slice_style.d2,2:0:66-2:1:67", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "b" + }, + "style": {}, + "icon": { + "Scheme": "https", + "Opaque": "", + "User": null, + "Host": "icons.terrastruct.com", + "Path": "/essentials/142-target.svg", + "RawPath": "", + "ForceQuery": false, + "RawQuery": "", + "Fragment": "", + "RawFragment": "" + }, + "near_key": null, + "shape": { + "value": "" + } + } + } + ] + }, + "err": "" +} diff --git a/testdata/d2oracle/TestMove/underscore_children.exp.json b/testdata/d2oracle/TestMove/underscore_children.exp.json new file mode 100644 index 000000000..759f812e7 --- /dev/null +++ b/testdata/d2oracle/TestMove/underscore_children.exp.json @@ -0,0 +1,228 @@ +{ + "graph": { + "ast": { + "range": "d2/testdata/d2oracle/TestMove/underscore_children.d2,0:0:0-4:0:15", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestMove/underscore_children.d2,0:0:0-2:1:12", + "key": { + "range": "d2/testdata/d2oracle/TestMove/underscore_children.d2,0:0:0-0:1:1", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/underscore_children.d2,0:0:0-0:1:1", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "map": { + "range": "d2/testdata/d2oracle/TestMove/underscore_children.d2,0:3:3-2:0:11", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestMove/underscore_children.d2,1:2:7-1:5:10", + "key": { + "range": "d2/testdata/d2oracle/TestMove/underscore_children.d2,1:2:7-1:5:10", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/underscore_children.d2,1:2:7-1:3:8", + "value": [ + { + "string": "_", + "raw_string": "_" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/underscore_children.d2,1:4:9-1:5:10", + "value": [ + { + "string": "c", + "raw_string": "c" + } + ] + } + } + ] + }, + "primary": {}, + "value": {} + } + } + ] + } + } + } + }, + { + "map_key": { + "range": "d2/testdata/d2oracle/TestMove/underscore_children.d2,3:0:13-3:1:14", + "key": { + "range": "d2/testdata/d2oracle/TestMove/underscore_children.d2,3:0:13-3:1:14", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/underscore_children.d2,3:0:13-3:1:14", + "value": [ + { + "string": "c", + "raw_string": "c" + } + ] + } + } + ] + }, + "primary": {}, + "value": {} + } + } + ] + }, + "root": { + "id": "", + "id_val": "", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + "edges": null, + "objects": [ + { + "id": "a", + "id_val": "a", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/underscore_children.d2,0:0:0-0:1:1", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/underscore_children.d2,0:0:0-0:1:1", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "a" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "c", + "id_val": "c", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/underscore_children.d2,1:2:7-1:5:10", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/underscore_children.d2,1:2:7-1:3:8", + "value": [ + { + "string": "_", + "raw_string": "_" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/underscore_children.d2,1:4:9-1:5:10", + "value": [ + { + "string": "c", + "raw_string": "c" + } + ] + } + } + ] + }, + "key_path_index": 1, + "map_key_edge_index": 0 + }, + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/underscore_children.d2,3:0:13-3:1:14", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/underscore_children.d2,3:0:13-3:1:14", + "value": [ + { + "string": "c", + "raw_string": "c" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "c" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ] + }, + "err": "" +} diff --git a/testdata/d2oracle/TestMove/underscore_edge_children.exp.json b/testdata/d2oracle/TestMove/underscore_edge_children.exp.json new file mode 100644 index 000000000..c25fc70ca --- /dev/null +++ b/testdata/d2oracle/TestMove/underscore_edge_children.exp.json @@ -0,0 +1,319 @@ +{ + "graph": { + "ast": { + "range": "d2/testdata/d2oracle/TestMove/underscore_edge_children.d2,0:0:0-4:0:20", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestMove/underscore_edge_children.d2,0:0:0-2:1:17", + "key": { + "range": "d2/testdata/d2oracle/TestMove/underscore_edge_children.d2,0:0:0-0:1:1", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/underscore_edge_children.d2,0:0:0-0:1:1", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "map": { + "range": "d2/testdata/d2oracle/TestMove/underscore_edge_children.d2,0:3:3-2:0:16", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestMove/underscore_edge_children.d2,1:2:7-1:10:15", + "edges": [ + { + "range": "d2/testdata/d2oracle/TestMove/underscore_edge_children.d2,1:2:7-1:10:15", + "src": { + "range": "d2/testdata/d2oracle/TestMove/underscore_edge_children.d2,1:2:7-1:6:11", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/underscore_edge_children.d2,1:2:7-1:3:8", + "value": [ + { + "string": "_", + "raw_string": "_" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/underscore_edge_children.d2,1:4:9-1:5:10", + "value": [ + { + "string": "c", + "raw_string": "c" + } + ] + } + } + ] + }, + "src_arrow": "", + "dst": { + "range": "d2/testdata/d2oracle/TestMove/underscore_edge_children.d2,1:8:13-1:10:15", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/underscore_edge_children.d2,1:9:14-1:10:15", + "value": [ + { + "string": "c", + "raw_string": "c" + } + ] + } + } + ] + }, + "dst_arrow": ">" + } + ], + "primary": {}, + "value": {} + } + } + ] + } + } + } + }, + { + "map_key": { + "range": "d2/testdata/d2oracle/TestMove/underscore_edge_children.d2,3:0:18-3:1:19", + "key": { + "range": "d2/testdata/d2oracle/TestMove/underscore_edge_children.d2,3:0:18-3:1:19", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/underscore_edge_children.d2,3:0:18-3:1:19", + "value": [ + { + "string": "c", + "raw_string": "c" + } + ] + } + } + ] + }, + "primary": {}, + "value": {} + } + } + ] + }, + "root": { + "id": "", + "id_val": "", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + "edges": [ + { + "index": 0, + "minWidth": 0, + "minHeight": 0, + "label_dimensions": { + "width": 0, + "height": 0 + }, + "isCurve": false, + "src_arrow": false, + "dst_arrow": true, + "references": [ + { + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ], + "objects": [ + { + "id": "a", + "id_val": "a", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/underscore_edge_children.d2,0:0:0-0:1:1", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/underscore_edge_children.d2,0:0:0-0:1:1", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "a" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "c", + "id_val": "c", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/underscore_edge_children.d2,3:0:18-3:1:19", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/underscore_edge_children.d2,3:0:18-3:1:19", + "value": [ + { + "string": "c", + "raw_string": "c" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + }, + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/underscore_edge_children.d2,1:2:7-1:6:11", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/underscore_edge_children.d2,1:2:7-1:3:8", + "value": [ + { + "string": "_", + "raw_string": "_" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/underscore_edge_children.d2,1:4:9-1:5:10", + "value": [ + { + "string": "c", + "raw_string": "c" + } + ] + } + } + ] + }, + "key_path_index": 1, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "c" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "c", + "id_val": "c", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/underscore_edge_children.d2,1:8:13-1:10:15", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/underscore_edge_children.d2,1:9:14-1:10:15", + "value": [ + { + "string": "c", + "raw_string": "c" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "c" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ] + }, + "err": "" +} diff --git a/testdata/d2oracle/TestMove/underscore_edge_container.exp.json b/testdata/d2oracle/TestMove/underscore_edge_container.exp.json new file mode 100644 index 000000000..5589622b3 --- /dev/null +++ b/testdata/d2oracle/TestMove/underscore_edge_container.exp.json @@ -0,0 +1,251 @@ +{ + "graph": { + "ast": { + "range": "d2/testdata/d2oracle/TestMove/underscore_edge_container.d2,0:0:0-3:0:16", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestMove/underscore_edge_container.d2,0:0:0-2:1:15", + "key": { + "range": "d2/testdata/d2oracle/TestMove/underscore_edge_container.d2,0:0:0-0:1:1", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/underscore_edge_container.d2,0:0:0-0:1:1", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "map": { + "range": "d2/testdata/d2oracle/TestMove/underscore_edge_container.d2,0:3:3-2:0:14", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestMove/underscore_edge_container.d2,1:2:7-1:8:13", + "edges": [ + { + "range": "d2/testdata/d2oracle/TestMove/underscore_edge_container.d2,1:2:7-1:8:13", + "src": { + "range": "d2/testdata/d2oracle/TestMove/underscore_edge_container.d2,1:2:7-1:4:9", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/underscore_edge_container.d2,1:2:7-1:3:8", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + } + ] + }, + "src_arrow": "", + "dst": { + "range": "d2/testdata/d2oracle/TestMove/underscore_edge_container.d2,1:6:11-1:8:13", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/underscore_edge_container.d2,1:7:12-1:8:13", + "value": [ + { + "string": "c", + "raw_string": "c" + } + ] + } + } + ] + }, + "dst_arrow": ">" + } + ], + "primary": {}, + "value": {} + } + } + ] + } + } + } + } + ] + }, + "root": { + "id": "", + "id_val": "", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + "edges": [ + { + "index": 0, + "label_dimensions": { + "width": 0, + "height": 0 + }, + "src_arrow": false, + "dst_arrow": true, + "references": [ + { + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ], + "objects": [ + { + "id": "a", + "id_val": "a", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/underscore_edge_container.d2,0:0:0-0:1:1", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/underscore_edge_container.d2,0:0:0-0:1:1", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "a" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "b", + "id_val": "b", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/underscore_edge_container.d2,1:2:7-1:4:9", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/underscore_edge_container.d2,1:2:7-1:3:8", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "b" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "c", + "id_val": "c", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/underscore_edge_container.d2,1:6:11-1:8:13", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/underscore_edge_container.d2,1:7:12-1:8:13", + "value": [ + { + "string": "c", + "raw_string": "c" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "c" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ] + }, + "err": "" +} diff --git a/testdata/d2oracle/TestMove/underscore_edge_container_1.exp.json b/testdata/d2oracle/TestMove/underscore_edge_container_1.exp.json new file mode 100644 index 000000000..1177bff53 --- /dev/null +++ b/testdata/d2oracle/TestMove/underscore_edge_container_1.exp.json @@ -0,0 +1,254 @@ +{ + "graph": { + "ast": { + "range": "d2/testdata/d2oracle/TestMove/underscore_edge_container_1.d2,0:0:0-3:0:16", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestMove/underscore_edge_container_1.d2,0:0:0-2:1:15", + "key": { + "range": "d2/testdata/d2oracle/TestMove/underscore_edge_container_1.d2,0:0:0-0:1:1", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/underscore_edge_container_1.d2,0:0:0-0:1:1", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "map": { + "range": "d2/testdata/d2oracle/TestMove/underscore_edge_container_1.d2,0:3:3-2:0:14", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestMove/underscore_edge_container_1.d2,1:2:7-1:8:13", + "edges": [ + { + "range": "d2/testdata/d2oracle/TestMove/underscore_edge_container_1.d2,1:2:7-1:8:13", + "src": { + "range": "d2/testdata/d2oracle/TestMove/underscore_edge_container_1.d2,1:2:7-1:4:9", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/underscore_edge_container_1.d2,1:2:7-1:3:8", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + } + ] + }, + "src_arrow": "", + "dst": { + "range": "d2/testdata/d2oracle/TestMove/underscore_edge_container_1.d2,1:6:11-1:8:13", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/underscore_edge_container_1.d2,1:7:12-1:8:13", + "value": [ + { + "string": "c", + "raw_string": "c" + } + ] + } + } + ] + }, + "dst_arrow": ">" + } + ], + "primary": {}, + "value": {} + } + } + ] + } + } + } + } + ] + }, + "root": { + "id": "", + "id_val": "", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + "edges": [ + { + "index": 0, + "minWidth": 0, + "minHeight": 0, + "label_dimensions": { + "width": 0, + "height": 0 + }, + "isCurve": false, + "src_arrow": false, + "dst_arrow": true, + "references": [ + { + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ], + "objects": [ + { + "id": "a", + "id_val": "a", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/underscore_edge_container_1.d2,0:0:0-0:1:1", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/underscore_edge_container_1.d2,0:0:0-0:1:1", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "a" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "b", + "id_val": "b", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/underscore_edge_container_1.d2,1:2:7-1:4:9", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/underscore_edge_container_1.d2,1:2:7-1:3:8", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "b" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "c", + "id_val": "c", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/underscore_edge_container_1.d2,1:6:11-1:8:13", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/underscore_edge_container_1.d2,1:7:12-1:8:13", + "value": [ + { + "string": "c", + "raw_string": "c" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "c" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ] + }, + "err": "" +} diff --git a/testdata/d2oracle/TestMove/underscore_edge_container_2.exp.json b/testdata/d2oracle/TestMove/underscore_edge_container_2.exp.json new file mode 100644 index 000000000..aef075e64 --- /dev/null +++ b/testdata/d2oracle/TestMove/underscore_edge_container_2.exp.json @@ -0,0 +1,307 @@ +{ + "graph": { + "ast": { + "range": "d2/testdata/d2oracle/TestMove/underscore_edge_container_2.d2,0:0:0-3:0:18", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestMove/underscore_edge_container_2.d2,0:0:0-2:1:17", + "key": { + "range": "d2/testdata/d2oracle/TestMove/underscore_edge_container_2.d2,0:0:0-0:1:1", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/underscore_edge_container_2.d2,0:0:0-0:1:1", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "map": { + "range": "d2/testdata/d2oracle/TestMove/underscore_edge_container_2.d2,0:3:3-2:0:16", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestMove/underscore_edge_container_2.d2,1:2:7-1:10:15", + "edges": [ + { + "range": "d2/testdata/d2oracle/TestMove/underscore_edge_container_2.d2,1:2:7-1:10:15", + "src": { + "range": "d2/testdata/d2oracle/TestMove/underscore_edge_container_2.d2,1:2:7-1:6:11", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/underscore_edge_container_2.d2,1:2:7-1:3:8", + "value": [ + { + "string": "c", + "raw_string": "c" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/underscore_edge_container_2.d2,1:4:9-1:5:10", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + } + ] + }, + "src_arrow": "", + "dst": { + "range": "d2/testdata/d2oracle/TestMove/underscore_edge_container_2.d2,1:8:13-1:10:15", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/underscore_edge_container_2.d2,1:9:14-1:10:15", + "value": [ + { + "string": "c", + "raw_string": "c" + } + ] + } + } + ] + }, + "dst_arrow": ">" + } + ], + "primary": {}, + "value": {} + } + } + ] + } + } + } + } + ] + }, + "root": { + "id": "", + "id_val": "", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + "edges": [ + { + "index": 0, + "minWidth": 0, + "minHeight": 0, + "label_dimensions": { + "width": 0, + "height": 0 + }, + "isCurve": false, + "src_arrow": false, + "dst_arrow": true, + "references": [ + { + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ], + "objects": [ + { + "id": "a", + "id_val": "a", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/underscore_edge_container_2.d2,0:0:0-0:1:1", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/underscore_edge_container_2.d2,0:0:0-0:1:1", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "a" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "c", + "id_val": "c", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/underscore_edge_container_2.d2,1:2:7-1:6:11", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/underscore_edge_container_2.d2,1:2:7-1:3:8", + "value": [ + { + "string": "c", + "raw_string": "c" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/underscore_edge_container_2.d2,1:4:9-1:5:10", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + }, + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/underscore_edge_container_2.d2,1:8:13-1:10:15", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/underscore_edge_container_2.d2,1:9:14-1:10:15", + "value": [ + { + "string": "c", + "raw_string": "c" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "c" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "b", + "id_val": "b", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/underscore_edge_container_2.d2,1:2:7-1:6:11", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/underscore_edge_container_2.d2,1:2:7-1:3:8", + "value": [ + { + "string": "c", + "raw_string": "c" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/underscore_edge_container_2.d2,1:4:9-1:5:10", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + } + ] + }, + "key_path_index": 1, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "b" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ] + }, + "err": "" +} diff --git a/testdata/d2oracle/TestMove/underscore_edge_container_3.exp.json b/testdata/d2oracle/TestMove/underscore_edge_container_3.exp.json new file mode 100644 index 000000000..01d482296 --- /dev/null +++ b/testdata/d2oracle/TestMove/underscore_edge_container_3.exp.json @@ -0,0 +1,276 @@ +{ + "graph": { + "ast": { + "range": "d2/testdata/d2oracle/TestMove/underscore_edge_container_3.d2,0:0:0-3:0:18", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestMove/underscore_edge_container_3.d2,0:0:0-2:1:17", + "key": { + "range": "d2/testdata/d2oracle/TestMove/underscore_edge_container_3.d2,0:0:0-0:1:1", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/underscore_edge_container_3.d2,0:0:0-0:1:1", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "map": { + "range": "d2/testdata/d2oracle/TestMove/underscore_edge_container_3.d2,0:3:3-2:0:16", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestMove/underscore_edge_container_3.d2,1:2:7-1:10:15", + "edges": [ + { + "range": "d2/testdata/d2oracle/TestMove/underscore_edge_container_3.d2,1:2:7-1:10:15", + "src": { + "range": "d2/testdata/d2oracle/TestMove/underscore_edge_container_3.d2,1:2:7-1:6:11", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/underscore_edge_container_3.d2,1:2:7-1:3:8", + "value": [ + { + "string": "_", + "raw_string": "_" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/underscore_edge_container_3.d2,1:4:9-1:5:10", + "value": [ + { + "string": "d", + "raw_string": "d" + } + ] + } + } + ] + }, + "src_arrow": "", + "dst": { + "range": "d2/testdata/d2oracle/TestMove/underscore_edge_container_3.d2,1:8:13-1:10:15", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/underscore_edge_container_3.d2,1:9:14-1:10:15", + "value": [ + { + "string": "c", + "raw_string": "c" + } + ] + } + } + ] + }, + "dst_arrow": ">" + } + ], + "primary": {}, + "value": {} + } + } + ] + } + } + } + } + ] + }, + "root": { + "id": "", + "id_val": "", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + "edges": [ + { + "index": 0, + "minWidth": 0, + "minHeight": 0, + "label_dimensions": { + "width": 0, + "height": 0 + }, + "isCurve": false, + "src_arrow": false, + "dst_arrow": true, + "references": [ + { + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ], + "objects": [ + { + "id": "a", + "id_val": "a", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/underscore_edge_container_3.d2,0:0:0-0:1:1", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/underscore_edge_container_3.d2,0:0:0-0:1:1", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "a" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "d", + "id_val": "d", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/underscore_edge_container_3.d2,1:2:7-1:6:11", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/underscore_edge_container_3.d2,1:2:7-1:3:8", + "value": [ + { + "string": "_", + "raw_string": "_" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/underscore_edge_container_3.d2,1:4:9-1:5:10", + "value": [ + { + "string": "d", + "raw_string": "d" + } + ] + } + } + ] + }, + "key_path_index": 1, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "d" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "c", + "id_val": "c", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/underscore_edge_container_3.d2,1:8:13-1:10:15", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/underscore_edge_container_3.d2,1:9:14-1:10:15", + "value": [ + { + "string": "c", + "raw_string": "c" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "c" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ] + }, + "err": "" +} diff --git a/testdata/d2oracle/TestMove/underscore_edge_container_4.exp.json b/testdata/d2oracle/TestMove/underscore_edge_container_4.exp.json new file mode 100644 index 000000000..ac60f92d9 --- /dev/null +++ b/testdata/d2oracle/TestMove/underscore_edge_container_4.exp.json @@ -0,0 +1,254 @@ +{ + "graph": { + "ast": { + "range": "d2/testdata/d2oracle/TestMove/underscore_edge_container_4.d2,0:0:0-3:0:16", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestMove/underscore_edge_container_4.d2,0:0:0-2:1:15", + "key": { + "range": "d2/testdata/d2oracle/TestMove/underscore_edge_container_4.d2,0:0:0-0:1:1", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/underscore_edge_container_4.d2,0:0:0-0:1:1", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "map": { + "range": "d2/testdata/d2oracle/TestMove/underscore_edge_container_4.d2,0:3:3-2:0:14", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestMove/underscore_edge_container_4.d2,1:2:7-1:8:13", + "edges": [ + { + "range": "d2/testdata/d2oracle/TestMove/underscore_edge_container_4.d2,1:2:7-1:8:13", + "src": { + "range": "d2/testdata/d2oracle/TestMove/underscore_edge_container_4.d2,1:2:7-1:4:9", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/underscore_edge_container_4.d2,1:2:7-1:3:8", + "value": [ + { + "string": "f", + "raw_string": "f" + } + ] + } + } + ] + }, + "src_arrow": "", + "dst": { + "range": "d2/testdata/d2oracle/TestMove/underscore_edge_container_4.d2,1:6:11-1:8:13", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/underscore_edge_container_4.d2,1:7:12-1:8:13", + "value": [ + { + "string": "c", + "raw_string": "c" + } + ] + } + } + ] + }, + "dst_arrow": ">" + } + ], + "primary": {}, + "value": {} + } + } + ] + } + } + } + } + ] + }, + "root": { + "id": "", + "id_val": "", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + "edges": [ + { + "index": 0, + "minWidth": 0, + "minHeight": 0, + "label_dimensions": { + "width": 0, + "height": 0 + }, + "isCurve": false, + "src_arrow": false, + "dst_arrow": true, + "references": [ + { + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ], + "objects": [ + { + "id": "a", + "id_val": "a", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/underscore_edge_container_4.d2,0:0:0-0:1:1", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/underscore_edge_container_4.d2,0:0:0-0:1:1", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "a" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "f", + "id_val": "f", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/underscore_edge_container_4.d2,1:2:7-1:4:9", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/underscore_edge_container_4.d2,1:2:7-1:3:8", + "value": [ + { + "string": "f", + "raw_string": "f" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "f" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "c", + "id_val": "c", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/underscore_edge_container_4.d2,1:6:11-1:8:13", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/underscore_edge_container_4.d2,1:7:12-1:8:13", + "value": [ + { + "string": "c", + "raw_string": "c" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "c" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ] + }, + "err": "" +} diff --git a/testdata/d2oracle/TestMove/underscore_edge_container_5.exp.json b/testdata/d2oracle/TestMove/underscore_edge_container_5.exp.json new file mode 100644 index 000000000..6aa8777c1 --- /dev/null +++ b/testdata/d2oracle/TestMove/underscore_edge_container_5.exp.json @@ -0,0 +1,362 @@ +{ + "graph": { + "ast": { + "range": "d2/testdata/d2oracle/TestMove/underscore_edge_container_5.d2,0:0:0-3:0:22", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestMove/underscore_edge_container_5.d2,0:0:0-2:1:21", + "key": { + "range": "d2/testdata/d2oracle/TestMove/underscore_edge_container_5.d2,0:0:0-0:1:1", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/underscore_edge_container_5.d2,0:0:0-0:1:1", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "map": { + "range": "d2/testdata/d2oracle/TestMove/underscore_edge_container_5.d2,0:3:3-2:0:20", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestMove/underscore_edge_container_5.d2,1:2:7-1:14:19", + "edges": [ + { + "range": "d2/testdata/d2oracle/TestMove/underscore_edge_container_5.d2,1:2:7-1:14:19", + "src": { + "range": "d2/testdata/d2oracle/TestMove/underscore_edge_container_5.d2,1:2:7-1:8:13", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/underscore_edge_container_5.d2,1:2:7-1:3:8", + "value": [ + { + "string": "_", + "raw_string": "_" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/underscore_edge_container_5.d2,1:4:9-1:5:10", + "value": [ + { + "string": "c", + "raw_string": "c" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/underscore_edge_container_5.d2,1:6:11-1:7:12", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + } + ] + }, + "src_arrow": "", + "dst": { + "range": "d2/testdata/d2oracle/TestMove/underscore_edge_container_5.d2,1:10:15-1:14:19", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/underscore_edge_container_5.d2,1:11:16-1:12:17", + "value": [ + { + "string": "_", + "raw_string": "_" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/underscore_edge_container_5.d2,1:13:18-1:14:19", + "value": [ + { + "string": "c", + "raw_string": "c" + } + ] + } + } + ] + }, + "dst_arrow": ">" + } + ], + "primary": {}, + "value": {} + } + } + ] + } + } + } + } + ] + }, + "root": { + "id": "", + "id_val": "", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + "edges": [ + { + "index": 0, + "minWidth": 0, + "minHeight": 0, + "label_dimensions": { + "width": 0, + "height": 0 + }, + "isCurve": false, + "src_arrow": false, + "dst_arrow": true, + "references": [ + { + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ], + "objects": [ + { + "id": "a", + "id_val": "a", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/underscore_edge_container_5.d2,0:0:0-0:1:1", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/underscore_edge_container_5.d2,0:0:0-0:1:1", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "a" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "c", + "id_val": "c", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/underscore_edge_container_5.d2,1:2:7-1:8:13", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/underscore_edge_container_5.d2,1:2:7-1:3:8", + "value": [ + { + "string": "_", + "raw_string": "_" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/underscore_edge_container_5.d2,1:4:9-1:5:10", + "value": [ + { + "string": "c", + "raw_string": "c" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/underscore_edge_container_5.d2,1:6:11-1:7:12", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + } + ] + }, + "key_path_index": 1, + "map_key_edge_index": 0 + }, + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/underscore_edge_container_5.d2,1:10:15-1:14:19", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/underscore_edge_container_5.d2,1:11:16-1:12:17", + "value": [ + { + "string": "_", + "raw_string": "_" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/underscore_edge_container_5.d2,1:13:18-1:14:19", + "value": [ + { + "string": "c", + "raw_string": "c" + } + ] + } + } + ] + }, + "key_path_index": 1, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "c" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "b", + "id_val": "b", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/underscore_edge_container_5.d2,1:2:7-1:8:13", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/underscore_edge_container_5.d2,1:2:7-1:3:8", + "value": [ + { + "string": "_", + "raw_string": "_" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/underscore_edge_container_5.d2,1:4:9-1:5:10", + "value": [ + { + "string": "c", + "raw_string": "c" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/underscore_edge_container_5.d2,1:6:11-1:7:12", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + } + ] + }, + "key_path_index": 2, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "b" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ] + }, + "err": "" +} diff --git a/testdata/d2oracle/TestMove/underscore_edge_split.exp.json b/testdata/d2oracle/TestMove/underscore_edge_split.exp.json new file mode 100644 index 000000000..6f2f331e9 --- /dev/null +++ b/testdata/d2oracle/TestMove/underscore_edge_split.exp.json @@ -0,0 +1,408 @@ +{ + "graph": { + "ast": { + "range": "d2/testdata/d2oracle/TestMove/underscore_edge_split.d2,0:0:0-6:0:34", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestMove/underscore_edge_split.d2,0:0:0-4:1:31", + "key": { + "range": "d2/testdata/d2oracle/TestMove/underscore_edge_split.d2,0:0:0-0:1:1", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/underscore_edge_split.d2,0:0:0-0:1:1", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "map": { + "range": "d2/testdata/d2oracle/TestMove/underscore_edge_split.d2,0:3:3-4:0:30", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestMove/underscore_edge_split.d2,1:2:7-3:3:29", + "key": { + "range": "d2/testdata/d2oracle/TestMove/underscore_edge_split.d2,1:2:7-1:3:8", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/underscore_edge_split.d2,1:2:7-1:3:8", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "map": { + "range": "d2/testdata/d2oracle/TestMove/underscore_edge_split.d2,1:5:10-3:2:28", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestMove/underscore_edge_split.d2,2:4:16-2:13:25", + "edges": [ + { + "range": "d2/testdata/d2oracle/TestMove/underscore_edge_split.d2,2:4:16-2:13:25", + "src": { + "range": "d2/testdata/d2oracle/TestMove/underscore_edge_split.d2,2:4:16-2:8:20", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/underscore_edge_split.d2,2:4:16-2:5:17", + "value": [ + { + "string": "_", + "raw_string": "_" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/underscore_edge_split.d2,2:6:18-2:7:19", + "value": [ + { + "string": "f", + "raw_string": "f" + } + ] + } + } + ] + }, + "src_arrow": "", + "dst": { + "range": "d2/testdata/d2oracle/TestMove/underscore_edge_split.d2,2:10:22-2:13:25", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/underscore_edge_split.d2,2:11:23-2:13:25", + "value": [ + { + "string": "yo", + "raw_string": "yo" + } + ] + } + } + ] + }, + "dst_arrow": ">" + } + ], + "primary": {}, + "value": {} + } + } + ] + } + } + } + } + ] + } + } + } + }, + { + "map_key": { + "range": "d2/testdata/d2oracle/TestMove/underscore_edge_split.d2,5:0:32-5:1:33", + "key": { + "range": "d2/testdata/d2oracle/TestMove/underscore_edge_split.d2,5:0:32-5:1:33", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/underscore_edge_split.d2,5:0:32-5:1:33", + "value": [ + { + "string": "c", + "raw_string": "c" + } + ] + } + } + ] + }, + "primary": {}, + "value": {} + } + } + ] + }, + "root": { + "id": "", + "id_val": "", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + "edges": [ + { + "index": 0, + "minWidth": 0, + "minHeight": 0, + "label_dimensions": { + "width": 0, + "height": 0 + }, + "isCurve": false, + "src_arrow": false, + "dst_arrow": true, + "references": [ + { + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ], + "objects": [ + { + "id": "a", + "id_val": "a", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/underscore_edge_split.d2,0:0:0-0:1:1", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/underscore_edge_split.d2,0:0:0-0:1:1", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "a" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "b", + "id_val": "b", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/underscore_edge_split.d2,1:2:7-1:3:8", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/underscore_edge_split.d2,1:2:7-1:3:8", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "b" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "c", + "id_val": "c", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/underscore_edge_split.d2,5:0:32-5:1:33", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/underscore_edge_split.d2,5:0:32-5:1:33", + "value": [ + { + "string": "c", + "raw_string": "c" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "c" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "f", + "id_val": "f", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/underscore_edge_split.d2,2:4:16-2:8:20", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/underscore_edge_split.d2,2:4:16-2:5:17", + "value": [ + { + "string": "_", + "raw_string": "_" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/underscore_edge_split.d2,2:6:18-2:7:19", + "value": [ + { + "string": "f", + "raw_string": "f" + } + ] + } + } + ] + }, + "key_path_index": 1, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "f" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "yo", + "id_val": "yo", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/underscore_edge_split.d2,2:10:22-2:13:25", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/underscore_edge_split.d2,2:11:23-2:13:25", + "value": [ + { + "string": "yo", + "raw_string": "yo" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "yo" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ] + }, + "err": "" +} diff --git a/testdata/d2oracle/TestMove/underscore_extend.exp.json b/testdata/d2oracle/TestMove/underscore_extend.exp.json new file mode 100644 index 000000000..655d01d42 --- /dev/null +++ b/testdata/d2oracle/TestMove/underscore_extend.exp.json @@ -0,0 +1,543 @@ +{ + "graph": { + "ast": { + "range": "d2/testdata/d2oracle/TestMove/underscore_extend.d2,0:0:0-8:0:47", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestMove/underscore_extend.d2,0:0:0-7:1:46", + "key": { + "range": "d2/testdata/d2oracle/TestMove/underscore_extend.d2,0:0:0-0:1:1", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/underscore_extend.d2,0:0:0-0:1:1", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "map": { + "range": "d2/testdata/d2oracle/TestMove/underscore_extend.d2,0:3:3-7:0:45", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestMove/underscore_extend.d2,1:2:7-3:3:27", + "key": { + "range": "d2/testdata/d2oracle/TestMove/underscore_extend.d2,1:2:7-1:3:8", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/underscore_extend.d2,1:2:7-1:3:8", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "map": { + "range": "d2/testdata/d2oracle/TestMove/underscore_extend.d2,1:5:10-3:2:26", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestMove/underscore_extend.d2,2:4:16-2:11:23", + "key": { + "range": "d2/testdata/d2oracle/TestMove/underscore_extend.d2,2:4:16-2:11:23", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/underscore_extend.d2,2:4:16-2:5:17", + "value": [ + { + "string": "_", + "raw_string": "_" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/underscore_extend.d2,2:6:18-2:7:19", + "value": [ + { + "string": "c", + "raw_string": "c" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/underscore_extend.d2,2:8:20-2:9:21", + "value": [ + { + "string": "e", + "raw_string": "e" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/underscore_extend.d2,2:10:22-2:11:23", + "value": [ + { + "string": "f", + "raw_string": "f" + } + ] + } + } + ] + }, + "primary": {}, + "value": {} + } + } + ] + } + } + } + }, + { + "map_key": { + "range": "d2/testdata/d2oracle/TestMove/underscore_extend.d2,4:2:30-6:3:44", + "key": { + "range": "d2/testdata/d2oracle/TestMove/underscore_extend.d2,4:2:30-4:3:31", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/underscore_extend.d2,4:2:30-4:3:31", + "value": [ + { + "string": "c", + "raw_string": "c" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "map": { + "range": "d2/testdata/d2oracle/TestMove/underscore_extend.d2,4:5:33-6:2:43", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestMove/underscore_extend.d2,5:4:39-5:5:40", + "key": { + "range": "d2/testdata/d2oracle/TestMove/underscore_extend.d2,5:4:39-5:5:40", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/underscore_extend.d2,5:4:39-5:5:40", + "value": [ + { + "string": "e", + "raw_string": "e" + } + ] + } + } + ] + }, + "primary": {}, + "value": {} + } + } + ] + } + } + } + } + ] + } + } + } + } + ] + }, + "root": { + "id": "", + "id_val": "", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + "edges": null, + "objects": [ + { + "id": "a", + "id_val": "a", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/underscore_extend.d2,0:0:0-0:1:1", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/underscore_extend.d2,0:0:0-0:1:1", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0, + "scope_key": "" + } + ], + "attributes": { + "label": { + "value": "a" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "b", + "id_val": "b", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/underscore_extend.d2,1:2:7-1:3:8", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/underscore_extend.d2,1:2:7-1:3:8", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0, + "scope_key": "a" + } + ], + "attributes": { + "label": { + "value": "b" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "c", + "id_val": "c", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/underscore_extend.d2,2:4:16-2:11:23", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/underscore_extend.d2,2:4:16-2:5:17", + "value": [ + { + "string": "_", + "raw_string": "_" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/underscore_extend.d2,2:6:18-2:7:19", + "value": [ + { + "string": "c", + "raw_string": "c" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/underscore_extend.d2,2:8:20-2:9:21", + "value": [ + { + "string": "e", + "raw_string": "e" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/underscore_extend.d2,2:10:22-2:11:23", + "value": [ + { + "string": "f", + "raw_string": "f" + } + ] + } + } + ] + }, + "key_path_index": 1, + "map_key_edge_index": 0, + "scope_key": "a" + }, + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/underscore_extend.d2,4:2:30-4:3:31", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/underscore_extend.d2,4:2:30-4:3:31", + "value": [ + { + "string": "c", + "raw_string": "c" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0, + "scope_key": "a" + } + ], + "attributes": { + "label": { + "value": "c" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "e", + "id_val": "e", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/underscore_extend.d2,2:4:16-2:11:23", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/underscore_extend.d2,2:4:16-2:5:17", + "value": [ + { + "string": "_", + "raw_string": "_" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/underscore_extend.d2,2:6:18-2:7:19", + "value": [ + { + "string": "c", + "raw_string": "c" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/underscore_extend.d2,2:8:20-2:9:21", + "value": [ + { + "string": "e", + "raw_string": "e" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/underscore_extend.d2,2:10:22-2:11:23", + "value": [ + { + "string": "f", + "raw_string": "f" + } + ] + } + } + ] + }, + "key_path_index": 2, + "map_key_edge_index": 0, + "scope_key": "a" + }, + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/underscore_extend.d2,5:4:39-5:5:40", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/underscore_extend.d2,5:4:39-5:5:40", + "value": [ + { + "string": "e", + "raw_string": "e" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0, + "scope_key": "a.c" + } + ], + "attributes": { + "label": { + "value": "e" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "f", + "id_val": "f", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/underscore_extend.d2,2:4:16-2:11:23", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/underscore_extend.d2,2:4:16-2:5:17", + "value": [ + { + "string": "_", + "raw_string": "_" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/underscore_extend.d2,2:6:18-2:7:19", + "value": [ + { + "string": "c", + "raw_string": "c" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/underscore_extend.d2,2:8:20-2:9:21", + "value": [ + { + "string": "e", + "raw_string": "e" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/underscore_extend.d2,2:10:22-2:11:23", + "value": [ + { + "string": "f", + "raw_string": "f" + } + ] + } + } + ] + }, + "key_path_index": 3, + "map_key_edge_index": 0, + "scope_key": "a" + } + ], + "attributes": { + "label": { + "value": "f" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ] + }, + "err": "" +} diff --git a/testdata/d2oracle/TestMove/underscore_merge.exp.json b/testdata/d2oracle/TestMove/underscore_merge.exp.json new file mode 100644 index 000000000..473097f49 --- /dev/null +++ b/testdata/d2oracle/TestMove/underscore_merge.exp.json @@ -0,0 +1,289 @@ +{ + "graph": { + "ast": { + "range": "d2/testdata/d2oracle/TestMove/underscore_merge.d2,0:0:0-6:0:32", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestMove/underscore_merge.d2,0:0:0-0:1:1", + "key": { + "range": "d2/testdata/d2oracle/TestMove/underscore_merge.d2,0:0:0-0:1:1", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/underscore_merge.d2,0:0:0-0:1:1", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + } + ] + }, + "primary": {}, + "value": {} + } + }, + { + "map_key": { + "range": "d2/testdata/d2oracle/TestMove/underscore_merge.d2,2:0:3-5:1:31", + "key": { + "range": "d2/testdata/d2oracle/TestMove/underscore_merge.d2,2:0:3-2:1:4", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/underscore_merge.d2,2:0:3-2:1:4", + "value": [ + { + "string": "c", + "raw_string": "c" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "map": { + "range": "d2/testdata/d2oracle/TestMove/underscore_merge.d2,2:3:6-5:0:30", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestMove/underscore_merge.d2,3:2:10-3:9:17", + "key": { + "range": "d2/testdata/d2oracle/TestMove/underscore_merge.d2,3:2:10-3:3:11", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/underscore_merge.d2,3:2:10-3:3:11", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "double_quoted_string": { + "range": "d2/testdata/d2oracle/TestMove/underscore_merge.d2,3:5:13-3:9:17", + "value": [ + { + "string": "yo", + "raw_string": "yo" + } + ] + } + } + } + }, + { + "map_key": { + "range": "d2/testdata/d2oracle/TestMove/underscore_merge.d2,4:2:20-4:11:29", + "key": { + "range": "d2/testdata/d2oracle/TestMove/underscore_merge.d2,4:2:20-4:3:21", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/underscore_merge.d2,4:2:20-4:3:21", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "double_quoted_string": { + "range": "d2/testdata/d2oracle/TestMove/underscore_merge.d2,4:5:23-4:11:29", + "value": [ + { + "string": "what", + "raw_string": "what" + } + ] + } + } + } + } + ] + } + } + } + } + ] + }, + "root": { + "id": "", + "id_val": "", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + "edges": null, + "objects": [ + { + "id": "a", + "id_val": "a", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/underscore_merge.d2,0:0:0-0:1:1", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/underscore_merge.d2,0:0:0-0:1:1", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "a" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "c", + "id_val": "c", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/underscore_merge.d2,2:0:3-2:1:4", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/underscore_merge.d2,2:0:3-2:1:4", + "value": [ + { + "string": "c", + "raw_string": "c" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "c" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "b", + "id_val": "b", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/underscore_merge.d2,3:2:10-3:3:11", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/underscore_merge.d2,3:2:10-3:3:11", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + }, + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/underscore_merge.d2,4:2:20-4:3:21", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/underscore_merge.d2,4:2:20-4:3:21", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "what" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ] + }, + "err": "" +} diff --git a/testdata/d2oracle/TestMove/underscore_merge_children.exp.json b/testdata/d2oracle/TestMove/underscore_merge_children.exp.json new file mode 100644 index 000000000..680711af6 --- /dev/null +++ b/testdata/d2oracle/TestMove/underscore_merge_children.exp.json @@ -0,0 +1,366 @@ +{ + "graph": { + "ast": { + "range": "d2/testdata/d2oracle/TestMove/underscore_merge_children.d2,0:0:0-7:0:27", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestMove/underscore_merge_children.d2,0:0:0-2:1:14", + "key": { + "range": "d2/testdata/d2oracle/TestMove/underscore_merge_children.d2,0:0:0-0:1:1", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/underscore_merge_children.d2,0:0:0-0:1:1", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "map": { + "range": "d2/testdata/d2oracle/TestMove/underscore_merge_children.d2,0:3:3-2:0:13", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestMove/underscore_merge_children.d2,1:2:7-1:7:12", + "key": { + "range": "d2/testdata/d2oracle/TestMove/underscore_merge_children.d2,1:2:7-1:7:12", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/underscore_merge_children.d2,1:2:7-1:3:8", + "value": [ + { + "string": "_", + "raw_string": "_" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/underscore_merge_children.d2,1:4:9-1:5:10", + "value": [ + { + "string": "c", + "raw_string": "c" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/underscore_merge_children.d2,1:6:11-1:7:12", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + } + ] + }, + "primary": {}, + "value": {} + } + } + ] + } + } + } + }, + { + "map_key": { + "range": "d2/testdata/d2oracle/TestMove/underscore_merge_children.d2,4:0:16-6:1:26", + "key": { + "range": "d2/testdata/d2oracle/TestMove/underscore_merge_children.d2,4:0:16-4:1:17", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/underscore_merge_children.d2,4:0:16-4:1:17", + "value": [ + { + "string": "c", + "raw_string": "c" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "map": { + "range": "d2/testdata/d2oracle/TestMove/underscore_merge_children.d2,4:3:19-6:0:25", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestMove/underscore_merge_children.d2,5:2:23-5:3:24", + "key": { + "range": "d2/testdata/d2oracle/TestMove/underscore_merge_children.d2,5:2:23-5:3:24", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/underscore_merge_children.d2,5:2:23-5:3:24", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + } + ] + }, + "primary": {}, + "value": {} + } + } + ] + } + } + } + } + ] + }, + "root": { + "id": "", + "id_val": "", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + "edges": null, + "objects": [ + { + "id": "a", + "id_val": "a", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/underscore_merge_children.d2,0:0:0-0:1:1", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/underscore_merge_children.d2,0:0:0-0:1:1", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0, + "scope_key": "" + } + ], + "attributes": { + "label": { + "value": "a" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "c", + "id_val": "c", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/underscore_merge_children.d2,1:2:7-1:7:12", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/underscore_merge_children.d2,1:2:7-1:3:8", + "value": [ + { + "string": "_", + "raw_string": "_" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/underscore_merge_children.d2,1:4:9-1:5:10", + "value": [ + { + "string": "c", + "raw_string": "c" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/underscore_merge_children.d2,1:6:11-1:7:12", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + } + ] + }, + "key_path_index": 1, + "map_key_edge_index": 0, + "scope_key": "" + }, + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/underscore_merge_children.d2,4:0:16-4:1:17", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/underscore_merge_children.d2,4:0:16-4:1:17", + "value": [ + { + "string": "c", + "raw_string": "c" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0, + "scope_key": "" + } + ], + "attributes": { + "label": { + "value": "c" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "b", + "id_val": "b", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/underscore_merge_children.d2,1:2:7-1:7:12", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/underscore_merge_children.d2,1:2:7-1:3:8", + "value": [ + { + "string": "_", + "raw_string": "_" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/underscore_merge_children.d2,1:4:9-1:5:10", + "value": [ + { + "string": "c", + "raw_string": "c" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/underscore_merge_children.d2,1:6:11-1:7:12", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + } + ] + }, + "key_path_index": 2, + "map_key_edge_index": 0, + "scope_key": "" + }, + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/underscore_merge_children.d2,5:2:23-5:3:24", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/underscore_merge_children.d2,5:2:23-5:3:24", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0, + "scope_key": "c" + } + ], + "attributes": { + "label": { + "value": "b" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ] + }, + "err": "" +} diff --git a/testdata/d2oracle/TestMove/underscore_split.exp.json b/testdata/d2oracle/TestMove/underscore_split.exp.json new file mode 100644 index 000000000..8984cf734 --- /dev/null +++ b/testdata/d2oracle/TestMove/underscore_split.exp.json @@ -0,0 +1,317 @@ +{ + "graph": { + "ast": { + "range": "d2/testdata/d2oracle/TestMove/underscore_split.d2,0:0:0-6:0:28", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestMove/underscore_split.d2,0:0:0-4:1:25", + "key": { + "range": "d2/testdata/d2oracle/TestMove/underscore_split.d2,0:0:0-0:1:1", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/underscore_split.d2,0:0:0-0:1:1", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "map": { + "range": "d2/testdata/d2oracle/TestMove/underscore_split.d2,0:3:3-4:0:24", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestMove/underscore_split.d2,1:2:7-3:3:23", + "key": { + "range": "d2/testdata/d2oracle/TestMove/underscore_split.d2,1:2:7-1:3:8", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/underscore_split.d2,1:2:7-1:3:8", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "map": { + "range": "d2/testdata/d2oracle/TestMove/underscore_split.d2,1:5:10-3:2:22", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestMove/underscore_split.d2,2:4:16-2:7:19", + "key": { + "range": "d2/testdata/d2oracle/TestMove/underscore_split.d2,2:4:16-2:7:19", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/underscore_split.d2,2:4:16-2:5:17", + "value": [ + { + "string": "_", + "raw_string": "_" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/underscore_split.d2,2:6:18-2:7:19", + "value": [ + { + "string": "f", + "raw_string": "f" + } + ] + } + } + ] + }, + "primary": {}, + "value": {} + } + } + ] + } + } + } + } + ] + } + } + } + }, + { + "map_key": { + "range": "d2/testdata/d2oracle/TestMove/underscore_split.d2,5:0:26-5:1:27", + "key": { + "range": "d2/testdata/d2oracle/TestMove/underscore_split.d2,5:0:26-5:1:27", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/underscore_split.d2,5:0:26-5:1:27", + "value": [ + { + "string": "c", + "raw_string": "c" + } + ] + } + } + ] + }, + "primary": {}, + "value": {} + } + } + ] + }, + "root": { + "id": "", + "id_val": "", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + "edges": null, + "objects": [ + { + "id": "a", + "id_val": "a", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/underscore_split.d2,0:0:0-0:1:1", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/underscore_split.d2,0:0:0-0:1:1", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "a" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "b", + "id_val": "b", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/underscore_split.d2,1:2:7-1:3:8", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/underscore_split.d2,1:2:7-1:3:8", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "b" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "f", + "id_val": "f", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/underscore_split.d2,2:4:16-2:7:19", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/underscore_split.d2,2:4:16-2:5:17", + "value": [ + { + "string": "_", + "raw_string": "_" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/underscore_split.d2,2:6:18-2:7:19", + "value": [ + { + "string": "f", + "raw_string": "f" + } + ] + } + } + ] + }, + "key_path_index": 1, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "f" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "c", + "id_val": "c", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/underscore_split.d2,5:0:26-5:1:27", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/underscore_split.d2,5:0:26-5:1:27", + "value": [ + { + "string": "c", + "raw_string": "c" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "c" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ] + }, + "err": "" +} diff --git a/testdata/d2oracle/TestMove/underscore_split_out.exp.json b/testdata/d2oracle/TestMove/underscore_split_out.exp.json new file mode 100644 index 000000000..b969371b1 --- /dev/null +++ b/testdata/d2oracle/TestMove/underscore_split_out.exp.json @@ -0,0 +1,435 @@ +{ + "graph": { + "ast": { + "range": "d2/testdata/d2oracle/TestMove/underscore_split_out.d2,0:0:0-10:0:60", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestMove/underscore_split_out.d2,0:0:0-9:1:59", + "key": { + "range": "d2/testdata/d2oracle/TestMove/underscore_split_out.d2,0:0:0-0:1:1", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/underscore_split_out.d2,0:0:0-0:1:1", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "map": { + "range": "d2/testdata/d2oracle/TestMove/underscore_split_out.d2,0:3:3-9:0:58", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestMove/underscore_split_out.d2,1:2:7-3:3:23", + "key": { + "range": "d2/testdata/d2oracle/TestMove/underscore_split_out.d2,1:2:7-1:3:8", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/underscore_split_out.d2,1:2:7-1:3:8", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "map": { + "range": "d2/testdata/d2oracle/TestMove/underscore_split_out.d2,1:5:10-3:2:22", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestMove/underscore_split_out.d2,2:4:16-2:7:19", + "key": { + "range": "d2/testdata/d2oracle/TestMove/underscore_split_out.d2,2:4:16-2:7:19", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/underscore_split_out.d2,2:4:16-2:5:17", + "value": [ + { + "string": "_", + "raw_string": "_" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/underscore_split_out.d2,2:6:18-2:7:19", + "value": [ + { + "string": "c", + "raw_string": "c" + } + ] + } + } + ] + }, + "primary": {}, + "value": {} + } + } + ] + } + } + } + }, + { + "map_key": { + "range": "d2/testdata/d2oracle/TestMove/underscore_split_out.d2,4:2:26-8:3:57", + "key": { + "range": "d2/testdata/d2oracle/TestMove/underscore_split_out.d2,4:2:26-4:3:27", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/underscore_split_out.d2,4:2:26-4:3:27", + "value": [ + { + "string": "c", + "raw_string": "c" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "map": { + "range": "d2/testdata/d2oracle/TestMove/underscore_split_out.d2,4:5:29-8:2:56", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestMove/underscore_split_out.d2,5:4:35-7:5:53", + "key": { + "range": "d2/testdata/d2oracle/TestMove/underscore_split_out.d2,5:4:35-5:5:36", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/underscore_split_out.d2,5:4:35-5:5:36", + "value": [ + { + "string": "e", + "raw_string": "e" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "map": { + "range": "d2/testdata/d2oracle/TestMove/underscore_split_out.d2,5:7:38-7:4:52", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestMove/underscore_split_out.d2,6:6:46-6:7:47", + "key": { + "range": "d2/testdata/d2oracle/TestMove/underscore_split_out.d2,6:6:46-6:7:47", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/underscore_split_out.d2,6:6:46-6:7:47", + "value": [ + { + "string": "f", + "raw_string": "f" + } + ] + } + } + ] + }, + "primary": {}, + "value": {} + } + } + ] + } + } + } + } + ] + } + } + } + } + ] + } + } + } + } + ] + }, + "root": { + "id": "", + "id_val": "", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + "edges": null, + "objects": [ + { + "id": "a", + "id_val": "a", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/underscore_split_out.d2,0:0:0-0:1:1", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/underscore_split_out.d2,0:0:0-0:1:1", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "a" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "b", + "id_val": "b", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/underscore_split_out.d2,1:2:7-1:3:8", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/underscore_split_out.d2,1:2:7-1:3:8", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "b" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "c", + "id_val": "c", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/underscore_split_out.d2,2:4:16-2:7:19", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/underscore_split_out.d2,2:4:16-2:5:17", + "value": [ + { + "string": "_", + "raw_string": "_" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/underscore_split_out.d2,2:6:18-2:7:19", + "value": [ + { + "string": "c", + "raw_string": "c" + } + ] + } + } + ] + }, + "key_path_index": 1, + "map_key_edge_index": 0 + }, + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/underscore_split_out.d2,4:2:26-4:3:27", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/underscore_split_out.d2,4:2:26-4:3:27", + "value": [ + { + "string": "c", + "raw_string": "c" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "c" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "e", + "id_val": "e", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/underscore_split_out.d2,5:4:35-5:5:36", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/underscore_split_out.d2,5:4:35-5:5:36", + "value": [ + { + "string": "e", + "raw_string": "e" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "e" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "f", + "id_val": "f", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/underscore_split_out.d2,6:6:46-6:7:47", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/underscore_split_out.d2,6:6:46-6:7:47", + "value": [ + { + "string": "f", + "raw_string": "f" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "f" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ] + }, + "err": "" +} diff --git a/testdata/d2oracle/TestMove/underscore_transplant.exp.json b/testdata/d2oracle/TestMove/underscore_transplant.exp.json new file mode 100644 index 000000000..5f001e047 --- /dev/null +++ b/testdata/d2oracle/TestMove/underscore_transplant.exp.json @@ -0,0 +1,226 @@ +{ + "graph": { + "ast": { + "range": "d2/testdata/d2oracle/TestMove/underscore_transplant.d2,0:0:0-4:0:13", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestMove/underscore_transplant.d2,0:0:0-2:1:10", + "key": { + "range": "d2/testdata/d2oracle/TestMove/underscore_transplant.d2,0:0:0-0:1:1", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/underscore_transplant.d2,0:0:0-0:1:1", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "map": { + "range": "d2/testdata/d2oracle/TestMove/underscore_transplant.d2,0:3:3-2:0:9", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestMove/underscore_transplant.d2,1:2:7-1:3:8", + "key": { + "range": "d2/testdata/d2oracle/TestMove/underscore_transplant.d2,1:2:7-1:3:8", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/underscore_transplant.d2,1:2:7-1:3:8", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + } + ] + }, + "primary": {}, + "value": {} + } + } + ] + } + } + } + }, + { + "map_key": { + "range": "d2/testdata/d2oracle/TestMove/underscore_transplant.d2,3:0:11-3:1:12", + "key": { + "range": "d2/testdata/d2oracle/TestMove/underscore_transplant.d2,3:0:11-3:1:12", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/underscore_transplant.d2,3:0:11-3:1:12", + "value": [ + { + "string": "c", + "raw_string": "c" + } + ] + } + } + ] + }, + "primary": {}, + "value": {} + } + } + ] + }, + "root": { + "id": "", + "id_val": "", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + "edges": null, + "objects": [ + { + "id": "a", + "id_val": "a", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/underscore_transplant.d2,0:0:0-0:1:1", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/underscore_transplant.d2,0:0:0-0:1:1", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "a" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "b", + "id_val": "b", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/underscore_transplant.d2,1:2:7-1:3:8", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/underscore_transplant.d2,1:2:7-1:3:8", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "b" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "c", + "id_val": "c", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/underscore_transplant.d2,3:0:11-3:1:12", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/underscore_transplant.d2,3:0:11-3:1:12", + "value": [ + { + "string": "c", + "raw_string": "c" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "c" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ] + }, + "err": "" +} diff --git a/testdata/d2oracle/TestMove/unique_name.exp.json b/testdata/d2oracle/TestMove/unique_name.exp.json new file mode 100644 index 000000000..013ff4319 --- /dev/null +++ b/testdata/d2oracle/TestMove/unique_name.exp.json @@ -0,0 +1,385 @@ +{ + "graph": { + "ast": { + "range": "d2/testdata/d2oracle/TestMove/unique_name.d2,0:0:0-6:0:23", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestMove/unique_name.d2,0:0:0-3:1:16", + "key": { + "range": "d2/testdata/d2oracle/TestMove/unique_name.d2,0:0:0-0:1:1", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/unique_name.d2,0:0:0-0:1:1", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "map": { + "range": "d2/testdata/d2oracle/TestMove/unique_name.d2,0:3:3-3:0:15", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestMove/unique_name.d2,1:2:7-1:3:8", + "key": { + "range": "d2/testdata/d2oracle/TestMove/unique_name.d2,1:2:7-1:3:8", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/unique_name.d2,1:2:7-1:3:8", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + } + ] + }, + "primary": {}, + "value": {} + } + }, + { + "map_key": { + "range": "d2/testdata/d2oracle/TestMove/unique_name.d2,2:2:11-2:5:14", + "key": { + "range": "d2/testdata/d2oracle/TestMove/unique_name.d2,2:2:11-2:5:14", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/unique_name.d2,2:2:11-2:5:14", + "value": [ + { + "string": "b 2", + "raw_string": "b 2" + } + ] + } + } + ] + }, + "primary": {}, + "value": {} + } + } + ] + } + } + } + }, + { + "map_key": { + "range": "d2/testdata/d2oracle/TestMove/unique_name.d2,4:0:17-4:3:20", + "key": { + "range": "d2/testdata/d2oracle/TestMove/unique_name.d2,4:0:17-4:3:20", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/unique_name.d2,4:0:17-4:1:18", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/unique_name.d2,4:2:19-4:3:20", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + } + ] + }, + "primary": {}, + "value": {} + } + }, + { + "map_key": { + "range": "d2/testdata/d2oracle/TestMove/unique_name.d2,5:0:21-5:1:22", + "key": { + "range": "d2/testdata/d2oracle/TestMove/unique_name.d2,5:0:21-5:1:22", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/unique_name.d2,5:0:21-5:1:22", + "value": [ + { + "string": "c", + "raw_string": "c" + } + ] + } + } + ] + }, + "primary": {}, + "value": {} + } + } + ] + }, + "root": { + "id": "", + "id_val": "", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + "edges": null, + "objects": [ + { + "id": "a", + "id_val": "a", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/unique_name.d2,0:0:0-0:1:1", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/unique_name.d2,0:0:0-0:1:1", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + }, + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/unique_name.d2,4:0:17-4:3:20", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/unique_name.d2,4:0:17-4:1:18", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/unique_name.d2,4:2:19-4:3:20", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "a" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "b", + "id_val": "b", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/unique_name.d2,1:2:7-1:3:8", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/unique_name.d2,1:2:7-1:3:8", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + }, + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/unique_name.d2,4:0:17-4:3:20", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/unique_name.d2,4:0:17-4:1:18", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/unique_name.d2,4:2:19-4:3:20", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + } + ] + }, + "key_path_index": 1, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "b" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "b 2", + "id_val": "b 2", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/unique_name.d2,2:2:11-2:5:14", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/unique_name.d2,2:2:11-2:5:14", + "value": [ + { + "string": "b 2", + "raw_string": "b 2" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "b 2" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "c", + "id_val": "c", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/unique_name.d2,5:0:21-5:1:22", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/unique_name.d2,5:0:21-5:1:22", + "value": [ + { + "string": "c", + "raw_string": "c" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "c" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ] + }, + "err": "" +} diff --git a/testdata/d2oracle/TestMove/unique_name_with_references.exp.json b/testdata/d2oracle/TestMove/unique_name_with_references.exp.json new file mode 100644 index 000000000..60bf00ba9 --- /dev/null +++ b/testdata/d2oracle/TestMove/unique_name_with_references.exp.json @@ -0,0 +1,476 @@ +{ + "graph": { + "ast": { + "range": "d2/testdata/d2oracle/TestMove/unique_name_with_references.d2,0:0:0-6:0:30", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestMove/unique_name_with_references.d2,0:0:0-3:1:16", + "key": { + "range": "d2/testdata/d2oracle/TestMove/unique_name_with_references.d2,0:0:0-0:1:1", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/unique_name_with_references.d2,0:0:0-0:1:1", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "map": { + "range": "d2/testdata/d2oracle/TestMove/unique_name_with_references.d2,0:3:3-3:0:15", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestMove/unique_name_with_references.d2,1:2:7-1:3:8", + "key": { + "range": "d2/testdata/d2oracle/TestMove/unique_name_with_references.d2,1:2:7-1:3:8", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/unique_name_with_references.d2,1:2:7-1:3:8", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + } + ] + }, + "primary": {}, + "value": {} + } + }, + { + "map_key": { + "range": "d2/testdata/d2oracle/TestMove/unique_name_with_references.d2,2:2:11-2:5:14", + "key": { + "range": "d2/testdata/d2oracle/TestMove/unique_name_with_references.d2,2:2:11-2:5:14", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/unique_name_with_references.d2,2:2:11-2:5:14", + "value": [ + { + "string": "b 2", + "raw_string": "b 2" + } + ] + } + } + ] + }, + "primary": {}, + "value": {} + } + } + ] + } + } + } + }, + { + "map_key": { + "range": "d2/testdata/d2oracle/TestMove/unique_name_with_references.d2,4:0:17-4:10:27", + "edges": [ + { + "range": "d2/testdata/d2oracle/TestMove/unique_name_with_references.d2,4:0:17-4:10:27", + "src": { + "range": "d2/testdata/d2oracle/TestMove/unique_name_with_references.d2,4:0:17-4:2:19", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/unique_name_with_references.d2,4:0:17-4:1:18", + "value": [ + { + "string": "d", + "raw_string": "d" + } + ] + } + } + ] + }, + "src_arrow": "", + "dst": { + "range": "d2/testdata/d2oracle/TestMove/unique_name_with_references.d2,4:4:21-4:10:27", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/unique_name_with_references.d2,4:5:22-4:6:23", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/unique_name_with_references.d2,4:7:24-4:10:27", + "value": [ + { + "string": "b 2", + "raw_string": "b 2" + } + ] + } + } + ] + }, + "dst_arrow": ">" + } + ], + "primary": {}, + "value": {} + } + }, + { + "map_key": { + "range": "d2/testdata/d2oracle/TestMove/unique_name_with_references.d2,5:0:28-5:1:29", + "key": { + "range": "d2/testdata/d2oracle/TestMove/unique_name_with_references.d2,5:0:28-5:1:29", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/unique_name_with_references.d2,5:0:28-5:1:29", + "value": [ + { + "string": "c", + "raw_string": "c" + } + ] + } + } + ] + }, + "primary": {}, + "value": {} + } + } + ] + }, + "root": { + "id": "", + "id_val": "", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + "edges": [ + { + "index": 0, + "minWidth": 0, + "minHeight": 0, + "label_dimensions": { + "width": 0, + "height": 0 + }, + "isCurve": false, + "src_arrow": false, + "dst_arrow": true, + "references": [ + { + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ], + "objects": [ + { + "id": "a", + "id_val": "a", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/unique_name_with_references.d2,0:0:0-0:1:1", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/unique_name_with_references.d2,0:0:0-0:1:1", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + }, + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/unique_name_with_references.d2,4:4:21-4:10:27", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/unique_name_with_references.d2,4:5:22-4:6:23", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/unique_name_with_references.d2,4:7:24-4:10:27", + "value": [ + { + "string": "b 2", + "raw_string": "b 2" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "a" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "b", + "id_val": "b", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/unique_name_with_references.d2,1:2:7-1:3:8", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/unique_name_with_references.d2,1:2:7-1:3:8", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "b" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "b 2", + "id_val": "b 2", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/unique_name_with_references.d2,2:2:11-2:5:14", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/unique_name_with_references.d2,2:2:11-2:5:14", + "value": [ + { + "string": "b 2", + "raw_string": "b 2" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + }, + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/unique_name_with_references.d2,4:4:21-4:10:27", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/unique_name_with_references.d2,4:5:22-4:6:23", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/unique_name_with_references.d2,4:7:24-4:10:27", + "value": [ + { + "string": "b 2", + "raw_string": "b 2" + } + ] + } + } + ] + }, + "key_path_index": 1, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "b 2" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "c", + "id_val": "c", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/unique_name_with_references.d2,5:0:28-5:1:29", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/unique_name_with_references.d2,5:0:28-5:1:29", + "value": [ + { + "string": "c", + "raw_string": "c" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "c" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "d", + "id_val": "d", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestMove/unique_name_with_references.d2,4:0:17-4:2:19", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestMove/unique_name_with_references.d2,4:0:17-4:1:18", + "value": [ + { + "string": "d", + "raw_string": "d" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "d" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ] + }, + "err": "" +} diff --git a/testdata/d2oracle/TestRename/arrows.exp.json b/testdata/d2oracle/TestRename/arrows.exp.json new file mode 100644 index 000000000..e83ff7555 --- /dev/null +++ b/testdata/d2oracle/TestRename/arrows.exp.json @@ -0,0 +1,185 @@ +{ + "graph": { + "ast": { + "range": "d2/testdata/d2oracle/TestRename/arrows.d2,0:0:0-1:0:7", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestRename/arrows.d2,0:0:0-0:6:6", + "edges": [ + { + "range": "d2/testdata/d2oracle/TestRename/arrows.d2,0:0:0-0:6:6", + "src": { + "range": "d2/testdata/d2oracle/TestRename/arrows.d2,0:0:0-0:2:2", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/arrows.d2,0:0:0-0:1:1", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "src_arrow": "<", + "dst": { + "range": "d2/testdata/d2oracle/TestRename/arrows.d2,0:4:4-0:6:6", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/arrows.d2,0:5:5-0:6:6", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + } + ] + }, + "dst_arrow": "" + } + ], + "primary": {}, + "value": {} + } + } + ] + }, + "root": { + "id": "", + "id_val": "", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + "edges": [ + { + "index": 0, + "minWidth": 0, + "minHeight": 0, + "label_dimensions": { + "width": 0, + "height": 0 + }, + "isCurve": false, + "src_arrow": true, + "dst_arrow": false, + "references": [ + { + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ], + "objects": [ + { + "id": "x", + "id_val": "x", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestRename/arrows.d2,0:0:0-0:2:2", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/arrows.d2,0:0:0-0:1:1", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "x" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "y", + "id_val": "y", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestRename/arrows.d2,0:4:4-0:6:6", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/arrows.d2,0:5:5-0:6:6", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "y" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ] + }, + "err": "" +} diff --git a/testdata/d2oracle/TestRename/arrows_chain.exp.json b/testdata/d2oracle/TestRename/arrows_chain.exp.json new file mode 100644 index 000000000..7838e805c --- /dev/null +++ b/testdata/d2oracle/TestRename/arrows_chain.exp.json @@ -0,0 +1,433 @@ +{ + "graph": { + "ast": { + "range": "d2/testdata/d2oracle/TestRename/arrows_chain.d2,0:0:0-1:0:18", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestRename/arrows_chain.d2,0:0:0-0:17:17", + "edges": [ + { + "range": "d2/testdata/d2oracle/TestRename/arrows_chain.d2,0:0:0-0:8:8", + "src": { + "range": "d2/testdata/d2oracle/TestRename/arrows_chain.d2,0:0:0-0:2:2", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/arrows_chain.d2,0:0:0-0:1:1", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "src_arrow": "<", + "dst": { + "range": "d2/testdata/d2oracle/TestRename/arrows_chain.d2,0:5:5-0:8:8", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/arrows_chain.d2,0:6:6-0:7:7", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + } + ] + }, + "dst_arrow": ">" + }, + { + "range": "d2/testdata/d2oracle/TestRename/arrows_chain.d2,0:5:5-0:13:13", + "src": { + "range": "d2/testdata/d2oracle/TestRename/arrows_chain.d2,0:5:5-0:8:8", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/arrows_chain.d2,0:6:6-0:7:7", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + } + ] + }, + "src_arrow": "", + "dst": { + "range": "d2/testdata/d2oracle/TestRename/arrows_chain.d2,0:10:10-0:13:13", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/arrows_chain.d2,0:11:11-0:12:12", + "value": [ + { + "string": "z", + "raw_string": "z" + } + ] + } + } + ] + }, + "dst_arrow": ">" + }, + { + "range": "d2/testdata/d2oracle/TestRename/arrows_chain.d2,0:10:10-0:17:17", + "src": { + "range": "d2/testdata/d2oracle/TestRename/arrows_chain.d2,0:10:10-0:13:13", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/arrows_chain.d2,0:11:11-0:12:12", + "value": [ + { + "string": "z", + "raw_string": "z" + } + ] + } + } + ] + }, + "src_arrow": "", + "dst": { + "range": "d2/testdata/d2oracle/TestRename/arrows_chain.d2,0:15:15-0:17:17", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/arrows_chain.d2,0:16:16-0:17:17", + "value": [ + { + "string": "q", + "raw_string": "q" + } + ] + } + } + ] + }, + "dst_arrow": ">" + } + ], + "primary": {}, + "value": {} + } + } + ] + }, + "root": { + "id": "", + "id_val": "", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + "edges": [ + { + "index": 0, + "minWidth": 0, + "minHeight": 0, + "label_dimensions": { + "width": 0, + "height": 0 + }, + "isCurve": false, + "src_arrow": true, + "dst_arrow": true, + "references": [ + { + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "index": 0, + "minWidth": 0, + "minHeight": 0, + "label_dimensions": { + "width": 0, + "height": 0 + }, + "isCurve": false, + "src_arrow": false, + "dst_arrow": true, + "references": [ + { + "map_key_edge_index": 1 + } + ], + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "index": 0, + "minWidth": 0, + "minHeight": 0, + "label_dimensions": { + "width": 0, + "height": 0 + }, + "isCurve": false, + "src_arrow": false, + "dst_arrow": true, + "references": [ + { + "map_key_edge_index": 2 + } + ], + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ], + "objects": [ + { + "id": "x", + "id_val": "x", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestRename/arrows_chain.d2,0:0:0-0:2:2", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/arrows_chain.d2,0:0:0-0:1:1", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "x" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "y", + "id_val": "y", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestRename/arrows_chain.d2,0:5:5-0:8:8", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/arrows_chain.d2,0:6:6-0:7:7", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + }, + { + "key": { + "range": "d2/testdata/d2oracle/TestRename/arrows_chain.d2,0:5:5-0:8:8", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/arrows_chain.d2,0:6:6-0:7:7", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 1 + } + ], + "attributes": { + "label": { + "value": "y" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "z", + "id_val": "z", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestRename/arrows_chain.d2,0:10:10-0:13:13", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/arrows_chain.d2,0:11:11-0:12:12", + "value": [ + { + "string": "z", + "raw_string": "z" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 1 + }, + { + "key": { + "range": "d2/testdata/d2oracle/TestRename/arrows_chain.d2,0:10:10-0:13:13", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/arrows_chain.d2,0:11:11-0:12:12", + "value": [ + { + "string": "z", + "raw_string": "z" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 2 + } + ], + "attributes": { + "label": { + "value": "z" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "q", + "id_val": "q", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestRename/arrows_chain.d2,0:15:15-0:17:17", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/arrows_chain.d2,0:16:16-0:17:17", + "value": [ + { + "string": "q", + "raw_string": "q" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 2 + } + ], + "attributes": { + "label": { + "value": "q" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ] + }, + "err": "" +} diff --git a/testdata/d2oracle/TestRename/arrows_complex.exp.json b/testdata/d2oracle/TestRename/arrows_complex.exp.json new file mode 100644 index 000000000..8cfc0614e --- /dev/null +++ b/testdata/d2oracle/TestRename/arrows_complex.exp.json @@ -0,0 +1,341 @@ +{ + "graph": { + "ast": { + "range": "d2/testdata/d2oracle/TestRename/arrows_complex.d2,0:0:0-1:0:18", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestRename/arrows_complex.d2,0:0:0-0:17:17", + "key": { + "range": "d2/testdata/d2oracle/TestRename/arrows_complex.d2,0:0:0-0:4:4", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/arrows_complex.d2,0:0:0-0:1:1", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/arrows_complex.d2,0:2:2-0:3:3", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + } + ] + }, + "edges": [ + { + "range": "d2/testdata/d2oracle/TestRename/arrows_complex.d2,0:5:5-0:12:12", + "src": { + "range": "d2/testdata/d2oracle/TestRename/arrows_complex.d2,0:5:5-0:7:7", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/arrows_complex.d2,0:5:5-0:6:6", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "src_arrow": "<", + "dst": { + "range": "d2/testdata/d2oracle/TestRename/arrows_complex.d2,0:10:10-0:12:12", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/arrows_complex.d2,0:11:11-0:12:12", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + } + ] + }, + "dst_arrow": ">" + } + ], + "edge_key": { + "range": "d2/testdata/d2oracle/TestRename/arrows_complex.d2,0:14:14-0:17:17", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/arrows_complex.d2,0:14:14-0:15:15", + "value": [ + { + "string": "q", + "raw_string": "q" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/arrows_complex.d2,0:16:16-0:17:17", + "value": [ + { + "string": "z", + "raw_string": "z" + } + ] + } + } + ] + }, + "primary": {}, + "value": {} + } + } + ] + }, + "root": { + "id": "", + "id_val": "", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + "edges": [ + { + "index": 0, + "minWidth": 0, + "minHeight": 0, + "label_dimensions": { + "width": 0, + "height": 0 + }, + "isCurve": false, + "src_arrow": true, + "dst_arrow": true, + "references": [ + { + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ], + "objects": [ + { + "id": "a", + "id_val": "a", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestRename/arrows_complex.d2,0:0:0-0:4:4", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/arrows_complex.d2,0:0:0-0:1:1", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/arrows_complex.d2,0:2:2-0:3:3", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "a" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "b", + "id_val": "b", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestRename/arrows_complex.d2,0:0:0-0:4:4", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/arrows_complex.d2,0:0:0-0:1:1", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/arrows_complex.d2,0:2:2-0:3:3", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + } + ] + }, + "key_path_index": 1, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "b" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "x", + "id_val": "x", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestRename/arrows_complex.d2,0:5:5-0:7:7", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/arrows_complex.d2,0:5:5-0:6:6", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "x" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "y", + "id_val": "y", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestRename/arrows_complex.d2,0:10:10-0:12:12", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/arrows_complex.d2,0:11:11-0:12:12", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "y" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ] + }, + "err": "" +} diff --git a/testdata/d2oracle/TestRename/arrows_trim_common.exp.json b/testdata/d2oracle/TestRename/arrows_trim_common.exp.json new file mode 100644 index 000000000..385ac743d --- /dev/null +++ b/testdata/d2oracle/TestRename/arrows_trim_common.exp.json @@ -0,0 +1,489 @@ +{ + "graph": { + "ast": { + "range": "d2/testdata/d2oracle/TestRename/arrows_trim_common.d2,0:0:0-1:0:22", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestRename/arrows_trim_common.d2,0:0:0-0:21:21", + "key": { + "range": "d2/testdata/d2oracle/TestRename/arrows_trim_common.d2,0:0:0-0:2:2", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/arrows_trim_common.d2,0:0:0-0:1:1", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "edges": [ + { + "range": "d2/testdata/d2oracle/TestRename/arrows_trim_common.d2,0:3:3-0:11:11", + "src": { + "range": "d2/testdata/d2oracle/TestRename/arrows_trim_common.d2,0:3:3-0:5:5", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/arrows_trim_common.d2,0:3:3-0:4:4", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "src_arrow": "<", + "dst": { + "range": "d2/testdata/d2oracle/TestRename/arrows_trim_common.d2,0:8:8-0:11:11", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/arrows_trim_common.d2,0:9:9-0:10:10", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + } + ] + }, + "dst_arrow": ">" + }, + { + "range": "d2/testdata/d2oracle/TestRename/arrows_trim_common.d2,0:8:8-0:16:16", + "src": { + "range": "d2/testdata/d2oracle/TestRename/arrows_trim_common.d2,0:8:8-0:11:11", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/arrows_trim_common.d2,0:9:9-0:10:10", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + } + ] + }, + "src_arrow": "", + "dst": { + "range": "d2/testdata/d2oracle/TestRename/arrows_trim_common.d2,0:13:13-0:16:16", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/arrows_trim_common.d2,0:14:14-0:15:15", + "value": [ + { + "string": "z", + "raw_string": "z" + } + ] + } + } + ] + }, + "dst_arrow": ">" + }, + { + "range": "d2/testdata/d2oracle/TestRename/arrows_trim_common.d2,0:13:13-0:20:20", + "src": { + "range": "d2/testdata/d2oracle/TestRename/arrows_trim_common.d2,0:13:13-0:16:16", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/arrows_trim_common.d2,0:14:14-0:15:15", + "value": [ + { + "string": "z", + "raw_string": "z" + } + ] + } + } + ] + }, + "src_arrow": "", + "dst": { + "range": "d2/testdata/d2oracle/TestRename/arrows_trim_common.d2,0:18:18-0:20:20", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/arrows_trim_common.d2,0:19:19-0:20:20", + "value": [ + { + "string": "q", + "raw_string": "q" + } + ] + } + } + ] + }, + "dst_arrow": ">" + } + ], + "primary": {}, + "value": {} + } + } + ] + }, + "root": { + "id": "", + "id_val": "", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + "edges": [ + { + "index": 0, + "minWidth": 0, + "minHeight": 0, + "label_dimensions": { + "width": 0, + "height": 0 + }, + "isCurve": false, + "src_arrow": true, + "dst_arrow": true, + "references": [ + { + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "index": 0, + "minWidth": 0, + "minHeight": 0, + "label_dimensions": { + "width": 0, + "height": 0 + }, + "isCurve": false, + "src_arrow": false, + "dst_arrow": true, + "references": [ + { + "map_key_edge_index": 1 + } + ], + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "index": 0, + "minWidth": 0, + "minHeight": 0, + "label_dimensions": { + "width": 0, + "height": 0 + }, + "isCurve": false, + "src_arrow": false, + "dst_arrow": true, + "references": [ + { + "map_key_edge_index": 2 + } + ], + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ], + "objects": [ + { + "id": "x", + "id_val": "x", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestRename/arrows_trim_common.d2,0:0:0-0:2:2", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/arrows_trim_common.d2,0:0:0-0:1:1", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "x" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "x", + "id_val": "x", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestRename/arrows_trim_common.d2,0:3:3-0:5:5", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/arrows_trim_common.d2,0:3:3-0:4:4", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "x" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "y", + "id_val": "y", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestRename/arrows_trim_common.d2,0:8:8-0:11:11", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/arrows_trim_common.d2,0:9:9-0:10:10", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + }, + { + "key": { + "range": "d2/testdata/d2oracle/TestRename/arrows_trim_common.d2,0:8:8-0:11:11", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/arrows_trim_common.d2,0:9:9-0:10:10", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 1 + } + ], + "attributes": { + "label": { + "value": "y" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "z", + "id_val": "z", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestRename/arrows_trim_common.d2,0:13:13-0:16:16", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/arrows_trim_common.d2,0:14:14-0:15:15", + "value": [ + { + "string": "z", + "raw_string": "z" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 1 + }, + { + "key": { + "range": "d2/testdata/d2oracle/TestRename/arrows_trim_common.d2,0:13:13-0:16:16", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/arrows_trim_common.d2,0:14:14-0:15:15", + "value": [ + { + "string": "z", + "raw_string": "z" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 2 + } + ], + "attributes": { + "label": { + "value": "z" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "q", + "id_val": "q", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestRename/arrows_trim_common.d2,0:18:18-0:20:20", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/arrows_trim_common.d2,0:19:19-0:20:20", + "value": [ + { + "string": "q", + "raw_string": "q" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 2 + } + ], + "attributes": { + "label": { + "value": "q" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ] + }, + "err": "" +} diff --git a/testdata/d2oracle/TestRename/arrows_trim_common_2.exp.json b/testdata/d2oracle/TestRename/arrows_trim_common_2.exp.json new file mode 100644 index 000000000..a05533059 --- /dev/null +++ b/testdata/d2oracle/TestRename/arrows_trim_common_2.exp.json @@ -0,0 +1,771 @@ +{ + "graph": { + "ast": { + "range": "d2/testdata/d2oracle/TestRename/arrows_trim_common_2.d2,0:0:0-1:0:27", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestRename/arrows_trim_common_2.d2,0:0:0-0:26:26", + "edges": [ + { + "range": "d2/testdata/d2oracle/TestRename/arrows_trim_common_2.d2,0:0:0-0:12:12", + "src": { + "range": "d2/testdata/d2oracle/TestRename/arrows_trim_common_2.d2,0:0:0-0:4:4", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/arrows_trim_common_2.d2,0:0:0-0:1:1", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/arrows_trim_common_2.d2,0:2:2-0:3:3", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "src_arrow": "<", + "dst": { + "range": "d2/testdata/d2oracle/TestRename/arrows_trim_common_2.d2,0:7:7-0:12:12", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/arrows_trim_common_2.d2,0:8:8-0:9:9", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/arrows_trim_common_2.d2,0:10:10-0:11:11", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + } + ] + }, + "dst_arrow": ">" + }, + { + "range": "d2/testdata/d2oracle/TestRename/arrows_trim_common_2.d2,0:7:7-0:19:19", + "src": { + "range": "d2/testdata/d2oracle/TestRename/arrows_trim_common_2.d2,0:7:7-0:12:12", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/arrows_trim_common_2.d2,0:8:8-0:9:9", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/arrows_trim_common_2.d2,0:10:10-0:11:11", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + } + ] + }, + "src_arrow": "", + "dst": { + "range": "d2/testdata/d2oracle/TestRename/arrows_trim_common_2.d2,0:14:14-0:19:19", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/arrows_trim_common_2.d2,0:15:15-0:16:16", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/arrows_trim_common_2.d2,0:17:17-0:18:18", + "value": [ + { + "string": "z", + "raw_string": "z" + } + ] + } + } + ] + }, + "dst_arrow": ">" + }, + { + "range": "d2/testdata/d2oracle/TestRename/arrows_trim_common_2.d2,0:14:14-0:26:26", + "src": { + "range": "d2/testdata/d2oracle/TestRename/arrows_trim_common_2.d2,0:14:14-0:19:19", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/arrows_trim_common_2.d2,0:15:15-0:16:16", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/arrows_trim_common_2.d2,0:17:17-0:18:18", + "value": [ + { + "string": "z", + "raw_string": "z" + } + ] + } + } + ] + }, + "src_arrow": "", + "dst": { + "range": "d2/testdata/d2oracle/TestRename/arrows_trim_common_2.d2,0:21:21-0:26:26", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/arrows_trim_common_2.d2,0:22:22-0:23:23", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/arrows_trim_common_2.d2,0:24:24-0:26:26", + "value": [ + { + "string": "q)", + "raw_string": "q)" + } + ] + } + } + ] + }, + "dst_arrow": ">" + } + ], + "primary": {}, + "value": {} + } + } + ] + }, + "root": { + "id": "", + "id_val": "", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + "edges": [ + { + "index": 0, + "minWidth": 0, + "minHeight": 0, + "label_dimensions": { + "width": 0, + "height": 0 + }, + "isCurve": false, + "src_arrow": true, + "dst_arrow": true, + "references": [ + { + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "index": 0, + "minWidth": 0, + "minHeight": 0, + "label_dimensions": { + "width": 0, + "height": 0 + }, + "isCurve": false, + "src_arrow": false, + "dst_arrow": true, + "references": [ + { + "map_key_edge_index": 1 + } + ], + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "index": 0, + "minWidth": 0, + "minHeight": 0, + "label_dimensions": { + "width": 0, + "height": 0 + }, + "isCurve": false, + "src_arrow": false, + "dst_arrow": true, + "references": [ + { + "map_key_edge_index": 2 + } + ], + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ], + "objects": [ + { + "id": "x", + "id_val": "x", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestRename/arrows_trim_common_2.d2,0:0:0-0:4:4", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/arrows_trim_common_2.d2,0:0:0-0:1:1", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/arrows_trim_common_2.d2,0:2:2-0:3:3", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + }, + { + "key": { + "range": "d2/testdata/d2oracle/TestRename/arrows_trim_common_2.d2,0:7:7-0:12:12", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/arrows_trim_common_2.d2,0:8:8-0:9:9", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/arrows_trim_common_2.d2,0:10:10-0:11:11", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + }, + { + "key": { + "range": "d2/testdata/d2oracle/TestRename/arrows_trim_common_2.d2,0:7:7-0:12:12", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/arrows_trim_common_2.d2,0:8:8-0:9:9", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/arrows_trim_common_2.d2,0:10:10-0:11:11", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 1 + }, + { + "key": { + "range": "d2/testdata/d2oracle/TestRename/arrows_trim_common_2.d2,0:14:14-0:19:19", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/arrows_trim_common_2.d2,0:15:15-0:16:16", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/arrows_trim_common_2.d2,0:17:17-0:18:18", + "value": [ + { + "string": "z", + "raw_string": "z" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 1 + }, + { + "key": { + "range": "d2/testdata/d2oracle/TestRename/arrows_trim_common_2.d2,0:14:14-0:19:19", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/arrows_trim_common_2.d2,0:15:15-0:16:16", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/arrows_trim_common_2.d2,0:17:17-0:18:18", + "value": [ + { + "string": "z", + "raw_string": "z" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 2 + }, + { + "key": { + "range": "d2/testdata/d2oracle/TestRename/arrows_trim_common_2.d2,0:21:21-0:26:26", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/arrows_trim_common_2.d2,0:22:22-0:23:23", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/arrows_trim_common_2.d2,0:24:24-0:26:26", + "value": [ + { + "string": "q)", + "raw_string": "q)" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 2 + } + ], + "attributes": { + "label": { + "value": "x" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "x", + "id_val": "x", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestRename/arrows_trim_common_2.d2,0:0:0-0:4:4", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/arrows_trim_common_2.d2,0:0:0-0:1:1", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/arrows_trim_common_2.d2,0:2:2-0:3:3", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "key_path_index": 1, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "x" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "y", + "id_val": "y", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestRename/arrows_trim_common_2.d2,0:7:7-0:12:12", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/arrows_trim_common_2.d2,0:8:8-0:9:9", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/arrows_trim_common_2.d2,0:10:10-0:11:11", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + } + ] + }, + "key_path_index": 1, + "map_key_edge_index": 0 + }, + { + "key": { + "range": "d2/testdata/d2oracle/TestRename/arrows_trim_common_2.d2,0:7:7-0:12:12", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/arrows_trim_common_2.d2,0:8:8-0:9:9", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/arrows_trim_common_2.d2,0:10:10-0:11:11", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + } + ] + }, + "key_path_index": 1, + "map_key_edge_index": 1 + } + ], + "attributes": { + "label": { + "value": "y" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "z", + "id_val": "z", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestRename/arrows_trim_common_2.d2,0:14:14-0:19:19", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/arrows_trim_common_2.d2,0:15:15-0:16:16", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/arrows_trim_common_2.d2,0:17:17-0:18:18", + "value": [ + { + "string": "z", + "raw_string": "z" + } + ] + } + } + ] + }, + "key_path_index": 1, + "map_key_edge_index": 1 + }, + { + "key": { + "range": "d2/testdata/d2oracle/TestRename/arrows_trim_common_2.d2,0:14:14-0:19:19", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/arrows_trim_common_2.d2,0:15:15-0:16:16", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/arrows_trim_common_2.d2,0:17:17-0:18:18", + "value": [ + { + "string": "z", + "raw_string": "z" + } + ] + } + } + ] + }, + "key_path_index": 1, + "map_key_edge_index": 2 + } + ], + "attributes": { + "label": { + "value": "z" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "\"q)\"", + "id_val": "q)", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestRename/arrows_trim_common_2.d2,0:21:21-0:26:26", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/arrows_trim_common_2.d2,0:22:22-0:23:23", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/arrows_trim_common_2.d2,0:24:24-0:26:26", + "value": [ + { + "string": "q)", + "raw_string": "q)" + } + ] + } + } + ] + }, + "key_path_index": 1, + "map_key_edge_index": 2 + } + ], + "attributes": { + "label": { + "value": "q)" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ] + }, + "err": "" +} diff --git a/testdata/d2oracle/TestRename/complex_edge_1.exp.json b/testdata/d2oracle/TestRename/complex_edge_1.exp.json new file mode 100644 index 000000000..43127797e --- /dev/null +++ b/testdata/d2oracle/TestRename/complex_edge_1.exp.json @@ -0,0 +1,341 @@ +{ + "graph": { + "ast": { + "range": "d2/testdata/d2oracle/TestRename/complex_edge_1.d2,0:0:0-1:0:19", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestRename/complex_edge_1.d2,0:0:0-0:18:18", + "key": { + "range": "d2/testdata/d2oracle/TestRename/complex_edge_1.d2,0:0:0-0:6:6", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/complex_edge_1.d2,0:0:0-0:1:1", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/complex_edge_1.d2,0:2:2-0:5:5", + "value": [ + { + "string": "ooo", + "raw_string": "ooo" + } + ] + } + } + ] + }, + "edges": [ + { + "range": "d2/testdata/d2oracle/TestRename/complex_edge_1.d2,0:7:7-0:13:13", + "src": { + "range": "d2/testdata/d2oracle/TestRename/complex_edge_1.d2,0:7:7-0:9:9", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/complex_edge_1.d2,0:7:7-0:8:8", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "src_arrow": "", + "dst": { + "range": "d2/testdata/d2oracle/TestRename/complex_edge_1.d2,0:11:11-0:13:13", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/complex_edge_1.d2,0:12:12-0:13:13", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + } + ] + }, + "dst_arrow": ">" + } + ], + "edge_key": { + "range": "d2/testdata/d2oracle/TestRename/complex_edge_1.d2,0:15:15-0:18:18", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/complex_edge_1.d2,0:15:15-0:16:16", + "value": [ + { + "string": "q", + "raw_string": "q" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/complex_edge_1.d2,0:17:17-0:18:18", + "value": [ + { + "string": "z", + "raw_string": "z" + } + ] + } + } + ] + }, + "primary": {}, + "value": {} + } + } + ] + }, + "root": { + "id": "", + "id_val": "", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + "edges": [ + { + "index": 0, + "minWidth": 0, + "minHeight": 0, + "label_dimensions": { + "width": 0, + "height": 0 + }, + "isCurve": false, + "src_arrow": false, + "dst_arrow": true, + "references": [ + { + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ], + "objects": [ + { + "id": "a", + "id_val": "a", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestRename/complex_edge_1.d2,0:0:0-0:6:6", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/complex_edge_1.d2,0:0:0-0:1:1", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/complex_edge_1.d2,0:2:2-0:5:5", + "value": [ + { + "string": "ooo", + "raw_string": "ooo" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "a" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "ooo", + "id_val": "ooo", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestRename/complex_edge_1.d2,0:0:0-0:6:6", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/complex_edge_1.d2,0:0:0-0:1:1", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/complex_edge_1.d2,0:2:2-0:5:5", + "value": [ + { + "string": "ooo", + "raw_string": "ooo" + } + ] + } + } + ] + }, + "key_path_index": 1, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "ooo" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "x", + "id_val": "x", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestRename/complex_edge_1.d2,0:7:7-0:9:9", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/complex_edge_1.d2,0:7:7-0:8:8", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "x" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "y", + "id_val": "y", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestRename/complex_edge_1.d2,0:11:11-0:13:13", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/complex_edge_1.d2,0:12:12-0:13:13", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "y" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ] + }, + "err": "" +} diff --git a/testdata/d2oracle/TestRename/complex_edge_2.exp.json b/testdata/d2oracle/TestRename/complex_edge_2.exp.json new file mode 100644 index 000000000..a7920769a --- /dev/null +++ b/testdata/d2oracle/TestRename/complex_edge_2.exp.json @@ -0,0 +1,341 @@ +{ + "graph": { + "ast": { + "range": "d2/testdata/d2oracle/TestRename/complex_edge_2.d2,0:0:0-1:0:20", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestRename/complex_edge_2.d2,0:0:0-0:19:19", + "key": { + "range": "d2/testdata/d2oracle/TestRename/complex_edge_2.d2,0:0:0-0:4:4", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/complex_edge_2.d2,0:0:0-0:1:1", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/complex_edge_2.d2,0:2:2-0:3:3", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + } + ] + }, + "edges": [ + { + "range": "d2/testdata/d2oracle/TestRename/complex_edge_2.d2,0:5:5-0:14:14", + "src": { + "range": "d2/testdata/d2oracle/TestRename/complex_edge_2.d2,0:5:5-0:10:10", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/complex_edge_2.d2,0:5:5-0:9:9", + "value": [ + { + "string": "papa", + "raw_string": "papa" + } + ] + } + } + ] + }, + "src_arrow": "", + "dst": { + "range": "d2/testdata/d2oracle/TestRename/complex_edge_2.d2,0:12:12-0:14:14", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/complex_edge_2.d2,0:13:13-0:14:14", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + } + ] + }, + "dst_arrow": ">" + } + ], + "edge_key": { + "range": "d2/testdata/d2oracle/TestRename/complex_edge_2.d2,0:16:16-0:19:19", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/complex_edge_2.d2,0:16:16-0:17:17", + "value": [ + { + "string": "q", + "raw_string": "q" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/complex_edge_2.d2,0:18:18-0:19:19", + "value": [ + { + "string": "z", + "raw_string": "z" + } + ] + } + } + ] + }, + "primary": {}, + "value": {} + } + } + ] + }, + "root": { + "id": "", + "id_val": "", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + "edges": [ + { + "index": 0, + "minWidth": 0, + "minHeight": 0, + "label_dimensions": { + "width": 0, + "height": 0 + }, + "isCurve": false, + "src_arrow": false, + "dst_arrow": true, + "references": [ + { + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ], + "objects": [ + { + "id": "a", + "id_val": "a", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestRename/complex_edge_2.d2,0:0:0-0:4:4", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/complex_edge_2.d2,0:0:0-0:1:1", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/complex_edge_2.d2,0:2:2-0:3:3", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "a" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "b", + "id_val": "b", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestRename/complex_edge_2.d2,0:0:0-0:4:4", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/complex_edge_2.d2,0:0:0-0:1:1", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/complex_edge_2.d2,0:2:2-0:3:3", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + } + ] + }, + "key_path_index": 1, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "b" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "papa", + "id_val": "papa", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestRename/complex_edge_2.d2,0:5:5-0:10:10", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/complex_edge_2.d2,0:5:5-0:9:9", + "value": [ + { + "string": "papa", + "raw_string": "papa" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "papa" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "y", + "id_val": "y", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestRename/complex_edge_2.d2,0:12:12-0:14:14", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/complex_edge_2.d2,0:13:13-0:14:14", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "y" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ] + }, + "err": "" +} diff --git a/testdata/d2oracle/TestRename/conflict.exp.json b/testdata/d2oracle/TestRename/conflict.exp.json new file mode 100644 index 000000000..0317bae47 --- /dev/null +++ b/testdata/d2oracle/TestRename/conflict.exp.json @@ -0,0 +1,157 @@ +{ + "graph": { + "ast": { + "range": "d2/testdata/d2oracle/TestRename/conflict.d2,0:0:0-2:0:8", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestRename/conflict.d2,0:0:0-0:4:4", + "key": { + "range": "d2/testdata/d2oracle/TestRename/conflict.d2,0:0:0-0:4:4", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/conflict.d2,0:0:0-0:4:4", + "value": [ + { + "string": "la 2", + "raw_string": "la 2" + } + ] + } + } + ] + }, + "primary": {}, + "value": {} + } + }, + { + "map_key": { + "range": "d2/testdata/d2oracle/TestRename/conflict.d2,1:0:5-1:2:7", + "key": { + "range": "d2/testdata/d2oracle/TestRename/conflict.d2,1:0:5-1:2:7", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/conflict.d2,1:0:5-1:2:7", + "value": [ + { + "string": "la", + "raw_string": "la" + } + ] + } + } + ] + }, + "primary": {}, + "value": {} + } + } + ] + }, + "root": { + "id": "", + "id_val": "", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + "edges": null, + "objects": [ + { + "id": "la 2", + "id_val": "la 2", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestRename/conflict.d2,0:0:0-0:4:4", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/conflict.d2,0:0:0-0:4:4", + "value": [ + { + "string": "la 2", + "raw_string": "la 2" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "la 2" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "la", + "id_val": "la", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestRename/conflict.d2,1:0:5-1:2:7", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/conflict.d2,1:0:5-1:2:7", + "value": [ + { + "string": "la", + "raw_string": "la" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "la" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ] + }, + "err": "" +} diff --git a/testdata/d2oracle/TestRename/conflict_2.exp.json b/testdata/d2oracle/TestRename/conflict_2.exp.json new file mode 100644 index 000000000..ace7a30ef --- /dev/null +++ b/testdata/d2oracle/TestRename/conflict_2.exp.json @@ -0,0 +1,394 @@ +{ + "graph": { + "ast": { + "range": "d2/testdata/d2oracle/TestRename/conflict_2.d2,0:0:0-4:0:21", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestRename/conflict_2.d2,0:0:0-3:1:20", + "key": { + "range": "d2/testdata/d2oracle/TestRename/conflict_2.d2,0:0:0-0:5:5", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/conflict_2.d2,0:0:0-0:1:1", + "value": [ + { + "string": "1", + "raw_string": "1" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/conflict_2.d2,0:2:2-0:3:3", + "value": [ + { + "string": "2", + "raw_string": "2" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/conflict_2.d2,0:4:4-0:5:5", + "value": [ + { + "string": "3", + "raw_string": "3" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "map": { + "range": "d2/testdata/d2oracle/TestRename/conflict_2.d2,0:7:7-3:0:19", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestRename/conflict_2.d2,1:2:11-1:5:14", + "key": { + "range": "d2/testdata/d2oracle/TestRename/conflict_2.d2,1:2:11-1:5:14", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/conflict_2.d2,1:2:11-1:5:14", + "value": [ + { + "string": "5 2", + "raw_string": "5 2" + } + ] + } + } + ] + }, + "primary": {}, + "value": {} + } + }, + { + "map_key": { + "range": "d2/testdata/d2oracle/TestRename/conflict_2.d2,2:2:17-2:3:18", + "key": { + "range": "d2/testdata/d2oracle/TestRename/conflict_2.d2,2:2:17-2:3:18", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/conflict_2.d2,2:2:17-2:3:18", + "value": [ + { + "string": "5", + "raw_string": "5" + } + ] + } + } + ] + }, + "primary": {}, + "value": {} + } + } + ] + } + } + } + } + ] + }, + "root": { + "id": "", + "id_val": "", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + "edges": null, + "objects": [ + { + "id": "1", + "id_val": "1", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestRename/conflict_2.d2,0:0:0-0:5:5", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/conflict_2.d2,0:0:0-0:1:1", + "value": [ + { + "string": "1", + "raw_string": "1" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/conflict_2.d2,0:2:2-0:3:3", + "value": [ + { + "string": "2", + "raw_string": "2" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/conflict_2.d2,0:4:4-0:5:5", + "value": [ + { + "string": "3", + "raw_string": "3" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "1" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "2", + "id_val": "2", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestRename/conflict_2.d2,0:0:0-0:5:5", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/conflict_2.d2,0:0:0-0:1:1", + "value": [ + { + "string": "1", + "raw_string": "1" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/conflict_2.d2,0:2:2-0:3:3", + "value": [ + { + "string": "2", + "raw_string": "2" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/conflict_2.d2,0:4:4-0:5:5", + "value": [ + { + "string": "3", + "raw_string": "3" + } + ] + } + } + ] + }, + "key_path_index": 1, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "2" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "3", + "id_val": "3", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestRename/conflict_2.d2,0:0:0-0:5:5", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/conflict_2.d2,0:0:0-0:1:1", + "value": [ + { + "string": "1", + "raw_string": "1" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/conflict_2.d2,0:2:2-0:3:3", + "value": [ + { + "string": "2", + "raw_string": "2" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/conflict_2.d2,0:4:4-0:5:5", + "value": [ + { + "string": "3", + "raw_string": "3" + } + ] + } + } + ] + }, + "key_path_index": 2, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "3" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "5 2", + "id_val": "5 2", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestRename/conflict_2.d2,1:2:11-1:5:14", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/conflict_2.d2,1:2:11-1:5:14", + "value": [ + { + "string": "5 2", + "raw_string": "5 2" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "5 2" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "5", + "id_val": "5", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestRename/conflict_2.d2,2:2:17-2:3:18", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/conflict_2.d2,2:2:17-2:3:18", + "value": [ + { + "string": "5", + "raw_string": "5" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "5" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ] + }, + "err": "" +} diff --git a/testdata/d2oracle/TestRename/conflict_with_dots.exp.json b/testdata/d2oracle/TestRename/conflict_with_dots.exp.json new file mode 100644 index 000000000..21d09182e --- /dev/null +++ b/testdata/d2oracle/TestRename/conflict_with_dots.exp.json @@ -0,0 +1,157 @@ +{ + "graph": { + "ast": { + "range": "d2/testdata/d2oracle/TestRename/conflict_with_dots.d2,0:0:0-2:0:14", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestRename/conflict_with_dots.d2,0:0:0-0:5:5", + "key": { + "range": "d2/testdata/d2oracle/TestRename/conflict_with_dots.d2,0:0:0-0:5:5", + "path": [ + { + "double_quoted_string": { + "range": "d2/testdata/d2oracle/TestRename/conflict_with_dots.d2,0:0:0-0:5:5", + "value": [ + { + "string": "a.b", + "raw_string": "a.b" + } + ] + } + } + ] + }, + "primary": {}, + "value": {} + } + }, + { + "map_key": { + "range": "d2/testdata/d2oracle/TestRename/conflict_with_dots.d2,1:0:6-1:7:13", + "key": { + "range": "d2/testdata/d2oracle/TestRename/conflict_with_dots.d2,1:0:6-1:7:13", + "path": [ + { + "double_quoted_string": { + "range": "d2/testdata/d2oracle/TestRename/conflict_with_dots.d2,1:0:6-1:7:13", + "value": [ + { + "string": "a.b 2", + "raw_string": "a.b 2" + } + ] + } + } + ] + }, + "primary": {}, + "value": {} + } + } + ] + }, + "root": { + "id": "", + "id_val": "", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + "edges": null, + "objects": [ + { + "id": "\"a.b\"", + "id_val": "a.b", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestRename/conflict_with_dots.d2,0:0:0-0:5:5", + "path": [ + { + "double_quoted_string": { + "range": "d2/testdata/d2oracle/TestRename/conflict_with_dots.d2,0:0:0-0:5:5", + "value": [ + { + "string": "a.b", + "raw_string": "a.b" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "a.b" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "\"a.b 2\"", + "id_val": "a.b 2", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestRename/conflict_with_dots.d2,1:0:6-1:7:13", + "path": [ + { + "double_quoted_string": { + "range": "d2/testdata/d2oracle/TestRename/conflict_with_dots.d2,1:0:6-1:7:13", + "value": [ + { + "string": "a.b 2", + "raw_string": "a.b 2" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "a.b 2" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ] + }, + "err": "" +} diff --git a/testdata/d2oracle/TestRename/container.exp.json b/testdata/d2oracle/TestRename/container.exp.json new file mode 100644 index 000000000..2b263f935 --- /dev/null +++ b/testdata/d2oracle/TestRename/container.exp.json @@ -0,0 +1,2639 @@ +{ + "graph": { + "ast": { + "range": "d2/testdata/d2oracle/TestRename/container.d2,0:0:0-12:0:235", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestRename/container.d2,0:0:0-0:70:70", + "edges": [ + { + "range": "d2/testdata/d2oracle/TestRename/container.d2,0:0:0-0:24:24", + "src": { + "range": "d2/testdata/d2oracle/TestRename/container.d2,0:0:0-0:17:17", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/container.d2,0:0:0-0:2:2", + "value": [ + { + "string": "ok", + "raw_string": "ok" + } + ] + } + }, + { + "double_quoted_string": { + "range": "d2/testdata/d2oracle/TestRename/container.d2,0:3:3-0:14:14", + "value": [ + { + "string": "", + "raw_string": "" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/container.d2,0:15:15-0:16:16", + "value": [ + { + "string": "z", + "raw_string": "z" + } + ] + } + } + ] + }, + "src_arrow": "", + "dst": { + "range": "d2/testdata/d2oracle/TestRename/container.d2,0:19:19-0:24:24", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/container.d2,0:20:20-0:21:21", + "value": [ + { + "string": "p", + "raw_string": "p" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/container.d2,0:22:22-0:23:23", + "value": [ + { + "string": "k", + "raw_string": "k" + } + ] + } + } + ] + }, + "dst_arrow": ">" + }, + { + "range": "d2/testdata/d2oracle/TestRename/container.d2,0:19:19-0:44:44", + "src": { + "range": "d2/testdata/d2oracle/TestRename/container.d2,0:19:19-0:24:24", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/container.d2,0:20:20-0:21:21", + "value": [ + { + "string": "p", + "raw_string": "p" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/container.d2,0:22:22-0:23:23", + "value": [ + { + "string": "k", + "raw_string": "k" + } + ] + } + } + ] + }, + "src_arrow": "", + "dst": { + "range": "d2/testdata/d2oracle/TestRename/container.d2,0:26:26-0:44:44", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/container.d2,0:27:27-0:29:29", + "value": [ + { + "string": "ok", + "raw_string": "ok" + } + ] + } + }, + { + "double_quoted_string": { + "range": "d2/testdata/d2oracle/TestRename/container.d2,0:30:30-0:41:41", + "value": [ + { + "string": "", + "raw_string": "" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/container.d2,0:42:42-0:43:43", + "value": [ + { + "string": "z", + "raw_string": "z" + } + ] + } + } + ] + }, + "dst_arrow": ">" + }, + { + "range": "d2/testdata/d2oracle/TestRename/container.d2,0:26:26-0:51:51", + "src": { + "range": "d2/testdata/d2oracle/TestRename/container.d2,0:26:26-0:44:44", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/container.d2,0:27:27-0:29:29", + "value": [ + { + "string": "ok", + "raw_string": "ok" + } + ] + } + }, + { + "double_quoted_string": { + "range": "d2/testdata/d2oracle/TestRename/container.d2,0:30:30-0:41:41", + "value": [ + { + "string": "", + "raw_string": "" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/container.d2,0:42:42-0:43:43", + "value": [ + { + "string": "z", + "raw_string": "z" + } + ] + } + } + ] + }, + "src_arrow": "", + "dst": { + "range": "d2/testdata/d2oracle/TestRename/container.d2,0:46:46-0:51:51", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/container.d2,0:47:47-0:48:48", + "value": [ + { + "string": "l", + "raw_string": "l" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/container.d2,0:49:49-0:50:50", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + } + ] + }, + "dst_arrow": ">" + }, + { + "range": "d2/testdata/d2oracle/TestRename/container.d2,0:46:46-0:70:70", + "src": { + "range": "d2/testdata/d2oracle/TestRename/container.d2,0:46:46-0:51:51", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/container.d2,0:47:47-0:48:48", + "value": [ + { + "string": "l", + "raw_string": "l" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/container.d2,0:49:49-0:50:50", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + } + ] + }, + "src_arrow": "", + "dst": { + "range": "d2/testdata/d2oracle/TestRename/container.d2,0:53:53-0:70:70", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/container.d2,0:54:54-0:56:56", + "value": [ + { + "string": "ok", + "raw_string": "ok" + } + ] + } + }, + { + "double_quoted_string": { + "range": "d2/testdata/d2oracle/TestRename/container.d2,0:57:57-0:68:68", + "value": [ + { + "string": "", + "raw_string": "" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/container.d2,0:69:69-0:70:70", + "value": [ + { + "string": "z", + "raw_string": "z" + } + ] + } + } + ] + }, + "dst_arrow": ">" + } + ], + "primary": {}, + "value": {} + } + }, + { + "map_key": { + "range": "d2/testdata/d2oracle/TestRename/container.d2,1:0:71-4:1:115", + "key": { + "range": "d2/testdata/d2oracle/TestRename/container.d2,1:0:71-1:14:85", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/container.d2,1:0:71-1:2:73", + "value": [ + { + "string": "ok", + "raw_string": "ok" + } + ] + } + }, + { + "double_quoted_string": { + "range": "d2/testdata/d2oracle/TestRename/container.d2,1:3:74-1:14:85", + "value": [ + { + "string": "", + "raw_string": "" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "map": { + "range": "d2/testdata/d2oracle/TestRename/container.d2,1:16:87-4:0:114", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestRename/container.d2,2:2:91-2:13:102", + "edges": [ + { + "range": "d2/testdata/d2oracle/TestRename/container.d2,2:2:91-2:9:98", + "src": { + "range": "d2/testdata/d2oracle/TestRename/container.d2,2:2:91-2:4:93", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/container.d2,2:2:91-2:3:92", + "value": [ + { + "string": "q", + "raw_string": "q" + } + ] + } + } + ] + }, + "src_arrow": "", + "dst": { + "range": "d2/testdata/d2oracle/TestRename/container.d2,2:6:95-2:9:98", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/container.d2,2:7:96-2:8:97", + "value": [ + { + "string": "+", + "raw_string": "+" + } + ] + } + } + ] + }, + "dst_arrow": ">" + }, + { + "range": "d2/testdata/d2oracle/TestRename/container.d2,2:6:95-2:13:102", + "src": { + "range": "d2/testdata/d2oracle/TestRename/container.d2,2:6:95-2:9:98", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/container.d2,2:7:96-2:8:97", + "value": [ + { + "string": "+", + "raw_string": "+" + } + ] + } + } + ] + }, + "src_arrow": "", + "dst": { + "range": "d2/testdata/d2oracle/TestRename/container.d2,2:11:100-2:13:102", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/container.d2,2:12:101-2:13:102", + "value": [ + { + "string": "z", + "raw_string": "z" + } + ] + } + } + ] + }, + "dst_arrow": ">" + } + ], + "primary": {}, + "value": {} + } + }, + { + "map_key": { + "range": "d2/testdata/d2oracle/TestRename/container.d2,3:2:105-3:10:113", + "key": { + "range": "d2/testdata/d2oracle/TestRename/container.d2,3:2:105-3:3:106", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/container.d2,3:2:105-3:3:106", + "value": [ + { + "string": "z", + "raw_string": "z" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/container.d2,3:5:108-3:10:113", + "value": [ + { + "string": "label", + "raw_string": "label" + } + ] + } + } + } + } + ] + } + } + } + }, + { + "map_key": { + "range": "d2/testdata/d2oracle/TestRename/container.d2,5:0:116-9:1:150", + "key": { + "range": "d2/testdata/d2oracle/TestRename/container.d2,5:0:116-5:2:118", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/container.d2,5:0:116-5:2:118", + "value": [ + { + "string": "ok", + "raw_string": "ok" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "map": { + "range": "d2/testdata/d2oracle/TestRename/container.d2,5:4:120-9:0:149", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestRename/container.d2,6:2:124-8:3:148", + "key": { + "range": "d2/testdata/d2oracle/TestRename/container.d2,6:2:124-6:13:135", + "path": [ + { + "double_quoted_string": { + "range": "d2/testdata/d2oracle/TestRename/container.d2,6:2:124-6:13:135", + "value": [ + { + "string": "", + "raw_string": "" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "map": { + "range": "d2/testdata/d2oracle/TestRename/container.d2,6:15:137-8:2:147", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestRename/container.d2,7:4:143-7:5:144", + "key": { + "range": "d2/testdata/d2oracle/TestRename/container.d2,7:4:143-7:5:144", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/container.d2,7:4:143-7:5:144", + "value": [ + { + "string": "i", + "raw_string": "i" + } + ] + } + } + ] + }, + "primary": {}, + "value": {} + } + } + ] + } + } + } + } + ] + } + } + } + }, + { + "map_key": { + "range": "d2/testdata/d2oracle/TestRename/container.d2,10:0:151-10:45:196", + "edges": [ + { + "range": "d2/testdata/d2oracle/TestRename/container.d2,10:1:152-10:24:175", + "src": { + "range": "d2/testdata/d2oracle/TestRename/container.d2,10:1:152-10:18:169", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/container.d2,10:1:152-10:3:154", + "value": [ + { + "string": "ok", + "raw_string": "ok" + } + ] + } + }, + { + "double_quoted_string": { + "range": "d2/testdata/d2oracle/TestRename/container.d2,10:4:155-10:15:166", + "value": [ + { + "string": "", + "raw_string": "" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/container.d2,10:16:167-10:17:168", + "value": [ + { + "string": "z", + "raw_string": "z" + } + ] + } + } + ] + }, + "src_arrow": "", + "dst": { + "range": "d2/testdata/d2oracle/TestRename/container.d2,10:20:171-10:24:175", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/container.d2,10:21:172-10:22:173", + "value": [ + { + "string": "p", + "raw_string": "p" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/container.d2,10:23:174-10:24:175", + "value": [ + { + "string": "k", + "raw_string": "k" + } + ] + } + } + ] + }, + "dst_arrow": ">" + } + ], + "edge_index": { + "range": "d2/testdata/d2oracle/TestRename/container.d2,10:25:176-10:28:179", + "int": 0, + "glob": false + }, + "primary": {}, + "value": { + "double_quoted_string": { + "range": "d2/testdata/d2oracle/TestRename/container.d2,10:30:181-10:45:196", + "value": [ + { + "string": "furbling, v.:", + "raw_string": "furbling, v.:" + } + ] + } + } + } + }, + { + "map_key": { + "range": "d2/testdata/d2oracle/TestRename/container.d2,11:0:197-11:37:234", + "key": { + "range": "d2/testdata/d2oracle/TestRename/container.d2,11:0:197-11:5:202", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/container.d2,11:0:197-11:4:201", + "value": [ + { + "string": "more", + "raw_string": "more" + } + ] + } + } + ] + }, + "edges": [ + { + "range": "d2/testdata/d2oracle/TestRename/container.d2,11:6:203-11:19:216", + "src": { + "range": "d2/testdata/d2oracle/TestRename/container.d2,11:6:203-11:13:210", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/container.d2,11:6:203-11:8:205", + "value": [ + { + "string": "ok", + "raw_string": "ok" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/container.d2,11:9:206-11:10:207", + "value": [ + { + "string": "q", + "raw_string": "q" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/container.d2,11:11:208-11:12:209", + "value": [ + { + "string": "z", + "raw_string": "z" + } + ] + } + } + ] + }, + "src_arrow": "", + "dst": { + "range": "d2/testdata/d2oracle/TestRename/container.d2,11:15:212-11:19:216", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/container.d2,11:16:213-11:17:214", + "value": [ + { + "string": "p", + "raw_string": "p" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/container.d2,11:18:215-11:19:216", + "value": [ + { + "string": "k", + "raw_string": "k" + } + ] + } + } + ] + }, + "dst_arrow": ">" + } + ], + "primary": {}, + "value": { + "double_quoted_string": { + "range": "d2/testdata/d2oracle/TestRename/container.d2,11:22:219-11:37:234", + "value": [ + { + "string": "furbling, v.:", + "raw_string": "furbling, v.:" + } + ] + } + } + } + } + ] + }, + "root": { + "id": "", + "id_val": "", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + "edges": [ + { + "index": 0, + "minWidth": 0, + "minHeight": 0, + "label_dimensions": { + "width": 0, + "height": 0 + }, + "isCurve": false, + "src_arrow": false, + "dst_arrow": true, + "references": [ + { + "map_key_edge_index": 0 + }, + { + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "furbling, v.:" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "index": 0, + "minWidth": 0, + "minHeight": 0, + "label_dimensions": { + "width": 0, + "height": 0 + }, + "isCurve": false, + "src_arrow": false, + "dst_arrow": true, + "references": [ + { + "map_key_edge_index": 1 + } + ], + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "index": 0, + "minWidth": 0, + "minHeight": 0, + "label_dimensions": { + "width": 0, + "height": 0 + }, + "isCurve": false, + "src_arrow": false, + "dst_arrow": true, + "references": [ + { + "map_key_edge_index": 2 + } + ], + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "index": 0, + "minWidth": 0, + "minHeight": 0, + "label_dimensions": { + "width": 0, + "height": 0 + }, + "isCurve": false, + "src_arrow": false, + "dst_arrow": true, + "references": [ + { + "map_key_edge_index": 3 + } + ], + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "index": 0, + "minWidth": 0, + "minHeight": 0, + "label_dimensions": { + "width": 0, + "height": 0 + }, + "isCurve": false, + "src_arrow": false, + "dst_arrow": true, + "references": [ + { + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "index": 0, + "minWidth": 0, + "minHeight": 0, + "label_dimensions": { + "width": 0, + "height": 0 + }, + "isCurve": false, + "src_arrow": false, + "dst_arrow": true, + "references": [ + { + "map_key_edge_index": 1 + } + ], + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "index": 0, + "minWidth": 0, + "minHeight": 0, + "label_dimensions": { + "width": 0, + "height": 0 + }, + "isCurve": false, + "src_arrow": false, + "dst_arrow": true, + "references": [ + { + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "furbling, v.:" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ], + "objects": [ + { + "id": "ok", + "id_val": "ok", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestRename/container.d2,1:0:71-1:14:85", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/container.d2,1:0:71-1:2:73", + "value": [ + { + "string": "ok", + "raw_string": "ok" + } + ] + } + }, + { + "double_quoted_string": { + "range": "d2/testdata/d2oracle/TestRename/container.d2,1:3:74-1:14:85", + "value": [ + { + "string": "", + "raw_string": "" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + }, + { + "key": { + "range": "d2/testdata/d2oracle/TestRename/container.d2,5:0:116-5:2:118", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/container.d2,5:0:116-5:2:118", + "value": [ + { + "string": "ok", + "raw_string": "ok" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + }, + { + "key": { + "range": "d2/testdata/d2oracle/TestRename/container.d2,0:0:0-0:17:17", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/container.d2,0:0:0-0:2:2", + "value": [ + { + "string": "ok", + "raw_string": "ok" + } + ] + } + }, + { + "double_quoted_string": { + "range": "d2/testdata/d2oracle/TestRename/container.d2,0:3:3-0:14:14", + "value": [ + { + "string": "", + "raw_string": "" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/container.d2,0:15:15-0:16:16", + "value": [ + { + "string": "z", + "raw_string": "z" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + }, + { + "key": { + "range": "d2/testdata/d2oracle/TestRename/container.d2,0:26:26-0:44:44", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/container.d2,0:27:27-0:29:29", + "value": [ + { + "string": "ok", + "raw_string": "ok" + } + ] + } + }, + { + "double_quoted_string": { + "range": "d2/testdata/d2oracle/TestRename/container.d2,0:30:30-0:41:41", + "value": [ + { + "string": "", + "raw_string": "" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/container.d2,0:42:42-0:43:43", + "value": [ + { + "string": "z", + "raw_string": "z" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 1 + }, + { + "key": { + "range": "d2/testdata/d2oracle/TestRename/container.d2,0:26:26-0:44:44", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/container.d2,0:27:27-0:29:29", + "value": [ + { + "string": "ok", + "raw_string": "ok" + } + ] + } + }, + { + "double_quoted_string": { + "range": "d2/testdata/d2oracle/TestRename/container.d2,0:30:30-0:41:41", + "value": [ + { + "string": "", + "raw_string": "" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/container.d2,0:42:42-0:43:43", + "value": [ + { + "string": "z", + "raw_string": "z" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 2 + }, + { + "key": { + "range": "d2/testdata/d2oracle/TestRename/container.d2,0:53:53-0:70:70", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/container.d2,0:54:54-0:56:56", + "value": [ + { + "string": "ok", + "raw_string": "ok" + } + ] + } + }, + { + "double_quoted_string": { + "range": "d2/testdata/d2oracle/TestRename/container.d2,0:57:57-0:68:68", + "value": [ + { + "string": "", + "raw_string": "" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/container.d2,0:69:69-0:70:70", + "value": [ + { + "string": "z", + "raw_string": "z" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 3 + }, + { + "key": { + "range": "d2/testdata/d2oracle/TestRename/container.d2,10:1:152-10:18:169", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/container.d2,10:1:152-10:3:154", + "value": [ + { + "string": "ok", + "raw_string": "ok" + } + ] + } + }, + { + "double_quoted_string": { + "range": "d2/testdata/d2oracle/TestRename/container.d2,10:4:155-10:15:166", + "value": [ + { + "string": "", + "raw_string": "" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/container.d2,10:16:167-10:17:168", + "value": [ + { + "string": "z", + "raw_string": "z" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "ok" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "\"\"", + "id_val": "", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestRename/container.d2,1:0:71-1:14:85", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/container.d2,1:0:71-1:2:73", + "value": [ + { + "string": "ok", + "raw_string": "ok" + } + ] + } + }, + { + "double_quoted_string": { + "range": "d2/testdata/d2oracle/TestRename/container.d2,1:3:74-1:14:85", + "value": [ + { + "string": "", + "raw_string": "" + } + ] + } + } + ] + }, + "key_path_index": 1, + "map_key_edge_index": 0 + }, + { + "key": { + "range": "d2/testdata/d2oracle/TestRename/container.d2,6:2:124-6:13:135", + "path": [ + { + "double_quoted_string": { + "range": "d2/testdata/d2oracle/TestRename/container.d2,6:2:124-6:13:135", + "value": [ + { + "string": "", + "raw_string": "" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + }, + { + "key": { + "range": "d2/testdata/d2oracle/TestRename/container.d2,0:0:0-0:17:17", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/container.d2,0:0:0-0:2:2", + "value": [ + { + "string": "ok", + "raw_string": "ok" + } + ] + } + }, + { + "double_quoted_string": { + "range": "d2/testdata/d2oracle/TestRename/container.d2,0:3:3-0:14:14", + "value": [ + { + "string": "", + "raw_string": "" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/container.d2,0:15:15-0:16:16", + "value": [ + { + "string": "z", + "raw_string": "z" + } + ] + } + } + ] + }, + "key_path_index": 1, + "map_key_edge_index": 0 + }, + { + "key": { + "range": "d2/testdata/d2oracle/TestRename/container.d2,0:26:26-0:44:44", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/container.d2,0:27:27-0:29:29", + "value": [ + { + "string": "ok", + "raw_string": "ok" + } + ] + } + }, + { + "double_quoted_string": { + "range": "d2/testdata/d2oracle/TestRename/container.d2,0:30:30-0:41:41", + "value": [ + { + "string": "", + "raw_string": "" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/container.d2,0:42:42-0:43:43", + "value": [ + { + "string": "z", + "raw_string": "z" + } + ] + } + } + ] + }, + "key_path_index": 1, + "map_key_edge_index": 1 + }, + { + "key": { + "range": "d2/testdata/d2oracle/TestRename/container.d2,0:26:26-0:44:44", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/container.d2,0:27:27-0:29:29", + "value": [ + { + "string": "ok", + "raw_string": "ok" + } + ] + } + }, + { + "double_quoted_string": { + "range": "d2/testdata/d2oracle/TestRename/container.d2,0:30:30-0:41:41", + "value": [ + { + "string": "", + "raw_string": "" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/container.d2,0:42:42-0:43:43", + "value": [ + { + "string": "z", + "raw_string": "z" + } + ] + } + } + ] + }, + "key_path_index": 1, + "map_key_edge_index": 2 + }, + { + "key": { + "range": "d2/testdata/d2oracle/TestRename/container.d2,0:53:53-0:70:70", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/container.d2,0:54:54-0:56:56", + "value": [ + { + "string": "ok", + "raw_string": "ok" + } + ] + } + }, + { + "double_quoted_string": { + "range": "d2/testdata/d2oracle/TestRename/container.d2,0:57:57-0:68:68", + "value": [ + { + "string": "", + "raw_string": "" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/container.d2,0:69:69-0:70:70", + "value": [ + { + "string": "z", + "raw_string": "z" + } + ] + } + } + ] + }, + "key_path_index": 1, + "map_key_edge_index": 3 + }, + { + "key": { + "range": "d2/testdata/d2oracle/TestRename/container.d2,10:1:152-10:18:169", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/container.d2,10:1:152-10:3:154", + "value": [ + { + "string": "ok", + "raw_string": "ok" + } + ] + } + }, + { + "double_quoted_string": { + "range": "d2/testdata/d2oracle/TestRename/container.d2,10:4:155-10:15:166", + "value": [ + { + "string": "", + "raw_string": "" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/container.d2,10:16:167-10:17:168", + "value": [ + { + "string": "z", + "raw_string": "z" + } + ] + } + } + ] + }, + "key_path_index": 1, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "z", + "id_val": "z", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestRename/container.d2,3:2:105-3:3:106", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/container.d2,3:2:105-3:3:106", + "value": [ + { + "string": "z", + "raw_string": "z" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + }, + { + "key": { + "range": "d2/testdata/d2oracle/TestRename/container.d2,0:0:0-0:17:17", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/container.d2,0:0:0-0:2:2", + "value": [ + { + "string": "ok", + "raw_string": "ok" + } + ] + } + }, + { + "double_quoted_string": { + "range": "d2/testdata/d2oracle/TestRename/container.d2,0:3:3-0:14:14", + "value": [ + { + "string": "", + "raw_string": "" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/container.d2,0:15:15-0:16:16", + "value": [ + { + "string": "z", + "raw_string": "z" + } + ] + } + } + ] + }, + "key_path_index": 2, + "map_key_edge_index": 0 + }, + { + "key": { + "range": "d2/testdata/d2oracle/TestRename/container.d2,0:26:26-0:44:44", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/container.d2,0:27:27-0:29:29", + "value": [ + { + "string": "ok", + "raw_string": "ok" + } + ] + } + }, + { + "double_quoted_string": { + "range": "d2/testdata/d2oracle/TestRename/container.d2,0:30:30-0:41:41", + "value": [ + { + "string": "", + "raw_string": "" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/container.d2,0:42:42-0:43:43", + "value": [ + { + "string": "z", + "raw_string": "z" + } + ] + } + } + ] + }, + "key_path_index": 2, + "map_key_edge_index": 1 + }, + { + "key": { + "range": "d2/testdata/d2oracle/TestRename/container.d2,0:26:26-0:44:44", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/container.d2,0:27:27-0:29:29", + "value": [ + { + "string": "ok", + "raw_string": "ok" + } + ] + } + }, + { + "double_quoted_string": { + "range": "d2/testdata/d2oracle/TestRename/container.d2,0:30:30-0:41:41", + "value": [ + { + "string": "", + "raw_string": "" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/container.d2,0:42:42-0:43:43", + "value": [ + { + "string": "z", + "raw_string": "z" + } + ] + } + } + ] + }, + "key_path_index": 2, + "map_key_edge_index": 2 + }, + { + "key": { + "range": "d2/testdata/d2oracle/TestRename/container.d2,0:53:53-0:70:70", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/container.d2,0:54:54-0:56:56", + "value": [ + { + "string": "ok", + "raw_string": "ok" + } + ] + } + }, + { + "double_quoted_string": { + "range": "d2/testdata/d2oracle/TestRename/container.d2,0:57:57-0:68:68", + "value": [ + { + "string": "", + "raw_string": "" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/container.d2,0:69:69-0:70:70", + "value": [ + { + "string": "z", + "raw_string": "z" + } + ] + } + } + ] + }, + "key_path_index": 2, + "map_key_edge_index": 3 + }, + { + "key": { + "range": "d2/testdata/d2oracle/TestRename/container.d2,2:11:100-2:13:102", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/container.d2,2:12:101-2:13:102", + "value": [ + { + "string": "z", + "raw_string": "z" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 1 + }, + { + "key": { + "range": "d2/testdata/d2oracle/TestRename/container.d2,10:1:152-10:18:169", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/container.d2,10:1:152-10:3:154", + "value": [ + { + "string": "ok", + "raw_string": "ok" + } + ] + } + }, + { + "double_quoted_string": { + "range": "d2/testdata/d2oracle/TestRename/container.d2,10:4:155-10:15:166", + "value": [ + { + "string": "", + "raw_string": "" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/container.d2,10:16:167-10:17:168", + "value": [ + { + "string": "z", + "raw_string": "z" + } + ] + } + } + ] + }, + "key_path_index": 2, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "label" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "i", + "id_val": "i", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestRename/container.d2,7:4:143-7:5:144", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/container.d2,7:4:143-7:5:144", + "value": [ + { + "string": "i", + "raw_string": "i" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "i" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "p", + "id_val": "p", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestRename/container.d2,0:19:19-0:24:24", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/container.d2,0:20:20-0:21:21", + "value": [ + { + "string": "p", + "raw_string": "p" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/container.d2,0:22:22-0:23:23", + "value": [ + { + "string": "k", + "raw_string": "k" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + }, + { + "key": { + "range": "d2/testdata/d2oracle/TestRename/container.d2,0:19:19-0:24:24", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/container.d2,0:20:20-0:21:21", + "value": [ + { + "string": "p", + "raw_string": "p" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/container.d2,0:22:22-0:23:23", + "value": [ + { + "string": "k", + "raw_string": "k" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 1 + }, + { + "key": { + "range": "d2/testdata/d2oracle/TestRename/container.d2,10:20:171-10:24:175", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/container.d2,10:21:172-10:22:173", + "value": [ + { + "string": "p", + "raw_string": "p" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/container.d2,10:23:174-10:24:175", + "value": [ + { + "string": "k", + "raw_string": "k" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "p" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "k", + "id_val": "k", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestRename/container.d2,0:19:19-0:24:24", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/container.d2,0:20:20-0:21:21", + "value": [ + { + "string": "p", + "raw_string": "p" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/container.d2,0:22:22-0:23:23", + "value": [ + { + "string": "k", + "raw_string": "k" + } + ] + } + } + ] + }, + "key_path_index": 1, + "map_key_edge_index": 0 + }, + { + "key": { + "range": "d2/testdata/d2oracle/TestRename/container.d2,0:19:19-0:24:24", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/container.d2,0:20:20-0:21:21", + "value": [ + { + "string": "p", + "raw_string": "p" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/container.d2,0:22:22-0:23:23", + "value": [ + { + "string": "k", + "raw_string": "k" + } + ] + } + } + ] + }, + "key_path_index": 1, + "map_key_edge_index": 1 + }, + { + "key": { + "range": "d2/testdata/d2oracle/TestRename/container.d2,10:20:171-10:24:175", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/container.d2,10:21:172-10:22:173", + "value": [ + { + "string": "p", + "raw_string": "p" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/container.d2,10:23:174-10:24:175", + "value": [ + { + "string": "k", + "raw_string": "k" + } + ] + } + } + ] + }, + "key_path_index": 1, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "k" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "l", + "id_val": "l", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestRename/container.d2,0:46:46-0:51:51", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/container.d2,0:47:47-0:48:48", + "value": [ + { + "string": "l", + "raw_string": "l" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/container.d2,0:49:49-0:50:50", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 2 + }, + { + "key": { + "range": "d2/testdata/d2oracle/TestRename/container.d2,0:46:46-0:51:51", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/container.d2,0:47:47-0:48:48", + "value": [ + { + "string": "l", + "raw_string": "l" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/container.d2,0:49:49-0:50:50", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 3 + } + ], + "attributes": { + "label": { + "value": "l" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "a", + "id_val": "a", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestRename/container.d2,0:46:46-0:51:51", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/container.d2,0:47:47-0:48:48", + "value": [ + { + "string": "l", + "raw_string": "l" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/container.d2,0:49:49-0:50:50", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + } + ] + }, + "key_path_index": 1, + "map_key_edge_index": 2 + }, + { + "key": { + "range": "d2/testdata/d2oracle/TestRename/container.d2,0:46:46-0:51:51", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/container.d2,0:47:47-0:48:48", + "value": [ + { + "string": "l", + "raw_string": "l" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/container.d2,0:49:49-0:50:50", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + } + ] + }, + "key_path_index": 1, + "map_key_edge_index": 3 + } + ], + "attributes": { + "label": { + "value": "a" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "q", + "id_val": "q", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestRename/container.d2,2:2:91-2:4:93", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/container.d2,2:2:91-2:3:92", + "value": [ + { + "string": "q", + "raw_string": "q" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "q" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "+", + "id_val": "+", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestRename/container.d2,2:6:95-2:9:98", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/container.d2,2:7:96-2:8:97", + "value": [ + { + "string": "+", + "raw_string": "+" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + }, + { + "key": { + "range": "d2/testdata/d2oracle/TestRename/container.d2,2:6:95-2:9:98", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/container.d2,2:7:96-2:8:97", + "value": [ + { + "string": "+", + "raw_string": "+" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 1 + } + ], + "attributes": { + "label": { + "value": "+" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "more", + "id_val": "more", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestRename/container.d2,11:0:197-11:5:202", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/container.d2,11:0:197-11:4:201", + "value": [ + { + "string": "more", + "raw_string": "more" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "more" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "ok", + "id_val": "ok", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestRename/container.d2,11:6:203-11:13:210", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/container.d2,11:6:203-11:8:205", + "value": [ + { + "string": "ok", + "raw_string": "ok" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/container.d2,11:9:206-11:10:207", + "value": [ + { + "string": "q", + "raw_string": "q" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/container.d2,11:11:208-11:12:209", + "value": [ + { + "string": "z", + "raw_string": "z" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "ok" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "q", + "id_val": "q", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestRename/container.d2,11:6:203-11:13:210", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/container.d2,11:6:203-11:8:205", + "value": [ + { + "string": "ok", + "raw_string": "ok" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/container.d2,11:9:206-11:10:207", + "value": [ + { + "string": "q", + "raw_string": "q" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/container.d2,11:11:208-11:12:209", + "value": [ + { + "string": "z", + "raw_string": "z" + } + ] + } + } + ] + }, + "key_path_index": 1, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "q" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "z", + "id_val": "z", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestRename/container.d2,11:6:203-11:13:210", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/container.d2,11:6:203-11:8:205", + "value": [ + { + "string": "ok", + "raw_string": "ok" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/container.d2,11:9:206-11:10:207", + "value": [ + { + "string": "q", + "raw_string": "q" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/container.d2,11:11:208-11:12:209", + "value": [ + { + "string": "z", + "raw_string": "z" + } + ] + } + } + ] + }, + "key_path_index": 2, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "z" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "p", + "id_val": "p", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestRename/container.d2,11:15:212-11:19:216", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/container.d2,11:16:213-11:17:214", + "value": [ + { + "string": "p", + "raw_string": "p" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/container.d2,11:18:215-11:19:216", + "value": [ + { + "string": "k", + "raw_string": "k" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "p" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "k", + "id_val": "k", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestRename/container.d2,11:15:212-11:19:216", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/container.d2,11:16:213-11:17:214", + "value": [ + { + "string": "p", + "raw_string": "p" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/container.d2,11:18:215-11:19:216", + "value": [ + { + "string": "k", + "raw_string": "k" + } + ] + } + } + ] + }, + "key_path_index": 1, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "k" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ] + }, + "err": "" +} diff --git a/testdata/d2oracle/TestRename/edges.exp.json b/testdata/d2oracle/TestRename/edges.exp.json new file mode 100644 index 000000000..a67dce07d --- /dev/null +++ b/testdata/d2oracle/TestRename/edges.exp.json @@ -0,0 +1,1360 @@ +{ + "graph": { + "ast": { + "range": "d2/testdata/d2oracle/TestRename/edges.d2,0:0:0-5:0:74", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestRename/edges.d2,0:0:0-0:37:37", + "edges": [ + { + "range": "d2/testdata/d2oracle/TestRename/edges.d2,0:0:0-0:13:13", + "src": { + "range": "d2/testdata/d2oracle/TestRename/edges.d2,0:0:0-0:6:6", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/edges.d2,0:0:0-0:1:1", + "value": [ + { + "string": "q", + "raw_string": "q" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/edges.d2,0:2:2-0:5:5", + "value": [ + { + "string": "%%%", + "raw_string": "%%%" + } + ] + } + } + ] + }, + "src_arrow": "", + "dst": { + "range": "d2/testdata/d2oracle/TestRename/edges.d2,0:8:8-0:13:13", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/edges.d2,0:9:9-0:10:10", + "value": [ + { + "string": "p", + "raw_string": "p" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/edges.d2,0:11:11-0:12:12", + "value": [ + { + "string": "k", + "raw_string": "k" + } + ] + } + } + ] + }, + "dst_arrow": ">" + }, + { + "range": "d2/testdata/d2oracle/TestRename/edges.d2,0:8:8-0:22:22", + "src": { + "range": "d2/testdata/d2oracle/TestRename/edges.d2,0:8:8-0:13:13", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/edges.d2,0:9:9-0:10:10", + "value": [ + { + "string": "p", + "raw_string": "p" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/edges.d2,0:11:11-0:12:12", + "value": [ + { + "string": "k", + "raw_string": "k" + } + ] + } + } + ] + }, + "src_arrow": "", + "dst": { + "range": "d2/testdata/d2oracle/TestRename/edges.d2,0:15:15-0:22:22", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/edges.d2,0:16:16-0:17:17", + "value": [ + { + "string": "q", + "raw_string": "q" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/edges.d2,0:18:18-0:21:21", + "value": [ + { + "string": "%%%", + "raw_string": "%%%" + } + ] + } + } + ] + }, + "dst_arrow": ">" + }, + { + "range": "d2/testdata/d2oracle/TestRename/edges.d2,0:15:15-0:29:29", + "src": { + "range": "d2/testdata/d2oracle/TestRename/edges.d2,0:15:15-0:22:22", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/edges.d2,0:16:16-0:17:17", + "value": [ + { + "string": "q", + "raw_string": "q" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/edges.d2,0:18:18-0:21:21", + "value": [ + { + "string": "%%%", + "raw_string": "%%%" + } + ] + } + } + ] + }, + "src_arrow": "", + "dst": { + "range": "d2/testdata/d2oracle/TestRename/edges.d2,0:24:24-0:29:29", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/edges.d2,0:25:25-0:26:26", + "value": [ + { + "string": "l", + "raw_string": "l" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/edges.d2,0:27:27-0:28:28", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + } + ] + }, + "dst_arrow": ">" + }, + { + "range": "d2/testdata/d2oracle/TestRename/edges.d2,0:24:24-0:37:37", + "src": { + "range": "d2/testdata/d2oracle/TestRename/edges.d2,0:24:24-0:29:29", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/edges.d2,0:25:25-0:26:26", + "value": [ + { + "string": "l", + "raw_string": "l" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/edges.d2,0:27:27-0:28:28", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + } + ] + }, + "src_arrow": "", + "dst": { + "range": "d2/testdata/d2oracle/TestRename/edges.d2,0:31:31-0:37:37", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/edges.d2,0:32:32-0:33:33", + "value": [ + { + "string": "q", + "raw_string": "q" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/edges.d2,0:34:34-0:37:37", + "value": [ + { + "string": "%%%", + "raw_string": "%%%" + } + ] + } + } + ] + }, + "dst_arrow": ">" + } + ], + "primary": {}, + "value": {} + } + }, + { + "map_key": { + "range": "d2/testdata/d2oracle/TestRename/edges.d2,1:0:38-4:1:73", + "key": { + "range": "d2/testdata/d2oracle/TestRename/edges.d2,1:0:38-1:1:39", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/edges.d2,1:0:38-1:1:39", + "value": [ + { + "string": "q", + "raw_string": "q" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "map": { + "range": "d2/testdata/d2oracle/TestRename/edges.d2,1:3:41-4:0:72", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestRename/edges.d2,2:2:45-2:15:58", + "edges": [ + { + "range": "d2/testdata/d2oracle/TestRename/edges.d2,2:2:45-2:9:52", + "src": { + "range": "d2/testdata/d2oracle/TestRename/edges.d2,2:2:45-2:4:47", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/edges.d2,2:2:45-2:3:46", + "value": [ + { + "string": "q", + "raw_string": "q" + } + ] + } + } + ] + }, + "src_arrow": "", + "dst": { + "range": "d2/testdata/d2oracle/TestRename/edges.d2,2:6:49-2:9:52", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/edges.d2,2:7:50-2:8:51", + "value": [ + { + "string": "+", + "raw_string": "+" + } + ] + } + } + ] + }, + "dst_arrow": ">" + }, + { + "range": "d2/testdata/d2oracle/TestRename/edges.d2,2:6:49-2:15:58", + "src": { + "range": "d2/testdata/d2oracle/TestRename/edges.d2,2:6:49-2:9:52", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/edges.d2,2:7:50-2:8:51", + "value": [ + { + "string": "+", + "raw_string": "+" + } + ] + } + } + ] + }, + "src_arrow": "", + "dst": { + "range": "d2/testdata/d2oracle/TestRename/edges.d2,2:11:54-2:15:58", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/edges.d2,2:12:55-2:15:58", + "value": [ + { + "string": "%%%", + "raw_string": "%%%" + } + ] + } + } + ] + }, + "dst_arrow": ">" + } + ], + "primary": {}, + "value": {} + } + }, + { + "map_key": { + "range": "d2/testdata/d2oracle/TestRename/edges.d2,3:2:61-3:12:71", + "key": { + "range": "d2/testdata/d2oracle/TestRename/edges.d2,3:2:61-3:5:64", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/edges.d2,3:2:61-3:5:64", + "value": [ + { + "string": "%%%", + "raw_string": "%%%" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/edges.d2,3:7:66-3:12:71", + "value": [ + { + "string": "label", + "raw_string": "label" + } + ] + } + } + } + } + ] + } + } + } + } + ] + }, + "root": { + "id": "", + "id_val": "", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + "edges": [ + { + "index": 0, + "minWidth": 0, + "minHeight": 0, + "label_dimensions": { + "width": 0, + "height": 0 + }, + "isCurve": false, + "src_arrow": false, + "dst_arrow": true, + "references": [ + { + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "index": 0, + "minWidth": 0, + "minHeight": 0, + "label_dimensions": { + "width": 0, + "height": 0 + }, + "isCurve": false, + "src_arrow": false, + "dst_arrow": true, + "references": [ + { + "map_key_edge_index": 1 + } + ], + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "index": 0, + "minWidth": 0, + "minHeight": 0, + "label_dimensions": { + "width": 0, + "height": 0 + }, + "isCurve": false, + "src_arrow": false, + "dst_arrow": true, + "references": [ + { + "map_key_edge_index": 2 + } + ], + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "index": 0, + "minWidth": 0, + "minHeight": 0, + "label_dimensions": { + "width": 0, + "height": 0 + }, + "isCurve": false, + "src_arrow": false, + "dst_arrow": true, + "references": [ + { + "map_key_edge_index": 3 + } + ], + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "index": 0, + "minWidth": 0, + "minHeight": 0, + "label_dimensions": { + "width": 0, + "height": 0 + }, + "isCurve": false, + "src_arrow": false, + "dst_arrow": true, + "references": [ + { + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "index": 0, + "minWidth": 0, + "minHeight": 0, + "label_dimensions": { + "width": 0, + "height": 0 + }, + "isCurve": false, + "src_arrow": false, + "dst_arrow": true, + "references": [ + { + "map_key_edge_index": 1 + } + ], + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ], + "objects": [ + { + "id": "q", + "id_val": "q", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestRename/edges.d2,1:0:38-1:1:39", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/edges.d2,1:0:38-1:1:39", + "value": [ + { + "string": "q", + "raw_string": "q" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + }, + { + "key": { + "range": "d2/testdata/d2oracle/TestRename/edges.d2,0:0:0-0:6:6", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/edges.d2,0:0:0-0:1:1", + "value": [ + { + "string": "q", + "raw_string": "q" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/edges.d2,0:2:2-0:5:5", + "value": [ + { + "string": "%%%", + "raw_string": "%%%" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + }, + { + "key": { + "range": "d2/testdata/d2oracle/TestRename/edges.d2,0:15:15-0:22:22", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/edges.d2,0:16:16-0:17:17", + "value": [ + { + "string": "q", + "raw_string": "q" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/edges.d2,0:18:18-0:21:21", + "value": [ + { + "string": "%%%", + "raw_string": "%%%" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 1 + }, + { + "key": { + "range": "d2/testdata/d2oracle/TestRename/edges.d2,0:15:15-0:22:22", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/edges.d2,0:16:16-0:17:17", + "value": [ + { + "string": "q", + "raw_string": "q" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/edges.d2,0:18:18-0:21:21", + "value": [ + { + "string": "%%%", + "raw_string": "%%%" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 2 + }, + { + "key": { + "range": "d2/testdata/d2oracle/TestRename/edges.d2,0:31:31-0:37:37", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/edges.d2,0:32:32-0:33:33", + "value": [ + { + "string": "q", + "raw_string": "q" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/edges.d2,0:34:34-0:37:37", + "value": [ + { + "string": "%%%", + "raw_string": "%%%" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 3 + } + ], + "attributes": { + "label": { + "value": "q" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "%%%", + "id_val": "%%%", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestRename/edges.d2,3:2:61-3:5:64", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/edges.d2,3:2:61-3:5:64", + "value": [ + { + "string": "%%%", + "raw_string": "%%%" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + }, + { + "key": { + "range": "d2/testdata/d2oracle/TestRename/edges.d2,0:0:0-0:6:6", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/edges.d2,0:0:0-0:1:1", + "value": [ + { + "string": "q", + "raw_string": "q" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/edges.d2,0:2:2-0:5:5", + "value": [ + { + "string": "%%%", + "raw_string": "%%%" + } + ] + } + } + ] + }, + "key_path_index": 1, + "map_key_edge_index": 0 + }, + { + "key": { + "range": "d2/testdata/d2oracle/TestRename/edges.d2,0:15:15-0:22:22", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/edges.d2,0:16:16-0:17:17", + "value": [ + { + "string": "q", + "raw_string": "q" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/edges.d2,0:18:18-0:21:21", + "value": [ + { + "string": "%%%", + "raw_string": "%%%" + } + ] + } + } + ] + }, + "key_path_index": 1, + "map_key_edge_index": 1 + }, + { + "key": { + "range": "d2/testdata/d2oracle/TestRename/edges.d2,0:15:15-0:22:22", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/edges.d2,0:16:16-0:17:17", + "value": [ + { + "string": "q", + "raw_string": "q" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/edges.d2,0:18:18-0:21:21", + "value": [ + { + "string": "%%%", + "raw_string": "%%%" + } + ] + } + } + ] + }, + "key_path_index": 1, + "map_key_edge_index": 2 + }, + { + "key": { + "range": "d2/testdata/d2oracle/TestRename/edges.d2,0:31:31-0:37:37", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/edges.d2,0:32:32-0:33:33", + "value": [ + { + "string": "q", + "raw_string": "q" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/edges.d2,0:34:34-0:37:37", + "value": [ + { + "string": "%%%", + "raw_string": "%%%" + } + ] + } + } + ] + }, + "key_path_index": 1, + "map_key_edge_index": 3 + }, + { + "key": { + "range": "d2/testdata/d2oracle/TestRename/edges.d2,2:11:54-2:15:58", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/edges.d2,2:12:55-2:15:58", + "value": [ + { + "string": "%%%", + "raw_string": "%%%" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 1 + } + ], + "attributes": { + "label": { + "value": "label" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "p", + "id_val": "p", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestRename/edges.d2,0:8:8-0:13:13", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/edges.d2,0:9:9-0:10:10", + "value": [ + { + "string": "p", + "raw_string": "p" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/edges.d2,0:11:11-0:12:12", + "value": [ + { + "string": "k", + "raw_string": "k" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + }, + { + "key": { + "range": "d2/testdata/d2oracle/TestRename/edges.d2,0:8:8-0:13:13", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/edges.d2,0:9:9-0:10:10", + "value": [ + { + "string": "p", + "raw_string": "p" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/edges.d2,0:11:11-0:12:12", + "value": [ + { + "string": "k", + "raw_string": "k" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 1 + } + ], + "attributes": { + "label": { + "value": "p" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "k", + "id_val": "k", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestRename/edges.d2,0:8:8-0:13:13", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/edges.d2,0:9:9-0:10:10", + "value": [ + { + "string": "p", + "raw_string": "p" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/edges.d2,0:11:11-0:12:12", + "value": [ + { + "string": "k", + "raw_string": "k" + } + ] + } + } + ] + }, + "key_path_index": 1, + "map_key_edge_index": 0 + }, + { + "key": { + "range": "d2/testdata/d2oracle/TestRename/edges.d2,0:8:8-0:13:13", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/edges.d2,0:9:9-0:10:10", + "value": [ + { + "string": "p", + "raw_string": "p" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/edges.d2,0:11:11-0:12:12", + "value": [ + { + "string": "k", + "raw_string": "k" + } + ] + } + } + ] + }, + "key_path_index": 1, + "map_key_edge_index": 1 + } + ], + "attributes": { + "label": { + "value": "k" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "l", + "id_val": "l", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestRename/edges.d2,0:24:24-0:29:29", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/edges.d2,0:25:25-0:26:26", + "value": [ + { + "string": "l", + "raw_string": "l" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/edges.d2,0:27:27-0:28:28", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 2 + }, + { + "key": { + "range": "d2/testdata/d2oracle/TestRename/edges.d2,0:24:24-0:29:29", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/edges.d2,0:25:25-0:26:26", + "value": [ + { + "string": "l", + "raw_string": "l" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/edges.d2,0:27:27-0:28:28", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 3 + } + ], + "attributes": { + "label": { + "value": "l" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "a", + "id_val": "a", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestRename/edges.d2,0:24:24-0:29:29", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/edges.d2,0:25:25-0:26:26", + "value": [ + { + "string": "l", + "raw_string": "l" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/edges.d2,0:27:27-0:28:28", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + } + ] + }, + "key_path_index": 1, + "map_key_edge_index": 2 + }, + { + "key": { + "range": "d2/testdata/d2oracle/TestRename/edges.d2,0:24:24-0:29:29", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/edges.d2,0:25:25-0:26:26", + "value": [ + { + "string": "l", + "raw_string": "l" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/edges.d2,0:27:27-0:28:28", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + } + ] + }, + "key_path_index": 1, + "map_key_edge_index": 3 + } + ], + "attributes": { + "label": { + "value": "a" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "q", + "id_val": "q", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestRename/edges.d2,2:2:45-2:4:47", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/edges.d2,2:2:45-2:3:46", + "value": [ + { + "string": "q", + "raw_string": "q" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "q" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "+", + "id_val": "+", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestRename/edges.d2,2:6:49-2:9:52", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/edges.d2,2:7:50-2:8:51", + "value": [ + { + "string": "+", + "raw_string": "+" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + }, + { + "key": { + "range": "d2/testdata/d2oracle/TestRename/edges.d2,2:6:49-2:9:52", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/edges.d2,2:7:50-2:8:51", + "value": [ + { + "string": "+", + "raw_string": "+" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 1 + } + ], + "attributes": { + "label": { + "value": "+" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ] + }, + "err": "" +} diff --git a/testdata/d2oracle/TestRename/errors/empty_key.exp.json b/testdata/d2oracle/TestRename/errors/empty_key.exp.json new file mode 100644 index 000000000..4c070e3f1 --- /dev/null +++ b/testdata/d2oracle/TestRename/errors/empty_key.exp.json @@ -0,0 +1,4 @@ +{ + "graph": null, + "err": "failed to rename \"\" to \"\": empty map key: \"\"" +} diff --git a/testdata/d2oracle/TestRename/errors/nonexistent.exp.json b/testdata/d2oracle/TestRename/errors/nonexistent.exp.json new file mode 100644 index 000000000..42c5b6014 --- /dev/null +++ b/testdata/d2oracle/TestRename/errors/nonexistent.exp.json @@ -0,0 +1,4 @@ +{ + "graph": null, + "err": "failed to rename \"1.2.3.4\" to \"bic\": key referenced by from does not exist" +} diff --git a/testdata/d2oracle/TestRename/errors/refuse_overwrite.exp.json b/testdata/d2oracle/TestRename/errors/refuse_overwrite.exp.json new file mode 100644 index 000000000..630f4bfa1 --- /dev/null +++ b/testdata/d2oracle/TestRename/errors/refuse_overwrite.exp.json @@ -0,0 +1,4 @@ +{ + "graph": null, + "err": "failed to rename \"1.2.3.4\" to \"5\": to key already exists" +} diff --git a/testdata/d2oracle/TestRename/errors/reserved_keys.exp.json b/testdata/d2oracle/TestRename/errors/reserved_keys.exp.json new file mode 100644 index 000000000..77687d708 --- /dev/null +++ b/testdata/d2oracle/TestRename/errors/reserved_keys.exp.json @@ -0,0 +1,4 @@ +{ + "graph": null, + "err": "failed to rename \"x.icon\" to \"near\": cannot rename to reserved keyword: \"near\"" +} diff --git a/testdata/d2oracle/TestRename/flat.exp.json b/testdata/d2oracle/TestRename/flat.exp.json new file mode 100644 index 000000000..ba24ba8e3 --- /dev/null +++ b/testdata/d2oracle/TestRename/flat.exp.json @@ -0,0 +1,94 @@ +{ + "graph": { + "ast": { + "range": "d2/testdata/d2oracle/TestRename/flat.d2,0:0:0-1:0:6", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestRename/flat.d2,0:0:0-0:5:5", + "key": { + "range": "d2/testdata/d2oracle/TestRename/flat.d2,0:0:0-0:5:5", + "path": [ + { + "double_quoted_string": { + "range": "d2/testdata/d2oracle/TestRename/flat.d2,0:0:0-0:5:5", + "value": [ + { + "string": "---", + "raw_string": "---" + } + ] + } + } + ] + }, + "primary": {}, + "value": {} + } + } + ] + }, + "root": { + "id": "", + "id_val": "", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + "edges": null, + "objects": [ + { + "id": "\"---\"", + "id_val": "---", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestRename/flat.d2,0:0:0-0:5:5", + "path": [ + { + "double_quoted_string": { + "range": "d2/testdata/d2oracle/TestRename/flat.d2,0:0:0-0:5:5", + "value": [ + { + "string": "---", + "raw_string": "---" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "---" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ] + }, + "err": "" +} diff --git a/testdata/d2oracle/TestRename/generated.exp.json b/testdata/d2oracle/TestRename/generated.exp.json new file mode 100644 index 000000000..11135a475 --- /dev/null +++ b/testdata/d2oracle/TestRename/generated.exp.json @@ -0,0 +1,94 @@ +{ + "graph": { + "ast": { + "range": "d2/testdata/d2oracle/TestRename/generated.d2,0:0:0-1:0:7", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestRename/generated.d2,0:0:0-0:6:6", + "key": { + "range": "d2/testdata/d2oracle/TestRename/generated.d2,0:0:0-0:6:6", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/generated.d2,0:0:0-0:6:6", + "value": [ + { + "string": "Square", + "raw_string": "Square" + } + ] + } + } + ] + }, + "primary": {}, + "value": {} + } + } + ] + }, + "root": { + "id": "", + "id_val": "", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + "edges": null, + "objects": [ + { + "id": "Square", + "id_val": "Square", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestRename/generated.d2,0:0:0-0:6:6", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/generated.d2,0:0:0-0:6:6", + "value": [ + { + "string": "Square", + "raw_string": "Square" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "Square" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ] + }, + "err": "" +} diff --git a/testdata/d2oracle/TestRename/near.exp.json b/testdata/d2oracle/TestRename/near.exp.json new file mode 100644 index 000000000..849d63ae7 --- /dev/null +++ b/testdata/d2oracle/TestRename/near.exp.json @@ -0,0 +1,211 @@ +{ + "graph": { + "ast": { + "range": "d2/testdata/d2oracle/TestRename/near.d2,0:0:0-4:0:19", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestRename/near.d2,0:0:0-2:1:16", + "key": { + "range": "d2/testdata/d2oracle/TestRename/near.d2,0:0:0-0:1:1", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/near.d2,0:0:0-0:1:1", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "map": { + "range": "d2/testdata/d2oracle/TestRename/near.d2,0:3:3-2:0:15", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestRename/near.d2,1:2:7-1:9:14", + "key": { + "range": "d2/testdata/d2oracle/TestRename/near.d2,1:2:7-1:6:11", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/near.d2,1:2:7-1:6:11", + "value": [ + { + "string": "near", + "raw_string": "near" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/near.d2,1:8:13-1:9:14", + "value": [ + { + "string": "z", + "raw_string": "z" + } + ] + } + } + } + } + ] + } + } + } + }, + { + "map_key": { + "range": "d2/testdata/d2oracle/TestRename/near.d2,3:0:17-3:1:18", + "key": { + "range": "d2/testdata/d2oracle/TestRename/near.d2,3:0:17-3:1:18", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/near.d2,3:0:17-3:1:18", + "value": [ + { + "string": "z", + "raw_string": "z" + } + ] + } + } + ] + }, + "primary": {}, + "value": {} + } + } + ] + }, + "root": { + "id": "", + "id_val": "", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + "edges": null, + "objects": [ + { + "id": "x", + "id_val": "x", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestRename/near.d2,0:0:0-0:1:1", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/near.d2,0:0:0-0:1:1", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "x" + }, + "style": {}, + "near_key": { + "range": ",0:0:0-0:1:1", + "path": [ + { + "unquoted_string": { + "range": ",0:0:0-0:1:1", + "value": [ + { + "string": "z", + "raw_string": "z" + } + ] + } + } + ] + }, + "shape": { + "value": "" + } + } + }, + { + "id": "z", + "id_val": "z", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestRename/near.d2,3:0:17-3:1:18", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/near.d2,3:0:17-3:1:18", + "value": [ + { + "string": "z", + "raw_string": "z" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "z" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ] + }, + "err": "" +} diff --git a/testdata/d2oracle/TestRename/nested.exp.json b/testdata/d2oracle/TestRename/nested.exp.json new file mode 100644 index 000000000..40404388e --- /dev/null +++ b/testdata/d2oracle/TestRename/nested.exp.json @@ -0,0 +1,835 @@ +{ + "graph": { + "ast": { + "range": "d2/testdata/d2oracle/TestRename/nested.d2,0:0:0-4:0:61", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestRename/nested.d2,0:0:0-0:26:26", + "key": { + "range": "d2/testdata/d2oracle/TestRename/nested.d2,0:0:0-0:26:26", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/nested.d2,0:0:0-0:1:1", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/nested.d2,0:2:2-0:3:3", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/nested.d2,0:4:4-0:5:5", + "value": [ + { + "string": "z", + "raw_string": "z" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/nested.d2,0:6:6-0:7:7", + "value": [ + { + "string": "q", + "raw_string": "q" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/nested.d2,0:8:8-0:26:26", + "value": [ + { + "string": "nerve-gift-jingler", + "raw_string": "nerve-gift-jingler" + } + ] + } + } + ] + }, + "primary": {}, + "value": {} + } + }, + { + "map_key": { + "range": "d2/testdata/d2oracle/TestRename/nested.d2,1:0:27-3:1:60", + "key": { + "range": "d2/testdata/d2oracle/TestRename/nested.d2,1:0:27-1:7:34", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/nested.d2,1:0:27-1:1:28", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/nested.d2,1:2:29-1:3:30", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/nested.d2,1:4:31-1:5:32", + "value": [ + { + "string": "z", + "raw_string": "z" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/nested.d2,1:6:33-1:7:34", + "value": [ + { + "string": "q", + "raw_string": "q" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "map": { + "range": "d2/testdata/d2oracle/TestRename/nested.d2,1:9:36-3:0:59", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestRename/nested.d2,2:2:40-2:20:58", + "key": { + "range": "d2/testdata/d2oracle/TestRename/nested.d2,2:2:40-2:20:58", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/nested.d2,2:2:40-2:20:58", + "value": [ + { + "string": "nerve-gift-jingler", + "raw_string": "nerve-gift-jingler" + } + ] + } + } + ] + }, + "primary": {}, + "value": {} + } + } + ] + } + } + } + } + ] + }, + "root": { + "id": "", + "id_val": "", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + "edges": null, + "objects": [ + { + "id": "x", + "id_val": "x", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestRename/nested.d2,0:0:0-0:26:26", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/nested.d2,0:0:0-0:1:1", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/nested.d2,0:2:2-0:3:3", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/nested.d2,0:4:4-0:5:5", + "value": [ + { + "string": "z", + "raw_string": "z" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/nested.d2,0:6:6-0:7:7", + "value": [ + { + "string": "q", + "raw_string": "q" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/nested.d2,0:8:8-0:26:26", + "value": [ + { + "string": "nerve-gift-jingler", + "raw_string": "nerve-gift-jingler" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + }, + { + "key": { + "range": "d2/testdata/d2oracle/TestRename/nested.d2,1:0:27-1:7:34", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/nested.d2,1:0:27-1:1:28", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/nested.d2,1:2:29-1:3:30", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/nested.d2,1:4:31-1:5:32", + "value": [ + { + "string": "z", + "raw_string": "z" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/nested.d2,1:6:33-1:7:34", + "value": [ + { + "string": "q", + "raw_string": "q" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "x" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "y", + "id_val": "y", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestRename/nested.d2,0:0:0-0:26:26", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/nested.d2,0:0:0-0:1:1", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/nested.d2,0:2:2-0:3:3", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/nested.d2,0:4:4-0:5:5", + "value": [ + { + "string": "z", + "raw_string": "z" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/nested.d2,0:6:6-0:7:7", + "value": [ + { + "string": "q", + "raw_string": "q" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/nested.d2,0:8:8-0:26:26", + "value": [ + { + "string": "nerve-gift-jingler", + "raw_string": "nerve-gift-jingler" + } + ] + } + } + ] + }, + "key_path_index": 1, + "map_key_edge_index": 0 + }, + { + "key": { + "range": "d2/testdata/d2oracle/TestRename/nested.d2,1:0:27-1:7:34", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/nested.d2,1:0:27-1:1:28", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/nested.d2,1:2:29-1:3:30", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/nested.d2,1:4:31-1:5:32", + "value": [ + { + "string": "z", + "raw_string": "z" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/nested.d2,1:6:33-1:7:34", + "value": [ + { + "string": "q", + "raw_string": "q" + } + ] + } + } + ] + }, + "key_path_index": 1, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "y" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "z", + "id_val": "z", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestRename/nested.d2,0:0:0-0:26:26", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/nested.d2,0:0:0-0:1:1", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/nested.d2,0:2:2-0:3:3", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/nested.d2,0:4:4-0:5:5", + "value": [ + { + "string": "z", + "raw_string": "z" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/nested.d2,0:6:6-0:7:7", + "value": [ + { + "string": "q", + "raw_string": "q" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/nested.d2,0:8:8-0:26:26", + "value": [ + { + "string": "nerve-gift-jingler", + "raw_string": "nerve-gift-jingler" + } + ] + } + } + ] + }, + "key_path_index": 2, + "map_key_edge_index": 0 + }, + { + "key": { + "range": "d2/testdata/d2oracle/TestRename/nested.d2,1:0:27-1:7:34", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/nested.d2,1:0:27-1:1:28", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/nested.d2,1:2:29-1:3:30", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/nested.d2,1:4:31-1:5:32", + "value": [ + { + "string": "z", + "raw_string": "z" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/nested.d2,1:6:33-1:7:34", + "value": [ + { + "string": "q", + "raw_string": "q" + } + ] + } + } + ] + }, + "key_path_index": 2, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "z" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "q", + "id_val": "q", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestRename/nested.d2,0:0:0-0:26:26", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/nested.d2,0:0:0-0:1:1", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/nested.d2,0:2:2-0:3:3", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/nested.d2,0:4:4-0:5:5", + "value": [ + { + "string": "z", + "raw_string": "z" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/nested.d2,0:6:6-0:7:7", + "value": [ + { + "string": "q", + "raw_string": "q" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/nested.d2,0:8:8-0:26:26", + "value": [ + { + "string": "nerve-gift-jingler", + "raw_string": "nerve-gift-jingler" + } + ] + } + } + ] + }, + "key_path_index": 3, + "map_key_edge_index": 0 + }, + { + "key": { + "range": "d2/testdata/d2oracle/TestRename/nested.d2,1:0:27-1:7:34", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/nested.d2,1:0:27-1:1:28", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/nested.d2,1:2:29-1:3:30", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/nested.d2,1:4:31-1:5:32", + "value": [ + { + "string": "z", + "raw_string": "z" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/nested.d2,1:6:33-1:7:34", + "value": [ + { + "string": "q", + "raw_string": "q" + } + ] + } + } + ] + }, + "key_path_index": 3, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "q" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "nerve-gift-jingler", + "id_val": "nerve-gift-jingler", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestRename/nested.d2,0:0:0-0:26:26", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/nested.d2,0:0:0-0:1:1", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/nested.d2,0:2:2-0:3:3", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/nested.d2,0:4:4-0:5:5", + "value": [ + { + "string": "z", + "raw_string": "z" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/nested.d2,0:6:6-0:7:7", + "value": [ + { + "string": "q", + "raw_string": "q" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/nested.d2,0:8:8-0:26:26", + "value": [ + { + "string": "nerve-gift-jingler", + "raw_string": "nerve-gift-jingler" + } + ] + } + } + ] + }, + "key_path_index": 4, + "map_key_edge_index": 0 + }, + { + "key": { + "range": "d2/testdata/d2oracle/TestRename/nested.d2,2:2:40-2:20:58", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestRename/nested.d2,2:2:40-2:20:58", + "value": [ + { + "string": "nerve-gift-jingler", + "raw_string": "nerve-gift-jingler" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "nerve-gift-jingler" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ] + }, + "err": "" +} diff --git a/testdata/d2oracle/TestSet/base.exp.json b/testdata/d2oracle/TestSet/base.exp.json new file mode 100644 index 000000000..b67328cd1 --- /dev/null +++ b/testdata/d2oracle/TestSet/base.exp.json @@ -0,0 +1,94 @@ +{ + "graph": { + "ast": { + "range": "d2/testdata/d2oracle/TestSet/base.d2,0:0:0-1:0:7", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestSet/base.d2,0:0:0-0:6:6", + "key": { + "range": "d2/testdata/d2oracle/TestSet/base.d2,0:0:0-0:6:6", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestSet/base.d2,0:0:0-0:6:6", + "value": [ + { + "string": "square", + "raw_string": "square" + } + ] + } + } + ] + }, + "primary": {}, + "value": {} + } + } + ] + }, + "root": { + "id": "", + "id_val": "", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + "edges": null, + "objects": [ + { + "id": "square", + "id_val": "square", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestSet/base.d2,0:0:0-0:6:6", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestSet/base.d2,0:0:0-0:6:6", + "value": [ + { + "string": "square", + "raw_string": "square" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "square" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ] + }, + "err": "" +} diff --git a/testdata/d2oracle/TestSet/block_string_multiline.exp.json b/testdata/d2oracle/TestSet/block_string_multiline.exp.json new file mode 100644 index 000000000..cdc06a233 --- /dev/null +++ b/testdata/d2oracle/TestSet/block_string_multiline.exp.json @@ -0,0 +1,102 @@ +{ + "graph": { + "ast": { + "range": "d2/testdata/d2oracle/TestSet/block_string_multiline.d2,0:0:0-5:0:146", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestSet/block_string_multiline.d2,0:0:0-4:1:145", + "key": { + "range": "d2/testdata/d2oracle/TestSet/block_string_multiline.d2,0:0:0-0:1:1", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestSet/block_string_multiline.d2,0:0:0-0:1:1", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "block_string": { + "range": "d2/testdata/d2oracle/TestSet/block_string_multiline.d2,0:3:3-4:1:145", + "quote": "", + "tag": "md", + "value": "# header\nHe has not acquired a fortune; the fortune has acquired him.\nHe has not acquired a fortune; the fortune has acquired him." + } + } + } + } + ] + }, + "root": { + "id": "", + "id_val": "", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + "edges": null, + "objects": [ + { + "id": "x", + "id_val": "x", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestSet/block_string_multiline.d2,0:0:0-0:1:1", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestSet/block_string_multiline.d2,0:0:0-0:1:1", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "# header\nHe has not acquired a fortune; the fortune has acquired him.\nHe has not acquired a fortune; the fortune has acquired him." + }, + "style": {}, + "near_key": null, + "language": "markdown", + "shape": { + "value": "text" + } + } + } + ] + }, + "err": "" +} diff --git a/testdata/d2oracle/TestSet/block_string_oneline.exp.json b/testdata/d2oracle/TestSet/block_string_oneline.exp.json new file mode 100644 index 000000000..006572fbb --- /dev/null +++ b/testdata/d2oracle/TestSet/block_string_oneline.exp.json @@ -0,0 +1,102 @@ +{ + "graph": { + "ast": { + "range": "d2/testdata/d2oracle/TestSet/block_string_oneline.d2,0:0:0-1:0:31", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestSet/block_string_oneline.d2,0:0:0-0:30:30", + "key": { + "range": "d2/testdata/d2oracle/TestSet/block_string_oneline.d2,0:0:0-0:1:1", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestSet/block_string_oneline.d2,0:0:0-0:1:1", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "block_string": { + "range": "d2/testdata/d2oracle/TestSet/block_string_oneline.d2,0:3:3-0:30:30", + "quote": "|||", + "tag": "md", + "value": "|||what's up|||" + } + } + } + } + ] + }, + "root": { + "id": "", + "id_val": "", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + "edges": null, + "objects": [ + { + "id": "x", + "id_val": "x", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestSet/block_string_oneline.d2,0:0:0-0:1:1", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestSet/block_string_oneline.d2,0:0:0-0:1:1", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "|||what's up|||" + }, + "style": {}, + "near_key": null, + "language": "markdown", + "shape": { + "value": "text" + } + } + } + ] + }, + "err": "" +} diff --git a/testdata/d2oracle/TestSet/edge.exp.json b/testdata/d2oracle/TestSet/edge.exp.json new file mode 100644 index 000000000..507949965 --- /dev/null +++ b/testdata/d2oracle/TestSet/edge.exp.json @@ -0,0 +1,195 @@ +{ + "graph": { + "ast": { + "range": "d2/testdata/d2oracle/TestSet/edge.d2,0:0:0-1:0:12", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestSet/edge.d2,0:0:0-0:11:11", + "edges": [ + { + "range": "d2/testdata/d2oracle/TestSet/edge.d2,0:0:0-0:6:6", + "src": { + "range": "d2/testdata/d2oracle/TestSet/edge.d2,0:0:0-0:2:2", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestSet/edge.d2,0:0:0-0:1:1", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "src_arrow": "", + "dst": { + "range": "d2/testdata/d2oracle/TestSet/edge.d2,0:4:4-0:6:6", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestSet/edge.d2,0:5:5-0:6:6", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + } + ] + }, + "dst_arrow": ">" + } + ], + "primary": {}, + "value": { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestSet/edge.d2,0:8:8-0:11:11", + "value": [ + { + "string": "two", + "raw_string": "two" + } + ] + } + } + } + } + ] + }, + "root": { + "id": "", + "id_val": "", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + "edges": [ + { + "index": 0, + "minWidth": 0, + "minHeight": 0, + "label_dimensions": { + "width": 0, + "height": 0 + }, + "isCurve": false, + "src_arrow": false, + "dst_arrow": true, + "references": [ + { + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "two" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ], + "objects": [ + { + "id": "x", + "id_val": "x", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestSet/edge.d2,0:0:0-0:2:2", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestSet/edge.d2,0:0:0-0:1:1", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "x" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "y", + "id_val": "y", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestSet/edge.d2,0:4:4-0:6:6", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestSet/edge.d2,0:5:5-0:6:6", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "y" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ] + }, + "err": "" +} diff --git a/testdata/d2oracle/TestSet/edge_append_style.exp.json b/testdata/d2oracle/TestSet/edge_append_style.exp.json new file mode 100644 index 000000000..8f0021f3f --- /dev/null +++ b/testdata/d2oracle/TestSet/edge_append_style.exp.json @@ -0,0 +1,234 @@ +{ + "graph": { + "ast": { + "range": "d2/testdata/d2oracle/TestSet/edge_append_style.d2,0:0:0-1:0:31", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestSet/edge_append_style.d2,0:0:0-0:30:30", + "edges": [ + { + "range": "d2/testdata/d2oracle/TestSet/edge_append_style.d2,0:0:0-0:6:6", + "src": { + "range": "d2/testdata/d2oracle/TestSet/edge_append_style.d2,0:0:0-0:2:2", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestSet/edge_append_style.d2,0:0:0-0:1:1", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "src_arrow": "", + "dst": { + "range": "d2/testdata/d2oracle/TestSet/edge_append_style.d2,0:4:4-0:6:6", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestSet/edge_append_style.d2,0:5:5-0:6:6", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + } + ] + }, + "dst_arrow": ">" + } + ], + "primary": {}, + "value": { + "map": { + "range": "d2/testdata/d2oracle/TestSet/edge_append_style.d2,0:8:8-0:29:29", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestSet/edge_append_style.d2,0:9:9-0:29:29", + "key": { + "range": "d2/testdata/d2oracle/TestSet/edge_append_style.d2,0:9:9-0:23:23", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestSet/edge_append_style.d2,0:9:9-0:14:14", + "value": [ + { + "string": "style", + "raw_string": "style" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestSet/edge_append_style.d2,0:15:15-0:23:23", + "value": [ + { + "string": "animated", + "raw_string": "animated" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "boolean": { + "range": "d2/testdata/d2oracle/TestSet/edge_append_style.d2,0:25:25-0:29:29", + "value": true + } + } + } + } + ] + } + } + } + } + ] + }, + "root": { + "id": "", + "id_val": "", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + "edges": [ + { + "index": 0, + "minWidth": 0, + "minHeight": 0, + "label_dimensions": { + "width": 0, + "height": 0 + }, + "isCurve": false, + "src_arrow": false, + "dst_arrow": true, + "references": [ + { + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "" + }, + "style": { + "animated": { + "value": "true" + } + }, + "near_key": null, + "shape": { + "value": "" + } + } + } + ], + "objects": [ + { + "id": "x", + "id_val": "x", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestSet/edge_append_style.d2,0:0:0-0:2:2", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestSet/edge_append_style.d2,0:0:0-0:1:1", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "x" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "y", + "id_val": "y", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestSet/edge_append_style.d2,0:4:4-0:6:6", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestSet/edge_append_style.d2,0:5:5-0:6:6", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "y" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ] + }, + "err": "" +} diff --git a/testdata/d2oracle/TestSet/edge_chain.exp.json b/testdata/d2oracle/TestSet/edge_chain.exp.json new file mode 100644 index 000000000..a4a3367d0 --- /dev/null +++ b/testdata/d2oracle/TestSet/edge_chain.exp.json @@ -0,0 +1,492 @@ +{ + "graph": { + "ast": { + "range": "d2/testdata/d2oracle/TestSet/edge_chain.d2,0:0:0-4:0:93", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestSet/edge_chain.d2,0:0:0-3:1:92", + "key": { + "range": "d2/testdata/d2oracle/TestSet/edge_chain.d2,0:0:0-0:4:4", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestSet/edge_chain.d2,0:0:0-0:4:4", + "value": [ + { + "string": "oreo", + "raw_string": "oreo" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "map": { + "range": "d2/testdata/d2oracle/TestSet/edge_chain.d2,0:6:6-3:0:91", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestSet/edge_chain.d2,1:2:10-1:19:27", + "edges": [ + { + "range": "d2/testdata/d2oracle/TestSet/edge_chain.d2,1:2:10-1:9:17", + "src": { + "range": "d2/testdata/d2oracle/TestSet/edge_chain.d2,1:2:10-1:4:12", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestSet/edge_chain.d2,1:2:10-1:3:11", + "value": [ + { + "string": "q", + "raw_string": "q" + } + ] + } + } + ] + }, + "src_arrow": "", + "dst": { + "range": "d2/testdata/d2oracle/TestSet/edge_chain.d2,1:6:14-1:9:17", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestSet/edge_chain.d2,1:7:15-1:8:16", + "value": [ + { + "string": "z", + "raw_string": "z" + } + ] + } + } + ] + }, + "dst_arrow": ">" + }, + { + "range": "d2/testdata/d2oracle/TestSet/edge_chain.d2,1:6:14-1:13:21", + "src": { + "range": "d2/testdata/d2oracle/TestSet/edge_chain.d2,1:6:14-1:9:17", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestSet/edge_chain.d2,1:7:15-1:8:16", + "value": [ + { + "string": "z", + "raw_string": "z" + } + ] + } + } + ] + }, + "src_arrow": "", + "dst": { + "range": "d2/testdata/d2oracle/TestSet/edge_chain.d2,1:11:19-1:13:21", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestSet/edge_chain.d2,1:12:20-1:13:21", + "value": [ + { + "string": "p", + "raw_string": "p" + } + ] + } + } + ] + }, + "dst_arrow": ">" + } + ], + "primary": {}, + "value": { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestSet/edge_chain.d2,1:15:23-1:19:27", + "value": [ + { + "string": "wsup", + "raw_string": "wsup" + } + ] + } + } + } + }, + { + "map_key": { + "range": "d2/testdata/d2oracle/TestSet/edge_chain.d2,2:2:30-2:62:90", + "edges": [ + { + "range": "d2/testdata/d2oracle/TestSet/edge_chain.d2,2:3:31-2:9:37", + "src": { + "range": "d2/testdata/d2oracle/TestSet/edge_chain.d2,2:3:31-2:5:33", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestSet/edge_chain.d2,2:3:31-2:4:32", + "value": [ + { + "string": "q", + "raw_string": "q" + } + ] + } + } + ] + }, + "src_arrow": "", + "dst": { + "range": "d2/testdata/d2oracle/TestSet/edge_chain.d2,2:7:35-2:9:37", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestSet/edge_chain.d2,2:8:36-2:9:37", + "value": [ + { + "string": "z", + "raw_string": "z" + } + ] + } + } + ] + }, + "dst_arrow": ">" + } + ], + "edge_index": { + "range": "d2/testdata/d2oracle/TestSet/edge_chain.d2,2:10:38-2:13:41", + "int": 0, + "glob": false + }, + "primary": {}, + "value": { + "double_quoted_string": { + "range": "d2/testdata/d2oracle/TestSet/edge_chain.d2,2:15:43-2:62:90", + "value": [ + { + "string": "QOTD:\n \"It's been Monday all week today.\"", + "raw_string": "QOTD:\\n \\\"It's been Monday all week today.\\\"" + } + ] + } + } + } + } + ] + } + } + } + } + ] + }, + "root": { + "id": "", + "id_val": "", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + "edges": [ + { + "index": 0, + "minWidth": 0, + "minHeight": 0, + "label_dimensions": { + "width": 0, + "height": 0 + }, + "isCurve": false, + "src_arrow": false, + "dst_arrow": true, + "references": [ + { + "map_key_edge_index": 0 + }, + { + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "QOTD:\n \"It's been Monday all week today.\"" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "index": 0, + "minWidth": 0, + "minHeight": 0, + "label_dimensions": { + "width": 0, + "height": 0 + }, + "isCurve": false, + "src_arrow": false, + "dst_arrow": true, + "references": [ + { + "map_key_edge_index": 1 + } + ], + "attributes": { + "label": { + "value": "wsup" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ], + "objects": [ + { + "id": "oreo", + "id_val": "oreo", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestSet/edge_chain.d2,0:0:0-0:4:4", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestSet/edge_chain.d2,0:0:0-0:4:4", + "value": [ + { + "string": "oreo", + "raw_string": "oreo" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "oreo" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "q", + "id_val": "q", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestSet/edge_chain.d2,1:2:10-1:4:12", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestSet/edge_chain.d2,1:2:10-1:3:11", + "value": [ + { + "string": "q", + "raw_string": "q" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + }, + { + "key": { + "range": "d2/testdata/d2oracle/TestSet/edge_chain.d2,2:3:31-2:5:33", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestSet/edge_chain.d2,2:3:31-2:4:32", + "value": [ + { + "string": "q", + "raw_string": "q" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "q" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "z", + "id_val": "z", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestSet/edge_chain.d2,1:6:14-1:9:17", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestSet/edge_chain.d2,1:7:15-1:8:16", + "value": [ + { + "string": "z", + "raw_string": "z" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + }, + { + "key": { + "range": "d2/testdata/d2oracle/TestSet/edge_chain.d2,1:6:14-1:9:17", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestSet/edge_chain.d2,1:7:15-1:8:16", + "value": [ + { + "string": "z", + "raw_string": "z" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 1 + }, + { + "key": { + "range": "d2/testdata/d2oracle/TestSet/edge_chain.d2,2:7:35-2:9:37", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestSet/edge_chain.d2,2:8:36-2:9:37", + "value": [ + { + "string": "z", + "raw_string": "z" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "z" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "p", + "id_val": "p", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestSet/edge_chain.d2,1:11:19-1:13:21", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestSet/edge_chain.d2,1:12:20-1:13:21", + "value": [ + { + "string": "p", + "raw_string": "p" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 1 + } + ], + "attributes": { + "label": { + "value": "p" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ] + }, + "err": "" +} diff --git a/testdata/d2oracle/TestSet/edge_chain_append_style.exp.json b/testdata/d2oracle/TestSet/edge_chain_append_style.exp.json new file mode 100644 index 000000000..9d923038f --- /dev/null +++ b/testdata/d2oracle/TestSet/edge_chain_append_style.exp.json @@ -0,0 +1,439 @@ +{ + "graph": { + "ast": { + "range": "d2/testdata/d2oracle/TestSet/edge_chain_append_style.d2,0:0:0-2:0:45", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestSet/edge_chain_append_style.d2,0:0:0-0:11:11", + "edges": [ + { + "range": "d2/testdata/d2oracle/TestSet/edge_chain_append_style.d2,0:0:0-0:7:7", + "src": { + "range": "d2/testdata/d2oracle/TestSet/edge_chain_append_style.d2,0:0:0-0:2:2", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestSet/edge_chain_append_style.d2,0:0:0-0:1:1", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "src_arrow": "", + "dst": { + "range": "d2/testdata/d2oracle/TestSet/edge_chain_append_style.d2,0:4:4-0:7:7", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestSet/edge_chain_append_style.d2,0:5:5-0:6:6", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + } + ] + }, + "dst_arrow": ">" + }, + { + "range": "d2/testdata/d2oracle/TestSet/edge_chain_append_style.d2,0:4:4-0:11:11", + "src": { + "range": "d2/testdata/d2oracle/TestSet/edge_chain_append_style.d2,0:4:4-0:7:7", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestSet/edge_chain_append_style.d2,0:5:5-0:6:6", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + } + ] + }, + "src_arrow": "", + "dst": { + "range": "d2/testdata/d2oracle/TestSet/edge_chain_append_style.d2,0:9:9-0:11:11", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestSet/edge_chain_append_style.d2,0:10:10-0:11:11", + "value": [ + { + "string": "z", + "raw_string": "z" + } + ] + } + } + ] + }, + "dst_arrow": ">" + } + ], + "primary": {}, + "value": {} + } + }, + { + "map_key": { + "range": "d2/testdata/d2oracle/TestSet/edge_chain_append_style.d2,1:0:12-1:32:44", + "edges": [ + { + "range": "d2/testdata/d2oracle/TestSet/edge_chain_append_style.d2,1:1:13-1:7:19", + "src": { + "range": "d2/testdata/d2oracle/TestSet/edge_chain_append_style.d2,1:1:13-1:3:15", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestSet/edge_chain_append_style.d2,1:1:13-1:2:14", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "src_arrow": "", + "dst": { + "range": "d2/testdata/d2oracle/TestSet/edge_chain_append_style.d2,1:5:17-1:7:19", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestSet/edge_chain_append_style.d2,1:6:18-1:7:19", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + } + ] + }, + "dst_arrow": ">" + } + ], + "edge_index": { + "range": "d2/testdata/d2oracle/TestSet/edge_chain_append_style.d2,1:8:20-1:11:23", + "int": 0, + "glob": false + }, + "edge_key": { + "range": "d2/testdata/d2oracle/TestSet/edge_chain_append_style.d2,1:12:24-1:26:38", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestSet/edge_chain_append_style.d2,1:12:24-1:17:29", + "value": [ + { + "string": "style", + "raw_string": "style" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestSet/edge_chain_append_style.d2,1:18:30-1:26:38", + "value": [ + { + "string": "animated", + "raw_string": "animated" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "boolean": { + "range": "d2/testdata/d2oracle/TestSet/edge_chain_append_style.d2,1:28:40-1:32:44", + "value": true + } + } + } + } + ] + }, + "root": { + "id": "", + "id_val": "", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + "edges": [ + { + "index": 0, + "minWidth": 0, + "minHeight": 0, + "label_dimensions": { + "width": 0, + "height": 0 + }, + "isCurve": false, + "src_arrow": false, + "dst_arrow": true, + "references": [ + { + "map_key_edge_index": 0 + }, + { + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "" + }, + "style": { + "animated": { + "value": "true" + } + }, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "index": 0, + "minWidth": 0, + "minHeight": 0, + "label_dimensions": { + "width": 0, + "height": 0 + }, + "isCurve": false, + "src_arrow": false, + "dst_arrow": true, + "references": [ + { + "map_key_edge_index": 1 + } + ], + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ], + "objects": [ + { + "id": "x", + "id_val": "x", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestSet/edge_chain_append_style.d2,0:0:0-0:2:2", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestSet/edge_chain_append_style.d2,0:0:0-0:1:1", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + }, + { + "key": { + "range": "d2/testdata/d2oracle/TestSet/edge_chain_append_style.d2,1:1:13-1:3:15", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestSet/edge_chain_append_style.d2,1:1:13-1:2:14", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "x" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "y", + "id_val": "y", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestSet/edge_chain_append_style.d2,0:4:4-0:7:7", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestSet/edge_chain_append_style.d2,0:5:5-0:6:6", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + }, + { + "key": { + "range": "d2/testdata/d2oracle/TestSet/edge_chain_append_style.d2,0:4:4-0:7:7", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestSet/edge_chain_append_style.d2,0:5:5-0:6:6", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 1 + }, + { + "key": { + "range": "d2/testdata/d2oracle/TestSet/edge_chain_append_style.d2,1:5:17-1:7:19", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestSet/edge_chain_append_style.d2,1:6:18-1:7:19", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "y" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "z", + "id_val": "z", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestSet/edge_chain_append_style.d2,0:9:9-0:11:11", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestSet/edge_chain_append_style.d2,0:10:10-0:11:11", + "value": [ + { + "string": "z", + "raw_string": "z" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 1 + } + ], + "attributes": { + "label": { + "value": "z" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ] + }, + "err": "" +} diff --git a/testdata/d2oracle/TestSet/edge_chain_existing_style.exp.json b/testdata/d2oracle/TestSet/edge_chain_existing_style.exp.json new file mode 100644 index 000000000..812c17710 --- /dev/null +++ b/testdata/d2oracle/TestSet/edge_chain_existing_style.exp.json @@ -0,0 +1,569 @@ +{ + "graph": { + "ast": { + "range": "d2/testdata/d2oracle/TestSet/edge_chain_existing_style.d2,0:0:0-3:0:76", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestSet/edge_chain_existing_style.d2,0:0:0-0:11:11", + "edges": [ + { + "range": "d2/testdata/d2oracle/TestSet/edge_chain_existing_style.d2,0:0:0-0:7:7", + "src": { + "range": "d2/testdata/d2oracle/TestSet/edge_chain_existing_style.d2,0:0:0-0:2:2", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestSet/edge_chain_existing_style.d2,0:0:0-0:1:1", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "src_arrow": "", + "dst": { + "range": "d2/testdata/d2oracle/TestSet/edge_chain_existing_style.d2,0:4:4-0:7:7", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestSet/edge_chain_existing_style.d2,0:5:5-0:6:6", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + } + ] + }, + "dst_arrow": ">" + }, + { + "range": "d2/testdata/d2oracle/TestSet/edge_chain_existing_style.d2,0:4:4-0:11:11", + "src": { + "range": "d2/testdata/d2oracle/TestSet/edge_chain_existing_style.d2,0:4:4-0:7:7", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestSet/edge_chain_existing_style.d2,0:5:5-0:6:6", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + } + ] + }, + "src_arrow": "", + "dst": { + "range": "d2/testdata/d2oracle/TestSet/edge_chain_existing_style.d2,0:9:9-0:11:11", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestSet/edge_chain_existing_style.d2,0:10:10-0:11:11", + "value": [ + { + "string": "z", + "raw_string": "z" + } + ] + } + } + ] + }, + "dst_arrow": ">" + } + ], + "primary": {}, + "value": {} + } + }, + { + "map_key": { + "range": "d2/testdata/d2oracle/TestSet/edge_chain_existing_style.d2,1:0:12-1:30:42", + "edges": [ + { + "range": "d2/testdata/d2oracle/TestSet/edge_chain_existing_style.d2,1:1:13-1:7:19", + "src": { + "range": "d2/testdata/d2oracle/TestSet/edge_chain_existing_style.d2,1:1:13-1:3:15", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestSet/edge_chain_existing_style.d2,1:1:13-1:2:14", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + } + ] + }, + "src_arrow": "", + "dst": { + "range": "d2/testdata/d2oracle/TestSet/edge_chain_existing_style.d2,1:5:17-1:7:19", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestSet/edge_chain_existing_style.d2,1:6:18-1:7:19", + "value": [ + { + "string": "z", + "raw_string": "z" + } + ] + } + } + ] + }, + "dst_arrow": ">" + } + ], + "edge_index": { + "range": "d2/testdata/d2oracle/TestSet/edge_chain_existing_style.d2,1:8:20-1:11:23", + "int": 0, + "glob": false + }, + "edge_key": { + "range": "d2/testdata/d2oracle/TestSet/edge_chain_existing_style.d2,1:12:24-1:25:37", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestSet/edge_chain_existing_style.d2,1:12:24-1:17:29", + "value": [ + { + "string": "style", + "raw_string": "style" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestSet/edge_chain_existing_style.d2,1:18:30-1:25:37", + "value": [ + { + "string": "opacity", + "raw_string": "opacity" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "number": { + "range": "d2/testdata/d2oracle/TestSet/edge_chain_existing_style.d2,1:27:39-1:30:42", + "raw": "0.4", + "value": "2/5" + } + } + } + }, + { + "map_key": { + "range": "d2/testdata/d2oracle/TestSet/edge_chain_existing_style.d2,2:0:43-2:32:75", + "edges": [ + { + "range": "d2/testdata/d2oracle/TestSet/edge_chain_existing_style.d2,2:1:44-2:7:50", + "src": { + "range": "d2/testdata/d2oracle/TestSet/edge_chain_existing_style.d2,2:1:44-2:3:46", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestSet/edge_chain_existing_style.d2,2:1:44-2:2:45", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + } + ] + }, + "src_arrow": "", + "dst": { + "range": "d2/testdata/d2oracle/TestSet/edge_chain_existing_style.d2,2:5:48-2:7:50", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestSet/edge_chain_existing_style.d2,2:6:49-2:7:50", + "value": [ + { + "string": "z", + "raw_string": "z" + } + ] + } + } + ] + }, + "dst_arrow": ">" + } + ], + "edge_index": { + "range": "d2/testdata/d2oracle/TestSet/edge_chain_existing_style.d2,2:8:51-2:11:54", + "int": 0, + "glob": false + }, + "edge_key": { + "range": "d2/testdata/d2oracle/TestSet/edge_chain_existing_style.d2,2:12:55-2:26:69", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestSet/edge_chain_existing_style.d2,2:12:55-2:17:60", + "value": [ + { + "string": "style", + "raw_string": "style" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestSet/edge_chain_existing_style.d2,2:18:61-2:26:69", + "value": [ + { + "string": "animated", + "raw_string": "animated" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "boolean": { + "range": "d2/testdata/d2oracle/TestSet/edge_chain_existing_style.d2,2:28:71-2:32:75", + "value": true + } + } + } + } + ] + }, + "root": { + "id": "", + "id_val": "", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + "edges": [ + { + "index": 0, + "minWidth": 0, + "minHeight": 0, + "label_dimensions": { + "width": 0, + "height": 0 + }, + "isCurve": false, + "src_arrow": false, + "dst_arrow": true, + "references": [ + { + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "index": 0, + "minWidth": 0, + "minHeight": 0, + "label_dimensions": { + "width": 0, + "height": 0 + }, + "isCurve": false, + "src_arrow": false, + "dst_arrow": true, + "references": [ + { + "map_key_edge_index": 1 + }, + { + "map_key_edge_index": 0 + }, + { + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "" + }, + "style": { + "opacity": { + "value": "0.4" + }, + "animated": { + "value": "true" + } + }, + "near_key": null, + "shape": { + "value": "" + } + } + } + ], + "objects": [ + { + "id": "x", + "id_val": "x", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestSet/edge_chain_existing_style.d2,0:0:0-0:2:2", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestSet/edge_chain_existing_style.d2,0:0:0-0:1:1", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "x" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "y", + "id_val": "y", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestSet/edge_chain_existing_style.d2,0:4:4-0:7:7", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestSet/edge_chain_existing_style.d2,0:5:5-0:6:6", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + }, + { + "key": { + "range": "d2/testdata/d2oracle/TestSet/edge_chain_existing_style.d2,0:4:4-0:7:7", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestSet/edge_chain_existing_style.d2,0:5:5-0:6:6", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 1 + }, + { + "key": { + "range": "d2/testdata/d2oracle/TestSet/edge_chain_existing_style.d2,1:1:13-1:3:15", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestSet/edge_chain_existing_style.d2,1:1:13-1:2:14", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + }, + { + "key": { + "range": "d2/testdata/d2oracle/TestSet/edge_chain_existing_style.d2,2:1:44-2:3:46", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestSet/edge_chain_existing_style.d2,2:1:44-2:2:45", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "y" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "z", + "id_val": "z", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestSet/edge_chain_existing_style.d2,0:9:9-0:11:11", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestSet/edge_chain_existing_style.d2,0:10:10-0:11:11", + "value": [ + { + "string": "z", + "raw_string": "z" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 1 + }, + { + "key": { + "range": "d2/testdata/d2oracle/TestSet/edge_chain_existing_style.d2,1:5:17-1:7:19", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestSet/edge_chain_existing_style.d2,1:6:18-1:7:19", + "value": [ + { + "string": "z", + "raw_string": "z" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + }, + { + "key": { + "range": "d2/testdata/d2oracle/TestSet/edge_chain_existing_style.d2,2:5:48-2:7:50", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestSet/edge_chain_existing_style.d2,2:6:49-2:7:50", + "value": [ + { + "string": "z", + "raw_string": "z" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "z" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ] + }, + "err": "" +} diff --git a/testdata/d2oracle/TestSet/edge_chain_nested_set.exp.json b/testdata/d2oracle/TestSet/edge_chain_nested_set.exp.json new file mode 100644 index 000000000..8e321df40 --- /dev/null +++ b/testdata/d2oracle/TestSet/edge_chain_nested_set.exp.json @@ -0,0 +1,519 @@ +{ + "graph": { + "ast": { + "range": "d2/testdata/d2oracle/TestSet/edge_chain_nested_set.d2,0:0:0-4:0:63", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestSet/edge_chain_nested_set.d2,0:0:0-3:1:62", + "key": { + "range": "d2/testdata/d2oracle/TestSet/edge_chain_nested_set.d2,0:0:0-0:4:4", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestSet/edge_chain_nested_set.d2,0:0:0-0:4:4", + "value": [ + { + "string": "oreo", + "raw_string": "oreo" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "map": { + "range": "d2/testdata/d2oracle/TestSet/edge_chain_nested_set.d2,0:6:6-3:0:61", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestSet/edge_chain_nested_set.d2,1:2:10-1:19:27", + "edges": [ + { + "range": "d2/testdata/d2oracle/TestSet/edge_chain_nested_set.d2,1:2:10-1:9:17", + "src": { + "range": "d2/testdata/d2oracle/TestSet/edge_chain_nested_set.d2,1:2:10-1:4:12", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestSet/edge_chain_nested_set.d2,1:2:10-1:3:11", + "value": [ + { + "string": "q", + "raw_string": "q" + } + ] + } + } + ] + }, + "src_arrow": "", + "dst": { + "range": "d2/testdata/d2oracle/TestSet/edge_chain_nested_set.d2,1:6:14-1:9:17", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestSet/edge_chain_nested_set.d2,1:7:15-1:8:16", + "value": [ + { + "string": "z", + "raw_string": "z" + } + ] + } + } + ] + }, + "dst_arrow": ">" + }, + { + "range": "d2/testdata/d2oracle/TestSet/edge_chain_nested_set.d2,1:6:14-1:13:21", + "src": { + "range": "d2/testdata/d2oracle/TestSet/edge_chain_nested_set.d2,1:6:14-1:9:17", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestSet/edge_chain_nested_set.d2,1:7:15-1:8:16", + "value": [ + { + "string": "z", + "raw_string": "z" + } + ] + } + } + ] + }, + "src_arrow": "", + "dst": { + "range": "d2/testdata/d2oracle/TestSet/edge_chain_nested_set.d2,1:11:19-1:13:21", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestSet/edge_chain_nested_set.d2,1:12:20-1:13:21", + "value": [ + { + "string": "p", + "raw_string": "p" + } + ] + } + } + ] + }, + "dst_arrow": ">" + } + ], + "primary": {}, + "value": { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestSet/edge_chain_nested_set.d2,1:15:23-1:19:27", + "value": [ + { + "string": "wsup", + "raw_string": "wsup" + } + ] + } + } + } + }, + { + "map_key": { + "range": "d2/testdata/d2oracle/TestSet/edge_chain_nested_set.d2,2:2:30-2:32:60", + "edges": [ + { + "range": "d2/testdata/d2oracle/TestSet/edge_chain_nested_set.d2,2:3:31-2:9:37", + "src": { + "range": "d2/testdata/d2oracle/TestSet/edge_chain_nested_set.d2,2:3:31-2:5:33", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestSet/edge_chain_nested_set.d2,2:3:31-2:4:32", + "value": [ + { + "string": "q", + "raw_string": "q" + } + ] + } + } + ] + }, + "src_arrow": "", + "dst": { + "range": "d2/testdata/d2oracle/TestSet/edge_chain_nested_set.d2,2:7:35-2:9:37", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestSet/edge_chain_nested_set.d2,2:8:36-2:9:37", + "value": [ + { + "string": "z", + "raw_string": "z" + } + ] + } + } + ] + }, + "dst_arrow": ">" + } + ], + "edge_index": { + "range": "d2/testdata/d2oracle/TestSet/edge_chain_nested_set.d2,2:10:38-2:13:41", + "int": 0, + "glob": false + }, + "edge_key": { + "range": "d2/testdata/d2oracle/TestSet/edge_chain_nested_set.d2,2:14:42-2:27:55", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestSet/edge_chain_nested_set.d2,2:14:42-2:19:47", + "value": [ + { + "string": "style", + "raw_string": "style" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestSet/edge_chain_nested_set.d2,2:20:48-2:27:55", + "value": [ + { + "string": "opacity", + "raw_string": "opacity" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "number": { + "range": "d2/testdata/d2oracle/TestSet/edge_chain_nested_set.d2,2:29:57-2:32:60", + "raw": "0.4", + "value": "2/5" + } + } + } + } + ] + } + } + } + } + ] + }, + "root": { + "id": "", + "id_val": "", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + "edges": [ + { + "index": 0, + "minWidth": 0, + "minHeight": 0, + "label_dimensions": { + "width": 0, + "height": 0 + }, + "isCurve": false, + "src_arrow": false, + "dst_arrow": true, + "references": [ + { + "map_key_edge_index": 0 + }, + { + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "wsup" + }, + "style": { + "opacity": { + "value": "0.4" + } + }, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "index": 0, + "minWidth": 0, + "minHeight": 0, + "label_dimensions": { + "width": 0, + "height": 0 + }, + "isCurve": false, + "src_arrow": false, + "dst_arrow": true, + "references": [ + { + "map_key_edge_index": 1 + } + ], + "attributes": { + "label": { + "value": "wsup" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ], + "objects": [ + { + "id": "oreo", + "id_val": "oreo", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestSet/edge_chain_nested_set.d2,0:0:0-0:4:4", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestSet/edge_chain_nested_set.d2,0:0:0-0:4:4", + "value": [ + { + "string": "oreo", + "raw_string": "oreo" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "oreo" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "q", + "id_val": "q", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestSet/edge_chain_nested_set.d2,1:2:10-1:4:12", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestSet/edge_chain_nested_set.d2,1:2:10-1:3:11", + "value": [ + { + "string": "q", + "raw_string": "q" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + }, + { + "key": { + "range": "d2/testdata/d2oracle/TestSet/edge_chain_nested_set.d2,2:3:31-2:5:33", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestSet/edge_chain_nested_set.d2,2:3:31-2:4:32", + "value": [ + { + "string": "q", + "raw_string": "q" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "q" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "z", + "id_val": "z", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestSet/edge_chain_nested_set.d2,1:6:14-1:9:17", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestSet/edge_chain_nested_set.d2,1:7:15-1:8:16", + "value": [ + { + "string": "z", + "raw_string": "z" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + }, + { + "key": { + "range": "d2/testdata/d2oracle/TestSet/edge_chain_nested_set.d2,1:6:14-1:9:17", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestSet/edge_chain_nested_set.d2,1:7:15-1:8:16", + "value": [ + { + "string": "z", + "raw_string": "z" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 1 + }, + { + "key": { + "range": "d2/testdata/d2oracle/TestSet/edge_chain_nested_set.d2,2:7:35-2:9:37", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestSet/edge_chain_nested_set.d2,2:8:36-2:9:37", + "value": [ + { + "string": "z", + "raw_string": "z" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "z" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "p", + "id_val": "p", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestSet/edge_chain_nested_set.d2,1:11:19-1:13:21", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestSet/edge_chain_nested_set.d2,1:12:20-1:13:21", + "value": [ + { + "string": "p", + "raw_string": "p" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 1 + } + ], + "attributes": { + "label": { + "value": "p" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ] + }, + "err": "" +} diff --git a/testdata/d2oracle/TestSet/edge_index_case.exp.json b/testdata/d2oracle/TestSet/edge_index_case.exp.json new file mode 100644 index 000000000..6ab4ab7cb --- /dev/null +++ b/testdata/d2oracle/TestSet/edge_index_case.exp.json @@ -0,0 +1,486 @@ +{ + "graph": { + "ast": { + "range": "d2/testdata/d2oracle/TestSet/edge_index_case.d2,0:0:0-6:0:54", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestSet/edge_index_case.d2,0:0:0-2:1:37", + "key": { + "range": "d2/testdata/d2oracle/TestSet/edge_index_case.d2,0:0:0-0:6:6", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestSet/edge_index_case.d2,0:0:0-0:6:6", + "value": [ + { + "string": "Square", + "raw_string": "Square" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "map": { + "range": "d2/testdata/d2oracle/TestSet/edge_index_case.d2,0:8:8-2:0:36", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestSet/edge_index_case.d2,1:2:12-1:25:35", + "edges": [ + { + "range": "d2/testdata/d2oracle/TestSet/edge_index_case.d2,1:2:12-1:20:30", + "src": { + "range": "d2/testdata/d2oracle/TestSet/edge_index_case.d2,1:2:12-1:9:19", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestSet/edge_index_case.d2,1:2:12-1:8:18", + "value": [ + { + "string": "Square", + "raw_string": "Square" + } + ] + } + } + ] + }, + "src_arrow": "", + "dst": { + "range": "d2/testdata/d2oracle/TestSet/edge_index_case.d2,1:11:21-1:20:30", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestSet/edge_index_case.d2,1:12:22-1:20:30", + "value": [ + { + "string": "Square 2", + "raw_string": "Square 2" + } + ] + } + } + ] + }, + "dst_arrow": ">" + } + ], + "primary": {}, + "value": { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestSet/edge_index_case.d2,1:22:32-1:25:35", + "value": [ + { + "string": "two", + "raw_string": "two" + } + ] + } + } + } + } + ] + } + } + } + }, + { + "map_key": { + "range": "d2/testdata/d2oracle/TestSet/edge_index_case.d2,3:0:38-5:1:53", + "key": { + "range": "d2/testdata/d2oracle/TestSet/edge_index_case.d2,3:0:38-3:1:39", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestSet/edge_index_case.d2,3:0:38-3:1:39", + "value": [ + { + "string": "z", + "raw_string": "z" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "map": { + "range": "d2/testdata/d2oracle/TestSet/edge_index_case.d2,3:3:41-5:0:52", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestSet/edge_index_case.d2,4:2:45-4:8:51", + "edges": [ + { + "range": "d2/testdata/d2oracle/TestSet/edge_index_case.d2,4:2:45-4:8:51", + "src": { + "range": "d2/testdata/d2oracle/TestSet/edge_index_case.d2,4:2:45-4:4:47", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestSet/edge_index_case.d2,4:2:45-4:3:46", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "src_arrow": "", + "dst": { + "range": "d2/testdata/d2oracle/TestSet/edge_index_case.d2,4:6:49-4:8:51", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestSet/edge_index_case.d2,4:7:50-4:8:51", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + } + ] + }, + "dst_arrow": ">" + } + ], + "primary": {}, + "value": {} + } + } + ] + } + } + } + } + ] + }, + "root": { + "id": "", + "id_val": "", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + "edges": [ + { + "index": 0, + "minWidth": 0, + "minHeight": 0, + "label_dimensions": { + "width": 0, + "height": 0 + }, + "isCurve": false, + "src_arrow": false, + "dst_arrow": true, + "references": [ + { + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "two" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "index": 0, + "minWidth": 0, + "minHeight": 0, + "label_dimensions": { + "width": 0, + "height": 0 + }, + "isCurve": false, + "src_arrow": false, + "dst_arrow": true, + "references": [ + { + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ], + "objects": [ + { + "id": "Square", + "id_val": "Square", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestSet/edge_index_case.d2,0:0:0-0:6:6", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestSet/edge_index_case.d2,0:0:0-0:6:6", + "value": [ + { + "string": "Square", + "raw_string": "Square" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "Square" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "z", + "id_val": "z", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestSet/edge_index_case.d2,3:0:38-3:1:39", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestSet/edge_index_case.d2,3:0:38-3:1:39", + "value": [ + { + "string": "z", + "raw_string": "z" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "z" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "Square", + "id_val": "Square", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestSet/edge_index_case.d2,1:2:12-1:9:19", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestSet/edge_index_case.d2,1:2:12-1:8:18", + "value": [ + { + "string": "Square", + "raw_string": "Square" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "Square" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "Square 2", + "id_val": "Square 2", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestSet/edge_index_case.d2,1:11:21-1:20:30", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestSet/edge_index_case.d2,1:12:22-1:20:30", + "value": [ + { + "string": "Square 2", + "raw_string": "Square 2" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "Square 2" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "x", + "id_val": "x", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestSet/edge_index_case.d2,4:2:45-4:4:47", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestSet/edge_index_case.d2,4:2:45-4:3:46", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "x" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "y", + "id_val": "y", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestSet/edge_index_case.d2,4:6:49-4:8:51", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestSet/edge_index_case.d2,4:7:50-4:8:51", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "y" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ] + }, + "err": "" +} diff --git a/testdata/d2oracle/TestSet/edge_index_nested.exp.json b/testdata/d2oracle/TestSet/edge_index_nested.exp.json new file mode 100644 index 000000000..375636762 --- /dev/null +++ b/testdata/d2oracle/TestSet/edge_index_nested.exp.json @@ -0,0 +1,264 @@ +{ + "graph": { + "ast": { + "range": "d2/testdata/d2oracle/TestSet/edge_index_nested.d2,0:0:0-3:0:25", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestSet/edge_index_nested.d2,0:0:0-2:1:24", + "key": { + "range": "d2/testdata/d2oracle/TestSet/edge_index_nested.d2,0:0:0-0:4:4", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestSet/edge_index_nested.d2,0:0:0-0:4:4", + "value": [ + { + "string": "oreo", + "raw_string": "oreo" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "map": { + "range": "d2/testdata/d2oracle/TestSet/edge_index_nested.d2,0:6:6-2:0:23", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestSet/edge_index_nested.d2,1:2:10-1:14:22", + "edges": [ + { + "range": "d2/testdata/d2oracle/TestSet/edge_index_nested.d2,1:2:10-1:8:16", + "src": { + "range": "d2/testdata/d2oracle/TestSet/edge_index_nested.d2,1:2:10-1:4:12", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestSet/edge_index_nested.d2,1:2:10-1:3:11", + "value": [ + { + "string": "q", + "raw_string": "q" + } + ] + } + } + ] + }, + "src_arrow": "", + "dst": { + "range": "d2/testdata/d2oracle/TestSet/edge_index_nested.d2,1:6:14-1:8:16", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestSet/edge_index_nested.d2,1:7:15-1:8:16", + "value": [ + { + "string": "z", + "raw_string": "z" + } + ] + } + } + ] + }, + "dst_arrow": ">" + } + ], + "primary": {}, + "value": { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestSet/edge_index_nested.d2,1:10:18-1:14:22", + "value": [ + { + "string": "QOTD", + "raw_string": "QOTD" + } + ] + } + } + } + } + ] + } + } + } + } + ] + }, + "root": { + "id": "", + "id_val": "", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + "edges": [ + { + "index": 0, + "minWidth": 0, + "minHeight": 0, + "label_dimensions": { + "width": 0, + "height": 0 + }, + "isCurve": false, + "src_arrow": false, + "dst_arrow": true, + "references": [ + { + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "QOTD" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ], + "objects": [ + { + "id": "oreo", + "id_val": "oreo", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestSet/edge_index_nested.d2,0:0:0-0:4:4", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestSet/edge_index_nested.d2,0:0:0-0:4:4", + "value": [ + { + "string": "oreo", + "raw_string": "oreo" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "oreo" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "q", + "id_val": "q", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestSet/edge_index_nested.d2,1:2:10-1:4:12", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestSet/edge_index_nested.d2,1:2:10-1:3:11", + "value": [ + { + "string": "q", + "raw_string": "q" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "q" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "z", + "id_val": "z", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestSet/edge_index_nested.d2,1:6:14-1:8:16", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestSet/edge_index_nested.d2,1:7:15-1:8:16", + "value": [ + { + "string": "z", + "raw_string": "z" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "z" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ] + }, + "err": "" +} diff --git a/testdata/d2oracle/TestSet/edge_key_and_key.exp.json b/testdata/d2oracle/TestSet/edge_key_and_key.exp.json new file mode 100644 index 000000000..421bb7d40 --- /dev/null +++ b/testdata/d2oracle/TestSet/edge_key_and_key.exp.json @@ -0,0 +1,403 @@ +{ + "graph": { + "ast": { + "range": "d2/testdata/d2oracle/TestSet/edge_key_and_key.d2,0:0:0-2:0:37", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestSet/edge_key_and_key.d2,0:0:0-0:1:1", + "key": { + "range": "d2/testdata/d2oracle/TestSet/edge_key_and_key.d2,0:0:0-0:1:1", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestSet/edge_key_and_key.d2,0:0:0-0:1:1", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + } + ] + }, + "primary": {}, + "value": {} + } + }, + { + "map_key": { + "range": "d2/testdata/d2oracle/TestSet/edge_key_and_key.d2,1:0:2-1:34:36", + "edges": [ + { + "range": "d2/testdata/d2oracle/TestSet/edge_key_and_key.d2,1:0:2-1:10:12", + "src": { + "range": "d2/testdata/d2oracle/TestSet/edge_key_and_key.d2,1:0:2-1:4:6", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestSet/edge_key_and_key.d2,1:0:2-1:1:3", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestSet/edge_key_and_key.d2,1:2:4-1:3:5", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + } + ] + }, + "src_arrow": "", + "dst": { + "range": "d2/testdata/d2oracle/TestSet/edge_key_and_key.d2,1:6:8-1:10:12", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestSet/edge_key_and_key.d2,1:7:9-1:8:10", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestSet/edge_key_and_key.d2,1:9:11-1:10:12", + "value": [ + { + "string": "c", + "raw_string": "c" + } + ] + } + } + ] + }, + "dst_arrow": ">" + } + ], + "primary": {}, + "value": { + "map": { + "range": "d2/testdata/d2oracle/TestSet/edge_key_and_key.d2,1:12:14-1:33:35", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestSet/edge_key_and_key.d2,1:13:15-1:33:35", + "key": { + "range": "d2/testdata/d2oracle/TestSet/edge_key_and_key.d2,1:13:15-1:27:29", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestSet/edge_key_and_key.d2,1:13:15-1:18:20", + "value": [ + { + "string": "style", + "raw_string": "style" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestSet/edge_key_and_key.d2,1:19:21-1:27:29", + "value": [ + { + "string": "animated", + "raw_string": "animated" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "boolean": { + "range": "d2/testdata/d2oracle/TestSet/edge_key_and_key.d2,1:29:31-1:33:35", + "value": true + } + } + } + } + ] + } + } + } + } + ] + }, + "root": { + "id": "", + "id_val": "", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + "edges": [ + { + "index": 0, + "minWidth": 0, + "minHeight": 0, + "label_dimensions": { + "width": 0, + "height": 0 + }, + "isCurve": false, + "src_arrow": false, + "dst_arrow": true, + "references": [ + { + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "" + }, + "style": { + "animated": { + "value": "true" + } + }, + "near_key": null, + "shape": { + "value": "" + } + } + } + ], + "objects": [ + { + "id": "a", + "id_val": "a", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestSet/edge_key_and_key.d2,0:0:0-0:1:1", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestSet/edge_key_and_key.d2,0:0:0-0:1:1", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + }, + { + "key": { + "range": "d2/testdata/d2oracle/TestSet/edge_key_and_key.d2,1:0:2-1:4:6", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestSet/edge_key_and_key.d2,1:0:2-1:1:3", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestSet/edge_key_and_key.d2,1:2:4-1:3:5", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + }, + { + "key": { + "range": "d2/testdata/d2oracle/TestSet/edge_key_and_key.d2,1:6:8-1:10:12", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestSet/edge_key_and_key.d2,1:7:9-1:8:10", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestSet/edge_key_and_key.d2,1:9:11-1:10:12", + "value": [ + { + "string": "c", + "raw_string": "c" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "a" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "b", + "id_val": "b", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestSet/edge_key_and_key.d2,1:0:2-1:4:6", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestSet/edge_key_and_key.d2,1:0:2-1:1:3", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestSet/edge_key_and_key.d2,1:2:4-1:3:5", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + } + ] + }, + "key_path_index": 1, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "b" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "c", + "id_val": "c", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestSet/edge_key_and_key.d2,1:6:8-1:10:12", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestSet/edge_key_and_key.d2,1:7:9-1:8:10", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestSet/edge_key_and_key.d2,1:9:11-1:10:12", + "value": [ + { + "string": "c", + "raw_string": "c" + } + ] + } + } + ] + }, + "key_path_index": 1, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "c" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ] + }, + "err": "" +} diff --git a/testdata/d2oracle/TestSet/edge_label.exp.json b/testdata/d2oracle/TestSet/edge_label.exp.json new file mode 100644 index 000000000..1f228e913 --- /dev/null +++ b/testdata/d2oracle/TestSet/edge_label.exp.json @@ -0,0 +1,244 @@ +{ + "graph": { + "ast": { + "range": "d2/testdata/d2oracle/TestSet/edge_label.d2,0:0:0-1:0:36", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestSet/edge_label.d2,0:0:0-0:35:35", + "edges": [ + { + "range": "d2/testdata/d2oracle/TestSet/edge_label.d2,0:0:0-0:6:6", + "src": { + "range": "d2/testdata/d2oracle/TestSet/edge_label.d2,0:0:0-0:2:2", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestSet/edge_label.d2,0:0:0-0:1:1", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + } + ] + }, + "src_arrow": "", + "dst": { + "range": "d2/testdata/d2oracle/TestSet/edge_label.d2,0:4:4-0:6:6", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestSet/edge_label.d2,0:5:5-0:6:6", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + } + ] + }, + "dst_arrow": ">" + } + ], + "primary": { + "double_quoted_string": { + "range": "d2/testdata/d2oracle/TestSet/edge_label.d2,0:8:8-0:12:12", + "value": [ + { + "string": "yo", + "raw_string": "yo" + } + ] + } + }, + "value": { + "map": { + "range": "d2/testdata/d2oracle/TestSet/edge_label.d2,0:13:13-0:34:34", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestSet/edge_label.d2,0:14:14-0:34:34", + "key": { + "range": "d2/testdata/d2oracle/TestSet/edge_label.d2,0:14:14-0:28:28", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestSet/edge_label.d2,0:14:14-0:19:19", + "value": [ + { + "string": "style", + "raw_string": "style" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestSet/edge_label.d2,0:20:20-0:28:28", + "value": [ + { + "string": "animated", + "raw_string": "animated" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "boolean": { + "range": "d2/testdata/d2oracle/TestSet/edge_label.d2,0:30:30-0:34:34", + "value": true + } + } + } + } + ] + } + } + } + } + ] + }, + "root": { + "id": "", + "id_val": "", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + "edges": [ + { + "index": 0, + "minWidth": 0, + "minHeight": 0, + "label_dimensions": { + "width": 0, + "height": 0 + }, + "isCurve": false, + "src_arrow": false, + "dst_arrow": true, + "references": [ + { + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "yo" + }, + "style": { + "animated": { + "value": "true" + } + }, + "near_key": null, + "shape": { + "value": "" + } + } + } + ], + "objects": [ + { + "id": "a", + "id_val": "a", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestSet/edge_label.d2,0:0:0-0:2:2", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestSet/edge_label.d2,0:0:0-0:1:1", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "a" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "b", + "id_val": "b", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestSet/edge_label.d2,0:4:4-0:6:6", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestSet/edge_label.d2,0:5:5-0:6:6", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "b" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ] + }, + "err": "" +} diff --git a/testdata/d2oracle/TestSet/edge_merge_style.exp.json b/testdata/d2oracle/TestSet/edge_merge_style.exp.json new file mode 100644 index 000000000..121ce1019 --- /dev/null +++ b/testdata/d2oracle/TestSet/edge_merge_style.exp.json @@ -0,0 +1,284 @@ +{ + "graph": { + "ast": { + "range": "d2/testdata/d2oracle/TestSet/edge_merge_style.d2,0:0:0-6:0:63", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestSet/edge_merge_style.d2,0:0:0-5:1:62", + "edges": [ + { + "range": "d2/testdata/d2oracle/TestSet/edge_merge_style.d2,0:0:0-0:6:6", + "src": { + "range": "d2/testdata/d2oracle/TestSet/edge_merge_style.d2,0:0:0-0:2:2", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestSet/edge_merge_style.d2,0:0:0-0:1:1", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "src_arrow": "", + "dst": { + "range": "d2/testdata/d2oracle/TestSet/edge_merge_style.d2,0:4:4-0:6:6", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestSet/edge_merge_style.d2,0:5:5-0:6:6", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + } + ] + }, + "dst_arrow": ">" + } + ], + "primary": {}, + "value": { + "map": { + "range": "d2/testdata/d2oracle/TestSet/edge_merge_style.d2,0:8:8-5:0:61", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestSet/edge_merge_style.d2,1:2:12-4:3:60", + "key": { + "range": "d2/testdata/d2oracle/TestSet/edge_merge_style.d2,1:2:12-1:7:17", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestSet/edge_merge_style.d2,1:2:12-1:7:17", + "value": [ + { + "string": "style", + "raw_string": "style" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "map": { + "range": "d2/testdata/d2oracle/TestSet/edge_merge_style.d2,1:9:19-4:2:59", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestSet/edge_merge_style.d2,2:4:25-2:16:37", + "key": { + "range": "d2/testdata/d2oracle/TestSet/edge_merge_style.d2,2:4:25-2:11:32", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestSet/edge_merge_style.d2,2:4:25-2:11:32", + "value": [ + { + "string": "opacity", + "raw_string": "opacity" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "number": { + "range": "d2/testdata/d2oracle/TestSet/edge_merge_style.d2,2:13:34-2:16:37", + "raw": "0.4", + "value": "2/5" + } + } + } + }, + { + "map_key": { + "range": "d2/testdata/d2oracle/TestSet/edge_merge_style.d2,3:4:42-3:18:56", + "key": { + "range": "d2/testdata/d2oracle/TestSet/edge_merge_style.d2,3:4:42-3:12:50", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestSet/edge_merge_style.d2,3:4:42-3:12:50", + "value": [ + { + "string": "animated", + "raw_string": "animated" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "boolean": { + "range": "d2/testdata/d2oracle/TestSet/edge_merge_style.d2,3:14:52-3:18:56", + "value": true + } + } + } + } + ] + } + } + } + } + ] + } + } + } + } + ] + }, + "root": { + "id": "", + "id_val": "", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + "edges": [ + { + "index": 0, + "minWidth": 0, + "minHeight": 0, + "label_dimensions": { + "width": 0, + "height": 0 + }, + "isCurve": false, + "src_arrow": false, + "dst_arrow": true, + "references": [ + { + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "" + }, + "style": { + "opacity": { + "value": "0.4" + }, + "animated": { + "value": "true" + } + }, + "near_key": null, + "shape": { + "value": "" + } + } + } + ], + "objects": [ + { + "id": "x", + "id_val": "x", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestSet/edge_merge_style.d2,0:0:0-0:2:2", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestSet/edge_merge_style.d2,0:0:0-0:1:1", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "x" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "y", + "id_val": "y", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestSet/edge_merge_style.d2,0:4:4-0:6:6", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestSet/edge_merge_style.d2,0:5:5-0:6:6", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "y" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ] + }, + "err": "" +} diff --git a/testdata/d2oracle/TestSet/edge_nested_label_set.exp.json b/testdata/d2oracle/TestSet/edge_nested_label_set.exp.json new file mode 100644 index 000000000..5d36f0f28 --- /dev/null +++ b/testdata/d2oracle/TestSet/edge_nested_label_set.exp.json @@ -0,0 +1,264 @@ +{ + "graph": { + "ast": { + "range": "d2/testdata/d2oracle/TestSet/edge_nested_label_set.d2,0:0:0-3:0:23", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestSet/edge_nested_label_set.d2,0:0:0-2:1:22", + "key": { + "range": "d2/testdata/d2oracle/TestSet/edge_nested_label_set.d2,0:0:0-0:4:4", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestSet/edge_nested_label_set.d2,0:0:0-0:4:4", + "value": [ + { + "string": "oreo", + "raw_string": "oreo" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "map": { + "range": "d2/testdata/d2oracle/TestSet/edge_nested_label_set.d2,0:6:6-2:0:21", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestSet/edge_nested_label_set.d2,1:2:10-1:12:20", + "edges": [ + { + "range": "d2/testdata/d2oracle/TestSet/edge_nested_label_set.d2,1:2:10-1:8:16", + "src": { + "range": "d2/testdata/d2oracle/TestSet/edge_nested_label_set.d2,1:2:10-1:4:12", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestSet/edge_nested_label_set.d2,1:2:10-1:3:11", + "value": [ + { + "string": "q", + "raw_string": "q" + } + ] + } + } + ] + }, + "src_arrow": "", + "dst": { + "range": "d2/testdata/d2oracle/TestSet/edge_nested_label_set.d2,1:6:14-1:8:16", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestSet/edge_nested_label_set.d2,1:7:15-1:8:16", + "value": [ + { + "string": "z", + "raw_string": "z" + } + ] + } + } + ] + }, + "dst_arrow": ">" + } + ], + "primary": {}, + "value": { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestSet/edge_nested_label_set.d2,1:10:18-1:12:20", + "value": [ + { + "string": "yo", + "raw_string": "yo" + } + ] + } + } + } + } + ] + } + } + } + } + ] + }, + "root": { + "id": "", + "id_val": "", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + "edges": [ + { + "index": 0, + "minWidth": 0, + "minHeight": 0, + "label_dimensions": { + "width": 0, + "height": 0 + }, + "isCurve": false, + "src_arrow": false, + "dst_arrow": true, + "references": [ + { + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "yo" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ], + "objects": [ + { + "id": "oreo", + "id_val": "oreo", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestSet/edge_nested_label_set.d2,0:0:0-0:4:4", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestSet/edge_nested_label_set.d2,0:0:0-0:4:4", + "value": [ + { + "string": "oreo", + "raw_string": "oreo" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "oreo" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "q", + "id_val": "q", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestSet/edge_nested_label_set.d2,1:2:10-1:4:12", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestSet/edge_nested_label_set.d2,1:2:10-1:3:11", + "value": [ + { + "string": "q", + "raw_string": "q" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "q" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "z", + "id_val": "z", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestSet/edge_nested_label_set.d2,1:6:14-1:8:16", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestSet/edge_nested_label_set.d2,1:7:15-1:8:16", + "value": [ + { + "string": "z", + "raw_string": "z" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "z" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ] + }, + "err": "" +} diff --git a/testdata/d2oracle/TestSet/edge_nested_style_set.exp.json b/testdata/d2oracle/TestSet/edge_nested_style_set.exp.json new file mode 100644 index 000000000..0b5d5025b --- /dev/null +++ b/testdata/d2oracle/TestSet/edge_nested_style_set.exp.json @@ -0,0 +1,314 @@ +{ + "graph": { + "ast": { + "range": "d2/testdata/d2oracle/TestSet/edge_nested_style_set.d2,0:0:0-3:0:46", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestSet/edge_nested_style_set.d2,0:0:0-2:1:45", + "key": { + "range": "d2/testdata/d2oracle/TestSet/edge_nested_style_set.d2,0:0:0-0:4:4", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestSet/edge_nested_style_set.d2,0:0:0-0:4:4", + "value": [ + { + "string": "oreo", + "raw_string": "oreo" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "map": { + "range": "d2/testdata/d2oracle/TestSet/edge_nested_style_set.d2,0:6:6-2:0:44", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestSet/edge_nested_style_set.d2,1:2:10-1:35:43", + "edges": [ + { + "range": "d2/testdata/d2oracle/TestSet/edge_nested_style_set.d2,1:2:10-1:8:16", + "src": { + "range": "d2/testdata/d2oracle/TestSet/edge_nested_style_set.d2,1:2:10-1:4:12", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestSet/edge_nested_style_set.d2,1:2:10-1:3:11", + "value": [ + { + "string": "q", + "raw_string": "q" + } + ] + } + } + ] + }, + "src_arrow": "", + "dst": { + "range": "d2/testdata/d2oracle/TestSet/edge_nested_style_set.d2,1:6:14-1:8:16", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestSet/edge_nested_style_set.d2,1:7:15-1:8:16", + "value": [ + { + "string": "z", + "raw_string": "z" + } + ] + } + } + ] + }, + "dst_arrow": ">" + } + ], + "primary": { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestSet/edge_nested_style_set.d2,1:10:18-1:14:22", + "value": [ + { + "string": "wsup", + "raw_string": "wsup" + } + ] + } + }, + "value": { + "map": { + "range": "d2/testdata/d2oracle/TestSet/edge_nested_style_set.d2,1:15:23-1:34:42", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestSet/edge_nested_style_set.d2,1:16:24-1:34:42", + "key": { + "range": "d2/testdata/d2oracle/TestSet/edge_nested_style_set.d2,1:16:24-1:29:37", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestSet/edge_nested_style_set.d2,1:16:24-1:21:29", + "value": [ + { + "string": "style", + "raw_string": "style" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestSet/edge_nested_style_set.d2,1:22:30-1:29:37", + "value": [ + { + "string": "opacity", + "raw_string": "opacity" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "number": { + "range": "d2/testdata/d2oracle/TestSet/edge_nested_style_set.d2,1:31:39-1:34:42", + "raw": "0.4", + "value": "2/5" + } + } + } + } + ] + } + } + } + } + ] + } + } + } + } + ] + }, + "root": { + "id": "", + "id_val": "", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + "edges": [ + { + "index": 0, + "minWidth": 0, + "minHeight": 0, + "label_dimensions": { + "width": 0, + "height": 0 + }, + "isCurve": false, + "src_arrow": false, + "dst_arrow": true, + "references": [ + { + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "wsup" + }, + "style": { + "opacity": { + "value": "0.4" + } + }, + "near_key": null, + "shape": { + "value": "" + } + } + } + ], + "objects": [ + { + "id": "oreo", + "id_val": "oreo", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestSet/edge_nested_style_set.d2,0:0:0-0:4:4", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestSet/edge_nested_style_set.d2,0:0:0-0:4:4", + "value": [ + { + "string": "oreo", + "raw_string": "oreo" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "oreo" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "q", + "id_val": "q", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestSet/edge_nested_style_set.d2,1:2:10-1:4:12", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestSet/edge_nested_style_set.d2,1:2:10-1:3:11", + "value": [ + { + "string": "q", + "raw_string": "q" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "q" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "z", + "id_val": "z", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestSet/edge_nested_style_set.d2,1:6:14-1:8:16", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestSet/edge_nested_style_set.d2,1:7:15-1:8:16", + "value": [ + { + "string": "z", + "raw_string": "z" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "z" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ] + }, + "err": "" +} diff --git a/testdata/d2oracle/TestSet/errors/bad_tag.exp.json b/testdata/d2oracle/TestSet/errors/bad_tag.exp.json new file mode 100644 index 000000000..486ce5ccd --- /dev/null +++ b/testdata/d2oracle/TestSet/errors/bad_tag.exp.json @@ -0,0 +1,4 @@ +{ + "graph": null, + "err": "failed to set \"x.icon\" to \"one two\" \"\\\"three\\\\nfour\\\\nfive\\\\nsix\\\\n\\\"\": spaces are not allowed in blockstring tags" +} diff --git a/testdata/d2oracle/TestSet/expanded_map_style.exp.json b/testdata/d2oracle/TestSet/expanded_map_style.exp.json new file mode 100644 index 000000000..e349381c3 --- /dev/null +++ b/testdata/d2oracle/TestSet/expanded_map_style.exp.json @@ -0,0 +1,162 @@ +{ + "graph": { + "ast": { + "range": "d2/testdata/d2oracle/TestSet/expanded_map_style.d2,0:0:0-5:0:44", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestSet/expanded_map_style.d2,0:0:0-4:1:43", + "key": { + "range": "d2/testdata/d2oracle/TestSet/expanded_map_style.d2,0:0:0-0:6:6", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestSet/expanded_map_style.d2,0:0:0-0:6:6", + "value": [ + { + "string": "square", + "raw_string": "square" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "map": { + "range": "d2/testdata/d2oracle/TestSet/expanded_map_style.d2,0:8:8-4:0:42", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestSet/expanded_map_style.d2,1:2:12-3:3:41", + "key": { + "range": "d2/testdata/d2oracle/TestSet/expanded_map_style.d2,1:2:12-1:7:17", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestSet/expanded_map_style.d2,1:2:12-1:7:17", + "value": [ + { + "string": "style", + "raw_string": "style" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "map": { + "range": "d2/testdata/d2oracle/TestSet/expanded_map_style.d2,1:9:19-3:2:40", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestSet/expanded_map_style.d2,2:4:25-2:16:37", + "key": { + "range": "d2/testdata/d2oracle/TestSet/expanded_map_style.d2,2:4:25-2:11:32", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestSet/expanded_map_style.d2,2:4:25-2:11:32", + "value": [ + { + "string": "opacity", + "raw_string": "opacity" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "number": { + "range": "d2/testdata/d2oracle/TestSet/expanded_map_style.d2,2:13:34-2:16:37", + "raw": "0.2", + "value": "1/5" + } + } + } + } + ] + } + } + } + } + ] + } + } + } + } + ] + }, + "root": { + "id": "", + "id_val": "", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + "edges": [], + "objects": [ + { + "id": "square", + "id_val": "square", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestSet/expanded_map_style.d2,0:0:0-0:6:6", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestSet/expanded_map_style.d2,0:0:0-0:6:6", + "value": [ + { + "string": "square", + "raw_string": "square" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "square" + }, + "style": { + "opacity": { + "value": "0.2" + } + }, + "near_key": null, + "shape": { + "value": "" + } + } + } + ] + }, + "err": "" +} diff --git a/testdata/d2oracle/TestSet/icon.exp.json b/testdata/d2oracle/TestSet/icon.exp.json new file mode 100644 index 000000000..675c03888 --- /dev/null +++ b/testdata/d2oracle/TestSet/icon.exp.json @@ -0,0 +1,145 @@ +{ + "graph": { + "ast": { + "range": "d2/testdata/d2oracle/TestSet/icon.d2,0:0:0-1:0:68", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestSet/icon.d2,0:0:0-0:67:67", + "key": { + "range": "d2/testdata/d2oracle/TestSet/icon.d2,0:0:0-0:4:4", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestSet/icon.d2,0:0:0-0:4:4", + "value": [ + { + "string": "meow", + "raw_string": "meow" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "map": { + "range": "d2/testdata/d2oracle/TestSet/icon.d2,0:6:6-0:66:66", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestSet/icon.d2,0:7:7-0:66:66", + "key": { + "range": "d2/testdata/d2oracle/TestSet/icon.d2,0:7:7-0:11:11", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestSet/icon.d2,0:7:7-0:11:11", + "value": [ + { + "string": "icon", + "raw_string": "icon" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestSet/icon.d2,0:13:13-0:66:66", + "value": [ + { + "string": "https://icons.terrastruct.com/essentials/087-menu.svg", + "raw_string": "https://icons.terrastruct.com/essentials/087-menu.svg" + } + ] + } + } + } + } + ] + } + } + } + } + ] + }, + "root": { + "id": "", + "id_val": "", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + "edges": null, + "objects": [ + { + "id": "meow", + "id_val": "meow", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestSet/icon.d2,0:0:0-0:4:4", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestSet/icon.d2,0:0:0-0:4:4", + "value": [ + { + "string": "meow", + "raw_string": "meow" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "meow" + }, + "style": {}, + "icon": { + "Scheme": "https", + "Opaque": "", + "User": null, + "Host": "icons.terrastruct.com", + "Path": "/essentials/087-menu.svg", + "RawPath": "", + "ForceQuery": false, + "RawQuery": "", + "Fragment": "", + "RawFragment": "" + }, + "near_key": null, + "shape": { + "value": "" + } + } + } + ] + }, + "err": "" +} diff --git a/testdata/d2oracle/TestSet/inline_style.exp.json b/testdata/d2oracle/TestSet/inline_style.exp.json new file mode 100644 index 000000000..d9b091523 --- /dev/null +++ b/testdata/d2oracle/TestSet/inline_style.exp.json @@ -0,0 +1,191 @@ +{ + "graph": { + "ast": { + "range": "d2/testdata/d2oracle/TestSet/inline_style.d2,0:0:0-4:0:51", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestSet/inline_style.d2,0:0:0-3:1:50", + "key": { + "range": "d2/testdata/d2oracle/TestSet/inline_style.d2,0:0:0-0:6:6", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestSet/inline_style.d2,0:0:0-0:6:6", + "value": [ + { + "string": "square", + "raw_string": "square" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "map": { + "range": "d2/testdata/d2oracle/TestSet/inline_style.d2,0:8:8-3:0:49", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestSet/inline_style.d2,1:2:12-1:20:30", + "key": { + "range": "d2/testdata/d2oracle/TestSet/inline_style.d2,1:2:12-1:15:25", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestSet/inline_style.d2,1:2:12-1:7:17", + "value": [ + { + "string": "style", + "raw_string": "style" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestSet/inline_style.d2,1:8:18-1:15:25", + "value": [ + { + "string": "opacity", + "raw_string": "opacity" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "number": { + "range": "d2/testdata/d2oracle/TestSet/inline_style.d2,1:17:27-1:20:30", + "raw": "0.2", + "value": "1/5" + } + } + } + }, + { + "map_key": { + "range": "d2/testdata/d2oracle/TestSet/inline_style.d2,2:2:33-2:17:48", + "key": { + "range": "d2/testdata/d2oracle/TestSet/inline_style.d2,2:2:33-2:12:43", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestSet/inline_style.d2,2:2:33-2:7:38", + "value": [ + { + "string": "style", + "raw_string": "style" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestSet/inline_style.d2,2:8:39-2:12:43", + "value": [ + { + "string": "fill", + "raw_string": "fill" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestSet/inline_style.d2,2:14:45-2:17:48", + "value": [ + { + "string": "red", + "raw_string": "red" + } + ] + } + } + } + } + ] + } + } + } + } + ] + }, + "root": { + "id": "", + "id_val": "", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + "edges": [], + "objects": [ + { + "id": "square", + "id_val": "square", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestSet/inline_style.d2,0:0:0-0:6:6", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestSet/inline_style.d2,0:0:0-0:6:6", + "value": [ + { + "string": "square", + "raw_string": "square" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "square" + }, + "style": { + "opacity": { + "value": "0.2" + }, + "fill": { + "value": "red" + } + }, + "near_key": null, + "shape": { + "value": "" + } + } + } + ] + }, + "err": "" +} diff --git a/testdata/d2oracle/TestSet/label.exp.json b/testdata/d2oracle/TestSet/label.exp.json new file mode 100644 index 000000000..1d91e4a49 --- /dev/null +++ b/testdata/d2oracle/TestSet/label.exp.json @@ -0,0 +1,104 @@ +{ + "graph": { + "ast": { + "range": "d2/testdata/d2oracle/TestSet/label.d2,0:0:0-1:0:88", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestSet/label.d2,0:0:0-0:87:87", + "key": { + "range": "d2/testdata/d2oracle/TestSet/label.d2,0:0:0-0:6:6", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestSet/label.d2,0:0:0-0:6:6", + "value": [ + { + "string": "square", + "raw_string": "square" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "double_quoted_string": { + "range": "d2/testdata/d2oracle/TestSet/label.d2,0:8:8-0:87:87", + "value": [ + { + "string": "Always try to do things in chronological order; it's less confusing that way.", + "raw_string": "Always try to do things in chronological order; it's less confusing that way." + } + ] + } + } + } + } + ] + }, + "root": { + "id": "", + "id_val": "", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + "edges": null, + "objects": [ + { + "id": "square", + "id_val": "square", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestSet/label.d2,0:0:0-0:6:6", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestSet/label.d2,0:0:0-0:6:6", + "value": [ + { + "string": "square", + "raw_string": "square" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "Always try to do things in chronological order; it's less confusing that way." + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ] + }, + "err": "" +} diff --git a/testdata/d2oracle/TestSet/label_primary.exp.json b/testdata/d2oracle/TestSet/label_primary.exp.json new file mode 100644 index 000000000..719f76e71 --- /dev/null +++ b/testdata/d2oracle/TestSet/label_primary.exp.json @@ -0,0 +1,260 @@ +{ + "graph": { + "ast": { + "range": "d2/testdata/d2oracle/TestSet/label_primary.d2,0:0:0-3:0:63", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestSet/label_primary.d2,0:0:0-2:1:62", + "key": { + "range": "d2/testdata/d2oracle/TestSet/label_primary.d2,0:0:0-0:4:4", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestSet/label_primary.d2,0:0:0-0:4:4", + "value": [ + { + "string": "oreo", + "raw_string": "oreo" + } + ] + } + } + ] + }, + "primary": { + "single_quoted_string": { + "range": "d2/testdata/d2oracle/TestSet/label_primary.d2,0:6:6-0:49:49", + "raw": "QOTD: \"It''s been Monday all week today.\"", + "value": "QOTD: \"It's been Monday all week today.\"" + } + }, + "value": { + "map": { + "range": "d2/testdata/d2oracle/TestSet/label_primary.d2,0:50:50-2:0:61", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestSet/label_primary.d2,1:2:54-1:8:60", + "edges": [ + { + "range": "d2/testdata/d2oracle/TestSet/label_primary.d2,1:2:54-1:8:60", + "src": { + "range": "d2/testdata/d2oracle/TestSet/label_primary.d2,1:2:54-1:4:56", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestSet/label_primary.d2,1:2:54-1:3:55", + "value": [ + { + "string": "q", + "raw_string": "q" + } + ] + } + } + ] + }, + "src_arrow": "", + "dst": { + "range": "d2/testdata/d2oracle/TestSet/label_primary.d2,1:6:58-1:8:60", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestSet/label_primary.d2,1:7:59-1:8:60", + "value": [ + { + "string": "z", + "raw_string": "z" + } + ] + } + } + ] + }, + "dst_arrow": ">" + } + ], + "primary": {}, + "value": {} + } + } + ] + } + } + } + } + ] + }, + "root": { + "id": "", + "id_val": "", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + "edges": [ + { + "index": 0, + "minWidth": 0, + "minHeight": 0, + "label_dimensions": { + "width": 0, + "height": 0 + }, + "isCurve": false, + "src_arrow": false, + "dst_arrow": true, + "references": [ + { + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ], + "objects": [ + { + "id": "oreo", + "id_val": "oreo", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestSet/label_primary.d2,0:0:0-0:4:4", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestSet/label_primary.d2,0:0:0-0:4:4", + "value": [ + { + "string": "oreo", + "raw_string": "oreo" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "QOTD: \"It's been Monday all week today.\"" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "q", + "id_val": "q", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestSet/label_primary.d2,1:2:54-1:4:56", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestSet/label_primary.d2,1:2:54-1:3:55", + "value": [ + { + "string": "q", + "raw_string": "q" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "q" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "z", + "id_val": "z", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestSet/label_primary.d2,1:6:58-1:8:60", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestSet/label_primary.d2,1:7:59-1:8:60", + "value": [ + { + "string": "z", + "raw_string": "z" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "z" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ] + }, + "err": "" +} diff --git a/testdata/d2oracle/TestSet/label_replace.exp.json b/testdata/d2oracle/TestSet/label_replace.exp.json new file mode 100644 index 000000000..3ab200dc5 --- /dev/null +++ b/testdata/d2oracle/TestSet/label_replace.exp.json @@ -0,0 +1,104 @@ +{ + "graph": { + "ast": { + "range": "d2/testdata/d2oracle/TestSet/label_replace.d2,0:0:0-1:0:88", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestSet/label_replace.d2,0:0:0-0:87:87", + "key": { + "range": "d2/testdata/d2oracle/TestSet/label_replace.d2,0:0:0-0:6:6", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestSet/label_replace.d2,0:0:0-0:6:6", + "value": [ + { + "string": "square", + "raw_string": "square" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "double_quoted_string": { + "range": "d2/testdata/d2oracle/TestSet/label_replace.d2,0:8:8-0:87:87", + "value": [ + { + "string": "Always try to do things in chronological order; it's less confusing that way.", + "raw_string": "Always try to do things in chronological order; it's less confusing that way." + } + ] + } + } + } + } + ] + }, + "root": { + "id": "", + "id_val": "", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + "edges": null, + "objects": [ + { + "id": "square", + "id_val": "square", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestSet/label_replace.d2,0:0:0-0:6:6", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestSet/label_replace.d2,0:0:0-0:6:6", + "value": [ + { + "string": "square", + "raw_string": "square" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "Always try to do things in chronological order; it's less confusing that way." + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ] + }, + "err": "" +} diff --git a/testdata/d2oracle/TestSet/label_unset.exp.json b/testdata/d2oracle/TestSet/label_unset.exp.json new file mode 100644 index 000000000..0abf820b6 --- /dev/null +++ b/testdata/d2oracle/TestSet/label_unset.exp.json @@ -0,0 +1,94 @@ +{ + "graph": { + "ast": { + "range": "d2/testdata/d2oracle/TestSet/label_unset.d2,0:0:0-1:0:7", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestSet/label_unset.d2,0:0:0-0:6:6", + "key": { + "range": "d2/testdata/d2oracle/TestSet/label_unset.d2,0:0:0-0:6:6", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestSet/label_unset.d2,0:0:0-0:6:6", + "value": [ + { + "string": "square", + "raw_string": "square" + } + ] + } + } + ] + }, + "primary": {}, + "value": {} + } + } + ] + }, + "root": { + "id": "", + "id_val": "", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + "edges": null, + "objects": [ + { + "id": "square", + "id_val": "square", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestSet/label_unset.d2,0:0:0-0:6:6", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestSet/label_unset.d2,0:0:0-0:6:6", + "value": [ + { + "string": "square", + "raw_string": "square" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "square" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ] + }, + "err": "" +} diff --git a/testdata/d2oracle/TestSet/map_key_missing.exp.json b/testdata/d2oracle/TestSet/map_key_missing.exp.json new file mode 100644 index 000000000..9253e09f0 --- /dev/null +++ b/testdata/d2oracle/TestSet/map_key_missing.exp.json @@ -0,0 +1,238 @@ +{ + "graph": { + "ast": { + "range": "d2/testdata/d2oracle/TestSet/map_key_missing.d2,0:0:0-1:0:83", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestSet/map_key_missing.d2,0:0:0-0:6:6", + "edges": [ + { + "range": "d2/testdata/d2oracle/TestSet/map_key_missing.d2,0:0:0-0:6:6", + "src": { + "range": "d2/testdata/d2oracle/TestSet/map_key_missing.d2,0:0:0-0:2:2", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestSet/map_key_missing.d2,0:0:0-0:1:1", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + } + ] + }, + "src_arrow": "", + "dst": { + "range": "d2/testdata/d2oracle/TestSet/map_key_missing.d2,0:4:4-0:6:6", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestSet/map_key_missing.d2,0:5:5-0:6:6", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + } + ] + }, + "dst_arrow": ">" + } + ], + "primary": {}, + "value": {} + } + }, + { + "map_key": { + "range": "d2/testdata/d2oracle/TestSet/map_key_missing.d2,0:8:8-0:82:82", + "key": { + "range": "d2/testdata/d2oracle/TestSet/map_key_missing.d2,0:8:8-0:9:9", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestSet/map_key_missing.d2,0:8:8-0:9:9", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestSet/map_key_missing.d2,0:11:11-0:82:82", + "value": [ + { + "string": "Never offend people with style when you can offend them with substance.", + "raw_string": "Never offend people with style when you can offend them with substance." + } + ] + } + } + } + } + ] + }, + "root": { + "id": "", + "id_val": "", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + "edges": [ + { + "index": 0, + "minWidth": 0, + "minHeight": 0, + "label_dimensions": { + "width": 0, + "height": 0 + }, + "isCurve": false, + "src_arrow": false, + "dst_arrow": true, + "references": [ + { + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ], + "objects": [ + { + "id": "a", + "id_val": "a", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestSet/map_key_missing.d2,0:8:8-0:9:9", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestSet/map_key_missing.d2,0:8:8-0:9:9", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + }, + { + "key": { + "range": "d2/testdata/d2oracle/TestSet/map_key_missing.d2,0:0:0-0:2:2", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestSet/map_key_missing.d2,0:0:0-0:1:1", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "Never offend people with style when you can offend them with substance." + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "b", + "id_val": "b", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestSet/map_key_missing.d2,0:4:4-0:6:6", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestSet/map_key_missing.d2,0:5:5-0:6:6", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "b" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ] + }, + "err": "" +} diff --git a/testdata/d2oracle/TestSet/nested_alex.exp.json b/testdata/d2oracle/TestSet/nested_alex.exp.json new file mode 100644 index 000000000..29e099bda --- /dev/null +++ b/testdata/d2oracle/TestSet/nested_alex.exp.json @@ -0,0 +1,350 @@ +{ + "graph": { + "ast": { + "range": "d2/testdata/d2oracle/TestSet/nested_alex.d2,0:0:0-5:0:202", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestSet/nested_alex.d2,0:0:0-4:1:201", + "key": { + "range": "d2/testdata/d2oracle/TestSet/nested_alex.d2,0:0:0-0:4:4", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestSet/nested_alex.d2,0:0:0-0:4:4", + "value": [ + { + "string": "this", + "raw_string": "this" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "map": { + "range": "d2/testdata/d2oracle/TestSet/nested_alex.d2,0:6:6-4:0:200", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestSet/nested_alex.d2,1:2:10-1:11:19", + "key": { + "range": "d2/testdata/d2oracle/TestSet/nested_alex.d2,1:2:10-1:7:15", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestSet/nested_alex.d2,1:2:10-1:7:15", + "value": [ + { + "string": "label", + "raw_string": "label" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestSet/nested_alex.d2,1:9:17-1:11:19", + "value": [ + { + "string": "do", + "raw_string": "do" + } + ] + } + } + } + }, + { + "map_key": { + "range": "d2/testdata/d2oracle/TestSet/nested_alex.d2,2:2:22-2:20:40", + "edges": [ + { + "range": "d2/testdata/d2oracle/TestSet/nested_alex.d2,2:2:22-2:14:34", + "src": { + "range": "d2/testdata/d2oracle/TestSet/nested_alex.d2,2:2:22-2:7:27", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestSet/nested_alex.d2,2:2:22-2:6:26", + "value": [ + { + "string": "test", + "raw_string": "test" + } + ] + } + } + ] + }, + "src_arrow": "", + "dst": { + "range": "d2/testdata/d2oracle/TestSet/nested_alex.d2,2:9:29-2:14:34", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestSet/nested_alex.d2,2:10:30-2:14:34", + "value": [ + { + "string": "here", + "raw_string": "here" + } + ] + } + } + ] + }, + "dst_arrow": ">" + } + ], + "primary": {}, + "value": { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestSet/nested_alex.d2,2:16:36-2:20:40", + "value": [ + { + "string": "asdf", + "raw_string": "asdf" + } + ] + } + } + } + }, + { + "map_key": { + "range": "d2/testdata/d2oracle/TestSet/nested_alex.d2,3:2:43-3:158:199", + "key": { + "range": "d2/testdata/d2oracle/TestSet/nested_alex.d2,3:2:43-3:6:47", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestSet/nested_alex.d2,3:2:43-3:6:47", + "value": [ + { + "string": "here", + "raw_string": "here" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "double_quoted_string": { + "range": "d2/testdata/d2oracle/TestSet/nested_alex.d2,3:8:49-3:158:199", + "value": [ + { + "string": "How much of their influence on you is a result of your influence on them?\nA conference is a gathering of important people who singly can do nothing", + "raw_string": "How much of their influence on you is a result of your influence on them?\\nA conference is a gathering of important people who singly can do nothing" + } + ] + } + } + } + } + ] + } + } + } + } + ] + }, + "root": { + "id": "", + "id_val": "", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + "edges": [ + { + "index": 0, + "minWidth": 0, + "minHeight": 0, + "label_dimensions": { + "width": 0, + "height": 0 + }, + "isCurve": false, + "src_arrow": false, + "dst_arrow": true, + "references": [ + { + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "asdf" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ], + "objects": [ + { + "id": "this", + "id_val": "this", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestSet/nested_alex.d2,0:0:0-0:4:4", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestSet/nested_alex.d2,0:0:0-0:4:4", + "value": [ + { + "string": "this", + "raw_string": "this" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "do" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "here", + "id_val": "here", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestSet/nested_alex.d2,3:2:43-3:6:47", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestSet/nested_alex.d2,3:2:43-3:6:47", + "value": [ + { + "string": "here", + "raw_string": "here" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + }, + { + "key": { + "range": "d2/testdata/d2oracle/TestSet/nested_alex.d2,2:9:29-2:14:34", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestSet/nested_alex.d2,2:10:30-2:14:34", + "value": [ + { + "string": "here", + "raw_string": "here" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "How much of their influence on you is a result of your influence on them?\nA conference is a gathering of important people who singly can do nothing" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + { + "id": "test", + "id_val": "test", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestSet/nested_alex.d2,2:2:22-2:7:27", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestSet/nested_alex.d2,2:2:22-2:6:26", + "value": [ + { + "string": "test", + "raw_string": "test" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "test" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + } + ] + }, + "err": "" +} diff --git a/testdata/d2oracle/TestSet/new_style.exp.json b/testdata/d2oracle/TestSet/new_style.exp.json new file mode 100644 index 000000000..577edce9e --- /dev/null +++ b/testdata/d2oracle/TestSet/new_style.exp.json @@ -0,0 +1,144 @@ +{ + "graph": { + "ast": { + "range": "d2/testdata/d2oracle/TestSet/new_style.d2,0:0:0-1:0:29", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestSet/new_style.d2,0:0:0-0:28:28", + "key": { + "range": "d2/testdata/d2oracle/TestSet/new_style.d2,0:0:0-0:6:6", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestSet/new_style.d2,0:0:0-0:6:6", + "value": [ + { + "string": "square", + "raw_string": "square" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "map": { + "range": "d2/testdata/d2oracle/TestSet/new_style.d2,0:8:8-0:27:27", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestSet/new_style.d2,0:9:9-0:27:27", + "key": { + "range": "d2/testdata/d2oracle/TestSet/new_style.d2,0:9:9-0:22:22", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestSet/new_style.d2,0:9:9-0:14:14", + "value": [ + { + "string": "style", + "raw_string": "style" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestSet/new_style.d2,0:15:15-0:22:22", + "value": [ + { + "string": "opacity", + "raw_string": "opacity" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "number": { + "range": "d2/testdata/d2oracle/TestSet/new_style.d2,0:24:24-0:27:27", + "raw": "0.2", + "value": "1/5" + } + } + } + } + ] + } + } + } + } + ] + }, + "root": { + "id": "", + "id_val": "", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + "edges": [], + "objects": [ + { + "id": "square", + "id_val": "square", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestSet/new_style.d2,0:0:0-0:6:6", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestSet/new_style.d2,0:0:0-0:6:6", + "value": [ + { + "string": "square", + "raw_string": "square" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "square" + }, + "style": { + "opacity": { + "value": "0.2" + } + }, + "near_key": null, + "shape": { + "value": "" + } + } + } + ] + }, + "err": "" +} diff --git a/testdata/d2oracle/TestSet/replace_shape.exp.json b/testdata/d2oracle/TestSet/replace_shape.exp.json new file mode 100644 index 000000000..8164179e6 --- /dev/null +++ b/testdata/d2oracle/TestSet/replace_shape.exp.json @@ -0,0 +1,126 @@ +{ + "graph": { + "ast": { + "range": "d2/testdata/d2oracle/TestSet/replace_shape.d2,0:0:0-1:0:21", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestSet/replace_shape.d2,0:0:0-0:20:20", + "key": { + "range": "d2/testdata/d2oracle/TestSet/replace_shape.d2,0:0:0-0:12:12", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestSet/replace_shape.d2,0:0:0-0:6:6", + "value": [ + { + "string": "square", + "raw_string": "square" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestSet/replace_shape.d2,0:7:7-0:12:12", + "value": [ + { + "string": "shape", + "raw_string": "shape" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestSet/replace_shape.d2,0:14:14-0:20:20", + "value": [ + { + "string": "circle", + "raw_string": "circle" + } + ] + } + } + } + } + ] + }, + "root": { + "id": "", + "id_val": "", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + "edges": null, + "objects": [ + { + "id": "square", + "id_val": "square", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestSet/replace_shape.d2,0:0:0-0:12:12", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestSet/replace_shape.d2,0:0:0-0:6:6", + "value": [ + { + "string": "square", + "raw_string": "square" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestSet/replace_shape.d2,0:7:7-0:12:12", + "value": [ + { + "string": "shape", + "raw_string": "shape" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "square" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "circle" + } + } + } + ] + }, + "err": "" +} diff --git a/testdata/d2oracle/TestSet/replace_style.exp.json b/testdata/d2oracle/TestSet/replace_style.exp.json new file mode 100644 index 000000000..61afee14d --- /dev/null +++ b/testdata/d2oracle/TestSet/replace_style.exp.json @@ -0,0 +1,148 @@ +{ + "graph": { + "ast": { + "range": "d2/testdata/d2oracle/TestSet/replace_style.d2,0:0:0-1:0:26", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestSet/replace_style.d2,0:0:0-0:25:25", + "key": { + "range": "d2/testdata/d2oracle/TestSet/replace_style.d2,0:0:0-0:20:20", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestSet/replace_style.d2,0:0:0-0:6:6", + "value": [ + { + "string": "square", + "raw_string": "square" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestSet/replace_style.d2,0:7:7-0:12:12", + "value": [ + { + "string": "style", + "raw_string": "style" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestSet/replace_style.d2,0:13:13-0:20:20", + "value": [ + { + "string": "opacity", + "raw_string": "opacity" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "number": { + "range": "d2/testdata/d2oracle/TestSet/replace_style.d2,0:22:22-0:25:25", + "raw": "0.2", + "value": "1/5" + } + } + } + } + ] + }, + "root": { + "id": "", + "id_val": "", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + "edges": [], + "objects": [ + { + "id": "square", + "id_val": "square", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestSet/replace_style.d2,0:0:0-0:20:20", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestSet/replace_style.d2,0:0:0-0:6:6", + "value": [ + { + "string": "square", + "raw_string": "square" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestSet/replace_style.d2,0:7:7-0:12:12", + "value": [ + { + "string": "style", + "raw_string": "style" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestSet/replace_style.d2,0:13:13-0:20:20", + "value": [ + { + "string": "opacity", + "raw_string": "opacity" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "square" + }, + "style": { + "opacity": { + "value": "0.2" + } + }, + "near_key": null, + "shape": { + "value": "" + } + } + } + ] + }, + "err": "" +} diff --git a/testdata/d2oracle/TestSet/replace_style_edgecase.exp.json b/testdata/d2oracle/TestSet/replace_style_edgecase.exp.json new file mode 100644 index 000000000..fd5eaa7ed --- /dev/null +++ b/testdata/d2oracle/TestSet/replace_style_edgecase.exp.json @@ -0,0 +1,248 @@ +{ + "graph": { + "ast": { + "range": "d2/testdata/d2oracle/TestSet/replace_style_edgecase.d2,0:0:0-2:0:52", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestSet/replace_style_edgecase.d2,0:0:0-0:25:25", + "key": { + "range": "d2/testdata/d2oracle/TestSet/replace_style_edgecase.d2,0:0:0-0:17:17", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestSet/replace_style_edgecase.d2,0:0:0-0:6:6", + "value": [ + { + "string": "square", + "raw_string": "square" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestSet/replace_style_edgecase.d2,0:7:7-0:12:12", + "value": [ + { + "string": "style", + "raw_string": "style" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestSet/replace_style_edgecase.d2,0:13:13-0:17:17", + "value": [ + { + "string": "fill", + "raw_string": "fill" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestSet/replace_style_edgecase.d2,0:19:19-0:25:25", + "value": [ + { + "string": "orange", + "raw_string": "orange" + } + ] + } + } + } + }, + { + "map_key": { + "range": "d2/testdata/d2oracle/TestSet/replace_style_edgecase.d2,1:0:26-1:25:51", + "key": { + "range": "d2/testdata/d2oracle/TestSet/replace_style_edgecase.d2,1:0:26-1:20:46", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestSet/replace_style_edgecase.d2,1:0:26-1:6:32", + "value": [ + { + "string": "square", + "raw_string": "square" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestSet/replace_style_edgecase.d2,1:7:33-1:12:38", + "value": [ + { + "string": "style", + "raw_string": "style" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestSet/replace_style_edgecase.d2,1:13:39-1:20:46", + "value": [ + { + "string": "opacity", + "raw_string": "opacity" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "number": { + "range": "d2/testdata/d2oracle/TestSet/replace_style_edgecase.d2,1:22:48-1:25:51", + "raw": "0.2", + "value": "1/5" + } + } + } + } + ] + }, + "root": { + "id": "", + "id_val": "", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + "edges": [], + "objects": [ + { + "id": "square", + "id_val": "square", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestSet/replace_style_edgecase.d2,0:0:0-0:17:17", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestSet/replace_style_edgecase.d2,0:0:0-0:6:6", + "value": [ + { + "string": "square", + "raw_string": "square" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestSet/replace_style_edgecase.d2,0:7:7-0:12:12", + "value": [ + { + "string": "style", + "raw_string": "style" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestSet/replace_style_edgecase.d2,0:13:13-0:17:17", + "value": [ + { + "string": "fill", + "raw_string": "fill" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + }, + { + "key": { + "range": "d2/testdata/d2oracle/TestSet/replace_style_edgecase.d2,1:0:26-1:20:46", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestSet/replace_style_edgecase.d2,1:0:26-1:6:32", + "value": [ + { + "string": "square", + "raw_string": "square" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestSet/replace_style_edgecase.d2,1:7:33-1:12:38", + "value": [ + { + "string": "style", + "raw_string": "style" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestSet/replace_style_edgecase.d2,1:13:39-1:20:46", + "value": [ + { + "string": "opacity", + "raw_string": "opacity" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "square" + }, + "style": { + "opacity": { + "value": "0.2" + }, + "fill": { + "value": "orange" + } + }, + "near_key": null, + "shape": { + "value": "" + } + } + } + ] + }, + "err": "" +} diff --git a/testdata/d2oracle/TestSet/shape.exp.json b/testdata/d2oracle/TestSet/shape.exp.json new file mode 100644 index 000000000..03855a624 --- /dev/null +++ b/testdata/d2oracle/TestSet/shape.exp.json @@ -0,0 +1,133 @@ +{ + "graph": { + "ast": { + "range": "d2/testdata/d2oracle/TestSet/shape.d2,0:0:0-1:0:24", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestSet/shape.d2,0:0:0-0:23:23", + "key": { + "range": "d2/testdata/d2oracle/TestSet/shape.d2,0:0:0-0:6:6", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestSet/shape.d2,0:0:0-0:6:6", + "value": [ + { + "string": "square", + "raw_string": "square" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "map": { + "range": "d2/testdata/d2oracle/TestSet/shape.d2,0:8:8-0:22:22", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestSet/shape.d2,0:9:9-0:22:22", + "key": { + "range": "d2/testdata/d2oracle/TestSet/shape.d2,0:9:9-0:14:14", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestSet/shape.d2,0:9:9-0:14:14", + "value": [ + { + "string": "shape", + "raw_string": "shape" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestSet/shape.d2,0:16:16-0:22:22", + "value": [ + { + "string": "square", + "raw_string": "square" + } + ] + } + } + } + } + ] + } + } + } + } + ] + }, + "root": { + "id": "", + "id_val": "", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + "edges": null, + "objects": [ + { + "id": "square", + "id_val": "square", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestSet/shape.d2,0:0:0-0:6:6", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestSet/shape.d2,0:0:0-0:6:6", + "value": [ + { + "string": "square", + "raw_string": "square" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "square" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "square" + } + } + } + ] + }, + "err": "" +} diff --git a/testdata/d2oracle/TestSet/shape_nested_style_set.exp.json b/testdata/d2oracle/TestSet/shape_nested_style_set.exp.json new file mode 100644 index 000000000..f5bf3145a --- /dev/null +++ b/testdata/d2oracle/TestSet/shape_nested_style_set.exp.json @@ -0,0 +1,144 @@ +{ + "graph": { + "ast": { + "range": "d2/testdata/d2oracle/TestSet/shape_nested_style_set.d2,0:0:0-1:0:24", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestSet/shape_nested_style_set.d2,0:0:0-0:23:23", + "key": { + "range": "d2/testdata/d2oracle/TestSet/shape_nested_style_set.d2,0:0:0-0:1:1", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestSet/shape_nested_style_set.d2,0:0:0-0:1:1", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "map": { + "range": "d2/testdata/d2oracle/TestSet/shape_nested_style_set.d2,0:3:3-0:22:22", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestSet/shape_nested_style_set.d2,0:4:4-0:22:22", + "key": { + "range": "d2/testdata/d2oracle/TestSet/shape_nested_style_set.d2,0:4:4-0:17:17", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestSet/shape_nested_style_set.d2,0:4:4-0:9:9", + "value": [ + { + "string": "style", + "raw_string": "style" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestSet/shape_nested_style_set.d2,0:10:10-0:17:17", + "value": [ + { + "string": "opacity", + "raw_string": "opacity" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "number": { + "range": "d2/testdata/d2oracle/TestSet/shape_nested_style_set.d2,0:19:19-0:22:22", + "raw": "0.4", + "value": "2/5" + } + } + } + } + ] + } + } + } + } + ] + }, + "root": { + "id": "", + "id_val": "", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "attributes": { + "label": { + "value": "" + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + } + } + }, + "edges": [], + "objects": [ + { + "id": "x", + "id_val": "x", + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestSet/shape_nested_style_set.d2,0:0:0-0:1:1", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestSet/shape_nested_style_set.d2,0:0:0-0:1:1", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "x" + }, + "style": { + "opacity": { + "value": "0.4" + } + }, + "near_key": null, + "shape": { + "value": "" + } + } + } + ] + }, + "err": "" +} diff --git a/testdata/d2oracle/TestSet/style.opacity.exp.json b/testdata/d2oracle/TestSet/style.opacity.exp.json new file mode 100644 index 000000000..70437e38f --- /dev/null +++ b/testdata/d2oracle/TestSet/style.opacity.exp.json @@ -0,0 +1,157 @@ +{ + "graph": { + "ast": { + "range": "d2/testdata/d2oracle/TestSet/style.opacity.d2,0:0:0-5:0:44", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestSet/style.opacity.d2,0:0:0-4:1:43", + "key": { + "range": "d2/testdata/d2oracle/TestSet/style.opacity.d2,0:0:0-0:6:6", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestSet/style.opacity.d2,0:0:0-0:6:6", + "value": [ + { + "string": "square", + "raw_string": "square" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "map": { + "range": "d2/testdata/d2oracle/TestSet/style.opacity.d2,0:8:8-4:0:42", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestSet/style.opacity.d2,1:2:12-3:3:41", + "key": { + "range": "d2/testdata/d2oracle/TestSet/style.opacity.d2,1:2:12-1:7:17", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestSet/style.opacity.d2,1:2:12-1:7:17", + "value": [ + { + "string": "style", + "raw_string": "style" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "map": { + "range": "d2/testdata/d2oracle/TestSet/style.opacity.d2,1:9:19-3:2:40", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestSet/style.opacity.d2,2:4:25-2:16:37", + "key": { + "range": "d2/testdata/d2oracle/TestSet/style.opacity.d2,2:4:25-2:11:32", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestSet/style.opacity.d2,2:4:25-2:11:32", + "value": [ + { + "string": "opacity", + "raw_string": "opacity" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "number": { + "range": "d2/testdata/d2oracle/TestSet/style.opacity.d2,2:13:34-2:16:37", + "raw": "0.2", + "value": "1/5" + } + } + } + } + ] + } + } + } + } + ] + } + } + } + } + ] + }, + "root": { + "id": "", + "label": { + "value": "" + }, + "label_dimensions": { + "width": 0, + "height": 0 + }, + "shape": { + "value": "" + }, + "near_key": null, + "style": {} + }, + "edges": null, + "objects": [ + { + "id": "square", + "label": { + "value": "square" + }, + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestSet/style.opacity.d2,0:0:0-0:6:6", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestSet/style.opacity.d2,0:0:0-0:6:6", + "value": [ + { + "string": "square", + "raw_string": "square" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0, + "scope_key": "" + } + ], + "shape": { + "value": "" + }, + "near_key": null, + "style": { + "opacity": { + "value": "0.2" + } + } + } + ] + }, + "err": "" +} diff --git a/testdata/d2oracle/TestSet/style_opacity.exp.json b/testdata/d2oracle/TestSet/style_opacity.exp.json new file mode 100644 index 000000000..aba297af7 --- /dev/null +++ b/testdata/d2oracle/TestSet/style_opacity.exp.json @@ -0,0 +1,162 @@ +{ + "graph": { + "ast": { + "range": "d2/testdata/d2oracle/TestSet/style_opacity.d2,0:0:0-1:0:29", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestSet/style_opacity.d2,0:0:0-0:28:28", + "key": { + "range": "d2/testdata/d2oracle/TestSet/style_opacity.d2,0:0:0-0:6:6", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestSet/style_opacity.d2,0:0:0-0:6:6", + "value": [ + { + "string": "square", + "raw_string": "square" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "map": { + "range": "d2/testdata/d2oracle/TestSet/style_opacity.d2,0:8:8-0:27:27", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestSet/style_opacity.d2,0:9:9-0:27:27", + "key": { + "range": "d2/testdata/d2oracle/TestSet/style_opacity.d2,0:9:9-0:22:22", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestSet/style_opacity.d2,0:9:9-0:22:22", + "value": [ + { + "string": "style_opacity", + "raw_string": "style_opacity" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "number": { + "range": "d2/testdata/d2oracle/TestSet/style_opacity.d2,0:24:24-0:27:27", + "raw": "0.2", + "value": "1/5" + } + } + } + } + ] + } + } + } + } + ] + }, + "root": { + "id": "", + "label": { + "value": "" + }, + "label_dimensions": { + "width": 0, + "height": 0 + }, + "shape": { + "value": "" + }, + "near_key": null, + "style": {} + }, + "edges": null, + "objects": [ + { + "id": "square", + "label": { + "value": "square" + }, + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestSet/style_opacity.d2,0:0:0-0:6:6", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestSet/style_opacity.d2,0:0:0-0:6:6", + "value": [ + { + "string": "square", + "raw_string": "square" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0, + "scope_key": "" + } + ], + "shape": { + "value": "" + }, + "near_key": null, + "style": {} + }, + { + "id": "style_opacity", + "label": { + "value": "0.2" + }, + "label_dimensions": { + "width": 0, + "height": 0 + }, + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestSet/style_opacity.d2,0:9:9-0:22:22", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestSet/style_opacity.d2,0:9:9-0:22:22", + "value": [ + { + "string": "style_opacity", + "raw_string": "style_opacity" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0, + "scope_key": "square" + } + ], + "shape": { + "value": "" + }, + "near_key": null, + "style": {} + } + ] + }, + "err": "" +} diff --git a/testdata/d2parser/TestParse/()_keys.exp.json b/testdata/d2parser/TestParse/()_keys.exp.json new file mode 100644 index 000000000..5326c814c --- /dev/null +++ b/testdata/d2parser/TestParse/()_keys.exp.json @@ -0,0 +1,184 @@ +{ + "ast": { + "range": "d2/testdata/d2parser/TestParse/()_keys.d2,0:0:0-3:0:64", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2parser/TestParse/()_keys.d2,1:0:1-1:17:18", + "edges": [ + { + "range": "d2/testdata/d2parser/TestParse/()_keys.d2,1:0:1-1:17:18", + "src": { + "range": "d2/testdata/d2parser/TestParse/()_keys.d2,1:0:1-1:8:9", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2parser/TestParse/()_keys.d2,1:0:1-1:7:8", + "value": [ + { + "string": "my_fn()", + "raw_string": "my_fn()" + } + ] + } + } + ] + }, + "src_arrow": "", + "dst": { + "range": "d2/testdata/d2parser/TestParse/()_keys.d2,1:10:11-1:17:18", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2parser/TestParse/()_keys.d2,1:11:12-1:17:18", + "value": [ + { + "string": "wowa()", + "raw_string": "wowa()" + } + ] + } + } + ] + }, + "dst_arrow": ">" + } + ], + "primary": {}, + "value": {} + } + }, + { + "map_key": { + "range": "d2/testdata/d2parser/TestParse/()_keys.d2,2:0:19-2:44:63", + "key": { + "range": "d2/testdata/d2parser/TestParse/()_keys.d2,2:0:19-2:5:24", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2parser/TestParse/()_keys.d2,2:0:19-2:4:23", + "value": [ + { + "string": "meow", + "raw_string": "meow" + } + ] + } + } + ] + }, + "edges": [ + { + "range": "d2/testdata/d2parser/TestParse/()_keys.d2,2:6:25-2:13:32", + "src": { + "range": "d2/testdata/d2parser/TestParse/()_keys.d2,2:6:25-2:8:27", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2parser/TestParse/()_keys.d2,2:6:25-2:7:26", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "src_arrow": "", + "dst": { + "range": "d2/testdata/d2parser/TestParse/()_keys.d2,2:10:29-2:13:32", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2parser/TestParse/()_keys.d2,2:11:30-2:12:31", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + } + ] + }, + "dst_arrow": ">" + }, + { + "range": "d2/testdata/d2parser/TestParse/()_keys.d2,2:10:29-2:17:36", + "src": { + "range": "d2/testdata/d2parser/TestParse/()_keys.d2,2:10:29-2:13:32", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2parser/TestParse/()_keys.d2,2:11:30-2:12:31", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + } + ] + }, + "src_arrow": "", + "dst": { + "range": "d2/testdata/d2parser/TestParse/()_keys.d2,2:15:34-2:17:36", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2parser/TestParse/()_keys.d2,2:16:35-2:17:36", + "value": [ + { + "string": "z", + "raw_string": "z" + } + ] + } + } + ] + }, + "dst_arrow": ">" + } + ], + "edge_index": { + "range": "d2/testdata/d2parser/TestParse/()_keys.d2,2:18:37-2:21:40", + "int": 3, + "glob": false + }, + "edge_key": { + "range": "d2/testdata/d2parser/TestParse/()_keys.d2,2:22:41-2:27:46", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2parser/TestParse/()_keys.d2,2:22:41-2:27:46", + "value": [ + { + "string": "shape", + "raw_string": "shape" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "double_quoted_string": { + "range": "d2/testdata/d2parser/TestParse/()_keys.d2,2:29:48-2:44:63", + "value": [ + { + "string": "all hail corn", + "raw_string": "all hail corn" + } + ] + } + } + } + } + ] + }, + "err": null +} diff --git a/testdata/d2parser/TestParse/bad_curly.exp.json b/testdata/d2parser/TestParse/bad_curly.exp.json new file mode 100644 index 000000000..f85aaf0f4 --- /dev/null +++ b/testdata/d2parser/TestParse/bad_curly.exp.json @@ -0,0 +1,15 @@ +{ + "ast": { + "range": "d2/testdata/d2parser/TestParse/bad_curly.d2,0:0:0-0:7:7", + "nodes": null + }, + "err": { + "ioerr": null, + "errs": [ + { + "range": "d2/testdata/d2parser/TestParse/bad_curly.d2,0:3:3-0:4:4", + "errmsg": "d2/testdata/d2parser/TestParse/bad_curly.d2:1:4: unexpected map termination character } in file map" + } + ] + } +} diff --git a/testdata/d2parser/TestParse/block_comment.exp.json b/testdata/d2parser/TestParse/block_comment.exp.json new file mode 100644 index 000000000..abe362db8 --- /dev/null +++ b/testdata/d2parser/TestParse/block_comment.exp.json @@ -0,0 +1,20 @@ +{ + "ast": { + "range": "d2/testdata/d2parser/TestParse/block_comment.d2,0:0:0-16:0:123", + "nodes": [ + { + "block_comment": { + "range": "d2/testdata/d2parser/TestParse/block_comment.d2,1:0:1-11:7:105", + "value": "dmaslkmdlksa\n\ndasmlkdas\nmkdlasdmkas\n dmsakldmklsadsa\n\n\tdsmakldmaslk\n\tdamklsdmklas\n\n\techo hi\nx" + } + }, + { + "block_comment": { + "range": "d2/testdata/d2parser/TestParse/block_comment.d2,13:0:107-15:3:122", + "value": "ok\nmeow" + } + } + ] + }, + "err": null +} diff --git a/testdata/d2parser/TestParse/block_edge_case.exp.json b/testdata/d2parser/TestParse/block_edge_case.exp.json new file mode 100644 index 000000000..4790bf745 --- /dev/null +++ b/testdata/d2parser/TestParse/block_edge_case.exp.json @@ -0,0 +1,38 @@ +{ + "ast": { + "range": "d2/testdata/d2parser/TestParse/block_edge_case.d2,0:0:0-5:0:28", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2parser/TestParse/block_edge_case.d2,1:0:1-4:1:27", + "key": { + "range": "d2/testdata/d2parser/TestParse/block_edge_case.d2,1:0:1-1:1:2", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2parser/TestParse/block_edge_case.d2,1:0:1-1:1:2", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "block_string": { + "range": "d2/testdata/d2parser/TestParse/block_edge_case.d2,1:3:4-4:1:27", + "quote": "", + "tag": "md", + "value": " meow \n hello\nyes" + } + } + } + } + ] + }, + "err": null +} diff --git a/testdata/d2parser/TestParse/block_one_line.exp.json b/testdata/d2parser/TestParse/block_one_line.exp.json new file mode 100644 index 000000000..0530f1121 --- /dev/null +++ b/testdata/d2parser/TestParse/block_one_line.exp.json @@ -0,0 +1,44 @@ +{ + "ast": { + "range": "d2/testdata/d2parser/TestParse/block_one_line.d2,0:0:0-3:0:34", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2parser/TestParse/block_one_line.d2,1:0:1-1:15:16", + "key": { + "range": "d2/testdata/d2parser/TestParse/block_one_line.d2,1:0:1-1:1:2", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2parser/TestParse/block_one_line.d2,1:0:1-1:1:2", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "block_string": { + "range": "d2/testdata/d2parser/TestParse/block_one_line.d2,1:3:4-1:15:16", + "quote": "", + "tag": "md", + "value": "hello" + } + } + } + }, + { + "block_comment": { + "range": "d2/testdata/d2parser/TestParse/block_one_line.d2,2:0:17-2:16:33", + "value": "hello" + } + } + ] + }, + "err": null +} diff --git a/testdata/d2parser/TestParse/block_string.exp.json b/testdata/d2parser/TestParse/block_string.exp.json new file mode 100644 index 000000000..cc9f06c07 --- /dev/null +++ b/testdata/d2parser/TestParse/block_string.exp.json @@ -0,0 +1,109 @@ +{ + "ast": { + "range": "d2/testdata/d2parser/TestParse/block_string.d2,0:0:0-21:0:111", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2parser/TestParse/block_string.d2,1:0:1-7:2:36", + "key": { + "range": "d2/testdata/d2parser/TestParse/block_string.d2,1:0:1-1:1:2", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2parser/TestParse/block_string.d2,1:0:1-1:1:2", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "block_string": { + "range": "d2/testdata/d2parser/TestParse/block_string.d2,1:3:4-7:2:36", + "quote": "|", + "tag": "md", + "value": "meow\nmeo\n# ok\n code\nyes" + } + } + } + }, + { + "map_key": { + "range": "d2/testdata/d2parser/TestParse/block_string.d2,8:0:37-12:6:72", + "key": { + "range": "d2/testdata/d2parser/TestParse/block_string.d2,8:0:37-8:1:38", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2parser/TestParse/block_string.d2,8:0:37-8:1:38", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "block_string": { + "range": "d2/testdata/d2parser/TestParse/block_string.d2,8:3:40-12:6:72", + "quote": "|", + "tag": "md", + "value": " meow\nmeo\n# ok\n code\nyes" + } + } + } + }, + { + "comment": { + "range": "d2/testdata/d2parser/TestParse/block_string.d2,14:0:74-14:8:82", + "value": "compat" + } + }, + { + "map_key": { + "range": "d2/testdata/d2parser/TestParse/block_string.d2,15:0:83-20:1:110", + "key": { + "range": "d2/testdata/d2parser/TestParse/block_string.d2,15:0:83-15:1:84", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2parser/TestParse/block_string.d2,15:0:83-15:1:84", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "primary": { + "block_string": { + "range": "d2/testdata/d2parser/TestParse/block_string.d2,15:3:86-19:2:106", + "quote": "`", + "tag": "md", + "value": "meow\nmeow\nmeow" + } + }, + "value": { + "map": { + "range": "d2/testdata/d2parser/TestParse/block_string.d2,19:3:107-20:0:109", + "nodes": null + } + } + } + } + ] + }, + "err": null +} diff --git a/testdata/d2parser/TestParse/block_trailing_space.exp.json b/testdata/d2parser/TestParse/block_trailing_space.exp.json new file mode 100644 index 000000000..b07d64c1f --- /dev/null +++ b/testdata/d2parser/TestParse/block_trailing_space.exp.json @@ -0,0 +1,44 @@ +{ + "ast": { + "range": "d2/testdata/d2parser/TestParse/block_trailing_space.d2,0:0:0-6:0:37", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2parser/TestParse/block_trailing_space.d2,1:0:1-3:1:16", + "key": { + "range": "d2/testdata/d2parser/TestParse/block_trailing_space.d2,1:0:1-1:1:2", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2parser/TestParse/block_trailing_space.d2,1:0:1-1:1:2", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "block_string": { + "range": "d2/testdata/d2parser/TestParse/block_trailing_space.d2,1:3:4-3:1:16", + "quote": "", + "tag": "md", + "value": "meow " + } + } + } + }, + { + "block_comment": { + "range": "d2/testdata/d2parser/TestParse/block_trailing_space.d2,4:0:17-5:3:36", + "value": "hello " + } + } + ] + }, + "err": null +} diff --git a/testdata/d2parser/TestParse/block_with_delims.exp.json b/testdata/d2parser/TestParse/block_with_delims.exp.json new file mode 100644 index 000000000..811142d66 --- /dev/null +++ b/testdata/d2parser/TestParse/block_with_delims.exp.json @@ -0,0 +1,44 @@ +{ + "ast": { + "range": "d2/testdata/d2parser/TestParse/block_with_delims.d2,0:0:0-8:0:34", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2parser/TestParse/block_with_delims.d2,1:0:1-3:2:18", + "key": { + "range": "d2/testdata/d2parser/TestParse/block_with_delims.d2,1:0:1-1:1:2", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2parser/TestParse/block_with_delims.d2,1:0:1-1:1:2", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "block_string": { + "range": "d2/testdata/d2parser/TestParse/block_with_delims.d2,1:3:4-3:2:18", + "quote": "|", + "tag": "md", + "value": "|pipe|" + } + } + } + }, + { + "block_comment": { + "range": "d2/testdata/d2parser/TestParse/block_with_delims.d2,5:0:20-7:3:33", + "value": "b: \"\"" + } + } + ] + }, + "err": null +} diff --git a/testdata/d2parser/TestParse/edge.exp.json b/testdata/d2parser/TestParse/edge.exp.json new file mode 100644 index 000000000..a2fabcc7a --- /dev/null +++ b/testdata/d2parser/TestParse/edge.exp.json @@ -0,0 +1,54 @@ +{ + "ast": { + "range": "d2/testdata/d2parser/TestParse/edge.d2,0:0:0-2:0:8", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2parser/TestParse/edge.d2,1:0:1-1:6:7", + "edges": [ + { + "range": "d2/testdata/d2parser/TestParse/edge.d2,1:0:1-1:6:7", + "src": { + "range": "d2/testdata/d2parser/TestParse/edge.d2,1:0:1-1:2:3", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2parser/TestParse/edge.d2,1:0:1-1:1:2", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "src_arrow": "", + "dst": { + "range": "d2/testdata/d2parser/TestParse/edge.d2,1:4:5-1:6:7", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2parser/TestParse/edge.d2,1:5:6-1:6:7", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + } + ] + }, + "dst_arrow": ">" + } + ], + "primary": {}, + "value": {} + } + } + ] + }, + "err": null +} diff --git a/testdata/d2parser/TestParse/edge_group_value.exp.json b/testdata/d2parser/TestParse/edge_group_value.exp.json new file mode 100644 index 000000000..6192c2f73 --- /dev/null +++ b/testdata/d2parser/TestParse/edge_group_value.exp.json @@ -0,0 +1,96 @@ +{ + "ast": { + "range": "d2/testdata/d2parser/TestParse/edge_group_value.d2,0:0:0-2:0:22", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2parser/TestParse/edge_group_value.d2,1:0:1-1:20:21", + "key": { + "range": "d2/testdata/d2parser/TestParse/edge_group_value.d2,1:0:1-1:2:3", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2parser/TestParse/edge_group_value.d2,1:0:1-1:1:2", + "value": [ + { + "string": "q", + "raw_string": "q" + } + ] + } + } + ] + }, + "edges": [ + { + "range": "d2/testdata/d2parser/TestParse/edge_group_value.d2,1:3:4-1:9:10", + "src": { + "range": "d2/testdata/d2parser/TestParse/edge_group_value.d2,1:3:4-1:5:6", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2parser/TestParse/edge_group_value.d2,1:3:4-1:4:5", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "src_arrow": "", + "dst": { + "range": "d2/testdata/d2parser/TestParse/edge_group_value.d2,1:7:8-1:9:10", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2parser/TestParse/edge_group_value.d2,1:8:9-1:9:10", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + } + ] + }, + "dst_arrow": ">" + } + ], + "edge_key": { + "range": "d2/testdata/d2parser/TestParse/edge_group_value.d2,1:11:12-1:12:13", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2parser/TestParse/edge_group_value.d2,1:11:12-1:12:13", + "value": [ + { + "string": "z", + "raw_string": "z" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "unquoted_string": { + "range": "d2/testdata/d2parser/TestParse/edge_group_value.d2,1:14:15-1:20:21", + "value": [ + { + "string": "(rawr)", + "raw_string": "(rawr)" + } + ] + } + } + } + } + ] + }, + "err": null +} diff --git a/testdata/d2parser/TestParse/edge_key.exp.json b/testdata/d2parser/TestParse/edge_key.exp.json new file mode 100644 index 000000000..21f56445e --- /dev/null +++ b/testdata/d2parser/TestParse/edge_key.exp.json @@ -0,0 +1,96 @@ +{ + "ast": { + "range": "d2/testdata/d2parser/TestParse/edge_key.d2,0:0:0-2:0:27", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2parser/TestParse/edge_key.d2,1:0:1-1:25:26", + "key": { + "range": "d2/testdata/d2parser/TestParse/edge_key.d2,1:0:1-1:2:3", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2parser/TestParse/edge_key.d2,1:0:1-1:1:2", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "edges": [ + { + "range": "d2/testdata/d2parser/TestParse/edge_key.d2,1:3:4-1:7:8", + "src": { + "range": "d2/testdata/d2parser/TestParse/edge_key.d2,1:3:4-1:4:5", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2parser/TestParse/edge_key.d2,1:3:4-1:4:5", + "value": [ + { + "string": "z", + "raw_string": "z" + } + ] + } + } + ] + }, + "src_arrow": "", + "dst": { + "range": "d2/testdata/d2parser/TestParse/edge_key.d2,1:6:7-1:7:8", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2parser/TestParse/edge_key.d2,1:6:7-1:7:8", + "value": [ + { + "string": "q", + "raw_string": "q" + } + ] + } + } + ] + }, + "dst_arrow": ">" + } + ], + "edge_index": { + "range": "d2/testdata/d2parser/TestParse/edge_key.d2,1:8:9-1:13:14", + "int": 343, + "glob": false + }, + "edge_key": { + "range": "d2/testdata/d2parser/TestParse/edge_key.d2,1:14:15-1:18:19", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2parser/TestParse/edge_key.d2,1:14:15-1:18:19", + "value": [ + { + "string": "hola", + "raw_string": "hola" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "boolean": { + "range": "d2/testdata/d2parser/TestParse/edge_key.d2,1:20:21-1:25:26", + "value": false + } + } + } + } + ] + }, + "err": null +} diff --git a/testdata/d2parser/TestParse/edge_line_continuation.exp.json b/testdata/d2parser/TestParse/edge_line_continuation.exp.json new file mode 100644 index 000000000..f6444a5dc --- /dev/null +++ b/testdata/d2parser/TestParse/edge_line_continuation.exp.json @@ -0,0 +1,54 @@ +{ + "ast": { + "range": "d2/testdata/d2parser/TestParse/edge_line_continuation.d2,0:0:0-3:5:77", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2parser/TestParse/edge_line_continuation.d2,1:0:1-2:41:71", + "edges": [ + { + "range": "d2/testdata/d2parser/TestParse/edge_line_continuation.d2,1:0:1-2:41:71", + "src": { + "range": "d2/testdata/d2parser/TestParse/edge_line_continuation.d2,1:0:1-1:25:26", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2parser/TestParse/edge_line_continuation.d2,1:0:1-1:24:25", + "value": [ + { + "string": "super long shape id here", + "raw_string": "super long shape id here" + } + ] + } + } + ] + }, + "src_arrow": "", + "dst": { + "range": "d2/testdata/d2parser/TestParse/edge_line_continuation.d2,2:4:34-2:41:71", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2parser/TestParse/edge_line_continuation.d2,2:5:35-2:41:71", + "value": [ + { + "string": "super long shape id even longer here", + "raw_string": "super long shape id even longer here" + } + ] + } + } + ] + }, + "dst_arrow": ">" + } + ], + "primary": {}, + "value": {} + } + } + ] + }, + "err": null +} diff --git a/testdata/d2parser/TestParse/edge_line_continuation_2.exp.json b/testdata/d2parser/TestParse/edge_line_continuation_2.exp.json new file mode 100644 index 000000000..1e5f4b296 --- /dev/null +++ b/testdata/d2parser/TestParse/edge_line_continuation_2.exp.json @@ -0,0 +1,54 @@ +{ + "ast": { + "range": "d2/testdata/d2parser/TestParse/edge_line_continuation_2.d2,0:0:0-3:2:71", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2parser/TestParse/edge_line_continuation_2.d2,1:0:1-2:38:68", + "edges": [ + { + "range": "d2/testdata/d2parser/TestParse/edge_line_continuation_2.d2,1:0:1-2:38:68", + "src": { + "range": "d2/testdata/d2parser/TestParse/edge_line_continuation_2.d2,1:0:1-1:25:26", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2parser/TestParse/edge_line_continuation_2.d2,1:0:1-1:24:25", + "value": [ + { + "string": "super long shape id here", + "raw_string": "super long shape id here" + } + ] + } + } + ] + }, + "src_arrow": "", + "dst": { + "range": "d2/testdata/d2parser/TestParse/edge_line_continuation_2.d2,2:1:31-2:38:68", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2parser/TestParse/edge_line_continuation_2.d2,2:2:32-2:38:68", + "value": [ + { + "string": "super long shape id even longer here", + "raw_string": "super long shape id even longer here" + } + ] + } + } + ] + }, + "dst_arrow": ">" + } + ], + "primary": {}, + "value": {} + } + } + ] + }, + "err": null +} diff --git a/testdata/d2parser/TestParse/empty.exp.json b/testdata/d2parser/TestParse/empty.exp.json new file mode 100644 index 000000000..5824afea6 --- /dev/null +++ b/testdata/d2parser/TestParse/empty.exp.json @@ -0,0 +1,7 @@ +{ + "ast": { + "range": "d2/testdata/d2parser/TestParse/empty.d2,0:0:0-0:0:0", + "nodes": null + }, + "err": null +} diff --git a/testdata/d2parser/TestParse/errs.exp.json b/testdata/d2parser/TestParse/errs.exp.json new file mode 100644 index 000000000..5136c50a2 --- /dev/null +++ b/testdata/d2parser/TestParse/errs.exp.json @@ -0,0 +1,472 @@ +{ + "ast": { + "range": "d2/testdata/d2parser/TestParse/errs.d2,0:0:0-27:0:220", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2parser/TestParse/errs.d2,1:0:1-1:8:9", + "edges": [ + { + "range": "d2/testdata/d2parser/TestParse/errs.d2,1:0:1-1:2:3", + "src": null, + "src_arrow": "", + "dst": null, + "dst_arrow": "" + } + ], + "primary": {}, + "value": { + "unquoted_string": { + "range": "d2/testdata/d2parser/TestParse/errs.d2,1:4:5-1:8:9", + "value": [ + { + "string": "meow", + "raw_string": "meow" + } + ] + } + } + } + }, + { + "map_key": { + "range": "d2/testdata/d2parser/TestParse/errs.d2,2:0:14-2:4:18", + "key": { + "range": "d2/testdata/d2parser/TestParse/errs.d2,2:0:14-2:4:18", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2parser/TestParse/errs.d2,2:0:14-2:4:18", + "value": [ + { + "string": "meow", + "raw_string": "meow" + } + ] + } + } + ] + }, + "primary": {}, + "value": {} + } + }, + { + "map_key": { + "range": "d2/testdata/d2parser/TestParse/errs.d2,3:0:26-3:16:42", + "key": { + "range": "d2/testdata/d2parser/TestParse/errs.d2,3:0:26-3:2:28", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2parser/TestParse/errs.d2,3:0:26-3:2:28", + "value": [ + { + "string": "ok", + "raw_string": "ok" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "double_quoted_string": { + "range": "d2/testdata/d2parser/TestParse/errs.d2,3:4:30-3:16:42", + "value": [ + { + "string": "dmsadmakls", + "raw_string": "dmsadmakls" + } + ] + } + } + } + }, + { + "map_key": { + "range": "d2/testdata/d2parser/TestParse/errs.d2,5:0:63-5:26:89", + "key": { + "range": "d2/testdata/d2parser/TestParse/errs.d2,5:0:63-5:7:70", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2parser/TestParse/errs.d2,5:0:63-5:1:64", + "value": [ + { + "string": "s", + "raw_string": "s" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2parser/TestParse/errs.d2,5:2:65-5:7:70", + "value": [ + { + "string": "shape", + "raw_string": "shape" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "unquoted_string": { + "range": "d2/testdata/d2parser/TestParse/errs.d2,5:9:72-5:19:82", + "value": [ + { + "string": "orochimaru", + "raw_string": "orochimaru" + } + ] + } + } + } + }, + { + "map_key": { + "range": "d2/testdata/d2parser/TestParse/errs.d2,6:0:90-6:25:115", + "key": { + "range": "d2/testdata/d2parser/TestParse/errs.d2,6:0:90-6:7:97", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2parser/TestParse/errs.d2,6:0:90-6:1:91", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2parser/TestParse/errs.d2,6:2:92-6:7:97", + "value": [ + { + "string": "shape", + "raw_string": "shape" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "unquoted_string": { + "range": "d2/testdata/d2parser/TestParse/errs.d2,6:9:99-6:18:108", + "value": [ + { + "string": "dasdasdas", + "raw_string": "dasdasdas" + } + ] + } + } + } + }, + { + "map_key": { + "range": "d2/testdata/d2parser/TestParse/errs.d2,8:0:117-8:4:121", + "key": { + "range": "d2/testdata/d2parser/TestParse/errs.d2,8:0:117-8:3:120", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2parser/TestParse/errs.d2,8:0:117-8:3:120", + "value": [ + { + "string": "wow", + "raw_string": "wow" + } + ] + } + } + ] + }, + "primary": {}, + "value": {} + } + }, + { + "block_comment": { + "range": "d2/testdata/d2parser/TestParse/errs.d2,16:0:138-18:3:150", + "value": "wsup" + } + }, + { + "map_key": { + "range": "d2/testdata/d2parser/TestParse/errs.d2,20:0:152-20:1:153", + "key": { + "range": "d2/testdata/d2parser/TestParse/errs.d2,20:0:152-20:1:153", + "path": [ + { + "single_quoted_string": { + "range": "d2/testdata/d2parser/TestParse/errs.d2,20:0:152-20:1:153", + "raw": "", + "value": "" + } + } + ] + }, + "primary": {}, + "value": {} + } + }, + { + "map_key": { + "range": "d2/testdata/d2parser/TestParse/errs.d2,22:0:155-22:11:166", + "key": { + "range": "d2/testdata/d2parser/TestParse/errs.d2,22:0:155-22:4:159", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2parser/TestParse/errs.d2,22:0:155-22:4:159", + "value": [ + { + "string": "meow", + "raw_string": "meow" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "unquoted_string": { + "range": "d2/testdata/d2parser/TestParse/errs.d2,22:6:161-22:7:162", + "value": [ + { + "substitution": { + "range": "d2/testdata/d2parser/TestParse/errs.d2,22:6:161-22:11:166", + "spread": false, + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2parser/TestParse/errs.d2,22:8:163-22:10:165", + "value": [ + { + "string": "ok", + "raw_string": "ok" + } + ] + } + } + ] + } + } + ] + } + } + } + }, + { + "map_key": { + "range": "d2/testdata/d2parser/TestParse/errs.d2,23:0:167-23:12:179", + "key": { + "range": "d2/testdata/d2parser/TestParse/errs.d2,23:0:167-23:5:172", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2parser/TestParse/errs.d2,23:0:167-23:4:171", + "value": [ + { + "string": "meow", + "raw_string": "meow" + } + ] + } + } + ] + }, + "edges": [ + { + "range": "d2/testdata/d2parser/TestParse/errs.d2,23:6:173-23:9:176", + "src": { + "range": "d2/testdata/d2parser/TestParse/errs.d2,23:6:173-23:7:174", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2parser/TestParse/errs.d2,23:6:173-23:7:174", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "src_arrow": "", + "dst": null, + "dst_arrow": ">" + } + ], + "edge_index": { + "range": "d2/testdata/d2parser/TestParse/errs.d2,23:10:177-23:11:178", + "int": null, + "glob": false + }, + "primary": {}, + "value": {} + } + }, + { + "map_key": { + "range": "d2/testdata/d2parser/TestParse/errs.d2,24:0:180-24:6:186", + "edges": [ + { + "range": "d2/testdata/d2parser/TestParse/errs.d2,24:0:180-24:6:186", + "src": { + "range": "d2/testdata/d2parser/TestParse/errs.d2,24:0:180-24:2:182", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2parser/TestParse/errs.d2,24:0:180-24:1:181", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "src_arrow": "", + "dst": { + "range": "d2/testdata/d2parser/TestParse/errs.d2,24:4:184-24:6:186", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2parser/TestParse/errs.d2,24:5:185-24:6:186", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "dst_arrow": ">" + } + ], + "primary": {}, + "value": {} + } + }, + { + "map_key": { + "range": "d2/testdata/d2parser/TestParse/errs.d2,26:0:188-26:5:193", + "key": { + "range": "d2/testdata/d2parser/TestParse/errs.d2,26:0:188-26:1:189", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2parser/TestParse/errs.d2,26:0:188-26:1:189", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "array": { + "range": "d2/testdata/d2parser/TestParse/errs.d2,26:3:191-26:4:192", + "nodes": null + } + } + } + } + ] + }, + "err": { + "ioerr": null, + "errs": [ + { + "range": "d2/testdata/d2parser/TestParse/errs.d2,1:0:1-1:1:2", + "errmsg": "d2/testdata/d2parser/TestParse/errs.d2:2:1: connection missing source" + }, + { + "range": "d2/testdata/d2parser/TestParse/errs.d2,1:0:1-1:2:3", + "errmsg": "d2/testdata/d2parser/TestParse/errs.d2:2:1: connection missing destination" + }, + { + "range": "d2/testdata/d2parser/TestParse/errs.d2,1:8:9-1:11:12", + "errmsg": "d2/testdata/d2parser/TestParse/errs.d2:2:9: unexpected text after unquoted string" + }, + { + "range": "d2/testdata/d2parser/TestParse/errs.d2,2:4:18-2:10:24", + "errmsg": "d2/testdata/d2parser/TestParse/errs.d2:3:5: unexpected text after map key" + }, + { + "range": "d2/testdata/d2parser/TestParse/errs.d2,3:16:42-3:31:57", + "errmsg": "d2/testdata/d2parser/TestParse/errs.d2:4:17: unexpected text after double quoted string" + }, + { + "range": "d2/testdata/d2parser/TestParse/errs.d2,8:3:120-8:4:121", + "errmsg": "d2/testdata/d2parser/TestParse/errs.d2:9:4: missing value after colon" + }, + { + "range": "d2/testdata/d2parser/TestParse/errs.d2,10:0:123-10:1:124", + "errmsg": "d2/testdata/d2parser/TestParse/errs.d2:11:1: map value without key" + }, + { + "range": "d2/testdata/d2parser/TestParse/errs.d2,10:0:123-10:1:124", + "errmsg": "d2/testdata/d2parser/TestParse/errs.d2:11:1: missing value after colon" + }, + { + "range": "d2/testdata/d2parser/TestParse/errs.d2,12:0:128-12:2:130", + "errmsg": "d2/testdata/d2parser/TestParse/errs.d2:13:1: invalid text beginning unquoted key" + }, + { + "range": "d2/testdata/d2parser/TestParse/errs.d2,14:2:134-14:3:135", + "errmsg": "d2/testdata/d2parser/TestParse/errs.d2:15:3: invalid text beginning unquoted key" + }, + { + "range": "d2/testdata/d2parser/TestParse/errs.d2,14:3:135-14:4:136", + "errmsg": "d2/testdata/d2parser/TestParse/errs.d2:15:4: unexpected map termination character } in file map" + }, + { + "range": "d2/testdata/d2parser/TestParse/errs.d2,20:0:152-20:1:153", + "errmsg": "d2/testdata/d2parser/TestParse/errs.d2:21:1: single quoted strings must be terminated with '" + }, + { + "range": "d2/testdata/d2parser/TestParse/errs.d2,23:6:173-23:9:176", + "errmsg": "d2/testdata/d2parser/TestParse/errs.d2:24:7: connection missing destination" + }, + { + "range": "d2/testdata/d2parser/TestParse/errs.d2,23:10:177-23:11:178", + "errmsg": "d2/testdata/d2parser/TestParse/errs.d2:24:11: unexpected character in edge index" + }, + { + "range": "d2/testdata/d2parser/TestParse/errs.d2,23:10:177-23:11:178", + "errmsg": "d2/testdata/d2parser/TestParse/errs.d2:24:11: unterminated edge index" + }, + { + "range": "d2/testdata/d2parser/TestParse/errs.d2,23:11:178-23:12:179", + "errmsg": "d2/testdata/d2parser/TestParse/errs.d2:24:12: missing value after colon" + }, + { + "range": "d2/testdata/d2parser/TestParse/errs.d2,26:5:193-26:31:219", + "errmsg": "d2/testdata/d2parser/TestParse/errs.d2:27:6: unexpected text after array" + } + ] + } +} diff --git a/testdata/d2parser/TestParse/field_line_continuation.exp.json b/testdata/d2parser/TestParse/field_line_continuation.exp.json new file mode 100644 index 000000000..67e23e9d8 --- /dev/null +++ b/testdata/d2parser/TestParse/field_line_continuation.exp.json @@ -0,0 +1,74 @@ +{ + "ast": { + "range": "d2/testdata/d2parser/TestParse/field_line_continuation.d2,0:0:0-9:2:85", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2parser/TestParse/field_line_continuation.d2,1:0:1-4:13:42", + "key": { + "range": "d2/testdata/d2parser/TestParse/field_line_continuation.d2,1:0:1-3:7:21", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2parser/TestParse/field_line_continuation.d2,1:0:1-3:7:21", + "value": [ + { + "string": "meow ok super", + "raw_string": "meow ok super" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "unquoted_string": { + "range": "d2/testdata/d2parser/TestParse/field_line_continuation.d2,3:9:23-4:13:42", + "value": [ + { + "string": "yes wow so cool", + "raw_string": "yes wow so cool" + } + ] + } + } + } + }, + { + "map_key": { + "range": "d2/testdata/d2parser/TestParse/field_line_continuation.d2,5:2:45-8:28:82", + "key": { + "range": "d2/testdata/d2parser/TestParse/field_line_continuation.d2,5:2:45-8:17:71", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2parser/TestParse/field_line_continuation.d2,5:2:45-8:17:71", + "value": [ + { + "string": "xd ok does it work", + "raw_string": "xd ok does it work" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "unquoted_string": { + "range": "d2/testdata/d2parser/TestParse/field_line_continuation.d2,8:19:73-8:28:82", + "value": [ + { + "string": "hopefully", + "raw_string": "hopefully" + } + ] + } + } + } + } + ] + }, + "err": null +} diff --git a/testdata/d2parser/TestParse/key.exp.json b/testdata/d2parser/TestParse/key.exp.json new file mode 100644 index 000000000..095d720ce --- /dev/null +++ b/testdata/d2parser/TestParse/key.exp.json @@ -0,0 +1,31 @@ +{ + "ast": { + "range": "d2/testdata/d2parser/TestParse/key.d2,0:0:0-2:0:3", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2parser/TestParse/key.d2,1:0:1-1:1:2", + "key": { + "range": "d2/testdata/d2parser/TestParse/key.d2,1:0:1-1:1:2", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2parser/TestParse/key.d2,1:0:1-1:1:2", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "primary": {}, + "value": {} + } + } + ] + }, + "err": null +} diff --git a/testdata/d2parser/TestParse/key_with_edge.exp.json b/testdata/d2parser/TestParse/key_with_edge.exp.json new file mode 100644 index 000000000..43687d963 --- /dev/null +++ b/testdata/d2parser/TestParse/key_with_edge.exp.json @@ -0,0 +1,70 @@ +{ + "ast": { + "range": "d2/testdata/d2parser/TestParse/key_with_edge.d2,0:0:0-2:0:10", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2parser/TestParse/key_with_edge.d2,1:0:1-1:8:9", + "key": { + "range": "d2/testdata/d2parser/TestParse/key_with_edge.d2,1:0:1-1:2:3", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2parser/TestParse/key_with_edge.d2,1:0:1-1:1:2", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "edges": [ + { + "range": "d2/testdata/d2parser/TestParse/key_with_edge.d2,1:3:4-1:7:8", + "src": { + "range": "d2/testdata/d2parser/TestParse/key_with_edge.d2,1:3:4-1:4:5", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2parser/TestParse/key_with_edge.d2,1:3:4-1:4:5", + "value": [ + { + "string": "z", + "raw_string": "z" + } + ] + } + } + ] + }, + "src_arrow": "", + "dst": { + "range": "d2/testdata/d2parser/TestParse/key_with_edge.d2,1:6:7-1:7:8", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2parser/TestParse/key_with_edge.d2,1:6:7-1:7:8", + "value": [ + { + "string": "q", + "raw_string": "q" + } + ] + } + } + ] + }, + "dst_arrow": ">" + } + ], + "primary": {}, + "value": {} + } + } + ] + }, + "err": null +} diff --git a/testdata/d2parser/TestParse/missing_map_value.exp.json b/testdata/d2parser/TestParse/missing_map_value.exp.json new file mode 100644 index 000000000..68179de80 --- /dev/null +++ b/testdata/d2parser/TestParse/missing_map_value.exp.json @@ -0,0 +1,39 @@ +{ + "ast": { + "range": "d2/testdata/d2parser/TestParse/missing_map_value.d2,0:0:0-2:3:7", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2parser/TestParse/missing_map_value.d2,1:0:1-1:2:3", + "key": { + "range": "d2/testdata/d2parser/TestParse/missing_map_value.d2,1:0:1-1:1:2", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2parser/TestParse/missing_map_value.d2,1:0:1-1:1:2", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "primary": {}, + "value": {} + } + } + ] + }, + "err": { + "ioerr": null, + "errs": [ + { + "range": "d2/testdata/d2parser/TestParse/missing_map_value.d2,1:1:2-1:2:3", + "errmsg": "d2/testdata/d2parser/TestParse/missing_map_value.d2:2:2: missing value after colon" + } + ] + } +} diff --git a/testdata/d2parser/TestParse/multiline_comment.exp.json b/testdata/d2parser/TestParse/multiline_comment.exp.json new file mode 100644 index 000000000..2497e0e2d --- /dev/null +++ b/testdata/d2parser/TestParse/multiline_comment.exp.json @@ -0,0 +1,14 @@ +{ + "ast": { + "range": "d2/testdata/d2parser/TestParse/multiline_comment.d2,0:0:0-18:0:233", + "nodes": [ + { + "comment": { + "range": "d2/testdata/d2parser/TestParse/multiline_comment.d2,2:2:4-15:21:230", + "value": "hello\nworld\nearth\n\nglobe\nvery good\nnot so bad\n\nyes indeed\nThe good (I am convinced, for one)\nIs but the bad one leaves undone.\nOnce your reputation's done\nYou can live a life of fun.\n -- Wilhelm Busch" + } + } + ] + }, + "err": null +} diff --git a/testdata/d2parser/TestParse/multiple_edges.exp.json b/testdata/d2parser/TestParse/multiple_edges.exp.json new file mode 100644 index 000000000..4fa6cf36c --- /dev/null +++ b/testdata/d2parser/TestParse/multiple_edges.exp.json @@ -0,0 +1,91 @@ +{ + "ast": { + "range": "d2/testdata/d2parser/TestParse/multiple_edges.d2,0:0:0-2:0:13", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2parser/TestParse/multiple_edges.d2,1:0:1-1:11:12", + "edges": [ + { + "range": "d2/testdata/d2parser/TestParse/multiple_edges.d2,1:0:1-1:7:8", + "src": { + "range": "d2/testdata/d2parser/TestParse/multiple_edges.d2,1:0:1-1:2:3", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2parser/TestParse/multiple_edges.d2,1:0:1-1:1:2", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "src_arrow": "", + "dst": { + "range": "d2/testdata/d2parser/TestParse/multiple_edges.d2,1:4:5-1:7:8", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2parser/TestParse/multiple_edges.d2,1:5:6-1:6:7", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + } + ] + }, + "dst_arrow": ">" + }, + { + "range": "d2/testdata/d2parser/TestParse/multiple_edges.d2,1:4:5-1:11:12", + "src": { + "range": "d2/testdata/d2parser/TestParse/multiple_edges.d2,1:4:5-1:7:8", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2parser/TestParse/multiple_edges.d2,1:5:6-1:6:7", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + } + ] + }, + "src_arrow": "", + "dst": { + "range": "d2/testdata/d2parser/TestParse/multiple_edges.d2,1:9:10-1:11:12", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2parser/TestParse/multiple_edges.d2,1:10:11-1:11:12", + "value": [ + { + "string": "z", + "raw_string": "z" + } + ] + } + } + ] + }, + "dst_arrow": ">" + } + ], + "primary": {}, + "value": {} + } + } + ] + }, + "err": null +} diff --git a/testdata/d2parser/TestParse/one_line_block_comment.exp.json b/testdata/d2parser/TestParse/one_line_block_comment.exp.json new file mode 100644 index 000000000..01aad6166 --- /dev/null +++ b/testdata/d2parser/TestParse/one_line_block_comment.exp.json @@ -0,0 +1,14 @@ +{ + "ast": { + "range": "d2/testdata/d2parser/TestParse/one_line_block_comment.d2,0:0:0-2:0:22", + "nodes": [ + { + "block_comment": { + "range": "d2/testdata/d2parser/TestParse/one_line_block_comment.d2,1:0:1-1:20:21", + "value": "dmaslkmdlksa" + } + } + ] + }, + "err": null +} diff --git a/testdata/d2parser/TestParse/one_line_comment.exp.json b/testdata/d2parser/TestParse/one_line_comment.exp.json new file mode 100644 index 000000000..4fd2ec7ac --- /dev/null +++ b/testdata/d2parser/TestParse/one_line_comment.exp.json @@ -0,0 +1,14 @@ +{ + "ast": { + "range": "d2/testdata/d2parser/TestParse/one_line_comment.d2,0:0:0-2:0:9", + "nodes": [ + { + "comment": { + "range": "d2/testdata/d2parser/TestParse/one_line_comment.d2,1:0:1-1:7:8", + "value": "hello" + } + } + ] + }, + "err": null +} diff --git a/testdata/d2parser/TestParse/primary.exp.json b/testdata/d2parser/TestParse/primary.exp.json new file mode 100644 index 000000000..c247a96ce --- /dev/null +++ b/testdata/d2parser/TestParse/primary.exp.json @@ -0,0 +1,126 @@ +{ + "ast": { + "range": "d2/testdata/d2parser/TestParse/primary.d2,0:0:0-17:0:743", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2parser/TestParse/primary.d2,1:0:1-16:1:742", + "edges": [ + { + "range": "d2/testdata/d2parser/TestParse/primary.d2,1:0:1-1:6:7", + "src": { + "range": "d2/testdata/d2parser/TestParse/primary.d2,1:0:1-1:2:3", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2parser/TestParse/primary.d2,1:0:1-1:1:2", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "src_arrow": "", + "dst": { + "range": "d2/testdata/d2parser/TestParse/primary.d2,1:4:5-1:6:7", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2parser/TestParse/primary.d2,1:5:6-1:6:7", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + } + ] + }, + "dst_arrow": ">" + } + ], + "primary": { + "unquoted_string": { + "range": "d2/testdata/d2parser/TestParse/primary.d2,1:8:9-1:9:10", + "value": [ + { + "substitution": { + "range": "d2/testdata/d2parser/TestParse/primary.d2,1:8:9-1:18:19", + "spread": false, + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2parser/TestParse/primary.d2,1:10:11-1:14:15", + "value": [ + { + "string": "meow", + "raw_string": "meow" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2parser/TestParse/primary.d2,1:15:16-1:17:18", + "value": [ + { + "string": "ok", + "raw_string": "ok" + } + ] + } + } + ] + } + } + ] + } + }, + "value": { + "map": { + "range": "d2/testdata/d2parser/TestParse/primary.d2,1:19:20-16:0:741", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2parser/TestParse/primary.d2,2:1:23-15:1:740", + "key": { + "range": "d2/testdata/d2parser/TestParse/primary.d2,2:1:23-2:6:28", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2parser/TestParse/primary.d2,2:1:23-2:6:28", + "value": [ + { + "string": "label", + "raw_string": "label" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "block_string": { + "range": "d2/testdata/d2parser/TestParse/primary.d2,2:8:30-15:1:740", + "quote": "", + "tag": "md", + "value": "\"Hi, I'm Preston A. Mantis, president of Consumers Retail Law Outlet. As you\ncan see by my suit and the fact that I have all these books of equal height\non the shelves behind me, I am a trained legal attorney. Do you have a car\nor a job? Do you ever walk around? If so, you probably have the makings of\nan excellent legal case. Although of course every case is different, I\nwould definitely say that based on my experience and training, there's no\nreason why you shouldn't come out of this thing with at least a cabin\ncruiser.\n\n\"Remember, at the Preston A. Mantis Consumers Retail Law Outlet, our motto\nis: 'It is very difficult to disprove certain kinds of pain.'\"\n\t\t-- Dave Barry, \"Pain and Suffering\"" + } + } + } + } + ] + } + } + } + } + ] + }, + "err": null +} diff --git a/testdata/d2parser/TestParse/semicolons.exp.json b/testdata/d2parser/TestParse/semicolons.exp.json new file mode 100644 index 000000000..a3f3b3505 --- /dev/null +++ b/testdata/d2parser/TestParse/semicolons.exp.json @@ -0,0 +1,7 @@ +{ + "ast": { + "range": "d2/testdata/d2parser/TestParse/semicolons.d2,0:0:0-0:5:5", + "nodes": null + }, + "err": null +} diff --git a/testdata/d2parser/TestParse/single_quote_block_string.exp.json b/testdata/d2parser/TestParse/single_quote_block_string.exp.json new file mode 100644 index 000000000..43657fb20 --- /dev/null +++ b/testdata/d2parser/TestParse/single_quote_block_string.exp.json @@ -0,0 +1,61 @@ +{ + "ast": { + "range": "d2/testdata/d2parser/TestParse/single_quote_block_string.d2,0:0:0-5:0:39", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2parser/TestParse/single_quote_block_string.d2,1:0:1-3:2:13", + "key": { + "range": "d2/testdata/d2parser/TestParse/single_quote_block_string.d2,1:0:1-1:1:2", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2parser/TestParse/single_quote_block_string.d2,1:0:1-1:1:2", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "block_string": { + "range": "d2/testdata/d2parser/TestParse/single_quote_block_string.d2,1:3:4-3:2:13", + "quote": "'", + "tag": "md", + "value": "bs" + } + } + } + }, + { + "map_key": { + "range": "d2/testdata/d2parser/TestParse/single_quote_block_string.d2,4:0:14-4:24:38", + "key": { + "range": "d2/testdata/d2parser/TestParse/single_quote_block_string.d2,4:0:14-4:24:38", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2parser/TestParse/single_quote_block_string.d2,4:0:14-4:24:38", + "value": [ + { + "string": "not part of block string", + "raw_string": "not part of block string" + } + ] + } + } + ] + }, + "primary": {}, + "value": {} + } + } + ] + }, + "err": null +} diff --git a/testdata/d2parser/TestParse/subst.exp.json b/testdata/d2parser/TestParse/subst.exp.json new file mode 100644 index 000000000..6dd9d488c --- /dev/null +++ b/testdata/d2parser/TestParse/subst.exp.json @@ -0,0 +1,90 @@ +{ + "ast": { + "range": "d2/testdata/d2parser/TestParse/subst.d2,0:0:0-2:0:20", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2parser/TestParse/subst.d2,1:0:1-1:18:19", + "edges": [ + { + "range": "d2/testdata/d2parser/TestParse/subst.d2,1:0:1-1:6:7", + "src": { + "range": "d2/testdata/d2parser/TestParse/subst.d2,1:0:1-1:2:3", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2parser/TestParse/subst.d2,1:0:1-1:1:2", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "src_arrow": "", + "dst": { + "range": "d2/testdata/d2parser/TestParse/subst.d2,1:4:5-1:6:7", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2parser/TestParse/subst.d2,1:5:6-1:6:7", + "value": [ + { + "string": "y", + "raw_string": "y" + } + ] + } + } + ] + }, + "dst_arrow": ">" + } + ], + "primary": {}, + "value": { + "unquoted_string": { + "range": "d2/testdata/d2parser/TestParse/subst.d2,1:8:9-1:9:10", + "value": [ + { + "substitution": { + "range": "d2/testdata/d2parser/TestParse/subst.d2,1:8:9-1:18:19", + "spread": false, + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2parser/TestParse/subst.d2,1:10:11-1:14:15", + "value": [ + { + "string": "meow", + "raw_string": "meow" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2parser/TestParse/subst.d2,1:15:16-1:17:18", + "value": [ + { + "string": "ok", + "raw_string": "ok" + } + ] + } + } + ] + } + } + ] + } + } + } + } + ] + }, + "err": null +} diff --git a/testdata/d2parser/TestParse/table_and_class.exp.json b/testdata/d2parser/TestParse/table_and_class.exp.json new file mode 100644 index 000000000..14df29b66 --- /dev/null +++ b/testdata/d2parser/TestParse/table_and_class.exp.json @@ -0,0 +1,1471 @@ +{ + "ast": { + "range": "d2/testdata/d2parser/TestParse/table_and_class.d2,0:0:0-57:0:1180", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2parser/TestParse/table_and_class.d2,1:0:1-44:1:1007", + "key": { + "range": "d2/testdata/d2parser/TestParse/table_and_class.d2,1:0:1-1:11:12", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2parser/TestParse/table_and_class.d2,1:0:1-1:11:12", + "value": [ + { + "string": "sql_example", + "raw_string": "sql_example" + } + ] + } + } + ] + }, + "primary": { + "unquoted_string": { + "range": "d2/testdata/d2parser/TestParse/table_and_class.d2,1:13:14-1:24:25", + "value": [ + { + "string": "sql_example", + "raw_string": "sql_example" + } + ] + } + }, + "value": { + "map": { + "range": "d2/testdata/d2parser/TestParse/table_and_class.d2,1:25:26-44:0:1006", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2parser/TestParse/table_and_class.d2,2:2:30-11:3:311", + "key": { + "range": "d2/testdata/d2parser/TestParse/table_and_class.d2,2:2:30-2:7:35", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2parser/TestParse/table_and_class.d2,2:2:30-2:7:35", + "value": [ + { + "string": "board", + "raw_string": "board" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "map": { + "range": "d2/testdata/d2parser/TestParse/table_and_class.d2,2:9:37-11:2:310", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2parser/TestParse/table_and_class.d2,3:4:43-3:20:59", + "key": { + "range": "d2/testdata/d2parser/TestParse/table_and_class.d2,3:4:43-3:9:48", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2parser/TestParse/table_and_class.d2,3:4:43-3:9:48", + "value": [ + { + "string": "shape", + "raw_string": "shape" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "unquoted_string": { + "range": "d2/testdata/d2parser/TestParse/table_and_class.d2,3:11:50-3:20:59", + "value": [ + { + "string": "sql_table", + "raw_string": "sql_table" + } + ] + } + } + } + }, + { + "map_key": { + "range": "d2/testdata/d2parser/TestParse/table_and_class.d2,4:4:64-4:37:97", + "key": { + "range": "d2/testdata/d2parser/TestParse/table_and_class.d2,4:4:64-4:6:66", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2parser/TestParse/table_and_class.d2,4:4:64-4:6:66", + "value": [ + { + "string": "id", + "raw_string": "id" + } + ] + } + } + ] + }, + "primary": { + "unquoted_string": { + "range": "d2/testdata/d2parser/TestParse/table_and_class.d2,4:8:68-4:11:71", + "value": [ + { + "string": "int", + "raw_string": "int" + } + ] + } + }, + "value": { + "map": { + "range": "d2/testdata/d2parser/TestParse/table_and_class.d2,4:12:72-4:36:96", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2parser/TestParse/table_and_class.d2,4:13:73-4:36:96", + "key": { + "range": "d2/testdata/d2parser/TestParse/table_and_class.d2,4:13:73-4:23:83", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2parser/TestParse/table_and_class.d2,4:13:73-4:23:83", + "value": [ + { + "string": "constraint", + "raw_string": "constraint" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "unquoted_string": { + "range": "d2/testdata/d2parser/TestParse/table_and_class.d2,4:25:85-4:36:96", + "value": [ + { + "string": "primary_key", + "raw_string": "primary_key" + } + ] + } + } + } + } + ] + } + } + } + }, + { + "map_key": { + "range": "d2/testdata/d2parser/TestParse/table_and_class.d2,5:4:102-5:40:138", + "key": { + "range": "d2/testdata/d2parser/TestParse/table_and_class.d2,5:4:102-5:9:107", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2parser/TestParse/table_and_class.d2,5:4:102-5:9:107", + "value": [ + { + "string": "frame", + "raw_string": "frame" + } + ] + } + } + ] + }, + "primary": { + "unquoted_string": { + "range": "d2/testdata/d2parser/TestParse/table_and_class.d2,5:11:109-5:14:112", + "value": [ + { + "string": "int", + "raw_string": "int" + } + ] + } + }, + "value": { + "map": { + "range": "d2/testdata/d2parser/TestParse/table_and_class.d2,5:15:113-5:39:137", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2parser/TestParse/table_and_class.d2,5:16:114-5:39:137", + "key": { + "range": "d2/testdata/d2parser/TestParse/table_and_class.d2,5:16:114-5:26:124", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2parser/TestParse/table_and_class.d2,5:16:114-5:26:124", + "value": [ + { + "string": "constraint", + "raw_string": "constraint" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "unquoted_string": { + "range": "d2/testdata/d2parser/TestParse/table_and_class.d2,5:28:126-5:39:137", + "value": [ + { + "string": "foreign_key", + "raw_string": "foreign_key" + } + ] + } + } + } + } + ] + } + } + } + }, + { + "map_key": { + "range": "d2/testdata/d2parser/TestParse/table_and_class.d2,6:4:143-6:42:181", + "key": { + "range": "d2/testdata/d2parser/TestParse/table_and_class.d2,6:4:143-6:11:150", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2parser/TestParse/table_and_class.d2,6:4:143-6:11:150", + "value": [ + { + "string": "diagram", + "raw_string": "diagram" + } + ] + } + } + ] + }, + "primary": { + "unquoted_string": { + "range": "d2/testdata/d2parser/TestParse/table_and_class.d2,6:13:152-6:16:155", + "value": [ + { + "string": "int", + "raw_string": "int" + } + ] + } + }, + "value": { + "map": { + "range": "d2/testdata/d2parser/TestParse/table_and_class.d2,6:17:156-6:41:180", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2parser/TestParse/table_and_class.d2,6:18:157-6:41:180", + "key": { + "range": "d2/testdata/d2parser/TestParse/table_and_class.d2,6:18:157-6:28:167", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2parser/TestParse/table_and_class.d2,6:18:157-6:28:167", + "value": [ + { + "string": "constraint", + "raw_string": "constraint" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "unquoted_string": { + "range": "d2/testdata/d2parser/TestParse/table_and_class.d2,6:30:169-6:41:180", + "value": [ + { + "string": "foreign_key", + "raw_string": "foreign_key" + } + ] + } + } + } + } + ] + } + } + } + }, + { + "map_key": { + "range": "d2/testdata/d2parser/TestParse/table_and_class.d2,7:4:186-7:24:206", + "key": { + "range": "d2/testdata/d2parser/TestParse/table_and_class.d2,7:4:186-7:17:199", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2parser/TestParse/table_and_class.d2,7:4:186-7:17:199", + "value": [ + { + "string": "board_objects", + "raw_string": "board_objects" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "unquoted_string": { + "range": "d2/testdata/d2parser/TestParse/table_and_class.d2,7:19:201-7:24:206", + "value": [ + { + "string": "jsonb", + "raw_string": "jsonb" + } + ] + } + } + } + }, + { + "map_key": { + "range": "d2/testdata/d2parser/TestParse/table_and_class.d2,8:4:211-8:42:249", + "key": { + "range": "d2/testdata/d2parser/TestParse/table_and_class.d2,8:4:211-8:16:223", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2parser/TestParse/table_and_class.d2,8:4:211-8:16:223", + "value": [ + { + "string": "last_updated", + "raw_string": "last_updated" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "unquoted_string": { + "range": "d2/testdata/d2parser/TestParse/table_and_class.d2,8:18:225-8:42:249", + "value": [ + { + "string": "timestamp with time zone", + "raw_string": "timestamp with time zone" + } + ] + } + } + } + }, + { + "map_key": { + "range": "d2/testdata/d2parser/TestParse/table_and_class.d2,9:4:254-9:43:293", + "key": { + "range": "d2/testdata/d2parser/TestParse/table_and_class.d2,9:4:254-9:17:267", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2parser/TestParse/table_and_class.d2,9:4:254-9:17:267", + "value": [ + { + "string": "last_thumbgen", + "raw_string": "last_thumbgen" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "unquoted_string": { + "range": "d2/testdata/d2parser/TestParse/table_and_class.d2,9:19:269-9:43:293", + "value": [ + { + "string": "timestamp with time zone", + "raw_string": "timestamp with time zone" + } + ] + } + } + } + }, + { + "map_key": { + "range": "d2/testdata/d2parser/TestParse/table_and_class.d2,10:4:298-10:13:307", + "key": { + "range": "d2/testdata/d2parser/TestParse/table_and_class.d2,10:4:298-10:7:301", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2parser/TestParse/table_and_class.d2,10:4:298-10:7:301", + "value": [ + { + "string": "dsl", + "raw_string": "dsl" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "unquoted_string": { + "range": "d2/testdata/d2parser/TestParse/table_and_class.d2,10:9:303-10:13:307", + "value": [ + { + "string": "text", + "raw_string": "text" + } + ] + } + } + } + } + ] + } + } + } + }, + { + "comment": { + "range": "d2/testdata/d2parser/TestParse/table_and_class.d2,13:2:315-13:11:324", + "value": "Normal." + } + }, + { + "map_key": { + "range": "d2/testdata/d2parser/TestParse/table_and_class.d2,14:2:327-14:30:355", + "edges": [ + { + "range": "d2/testdata/d2parser/TestParse/table_and_class.d2,14:2:327-14:30:355", + "src": { + "range": "d2/testdata/d2parser/TestParse/table_and_class.d2,14:2:327-14:16:341", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2parser/TestParse/table_and_class.d2,14:2:327-14:7:332", + "value": [ + { + "string": "board", + "raw_string": "board" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2parser/TestParse/table_and_class.d2,14:8:333-14:15:340", + "value": [ + { + "string": "diagram", + "raw_string": "diagram" + } + ] + } + } + ] + }, + "src_arrow": "", + "dst": { + "range": "d2/testdata/d2parser/TestParse/table_and_class.d2,14:18:343-14:30:355", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2parser/TestParse/table_and_class.d2,14:19:344-14:27:352", + "value": [ + { + "string": "diagrams", + "raw_string": "diagrams" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2parser/TestParse/table_and_class.d2,14:28:353-14:30:355", + "value": [ + { + "string": "id", + "raw_string": "id" + } + ] + } + } + ] + }, + "dst_arrow": ">" + } + ], + "primary": {}, + "value": {} + } + }, + { + "comment": { + "range": "d2/testdata/d2parser/TestParse/table_and_class.d2,16:2:359-16:21:378", + "value": "Self referential." + } + }, + { + "map_key": { + "range": "d2/testdata/d2parser/TestParse/table_and_class.d2,17:2:381-17:40:419", + "edges": [ + { + "range": "d2/testdata/d2parser/TestParse/table_and_class.d2,17:2:381-17:40:419", + "src": { + "range": "d2/testdata/d2parser/TestParse/table_and_class.d2,17:2:381-17:14:393", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2parser/TestParse/table_and_class.d2,17:2:381-17:10:389", + "value": [ + { + "string": "diagrams", + "raw_string": "diagrams" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2parser/TestParse/table_and_class.d2,17:11:390-17:13:392", + "value": [ + { + "string": "id", + "raw_string": "id" + } + ] + } + } + ] + }, + "src_arrow": "", + "dst": { + "range": "d2/testdata/d2parser/TestParse/table_and_class.d2,17:16:395-17:40:419", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2parser/TestParse/table_and_class.d2,17:17:396-17:25:404", + "value": [ + { + "string": "diagrams", + "raw_string": "diagrams" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2parser/TestParse/table_and_class.d2,17:26:405-17:40:419", + "value": [ + { + "string": "representation", + "raw_string": "representation" + } + ] + } + } + ] + }, + "dst_arrow": ">" + } + ], + "primary": {}, + "value": {} + } + }, + { + "comment": { + "range": "d2/testdata/d2parser/TestParse/table_and_class.d2,19:2:423-19:18:439", + "value": "SrcArrow test." + } + }, + { + "map_key": { + "range": "d2/testdata/d2parser/TestParse/table_and_class.d2,20:2:442-20:30:470", + "edges": [ + { + "range": "d2/testdata/d2parser/TestParse/table_and_class.d2,20:2:442-20:30:470", + "src": { + "range": "d2/testdata/d2parser/TestParse/table_and_class.d2,20:2:442-20:14:454", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2parser/TestParse/table_and_class.d2,20:2:442-20:10:450", + "value": [ + { + "string": "diagrams", + "raw_string": "diagrams" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2parser/TestParse/table_and_class.d2,20:11:451-20:13:453", + "value": [ + { + "string": "id", + "raw_string": "id" + } + ] + } + } + ] + }, + "src_arrow": "<", + "dst": { + "range": "d2/testdata/d2parser/TestParse/table_and_class.d2,20:16:456-20:30:470", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2parser/TestParse/table_and_class.d2,20:17:457-20:22:462", + "value": [ + { + "string": "views", + "raw_string": "views" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2parser/TestParse/table_and_class.d2,20:23:463-20:30:470", + "value": [ + { + "string": "diagram", + "raw_string": "diagram" + } + ] + } + } + ] + }, + "dst_arrow": "" + } + ], + "primary": {}, + "value": {} + } + }, + { + "map_key": { + "range": "d2/testdata/d2parser/TestParse/table_and_class.d2,21:2:473-21:31:502", + "edges": [ + { + "range": "d2/testdata/d2parser/TestParse/table_and_class.d2,21:2:473-21:31:502", + "src": { + "range": "d2/testdata/d2parser/TestParse/table_and_class.d2,21:2:473-21:14:485", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2parser/TestParse/table_and_class.d2,21:2:473-21:10:481", + "value": [ + { + "string": "diagrams", + "raw_string": "diagrams" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2parser/TestParse/table_and_class.d2,21:11:482-21:13:484", + "value": [ + { + "string": "id", + "raw_string": "id" + } + ] + } + } + ] + }, + "src_arrow": "<", + "dst": { + "range": "d2/testdata/d2parser/TestParse/table_and_class.d2,21:17:488-21:31:502", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2parser/TestParse/table_and_class.d2,21:18:489-21:23:494", + "value": [ + { + "string": "steps", + "raw_string": "steps" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2parser/TestParse/table_and_class.d2,21:24:495-21:31:502", + "value": [ + { + "string": "diagram", + "raw_string": "diagram" + } + ] + } + } + ] + }, + "dst_arrow": ">" + } + ], + "primary": {}, + "value": {} + } + }, + { + "map_key": { + "range": "d2/testdata/d2parser/TestParse/table_and_class.d2,23:2:506-27:3:621", + "key": { + "range": "d2/testdata/d2parser/TestParse/table_and_class.d2,23:2:506-23:10:514", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2parser/TestParse/table_and_class.d2,23:2:506-23:10:514", + "value": [ + { + "string": "diagrams", + "raw_string": "diagrams" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "map": { + "range": "d2/testdata/d2parser/TestParse/table_and_class.d2,23:12:516-27:2:620", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2parser/TestParse/table_and_class.d2,24:4:522-24:20:538", + "key": { + "range": "d2/testdata/d2parser/TestParse/table_and_class.d2,24:4:522-24:9:527", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2parser/TestParse/table_and_class.d2,24:4:522-24:9:527", + "value": [ + { + "string": "shape", + "raw_string": "shape" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "unquoted_string": { + "range": "d2/testdata/d2parser/TestParse/table_and_class.d2,24:11:529-24:20:538", + "value": [ + { + "string": "sql_table", + "raw_string": "sql_table" + } + ] + } + } + } + }, + { + "map_key": { + "range": "d2/testdata/d2parser/TestParse/table_and_class.d2,25:4:543-25:44:583", + "key": { + "range": "d2/testdata/d2parser/TestParse/table_and_class.d2,25:4:543-25:6:545", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2parser/TestParse/table_and_class.d2,25:4:543-25:6:545", + "value": [ + { + "string": "id", + "raw_string": "id" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "map": { + "range": "d2/testdata/d2parser/TestParse/table_and_class.d2,25:8:547-25:43:582", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2parser/TestParse/table_and_class.d2,25:9:548-25:43:582", + "key": { + "range": "d2/testdata/d2parser/TestParse/table_and_class.d2,25:9:548-25:13:552", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2parser/TestParse/table_and_class.d2,25:9:548-25:13:552", + "value": [ + { + "string": "type", + "raw_string": "type" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "unquoted_string": { + "range": "d2/testdata/d2parser/TestParse/table_and_class.d2,25:15:554-25:43:582", + "value": [ + { + "string": "int, constraint: primary_key", + "raw_string": "int, constraint: primary_key" + } + ] + } + } + } + } + ] + } + } + } + }, + { + "map_key": { + "range": "d2/testdata/d2parser/TestParse/table_and_class.d2,26:4:588-26:33:617", + "key": { + "range": "d2/testdata/d2parser/TestParse/table_and_class.d2,26:4:588-26:18:602", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2parser/TestParse/table_and_class.d2,26:4:588-26:18:602", + "value": [ + { + "string": "representation", + "raw_string": "representation" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "map": { + "range": "d2/testdata/d2parser/TestParse/table_and_class.d2,26:20:604-26:32:616", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2parser/TestParse/table_and_class.d2,26:21:605-26:32:616", + "key": { + "range": "d2/testdata/d2parser/TestParse/table_and_class.d2,26:21:605-26:25:609", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2parser/TestParse/table_and_class.d2,26:21:605-26:25:609", + "value": [ + { + "string": "type", + "raw_string": "type" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "unquoted_string": { + "range": "d2/testdata/d2parser/TestParse/table_and_class.d2,26:27:611-26:32:616", + "value": [ + { + "string": "jsonb", + "raw_string": "jsonb" + } + ] + } + } + } + } + ] + } + } + } + } + ] + } + } + } + }, + { + "map_key": { + "range": "d2/testdata/d2parser/TestParse/table_and_class.d2,29:2:625-34:3:780", + "key": { + "range": "d2/testdata/d2parser/TestParse/table_and_class.d2,29:2:625-29:7:630", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2parser/TestParse/table_and_class.d2,29:2:625-29:7:630", + "value": [ + { + "string": "views", + "raw_string": "views" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "map": { + "range": "d2/testdata/d2parser/TestParse/table_and_class.d2,29:9:632-34:2:779", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2parser/TestParse/table_and_class.d2,30:4:638-30:20:654", + "key": { + "range": "d2/testdata/d2parser/TestParse/table_and_class.d2,30:4:638-30:9:643", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2parser/TestParse/table_and_class.d2,30:4:638-30:9:643", + "value": [ + { + "string": "shape", + "raw_string": "shape" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "unquoted_string": { + "range": "d2/testdata/d2parser/TestParse/table_and_class.d2,30:11:645-30:20:654", + "value": [ + { + "string": "sql_table", + "raw_string": "sql_table" + } + ] + } + } + } + }, + { + "map_key": { + "range": "d2/testdata/d2parser/TestParse/table_and_class.d2,31:4:659-31:44:699", + "key": { + "range": "d2/testdata/d2parser/TestParse/table_and_class.d2,31:4:659-31:6:661", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2parser/TestParse/table_and_class.d2,31:4:659-31:6:661", + "value": [ + { + "string": "id", + "raw_string": "id" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "map": { + "range": "d2/testdata/d2parser/TestParse/table_and_class.d2,31:8:663-31:43:698", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2parser/TestParse/table_and_class.d2,31:9:664-31:43:698", + "key": { + "range": "d2/testdata/d2parser/TestParse/table_and_class.d2,31:9:664-31:13:668", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2parser/TestParse/table_and_class.d2,31:9:664-31:13:668", + "value": [ + { + "string": "type", + "raw_string": "type" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "unquoted_string": { + "range": "d2/testdata/d2parser/TestParse/table_and_class.d2,31:15:670-31:43:698", + "value": [ + { + "string": "int, constraint: primary_key", + "raw_string": "int, constraint: primary_key" + } + ] + } + } + } + } + ] + } + } + } + }, + { + "map_key": { + "range": "d2/testdata/d2parser/TestParse/table_and_class.d2,32:4:704-32:33:733", + "key": { + "range": "d2/testdata/d2parser/TestParse/table_and_class.d2,32:4:704-32:18:718", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2parser/TestParse/table_and_class.d2,32:4:704-32:18:718", + "value": [ + { + "string": "representation", + "raw_string": "representation" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "map": { + "range": "d2/testdata/d2parser/TestParse/table_and_class.d2,32:20:720-32:32:732", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2parser/TestParse/table_and_class.d2,32:21:721-32:32:732", + "key": { + "range": "d2/testdata/d2parser/TestParse/table_and_class.d2,32:21:721-32:25:725", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2parser/TestParse/table_and_class.d2,32:21:721-32:25:725", + "value": [ + { + "string": "type", + "raw_string": "type" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "unquoted_string": { + "range": "d2/testdata/d2parser/TestParse/table_and_class.d2,32:27:727-32:32:732", + "value": [ + { + "string": "jsonb", + "raw_string": "jsonb" + } + ] + } + } + } + } + ] + } + } + } + }, + { + "map_key": { + "range": "d2/testdata/d2parser/TestParse/table_and_class.d2,33:4:738-33:42:776", + "key": { + "range": "d2/testdata/d2parser/TestParse/table_and_class.d2,33:4:738-33:11:745", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2parser/TestParse/table_and_class.d2,33:4:738-33:11:745", + "value": [ + { + "string": "diagram", + "raw_string": "diagram" + } + ] + } + } + ] + }, + "primary": { + "unquoted_string": { + "range": "d2/testdata/d2parser/TestParse/table_and_class.d2,33:13:747-33:16:750", + "value": [ + { + "string": "int", + "raw_string": "int" + } + ] + } + }, + "value": { + "map": { + "range": "d2/testdata/d2parser/TestParse/table_and_class.d2,33:17:751-33:41:775", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2parser/TestParse/table_and_class.d2,33:18:752-33:41:775", + "key": { + "range": "d2/testdata/d2parser/TestParse/table_and_class.d2,33:18:752-33:28:762", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2parser/TestParse/table_and_class.d2,33:18:752-33:28:762", + "value": [ + { + "string": "constraint", + "raw_string": "constraint" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "unquoted_string": { + "range": "d2/testdata/d2parser/TestParse/table_and_class.d2,33:30:764-33:41:775", + "value": [ + { + "string": "foreign_key", + "raw_string": "foreign_key" + } + ] + } + } + } + } + ] + } + } + } + } + ] + } + } + } + }, + { + "comment": { + "range": "d2/testdata/d2parser/TestParse/table_and_class.d2,36:2:784-42:39:983", + "value": "steps: {\nshape: sql_table\nid: {type: int, constraint: primary_key}\nrepresentation: {type: jsonb}\ndiagram: int {constraint: foreign_key}\n}\nUncomment to make autolayout panic:" + } + }, + { + "map_key": { + "range": "d2/testdata/d2parser/TestParse/table_and_class.d2,43:2:986-43:21:1005", + "edges": [ + { + "range": "d2/testdata/d2parser/TestParse/table_and_class.d2,43:2:986-43:21:1005", + "src": { + "range": "d2/testdata/d2parser/TestParse/table_and_class.d2,43:2:986-43:7:991", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2parser/TestParse/table_and_class.d2,43:2:986-43:6:990", + "value": [ + { + "string": "meow", + "raw_string": "meow" + } + ] + } + } + ] + }, + "src_arrow": "<", + "dst": { + "range": "d2/testdata/d2parser/TestParse/table_and_class.d2,43:9:993-43:21:1005", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2parser/TestParse/table_and_class.d2,43:10:994-43:18:1002", + "value": [ + { + "string": "diagrams", + "raw_string": "diagrams" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2parser/TestParse/table_and_class.d2,43:19:1003-43:21:1005", + "value": [ + { + "string": "id", + "raw_string": "id" + } + ] + } + } + ] + }, + "dst_arrow": "" + } + ], + "primary": {}, + "value": {} + } + } + ] + } + } + } + }, + { + "map_key": { + "range": "d2/testdata/d2parser/TestParse/table_and_class.d2,46:0:1009-56:1:1179", + "key": { + "range": "d2/testdata/d2parser/TestParse/table_and_class.d2,46:0:1009-46:13:1022", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2parser/TestParse/table_and_class.d2,46:0:1009-46:13:1022", + "value": [ + { + "string": "D2 AST Parser", + "raw_string": "D2 AST Parser" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "map": { + "range": "d2/testdata/d2parser/TestParse/table_and_class.d2,46:15:1024-56:0:1178", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2parser/TestParse/table_and_class.d2,47:2:1028-47:14:1040", + "key": { + "range": "d2/testdata/d2parser/TestParse/table_and_class.d2,47:2:1028-47:7:1033", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2parser/TestParse/table_and_class.d2,47:2:1028-47:7:1033", + "value": [ + { + "string": "shape", + "raw_string": "shape" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "unquoted_string": { + "range": "d2/testdata/d2parser/TestParse/table_and_class.d2,47:9:1035-47:14:1040", + "value": [ + { + "string": "class", + "raw_string": "class" + } + ] + } + } + } + }, + { + "map_key": { + "range": "d2/testdata/d2parser/TestParse/table_and_class.d2,49:2:1044-49:17:1059", + "key": { + "range": "d2/testdata/d2parser/TestParse/table_and_class.d2,49:2:1044-49:11:1053", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2parser/TestParse/table_and_class.d2,49:2:1044-49:11:1053", + "value": [ + { + "string": "+prevRune", + "raw_string": "+prevRune" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "unquoted_string": { + "range": "d2/testdata/d2parser/TestParse/table_and_class.d2,49:13:1055-49:17:1059", + "value": [ + { + "string": "rune", + "raw_string": "rune" + } + ] + } + } + } + }, + { + "map_key": { + "range": "d2/testdata/d2parser/TestParse/table_and_class.d2,50:2:1062-50:17:1077", + "key": { + "range": "d2/testdata/d2parser/TestParse/table_and_class.d2,50:2:1062-50:12:1072", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2parser/TestParse/table_and_class.d2,50:2:1062-50:12:1072", + "value": [ + { + "string": "prevColumn", + "raw_string": "prevColumn" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "unquoted_string": { + "range": "d2/testdata/d2parser/TestParse/table_and_class.d2,50:14:1074-50:17:1077", + "value": [ + { + "string": "int", + "raw_string": "int" + } + ] + } + } + } + }, + { + "map_key": { + "range": "d2/testdata/d2parser/TestParse/table_and_class.d2,52:2:1081-52:44:1123", + "key": { + "range": "d2/testdata/d2parser/TestParse/table_and_class.d2,52:2:1081-52:29:1108", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2parser/TestParse/table_and_class.d2,52:2:1081-52:29:1108", + "value": [ + { + "string": "+eatSpace(eatNewlines bool)", + "raw_string": "+eatSpace(eatNewlines bool)" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "unquoted_string": { + "range": "d2/testdata/d2parser/TestParse/table_and_class.d2,52:31:1110-52:44:1123", + "value": [ + { + "string": "(rune, error)", + "raw_string": "(rune, error)" + } + ] + } + } + } + }, + { + "map_key": { + "range": "d2/testdata/d2parser/TestParse/table_and_class.d2,53:2:1126-53:14:1138", + "key": { + "range": "d2/testdata/d2parser/TestParse/table_and_class.d2,53:2:1126-53:14:1138", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2parser/TestParse/table_and_class.d2,53:2:1126-53:14:1138", + "value": [ + { + "string": "unreadRune()", + "raw_string": "unreadRune()" + } + ] + } + } + ] + }, + "primary": {}, + "value": {} + } + }, + { + "map_key": { + "range": "d2/testdata/d2parser/TestParse/table_and_class.d2,55:2:1142-55:37:1177", + "key": { + "range": "d2/testdata/d2parser/TestParse/table_and_class.d2,55:2:1142-55:19:1159", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2parser/TestParse/table_and_class.d2,55:2:1142-55:19:1159", + "value": [ + { + "string": "#scanKey(r rune)", + "raw_string": "\\#scanKey(r rune)" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "unquoted_string": { + "range": "d2/testdata/d2parser/TestParse/table_and_class.d2,55:21:1161-55:37:1177", + "value": [ + { + "string": "(k Key, _ error)", + "raw_string": "(k Key, _ error)" + } + ] + } + } + } + } + ] + } + } + } + } + ] + }, + "err": null +} diff --git a/testdata/d2parser/TestParse/trailing_whitespace.exp.json b/testdata/d2parser/TestParse/trailing_whitespace.exp.json new file mode 100644 index 000000000..c5e36f613 --- /dev/null +++ b/testdata/d2parser/TestParse/trailing_whitespace.exp.json @@ -0,0 +1,52 @@ +{ + "ast": { + "range": "d2/testdata/d2parser/TestParse/trailing_whitespace.d2,0:0:0-2:0:28", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2parser/TestParse/trailing_whitespace.d2,1:0:1-1:26:27", + "key": { + "range": "d2/testdata/d2parser/TestParse/trailing_whitespace.d2,1:0:1-1:7:8", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2parser/TestParse/trailing_whitespace.d2,1:0:1-1:1:2", + "value": [ + { + "string": "s", + "raw_string": "s" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2parser/TestParse/trailing_whitespace.d2,1:2:3-1:7:8", + "value": [ + { + "string": "shape", + "raw_string": "shape" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "unquoted_string": { + "range": "d2/testdata/d2parser/TestParse/trailing_whitespace.d2,1:9:10-1:19:20", + "value": [ + { + "string": "orochimaru", + "raw_string": "orochimaru" + } + ] + } + } + } + } + ] + }, + "err": null +}