diff --git a/.github/dependabot.yml b/.github/dependabot.yml index bcc55d291..999650853 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -16,9 +16,12 @@ updates: security: applies-to: security-updates update-types: - - major - minor - patch + security-major: + applies-to: security-updates + update-types: + - major patch: applies-to: version-updates update-types: @@ -49,9 +52,408 @@ updates: security: applies-to: security-updates update-types: - - major - minor - patch + security-major: + applies-to: security-updates + update-types: + - major + patch: + applies-to: version-updates + update-types: + - patch + major: + applies-to: version-updates + update-types: + - major + minor: + applies-to: version-updates + update-types: + - minor + - patch +- package-ecosystem: cargo + directory: /rust/kcl-python-bindings + schedule: + interval: weekly + day: monday + time: '03:00' + timezone: America/Los_Angeles + open-pull-requests-limit: 5 + reviewers: + - adamchalmers + - franknoirot + - irev-dev + - jessfraz + groups: + security: + applies-to: security-updates + update-types: + - minor + - patch + security-major: + applies-to: security-updates + update-types: + - major + patch: + applies-to: version-updates + update-types: + - patch + major: + applies-to: version-updates + update-types: + - major + minor: + applies-to: version-updates + update-types: + - minor + - patch +- package-ecosystem: cargo + directory: /rust/kcl-to-core + schedule: + interval: weekly + day: monday + time: '03:00' + timezone: America/Los_Angeles + open-pull-requests-limit: 5 + reviewers: + - adamchalmers + - franknoirot + - irev-dev + - jessfraz + groups: + security: + applies-to: security-updates + update-types: + - minor + - patch + security-major: + applies-to: security-updates + update-types: + - major + patch: + applies-to: version-updates + update-types: + - patch + major: + applies-to: version-updates + update-types: + - major + minor: + applies-to: version-updates + update-types: + - minor + - patch +- package-ecosystem: cargo + directory: /rust/kcl-language-server-release + schedule: + interval: weekly + day: monday + time: '03:00' + timezone: America/Los_Angeles + open-pull-requests-limit: 5 + reviewers: + - adamchalmers + - franknoirot + - irev-dev + - jessfraz + groups: + security: + applies-to: security-updates + update-types: + - minor + - patch + security-major: + applies-to: security-updates + update-types: + - major + patch: + applies-to: version-updates + update-types: + - patch + major: + applies-to: version-updates + update-types: + - major + minor: + applies-to: version-updates + update-types: + - minor + - patch +- package-ecosystem: cargo + directory: /rust/kcl-wasm-lib + schedule: + interval: weekly + day: monday + time: '03:00' + timezone: America/Los_Angeles + open-pull-requests-limit: 5 + reviewers: + - adamchalmers + - franknoirot + - irev-dev + - jessfraz + groups: + security: + applies-to: security-updates + update-types: + - minor + - patch + security-major: + applies-to: security-updates + update-types: + - major + patch: + applies-to: version-updates + update-types: + - patch + major: + applies-to: version-updates + update-types: + - major + minor: + applies-to: version-updates + update-types: + - minor + - patch +- package-ecosystem: cargo + directory: /rust/kcl-derive-docs + schedule: + interval: weekly + day: monday + time: '03:00' + timezone: America/Los_Angeles + open-pull-requests-limit: 5 + reviewers: + - adamchalmers + - franknoirot + - irev-dev + - jessfraz + groups: + security: + applies-to: security-updates + update-types: + - minor + - patch + security-major: + applies-to: security-updates + update-types: + - major + patch: + applies-to: version-updates + update-types: + - patch + major: + applies-to: version-updates + update-types: + - major + minor: + applies-to: version-updates + update-types: + - minor + - patch +- package-ecosystem: cargo + directory: /rust/kcl-bumper + schedule: + interval: weekly + day: monday + time: '03:00' + timezone: America/Los_Angeles + open-pull-requests-limit: 5 + reviewers: + - adamchalmers + - franknoirot + - irev-dev + - jessfraz + groups: + security: + applies-to: security-updates + update-types: + - minor + - patch + security-major: + applies-to: security-updates + update-types: + - major + patch: + applies-to: version-updates + update-types: + - patch + major: + applies-to: version-updates + update-types: + - major + minor: + applies-to: version-updates + update-types: + - minor + - patch +- package-ecosystem: cargo + directory: /rust/kcl-language-server + schedule: + interval: weekly + day: monday + time: '03:00' + timezone: America/Los_Angeles + open-pull-requests-limit: 5 + reviewers: + - adamchalmers + - franknoirot + - irev-dev + - jessfraz + groups: + security: + applies-to: security-updates + update-types: + - minor + - patch + security-major: + applies-to: security-updates + update-types: + - major + patch: + applies-to: version-updates + update-types: + - patch + major: + applies-to: version-updates + update-types: + - major + minor: + applies-to: version-updates + update-types: + - minor + - patch +- package-ecosystem: cargo + directory: /rust/kcl-lib + schedule: + interval: weekly + day: monday + time: '03:00' + timezone: America/Los_Angeles + open-pull-requests-limit: 5 + reviewers: + - adamchalmers + - franknoirot + - irev-dev + - jessfraz + groups: + security: + applies-to: security-updates + update-types: + - minor + - patch + security-major: + applies-to: security-updates + update-types: + - major + patch: + applies-to: version-updates + update-types: + - patch + major: + applies-to: version-updates + update-types: + - major + minor: + applies-to: version-updates + update-types: + - minor + - patch +- package-ecosystem: cargo + directory: /rust/kcl-lib/fuzz + schedule: + interval: weekly + day: monday + time: '03:00' + timezone: America/Los_Angeles + open-pull-requests-limit: 5 + reviewers: + - adamchalmers + - franknoirot + - irev-dev + - jessfraz + groups: + security: + applies-to: security-updates + update-types: + - minor + - patch + security-major: + applies-to: security-updates + update-types: + - major + patch: + applies-to: version-updates + update-types: + - patch + major: + applies-to: version-updates + update-types: + - major + minor: + applies-to: version-updates + update-types: + - minor + - patch +- package-ecosystem: cargo + directory: /rust/kcl-test-server + schedule: + interval: weekly + day: monday + time: '03:00' + timezone: America/Los_Angeles + open-pull-requests-limit: 5 + reviewers: + - adamchalmers + - franknoirot + - irev-dev + - jessfraz + groups: + security: + applies-to: security-updates + update-types: + - minor + - patch + security-major: + applies-to: security-updates + update-types: + - major + patch: + applies-to: version-updates + update-types: + - patch + major: + applies-to: version-updates + update-types: + - major + minor: + applies-to: version-updates + update-types: + - minor + - patch +- package-ecosystem: cargo + directory: /rust/kcl-directory-test-macro + schedule: + interval: weekly + day: monday + time: '03:00' + timezone: America/Los_Angeles + open-pull-requests-limit: 5 + reviewers: + - adamchalmers + - franknoirot + - irev-dev + - jessfraz + groups: + security: + applies-to: security-updates + update-types: + - minor + - patch + security-major: + applies-to: security-updates + update-types: + - major patch: applies-to: version-updates update-types: @@ -82,9 +484,12 @@ updates: security: applies-to: security-updates update-types: - - major - minor - patch + security-major: + applies-to: security-updates + update-types: + - major patch: applies-to: version-updates update-types: @@ -115,9 +520,12 @@ updates: security: applies-to: security-updates update-types: - - major - minor - patch + security-major: + applies-to: security-updates + update-types: + - major patch: applies-to: version-updates update-types: @@ -148,9 +556,12 @@ updates: security: applies-to: security-updates update-types: - - major - minor - patch + security-major: + applies-to: security-updates + update-types: + - major patch: applies-to: version-updates update-types: @@ -181,9 +592,12 @@ updates: security: applies-to: security-updates update-types: - - major - minor - patch + security-major: + applies-to: security-updates + update-types: + - major patch: applies-to: version-updates update-types: @@ -214,9 +628,12 @@ updates: security: applies-to: security-updates update-types: - - major - minor - patch + security-major: + applies-to: security-updates + update-types: + - major patch: applies-to: version-updates update-types: @@ -247,9 +664,12 @@ updates: security: applies-to: security-updates update-types: - - major - minor - patch + security-major: + applies-to: security-updates + update-types: + - major patch: applies-to: version-updates update-types: @@ -280,9 +700,12 @@ updates: security: applies-to: security-updates update-types: - - major - minor - patch + security-major: + applies-to: security-updates + update-types: + - major patch: applies-to: version-updates update-types: diff --git a/.github/workflows/cargo-test.yml b/.github/workflows/cargo-test.yml index a4c963a39..8508c612c 100644 --- a/.github/workflows/cargo-test.yml +++ b/.github/workflows/cargo-test.yml @@ -86,7 +86,8 @@ jobs: cd rust cargo nextest run --workspace --features artifact-graph --retries=2 --no-fail-fast --profile ci simulation_tests::kcl_samples 2>&1 | tee /tmp/github-actions.log env: - KITTYCAD_API_TOKEN: ${{secrets.KITTYCAD_API_TOKEN}} + KITTYCAD_API_TOKEN: ${{secrets.KITTYCAD_API_TOKEN_DEV}} + ZOO_HOST: https://api.dev.zoo.dev RUST_BACKTRACE: full - name: Commit differences if: steps.path-changes.outputs.outside-kcl-samples == 'false' && steps.cargo-test-kcl-samples.outcome == 'failure' @@ -116,7 +117,8 @@ jobs: env: # The default is auto, and insta behaves differently in CI vs. not. INSTA_UPDATE: always - KITTYCAD_API_TOKEN: ${{secrets.KITTYCAD_API_TOKEN}} + KITTYCAD_API_TOKEN: ${{secrets.KITTYCAD_API_TOKEN_DEV}} + ZOO_HOST: https://api.dev.zoo.dev # Configure nextest when it's run by insta (via just). NEXTEST_PROFILE: ci RUST_BACKTRACE: full @@ -182,5 +184,6 @@ jobs: --partition count:${{ matrix.partitionIndex}}/${{ matrix.partitionTotal }} \ 2>&1 | tee /tmp/github-actions.log env: - KITTYCAD_API_TOKEN: ${{secrets.KITTYCAD_API_TOKEN}} + KITTYCAD_API_TOKEN: ${{secrets.KITTYCAD_API_TOKEN_DEV}} + ZOO_HOST: https://api.dev.zoo.dev diff --git a/.github/workflows/generate-website-docs.yml b/.github/workflows/generate-website-docs.yml index a31a72b38..7e02fbaf3 100644 --- a/.github/workflows/generate-website-docs.yml +++ b/.github/workflows/generate-website-docs.yml @@ -40,13 +40,15 @@ jobs: # cleanup old rm -rf documentation/content/pages/docs/kcl/*.md rm -rf documentation/content/pages/docs/kcl/types - rm -rf documentation/content/pages/docs/kcl/settings + rm -rf documentation/content/pages/docs/kcl/functions rm -rf documentation/content/pages/docs/kcl/consts # move new mv -f docs/kcl/*.md documentation/content/pages/docs/kcl/ mv -f docs/kcl/types documentation/content/pages/docs/kcl/ - mv -f docs/kcl/settings documentation/content/pages/docs/kcl/ + mv -f docs/kcl/functions documentation/content/pages/docs/kcl/ mv -f docs/kcl/consts documentation/content/pages/docs/kcl/ + # We don't need the README + rm documentation/content/pages/docs/kcl/README.md - name: move kcl-samples shell: bash run: | diff --git a/.github/workflows/kcl-python-bindings.yml b/.github/workflows/kcl-python-bindings.yml index 55967e294..dfc80d976 100644 --- a/.github/workflows/kcl-python-bindings.yml +++ b/.github/workflows/kcl-python-bindings.yml @@ -125,7 +125,8 @@ jobs: just setup-uv just test env: - KITTYCAD_API_TOKEN: ${{ secrets.KITTYCAD_API_TOKEN }} + KITTYCAD_API_TOKEN: ${{ secrets.KITTYCAD_API_TOKEN_DEV }} + ZOO_HOST: https://api.dev.zoo.dev sdist: runs-on: ubuntu-latest diff --git a/.gitignore b/.gitignore index 3089b837d..6a348c886 100644 --- a/.gitignore +++ b/.gitignore @@ -85,3 +85,4 @@ venv .vscode-test .biome/ +.million diff --git a/docs/kcl-src/known-issues.md b/docs/kcl-src/known-issues.md new file mode 100644 index 000000000..eb3025d07 --- /dev/null +++ b/docs/kcl-src/known-issues.md @@ -0,0 +1,26 @@ +--- +title: "KCL Known Issues" +excerpt: "Known issues with the KCL standard library for the Zoo Design Studio." +layout: manual +--- + +The following are bugs that are not in modeling-app or kcl itself. These bugs +once fixed in engine will just start working here with no language changes. + +- **Sketch on Face**: If your sketch is outside the edges of the face (on which you + are sketching) you will get multiple models returned instead of one single + model for that sketch and its underlying 3D object. + If you see a red line around your model, it means this is happening. + +- **Import**: Right now you can import a file, even if that file has brep data + you cannot edit it, after v1, the engine will account for this. + +- **Fillets**: Fillets cannot intersect, you will get an error. Only simple fillet + cases work currently. + +- **Chamfers**: Chamfers cannot intersect, you will get an error. Only simple + chamfer cases work currently. + +- **Appearance**: Changing the appearance on a loft does not work. + +- **CSG Booleans**: Coplanar (bodies that share a plane) unions, subtractions, and intersections are not currently supported. diff --git a/docs/kcl-src/modules.md b/docs/kcl-src/modules.md new file mode 100644 index 000000000..47c4daa9a --- /dev/null +++ b/docs/kcl-src/modules.md @@ -0,0 +1,365 @@ +--- +title: "KCL Modules" +excerpt: "Documentation of modules for the KCL language for the Zoo Design Studio." +layout: manual +--- + +`KCL` allows splitting code up into multiple files. Each file is somewhat +isolated from other files as a separate module. + +When you define a function, you can use `export` before it to make it available +to other modules. + +```kcl +// util.kcl +export fn increment(@x) { + return x + 1 +} +``` + +Other files in the project can now import functions that have been exported. +This makes them available to use in another file. + +```norun +// main.kcl +import increment from "util.kcl" + +answer = increment(41) +``` + +Imported files _must_ be in the same project so that units are uniform across +modules. This means that it must be in the same directory. + +Import statements must be at the top-level of a file. It is not allowed to have +an `import` statement inside a function or in the body of an if‑else. + +Multiple functions can be exported in a file. + +```kcl +// util.kcl +export fn increment(@x) { + return x + 1 +} + +export fn decrement(@x) { + return x - 1 +} +``` + +When importing, you can import multiple functions at once. + +```norun +import increment, decrement from "util.kcl" +``` + +Imported symbols can be renamed for convenience or to avoid name collisions. + +```norun +import increment as inc, decrement as dec from "util.kcl" +``` + +--- + +## Functions vs `clone` + +There are two common patterns for re‑using geometry: + +1. **Wrap the construction in a function** – flexible and fully parametric. +2. **Duplicate an existing object with `clone`** – lightning‑fast, but an exact + duplicate. + +### Parametric function example + +```kcl +fn cube(center) { + return startSketchOn(XY) + |> startProfile(at = [center[0] - 10, center[1] - 10]) + |> line(endAbsolute = [center[0] + 10, center[1] - 10]) + |> line(endAbsolute = [center[0] + 10, center[1] + 10]) + |> line(endAbsolute = [center[0] - 10, center[1] + 10]) + |> close() + |> extrude(length = 10) +} + +myCube = cube(center = [0, 0]) +``` + +*Pros* +- Any argument can be a parameter – size, position, appearance, etc. +- Works great inside loops, arrays, or optimisation sweeps. + +*Cons* +- Every invocation rebuilds the entire feature tree. +- **Slower** than a straight duplicate – each call is its own render job. + +### `clone` example + +```kcl +sketch001 = startSketchOn(-XZ) + |> circle(center = [0, 0], radius = 10) + |> extrude(length = 5) + |> appearance(color = "#ff0000", metalness = 90, roughness = 90) + +sketch002 = clone(sketch001) // ✓ instant copy +``` + +*Pros* +- Roughly an O(1) operation – we just duplicate the underlying engine handle. +- Perfect when you need ten identical bolts or two copies of the same imported STEP file. + +*Cons* +- **Not parametric** – the clone is exactly the same shape as the source. +- If you need to tweak dimensions per‑instance, you’re back to a function. + +> **Rule of thumb** – Reach for `clone` when the geometry is already what you want. Reach for a function when you need customisation. + +--- + +## Module‑level parallelism + +Under the hood, the Design Studio runs **every module in parallel** where it can. This means: + +- The top‑level code of `foo.kcl`, `bar.kcl`, and `baz.kcl` all start executing immediately and concurrently. +- Imports that read foreign files (STEP/OBJ/…) overlap their I/O and background render. +- CPU‑bound calculations in separate modules get their own worker threads. + +### Why modules beat one‑big‑file + +If you shoe‑horn everything into `main.kcl`, each statement runs sequentially: + +```norun +import "big.step" as gizmo // blocks main while reading + +gizmo |> translate(x=50) // blocks again while waiting for render +``` + +Split `gizmo` into its own file and the read/render can overlap whatever else `main.kcl` is doing. + +```norun +// gizmo.kcl (worker A) +import "big.step" + +// main.kcl (worker B) +import "gizmo.kcl" as gizmo // non‑blocking + +// ... other setup ... + +gizmo |> translate(x=50) // only blocks here +``` + +### Gotcha: defining but **not** calling functions + +Defining a function inside a module is instantaneous – we just record the byte‑code. The heavy lifting happens when the function is **called**. So: + +```norun +// util.kcl +export fn makeBolt(size) { /* … expensive CAD … */ } +``` + +If `main.kcl` waits until the very end to call `makeBolt`, *none* of that work was parallelised – you’ve pushed the cost back onto the serial tail of your script. + +**Better:** call it early or move the invocation into another module. + +```norun +// bolt_instance.kcl +import makeBolt from "util.kcl" +bolt = makeBolt(5) // executed in parallel +bolt +``` + +Now `main.kcl` can `import "bolt_instance.kcl" as bolt` and get the result that was rendered while it was busy doing other things. + +--- + +## Whole module import + +You can also import the whole module. This is useful if you want to use the +result of a module as a variable, like a part. + +```norun +import "tests/inputs/cube.kcl" as cube +cube + |> translate(x=10) +``` + +This imports the whole module and makes it available as `cube`. You can then +use it like any other object. The `cube` variable is now a reference to the +result of the module. This means that if you change the module, the `cube` +variable will change as well. + +In `cube.kcl`, you cannot have multiple objects. It has to be a single part. If +you have multiple objects, you will get an error. This is because the module is +expected to return a single object that can be used as a variable. + +The last expression or variable definition becomes the module's return value. +The module is expected to return a single object that can be used as a variable +by whatever imports it. + +So for example, this is allowed: + +```norun +... a bunch of code to create cube and cube2 ... + +myUnion = union([cube, cube2]) +``` + +You can also do this: + +```norun +... a bunch of code to create cube and cube2 ... + +union([cube, cube2]) +``` + +Either way, the last line will return the union of the two objects. + +Or what you could do instead is: + +```norun +... a bunch of code to create cube and cube2 ... + +myUnion = union([cube, cube2]) +myUnion +``` + +This will assign the union of the two objects to a variable, and then return it +on the last statement. It's simply another way of doing the same thing. + +The final statement is what's important because it's the return value of the +entire module. The module is expected to return a single object that can be used +as a variable by the file that imports it. + +--- + +## Multiple instances of the same import + +Whether you are importing a file from another CAD system or a KCL file, that +file represents object(s) in memory. If you import the same file multiple times, +it will only be rendered once. + +If you want to have multiple instances of the same object, you can use the +[`clone`](/docs/kcl/clone) function. This will render a new instance of the object in memory. + +```norun +import cube from "tests/inputs/cube.kcl" + +cube + |> translate(x=10) +clone(cube) + |> translate(x=20) +``` + +In the sample above, the `cube` object is imported from a KCL file. The first +instance is translated 10 units in the x direction. The second instance is +cloned and translated 20 units in the x direction. The two instances are now +separate objects in memory, and can be manipulated independently. + +Here is an example with a file from another CAD system: + +```kcl +import "tests/inputs/cube.step" as cube + +cube + |> translate(x=10) +clone(cube) + |> translate(x=20) +``` + +--- + +## Importing files from other CAD systems + +`import` can also be used to import files from other CAD systems. The format of the statement is the +same as for KCL files. You can only import the whole file, not items from it. E.g., + +```norun +import "tests/inputs/cube.obj" + +// Use `cube` just like a KCL object. +``` + +```kcl +import "tests/inputs/cube.sldprt" as cube + +// Use `cube` just like a KCL object. +``` + +For formats lacking unit data (such as STL, OBJ, or PLY files), the default +unit of measurement is millimeters. Alternatively you may specify the unit +by using an attribute. Likewise, you can also specify a coordinate system. E.g., + +```kcl +@(lengthUnit = ft, coords = opengl) +import "tests/inputs/cube.obj" +``` + +When importing a GLTF file, the bin file will be imported as well. + +Import paths are relative to the current project directory. Imports currently only work when +using the native Design Studio, not in the browser. + +### Supported values + +File formats: `fbx`, `gltf`/`glb`, `obj`+, `ply`+, `sldprt`, `step`/`stp`, `stl`+. (Those marked with a +'+' support customising the length unit and coordinate system). + +Length units: `mm` (the default), `cm`, `m`, `inch`, `ft`, `yd`. + +Coordinate systems: + +- `zoo` (the default), forward: -Y, up: +Z, handedness: right +- `opengl`, forward: +Z, up: +Y, handedness: right +- `vulkan`, forward: +Z, up: -Y, handedness: left + +--- + +## Performance deep‑dive for foreign‑file imports + +Parallelized foreign‑file imports now let you overlap file reads, initialization, +and rendering. To maximize throughput, you need to understand the three distinct +stages—reading, initializing (background render start), and invocation (blocking) +—and structure your code to defer blocking operations until the end. + +### Foreign import execution stages + +1. **Import (Read / Initialization) Stage** + ```kcl + import "tests/inputs/cube.step" as cube + ``` + - Reads the file from disk and makes its API available. + - Starts engine rendering but **does not block** your script. + - This kick‑starts the render pipeline while you keep executing other code. + +2. **Invocation (Blocking) Stage** + ```kcl + import "tests/inputs/cube.step" as cube + + cube + |> translate(z=10) // ← blocks here only + ``` + - Any method call (e.g., `translate`, `scale`, `rotate`) waits for the background render to finish before applying transformations. + +### Best practices + +#### 1. Defer blocking calls + +```kcl +import "tests/inputs/cube.step" as cube // 1) Read / Background render starts + + +// --- perform other operations and calculations here --- + + +cube + |> translate(z=10) // 2) Blocks only here +``` + +#### 2. Split heavy work into separate modules + +Place computationally expensive or IO‑heavy work into its own module so it can render in parallel while `main.kcl` continues. + +#### Future improvements + +Upcoming releases will auto‑analyse dependencies and only block when truly necessary. Until then, explicit deferral will give you the best performance. + + diff --git a/docs/kcl-src/settings.md b/docs/kcl-src/settings.md new file mode 100644 index 000000000..fef877621 --- /dev/null +++ b/docs/kcl-src/settings.md @@ -0,0 +1,45 @@ +--- +title: "KCL Settings" +excerpt: "Documentation of settings for the KCL language and Zoo Design Studio." +layout: manual +--- + +# KCL Settings + +There are three levels of settings available in Zoo Design Studio: + +1. [User Settings](/docs/kcl/settings-user): Global settings that apply to all projects, stored in `user.toml` +2. [Project Settings](/docs/kcl/settings-project): Settings specific to a project, stored in `project.toml` +3. Per-file Settings: Settings that apply to a single KCL file, specified using the `@settings` attribute + +## Configuration Files + +Zoo Design Studio uses TOML files for configuration: + +* **User Settings**: `user.toml` - See [complete documentation](/docs/kcl/settings-user) +* **Project Settings**: `project.toml` - See [complete documentation](/docs/kcl/settings-project) + +## Per-file settings + +Settings which affect a single file are configured using the settings attribute. +This must be at the top of the KCL file (comments before the attribute are permitted). +For example: + +```kcl +// The settings attribute. +@settings(defaultLengthUnit = in) + +// The rest of your KCL code goes below... + +x = 42 // Represents 42 inches. +``` + +The settings attribute may contain multiple properties separated by commas. +Valid properties are: + +- `defaultLengthUnit`: the default length unit to use for numbers declared in this file. + - Accepted values: `mm`, `cm`, `m`, `in` (inches), `ft` (feet), `yd` (yards). +- `defaultAngleUnit`: the default angle unit to use for numbers declared in this file. + - Accepted values: `deg` (degrees), `rad` (radians). + +These settings override any project-wide settings (configured in project.toml or via the UI). diff --git a/docs/kcl-src/types.md b/docs/kcl-src/types.md new file mode 100644 index 000000000..7cea7be5a --- /dev/null +++ b/docs/kcl-src/types.md @@ -0,0 +1,299 @@ +--- +title: "KCL Types" +excerpt: "Documentation of types for the KCL standard library for the Zoo Design Studio." +layout: manual +--- + +`KCL` defines the following types and keywords the language. + +All these types can be nested in various forms where nesting applies. Like +arrays can hold objects and vice versa. + +## Constant declaration + +Constants are defined with a name and a value, like so: + +``` +myBool = false +``` + +Currently you cannot redeclare a constant. + +## Arrays + +An array is defined with `[]` braces. What is inside the brackets can +be of any type. For example, the following is completely valid: + +``` +myArray = ["thing", 2, false] +``` + +If you want to get a value from an array you can use the index like so: +`myArray[0]`. + + +## Objects + +An object is defined with `{}` braces. Here is an example object: + +``` +myObj = { a = 0, b = "thing" } +``` + +We support two different ways of getting properties from objects, you can call +`myObj.a` or `myObj["a"]` both work. + +## `ImportedGeometry` + +Using `import` you can import geometry defined using other CAD software. In KCL, +these objects have type `ImportedGeometry` and can mostly be treated like any +other solid (they can be rotated, scaled, etc.), although there is no access to +their internal components. See the [modules and imports docs](modules) for more +detail on importing geometry. + + +## Binary expressions + +You can also do math! Let's show an example below: + +``` +myMathExpression = 3 + 1 * 2 / 3 - 7 +``` + +You can nest expressions in parenthesis as well: + +``` +myMathExpression = 3 + (1 * 2 / (3 - 7)) +``` + +## Functions + +We also have support for defining your own functions. Functions can take in any +type of argument. Below is an example of the syntax: + +``` +fn myFn(x) { + return x +} +``` + +As you can see above `myFn` just returns whatever it is given. + +KCL's early drafts used positional arguments, but we now use keyword arguments: + +``` +// If you declare a function like this +fn add(left, right) { + return left + right +} + +// You can call it like this: +total = add(left = 1, right = 2) +``` + +Functions can also declare one *unlabeled* arg. If you do want to declare an unlabeled arg, it must +be the first arg declared. + +``` +// The @ indicates an argument can be used without a label. +// Note that only the first argument can use @. +fn increment(@x) { + return x + 1 +} + +fn add(@x, delta) { + return x + delta +} + +two = increment(1) +three = add(1, delta = 2) +``` + +## Pipelines + +It can be hard to read repeated function calls, because of all the nested brackets. + +```norun +i = 1 +x = h(g(f(i))) +``` + +You can make this easier to read by breaking it into many declarations, but that is a bit annoying. + +```norun +i = 1 +x0 = f(i) +x1 = g(x0) +x = h(x1) +``` + +Instead, you can use the pipeline operator (`|>`) to simplify this. + +Basically, `x |> f(%)` is a shorthand for `f(x)`. The left-hand side of the `|>` gets put into +the `%` in the right-hand side. + +So, this means `x |> f(%) |> g(%)` is shorthand for `g(f(x))`. The code example above, with its +somewhat-clunky `x0` and `x1` constants could be rewritten as + +```norun +i = 1 +x = i + |> f(%) + |> g(%) + |> h(%) +``` + +This helps keep your code neat and avoid unnecessary declarations. + +## Pipelines and keyword arguments + +Say you have a long pipeline of sketch functions, like this: + +```norun +startSketchOn(XZ) + |> line(%, end = [3, 4]) + |> line(%, end = [10, 10]) + |> line(%, end = [-13, -14]) + |> close(%) +``` + +In this example, each function call outputs a sketch, and it gets put into the next function call via +the `%`, into the first (unlabeled) argument. + +If a function call uses an unlabeled first parameter, it will default to `%` if it's not given. This +means that `|> line(%, end = [3, 4])` and `|> line(end = [3, 4])` are equivalent! So the above +could be rewritten as + +```norun +startSketchOn(XZ) + |> line(end = [3, 4]) + |> line(end = [10, 10]) + |> line(end = [-13, -14]) + |> close() +``` + +Note that we are still in the process of migrating KCL's standard library to use keyword arguments. So some +functions are still unfortunately using positional arguments. We're moving them over, so keep checking back. +Some functions are still using the old positional argument syntax. +Check the docs page for each function and look at its examples to see. + +## Tags + +Tags are used to give a name (tag) to a specific path. + +### `TagDeclarator` + +The syntax for declaring a tag is `$myTag` you would use it in the following +way: + +```norun +startSketchOn(XZ) + |> startProfile(at = origin) + |> angledLine(angle = 0, length = 191.26, tag = $rectangleSegmentA001) + |> angledLine( + angle = segAng(rectangleSegmentA001) - 90, + length = 196.99, + tag = $rectangleSegmentB001, + ) + |> angledLine( + angle = segAng(rectangleSegmentA001), + length = -segLen(rectangleSegmentA001), + tag = $rectangleSegmentC001, + ) + |> line(endAbsolute = [profileStartX(%), profileStartY(%)]) + |> close() +``` + +### `TagIdentifier` + +As per the example above you can use the tag identifier to get a reference to the +tagged object. The syntax for this is `myTag`. + +In the example above we use the tag identifier to get the angle of the segment +`segAng(rectangleSegmentA001, %)`. + +### `Start` + +There is a special tag, `START` (with type `Start`, although under the cover, it's a string) +for identifying the face of a solid which was the start of an extrusion (i.e., the surface which +is extruded). + +### `End` + +There is a special tag, `END` (with type `End`, although under the cover, it's a string) +for identifying the face of a solid which was finishes an extrusion. + +### Tag Scope + +Tags are scoped globally if in the root context meaning in this example you can +use the tag `rectangleSegmentA001` in any function or expression in the file. + +However if the code was written like this: + +```norun +fn rect(origin) { + return startSketchOn(XZ) + |> startProfile(at = origin) + |> angledLine(angle = 0, length = 191.26, tag = $rectangleSegmentA001) + |> angledLine( + angle = segAng(rectangleSegmentA001) - 90, + length = 196.99, + tag = $rectangleSegmentB001, + ) + |> angledLine( + angle = segAng(rectangleSegmentA001), + length = -segLen(rectangleSegmentA001), + tag = $rectangleSegmentC001, + ) + |> line(endAbsolute = [profileStartX(%), profileStartY(%)]) + |> close() +} + +rect(origin = [0, 0]) +rect(origin = [20, 0]) +``` + +Those tags would only be available in the `rect` function and not globally. + +However you likely want to use those tags somewhere outside the `rect` function. + +Tags are accessible through the sketch group they are declared in. +For example the following code works. + +```norun +fn rect(origin) { + return startSketchOn(XZ) + |> startProfile(at = origin) + |> angledLine(angle = 0, length = 191.26, tag = $rectangleSegmentA001) + |> angledLine( + angle = segAng(rectangleSegmentA001) - 90, + length = 196.99, + tag = $rectangleSegmentB001, + ) + |> angledLine( + angle = segAng(rectangleSegmentA001), + length = -segLen(rectangleSegmentA001), + tag = $rectangleSegmentC001, + ) + |> line(endAbsolute = [profileStartX(%), profileStartY(%)]) + |> close() +} + +rect(origin = [0, 0]) +myRect = rect(origin = [20, 0]) + +myRect + |> extrude(length = 10) + |> fillet(radius = 0.5, tags = [myRect.tags.rectangleSegmentA001]) +``` + +See how we use the tag `rectangleSegmentA001` in the `fillet` function outside +the `rect` function. This is because the `rect` function is returning the +sketch group that contains the tags. + + +--- + +If you find any issues using any of the above expressions or syntax, +please file an issue with the `ast` label on the [modeling-app +repo](https://github.com/KittyCAD/modeling-app/issues/new). diff --git a/docs/kcl/README.md b/docs/kcl/README.md new file mode 100644 index 000000000..f1dff1f1b --- /dev/null +++ b/docs/kcl/README.md @@ -0,0 +1,5 @@ +# Autogenerated docs + +Everything in this directory and its subdirectories (except this file) is automatically generated. Do not edit anything in this directory directly, your changes will be lost. + +The directory contents are generated by running the `test_generate_stdlib_markdown_docs` test in `/rust/kcl-lib/src/docs/gen_std_tests.rs`. Files are generated from the standard library declared in KCL (`/rust/kcl-lib/std`) and in Rust (`/rust/kcl-lib/src/std`), and by copying files from `../kcl-src`. \ No newline at end of file diff --git a/docs/kcl/angledLine.md b/docs/kcl/angledLine.md index 94177f263..70fc315af 100644 --- a/docs/kcl/angledLine.md +++ b/docs/kcl/angledLine.md @@ -10,15 +10,15 @@ Draw a line segment relative to the current origin using the polar measure of so ```kcl angledLine( - sketch: [Sketch](/docs/kcl/types/Sketch), - angle: [number](/docs/kcl/types/number), - length?: [number](/docs/kcl/types/number), - lengthX?: [number](/docs/kcl/types/number), - lengthY?: [number](/docs/kcl/types/number), - endAbsoluteX?: [number](/docs/kcl/types/number), - endAbsoluteY?: [number](/docs/kcl/types/number), - tag?: [TagDeclarator](/docs/kcl/types#tag-declaration), -): [Sketch](/docs/kcl/types/Sketch) + sketch: Sketch, + angle: number, + length?: number, + lengthX?: number, + lengthY?: number, + endAbsoluteX?: number, + endAbsoluteY?: number, + tag?: TagDeclarator, +): Sketch ``` @@ -26,18 +26,18 @@ angledLine( | Name | Type | Description | Required | |----------|------|-------------|----------| -| `sketch` | [`Sketch`](/docs/kcl/types/Sketch) | Which sketch should this path be added to? | Yes | -| `angle` | [`number`](/docs/kcl/types/number) | Which angle should the line be drawn at? | Yes | -| `length` | [`number`](/docs/kcl/types/number) | Draw the line this distance along the given angle. Only one of `length`, `lengthX`, `lengthY`, `endAbsoluteX`, `endAbsoluteY` can be given. | No | -| `lengthX` | [`number`](/docs/kcl/types/number) | Draw the line this distance along the X axis. Only one of `length`, `lengthX`, `lengthY`, `endAbsoluteX`, `endAbsoluteY` can be given. | No | -| `lengthY` | [`number`](/docs/kcl/types/number) | Draw the line this distance along the Y axis. Only one of `length`, `lengthX`, `lengthY`, `endAbsoluteX`, `endAbsoluteY` can be given. | No | -| `endAbsoluteX` | [`number`](/docs/kcl/types/number) | Draw the line along the given angle until it reaches this point along the X axis. Only one of `length`, `lengthX`, `lengthY`, `endAbsoluteX`, `endAbsoluteY` can be given. | No | -| `endAbsoluteY` | [`number`](/docs/kcl/types/number) | Draw the line along the given angle until it reaches this point along the Y axis. Only one of `length`, `lengthX`, `lengthY`, `endAbsoluteX`, `endAbsoluteY` can be given. | No | -| `tag` | [`TagDeclarator`](/docs/kcl/types#tag-declaration) | Create a new tag which refers to this line | No | +| `sketch` | [`Sketch`](/docs/kcl/types/std-types-Sketch) | Which sketch should this path be added to? | Yes | +| `angle` | [`number`](/docs/kcl/types/std-types-number) | Which angle should the line be drawn at? | Yes | +| `length` | [`number`](/docs/kcl/types/std-types-number) | Draw the line this distance along the given angle. Only one of `length`, `lengthX`, `lengthY`, `endAbsoluteX`, `endAbsoluteY` can be given. | No | +| `lengthX` | [`number`](/docs/kcl/types/std-types-number) | Draw the line this distance along the X axis. Only one of `length`, `lengthX`, `lengthY`, `endAbsoluteX`, `endAbsoluteY` can be given. | No | +| `lengthY` | [`number`](/docs/kcl/types/std-types-number) | Draw the line this distance along the Y axis. Only one of `length`, `lengthX`, `lengthY`, `endAbsoluteX`, `endAbsoluteY` can be given. | No | +| `endAbsoluteX` | [`number`](/docs/kcl/types/std-types-number) | Draw the line along the given angle until it reaches this point along the X axis. Only one of `length`, `lengthX`, `lengthY`, `endAbsoluteX`, `endAbsoluteY` can be given. | No | +| `endAbsoluteY` | [`number`](/docs/kcl/types/std-types-number) | Draw the line along the given angle until it reaches this point along the Y axis. Only one of `length`, `lengthX`, `lengthY`, `endAbsoluteX`, `endAbsoluteY` can be given. | No | +| [`tag`](/docs/kcl/types/std-types-tag) | [`TagDeclarator`](/docs/kcl/types#TagDeclarator) | Create a new tag which refers to this line | No | ### Returns -[`Sketch`](/docs/kcl/types/Sketch) +[`Sketch`](/docs/kcl/types/std-types-Sketch) ### Examples diff --git a/docs/kcl/angledLineThatIntersects.md b/docs/kcl/angledLineThatIntersects.md index ea0dbc699..aa5d08743 100644 --- a/docs/kcl/angledLineThatIntersects.md +++ b/docs/kcl/angledLineThatIntersects.md @@ -10,12 +10,12 @@ Draw an angled line from the current origin, constructing a line segment such th ```kcl angledLineThatIntersects( - sketch: [Sketch](/docs/kcl/types/Sketch), - angle: [number](/docs/kcl/types/number), - intersectTag: [TagIdentifier](/docs/kcl/types#tag-identifier), - offset?: [number](/docs/kcl/types/number), - tag?: [TagDeclarator](/docs/kcl/types#tag-declaration), -): [Sketch](/docs/kcl/types/Sketch) + sketch: Sketch, + angle: number, + intersectTag: TagIdentifier, + offset?: number, + tag?: TagDeclarator, +): Sketch ``` @@ -23,15 +23,15 @@ angledLineThatIntersects( | Name | Type | Description | Required | |----------|------|-------------|----------| -| `sketch` | [`Sketch`](/docs/kcl/types/Sketch) | Which sketch should this path be added to? | Yes | -| `angle` | [`number`](/docs/kcl/types/number) | Which angle should the line be drawn at? | Yes | -| `intersectTag` | [`TagIdentifier`](/docs/kcl/types#tag-identifier) | The tag of the line to intersect with | Yes | -| `offset` | [`number`](/docs/kcl/types/number) | The offset from the intersecting line. Defaults to 0. | No | -| `tag` | [`TagDeclarator`](/docs/kcl/types#tag-declaration) | Create a new tag which refers to this line | No | +| `sketch` | [`Sketch`](/docs/kcl/types/std-types-Sketch) | Which sketch should this path be added to? | Yes | +| `angle` | [`number`](/docs/kcl/types/std-types-number) | Which angle should the line be drawn at? | Yes | +| `intersectTag` | [`TagIdentifier`](/docs/kcl/types#TagIdentifier) | The tag of the line to intersect with | Yes | +| `offset` | [`number`](/docs/kcl/types/std-types-number) | The offset from the intersecting line. Defaults to 0. | No | +| [`tag`](/docs/kcl/types/std-types-tag) | [`TagDeclarator`](/docs/kcl/types#TagDeclarator) | Create a new tag which refers to this line | No | ### Returns -[`Sketch`](/docs/kcl/types/Sketch) +[`Sketch`](/docs/kcl/types/std-types-Sketch) ### Examples diff --git a/docs/kcl/appearance.md b/docs/kcl/appearance.md index 28bea674a..4cb592631 100644 --- a/docs/kcl/appearance.md +++ b/docs/kcl/appearance.md @@ -10,11 +10,11 @@ This will work on any solid, including extruded solids, revolved solids, and she ```kcl appearance( - solids: [[Solid](/docs/kcl/types/Solid)OrImportedGeometry](/docs/kcl/types/[Solid](/docs/kcl/types/Solid)OrImportedGeometry), - color: String, - metalness?: [number](/docs/kcl/types/number), - roughness?: [number](/docs/kcl/types/number), -): [[Solid](/docs/kcl/types/Solid)OrImportedGeometry](/docs/kcl/types/[Solid](/docs/kcl/types/Solid)OrImportedGeometry) + solids: [Solid] | ImportedGeometry, + color: string, + metalness?: number, + roughness?: number, +): [Solid] | ImportedGeometry ``` @@ -22,14 +22,14 @@ appearance( | Name | Type | Description | Required | |----------|------|-------------|----------| -| `solids` | [`SolidOrImportedGeometry`](/docs/kcl/types/SolidOrImportedGeometry) | The solid(s) whose appearance is being set | Yes | -| `color` | `String` | Color of the new material, a hex string like '#ff0000' | Yes | -| `metalness` | [`number`](/docs/kcl/types/number) | Metalness of the new material, a percentage like 95.7. | No | -| `roughness` | [`number`](/docs/kcl/types/number) | Roughness of the new material, a percentage like 95.7. | No | +| `solids` | [`[Solid]`](/docs/kcl/types/std-types-Solid) or [`ImportedGeometry`](/docs/kcl/types#ImportedGeometry) | The solid(s) whose appearance is being set | Yes | +| `color` | [`string`](/docs/kcl/types/std-types-string) | Color of the new material, a hex string like '#ff0000' | Yes | +| `metalness` | [`number`](/docs/kcl/types/std-types-number) | Metalness of the new material, a percentage like 95.7. | No | +| `roughness` | [`number`](/docs/kcl/types/std-types-number) | Roughness of the new material, a percentage like 95.7. | No | ### Returns -[`SolidOrImportedGeometry`](/docs/kcl/types/SolidOrImportedGeometry) - Data for a solid or an imported geometry. +[`[Solid]`](/docs/kcl/types/std-types-Solid) or [`ImportedGeometry`](/docs/kcl/types#ImportedGeometry) - Data for a solid or an imported geometry. ### Examples @@ -72,9 +72,9 @@ fn cube(center) { |> extrude(length = 10) } -example0 = cube([0, 0]) -example1 = cube([20, 0]) -example2 = cube([40, 0]) +example0 = cube(center = [0, 0]) +example1 = cube(center = [20, 0]) +example2 = cube(center = [40, 0]) appearance( [example0, example1], diff --git a/docs/kcl/arc.md b/docs/kcl/arc.md index 9b1328922..f38d50477 100644 --- a/docs/kcl/arc.md +++ b/docs/kcl/arc.md @@ -12,14 +12,14 @@ Unless this makes a lot of sense and feels like what you're looking for to const ```kcl arc( - sketch: [Sketch](/docs/kcl/types/Sketch), - angleStart?: [number](/docs/kcl/types/number), - angleEnd?: [number](/docs/kcl/types/number), - radius?: [number](/docs/kcl/types/number), - interiorAbsolute?: [[[number](/docs/kcl/types/number)]](/docs/kcl/types/[number](/docs/kcl/types/number)), - endAbsolute?: [[[number](/docs/kcl/types/number)]](/docs/kcl/types/[number](/docs/kcl/types/number)), - tag?: [TagDeclarator](/docs/kcl/types#tag-declaration), -): [Sketch](/docs/kcl/types/Sketch) + sketch: Sketch, + angleStart?: number, + angleEnd?: number, + radius?: number, + interiorAbsolute?: Point2d, + endAbsolute?: Point2d, + tag?: TagDeclarator, +): Sketch ``` @@ -27,17 +27,17 @@ arc( | Name | Type | Description | Required | |----------|------|-------------|----------| -| `sketch` | [`Sketch`](/docs/kcl/types/Sketch) | Which sketch should this path be added to? | Yes | -| `angleStart` | [`number`](/docs/kcl/types/number) | Where along the circle should this arc start? | No | -| `angleEnd` | [`number`](/docs/kcl/types/number) | Where along the circle should this arc end? | No | -| `radius` | [`number`](/docs/kcl/types/number) | How large should the circle be? | No | -| `interiorAbsolute` | [`[number]`](/docs/kcl/types/number) | Any point between the arc's start and end? Requires `endAbsolute`. Incompatible with `angleStart` or `angleEnd` | No | -| `endAbsolute` | [`[number]`](/docs/kcl/types/number) | Where should this arc end? Requires `interiorAbsolute`. Incompatible with `angleStart` or `angleEnd` | No | -| `tag` | [`TagDeclarator`](/docs/kcl/types#tag-declaration) | Create a new tag which refers to this line | No | +| `sketch` | [`Sketch`](/docs/kcl/types/std-types-Sketch) | Which sketch should this path be added to? | Yes | +| `angleStart` | [`number`](/docs/kcl/types/std-types-number) | Where along the circle should this arc start? | No | +| `angleEnd` | [`number`](/docs/kcl/types/std-types-number) | Where along the circle should this arc end? | No | +| `radius` | [`number`](/docs/kcl/types/std-types-number) | How large should the circle be? | No | +| `interiorAbsolute` | [`Point2d`](/docs/kcl/types/std-types-Point2d) | Any point between the arc's start and end? Requires `endAbsolute`. Incompatible with `angleStart` or `angleEnd` | No | +| `endAbsolute` | [`Point2d`](/docs/kcl/types/std-types-Point2d) | Where should this arc end? Requires `interiorAbsolute`. Incompatible with `angleStart` or `angleEnd` | No | +| [`tag`](/docs/kcl/types/std-types-tag) | [`TagDeclarator`](/docs/kcl/types#TagDeclarator) | Create a new tag which refers to this line | No | ### Returns -[`Sketch`](/docs/kcl/types/Sketch) +[`Sketch`](/docs/kcl/types/std-types-Sketch) ### Examples diff --git a/docs/kcl/assert.md b/docs/kcl/assert.md index edd4b1371..e0e3caabf 100644 --- a/docs/kcl/assert.md +++ b/docs/kcl/assert.md @@ -10,14 +10,14 @@ Check a value meets some expected conditions at runtime. Program terminates with ```kcl assert( - actual: [number](/docs/kcl/types/number), - isGreaterThan?: [number](/docs/kcl/types/number), - isLessThan?: [number](/docs/kcl/types/number), - isGreaterThanOrEqual?: [number](/docs/kcl/types/number), - isLessThanOrEqual?: [number](/docs/kcl/types/number), - isEqualTo?: [number](/docs/kcl/types/number), - tolerance?: [number](/docs/kcl/types/number), - error?: String, + actual: number, + isGreaterThan?: number, + isLessThan?: number, + isGreaterThanOrEqual?: number, + isLessThanOrEqual?: number, + isEqualTo?: number, + tolerance?: number, + error?: string, ): () ``` @@ -26,14 +26,14 @@ assert( | Name | Type | Description | Required | |----------|------|-------------|----------| -| `actual` | [`number`](/docs/kcl/types/number) | Value to check. It will be compared with one of the comparison arguments. | Yes | -| `isGreaterThan` | [`number`](/docs/kcl/types/number) | Comparison argument. If given, checks the `actual` value is greater than this. | No | -| `isLessThan` | [`number`](/docs/kcl/types/number) | Comparison argument. If given, checks the `actual` value is less than this. | No | -| `isGreaterThanOrEqual` | [`number`](/docs/kcl/types/number) | Comparison argument. If given, checks the `actual` value is greater than or equal to this. | No | -| `isLessThanOrEqual` | [`number`](/docs/kcl/types/number) | Comparison argument. If given, checks the `actual` value is less than or equal to this. | No | -| `isEqualTo` | [`number`](/docs/kcl/types/number) | Comparison argument. If given, checks the `actual` value is less than or equal to this. | No | -| `tolerance` | [`number`](/docs/kcl/types/number) | If `isEqualTo` is used, this is the tolerance to allow for the comparison. This tolerance is used because KCL's number system has some floating-point imprecision when used with very large decimal places. | No | -| `error` | `String` | If the value was false, the program will terminate with this error message | No | +| `actual` | [`number`](/docs/kcl/types/std-types-number) | Value to check. It will be compared with one of the comparison arguments. | Yes | +| `isGreaterThan` | [`number`](/docs/kcl/types/std-types-number) | Comparison argument. If given, checks the `actual` value is greater than this. | No | +| `isLessThan` | [`number`](/docs/kcl/types/std-types-number) | Comparison argument. If given, checks the `actual` value is less than this. | No | +| `isGreaterThanOrEqual` | [`number`](/docs/kcl/types/std-types-number) | Comparison argument. If given, checks the `actual` value is greater than or equal to this. | No | +| `isLessThanOrEqual` | [`number`](/docs/kcl/types/std-types-number) | Comparison argument. If given, checks the `actual` value is less than or equal to this. | No | +| `isEqualTo` | [`number`](/docs/kcl/types/std-types-number) | Comparison argument. If given, checks the `actual` value is less than or equal to this. | No | +| `tolerance` | [`number`](/docs/kcl/types/std-types-number) | If `isEqualTo` is used, this is the tolerance to allow for the comparison. This tolerance is used because KCL's number system has some floating-point imprecision when used with very large decimal places. | No | +| `error` | [`string`](/docs/kcl/types/std-types-string) | If the value was false, the program will terminate with this error message | No | ### Returns diff --git a/docs/kcl/assertIs.md b/docs/kcl/assertIs.md index 0b7b6e5b3..78593851a 100644 --- a/docs/kcl/assertIs.md +++ b/docs/kcl/assertIs.md @@ -10,8 +10,8 @@ Asserts that a value is the boolean value true. ```kcl assertIs( - actual: [bool](/docs/kcl/types/bool), - error?: String, + actual: bool, + error?: string, ): () ``` @@ -20,8 +20,8 @@ assertIs( | Name | Type | Description | Required | |----------|------|-------------|----------| -| `actual` | [`bool`](/docs/kcl/types/bool) | Value to check. If this is the boolean value true, assert passes. Otherwise it fails. | Yes | -| `error` | `String` | If the value was false, the program will terminate with this error message | No | +| `actual` | [`bool`](/docs/kcl/types/std-types-bool) | Value to check. If this is the boolean value true, assert passes. Otherwise it fails. | Yes | +| `error` | [`string`](/docs/kcl/types/std-types-string) | If the value was false, the program will terminate with this error message | No | ### Returns diff --git a/docs/kcl/bezierCurve.md b/docs/kcl/bezierCurve.md index 787c29c77..27b9ccd99 100644 --- a/docs/kcl/bezierCurve.md +++ b/docs/kcl/bezierCurve.md @@ -10,12 +10,12 @@ Draw a smooth, continuous, curved line segment from the current origin to the de ```kcl bezierCurve( - sketch: [Sketch](/docs/kcl/types/Sketch), - control1: [[[number](/docs/kcl/types/number)]](/docs/kcl/types/[number](/docs/kcl/types/number)), - control2: [[[number](/docs/kcl/types/number)]](/docs/kcl/types/[number](/docs/kcl/types/number)), - end: [[[number](/docs/kcl/types/number)]](/docs/kcl/types/[number](/docs/kcl/types/number)), - tag?: [TagDeclarator](/docs/kcl/types#tag-declaration), -): [Sketch](/docs/kcl/types/Sketch) + sketch: Sketch, + control1: Point2d, + control2: Point2d, + end: Point2d, + tag?: TagDeclarator, +): Sketch ``` @@ -23,15 +23,15 @@ bezierCurve( | Name | Type | Description | Required | |----------|------|-------------|----------| -| `sketch` | [`Sketch`](/docs/kcl/types/Sketch) | Which sketch should this path be added to? | Yes | -| `control1` | [`[number]`](/docs/kcl/types/number) | First control point for the cubic | Yes | -| `control2` | [`[number]`](/docs/kcl/types/number) | Second control point for the cubic | Yes | -| `end` | [`[number]`](/docs/kcl/types/number) | How far away (along the X and Y axes) should this line go? | Yes | -| `tag` | [`TagDeclarator`](/docs/kcl/types#tag-declaration) | Create a new tag which refers to this line | No | +| `sketch` | [`Sketch`](/docs/kcl/types/std-types-Sketch) | Which sketch should this path be added to? | Yes | +| `control1` | [`Point2d`](/docs/kcl/types/std-types-Point2d) | First control point for the cubic | Yes | +| `control2` | [`Point2d`](/docs/kcl/types/std-types-Point2d) | Second control point for the cubic | Yes | +| `end` | [`Point2d`](/docs/kcl/types/std-types-Point2d) | How far away (along the X and Y axes) should this line go? | Yes | +| [`tag`](/docs/kcl/types/std-types-tag) | [`TagDeclarator`](/docs/kcl/types#TagDeclarator) | Create a new tag which refers to this line | No | ### Returns -[`Sketch`](/docs/kcl/types/Sketch) +[`Sketch`](/docs/kcl/types/std-types-Sketch) ### Examples diff --git a/docs/kcl/circleThreePoint.md b/docs/kcl/circleThreePoint.md index 0c7e7247d..07158f0e2 100644 --- a/docs/kcl/circleThreePoint.md +++ b/docs/kcl/circleThreePoint.md @@ -10,12 +10,12 @@ Construct a circle derived from 3 points. ```kcl circleThreePoint( - sketchSurfaceOrGroup: [[Sketch](/docs/kcl/types/Sketch)OrSurface](/docs/kcl/types/[Sketch](/docs/kcl/types/Sketch)OrSurface), - p1: [[[number](/docs/kcl/types/number)]](/docs/kcl/types/[number](/docs/kcl/types/number)), - p2: [[[number](/docs/kcl/types/number)]](/docs/kcl/types/[number](/docs/kcl/types/number)), - p3: [[[number](/docs/kcl/types/number)]](/docs/kcl/types/[number](/docs/kcl/types/number)), - tag?: [TagDeclarator](/docs/kcl/types#tag-declaration), -): [Sketch](/docs/kcl/types/Sketch) + sketchSurfaceOrGroup: Sketch | Plane | Face, + p1: Point2d, + p2: Point2d, + p3: Point2d, + tag?: TagDeclarator, +): Sketch ``` @@ -23,15 +23,15 @@ circleThreePoint( | Name | Type | Description | Required | |----------|------|-------------|----------| -| `sketchSurfaceOrGroup` | [`SketchOrSurface`](/docs/kcl/types/SketchOrSurface) | Plane or surface to sketch on. | Yes | -| `p1` | [`[number]`](/docs/kcl/types/number) | 1st point to derive the circle. | Yes | -| `p2` | [`[number]`](/docs/kcl/types/number) | 2nd point to derive the circle. | Yes | -| `p3` | [`[number]`](/docs/kcl/types/number) | 3rd point to derive the circle. | Yes | -| `tag` | [`TagDeclarator`](/docs/kcl/types#tag-declaration) | Identifier for the circle to reference elsewhere. | No | +| `sketchSurfaceOrGroup` | [`Sketch`](/docs/kcl/types/std-types-Sketch) or [`Plane`](/docs/kcl/types/std-types-Plane) or [`Face`](/docs/kcl/types/std-types-Face) | Plane or surface to sketch on. | Yes | +| `p1` | [`Point2d`](/docs/kcl/types/std-types-Point2d) | 1st point to derive the circle. | Yes | +| `p2` | [`Point2d`](/docs/kcl/types/std-types-Point2d) | 2nd point to derive the circle. | Yes | +| `p3` | [`Point2d`](/docs/kcl/types/std-types-Point2d) | 3rd point to derive the circle. | Yes | +| [`tag`](/docs/kcl/types/std-types-tag) | [`TagDeclarator`](/docs/kcl/types#TagDeclarator) | Identifier for the circle to reference elsewhere. | No | ### Returns -[`Sketch`](/docs/kcl/types/Sketch) +[`Sketch`](/docs/kcl/types/std-types-Sketch) ### Examples diff --git a/docs/kcl/clone.md b/docs/kcl/clone.md index 62c88791f..37f51ef55 100644 --- a/docs/kcl/clone.md +++ b/docs/kcl/clone.md @@ -13,7 +13,7 @@ This doesn't really have much utility unless you need the equivalent of a double Really only use this function if YOU ARE SURE you need it. In most cases you do not need clone and using a pattern with `instance = 2` is more appropriate. ```kcl -clone(geometry: [GeometryWithImportedGeometry](/docs/kcl/types/GeometryWithImportedGeometry)): [GeometryWithImportedGeometry](/docs/kcl/types/GeometryWithImportedGeometry) +clone(geometry: Solid | Sketch | ImportedGeometry): Solid | Sketch | ImportedGeometry ``` @@ -21,11 +21,11 @@ clone(geometry: [GeometryWithImportedGeometry](/docs/kcl/types/GeometryWithImpor | Name | Type | Description | Required | |----------|------|-------------|----------| -| `geometry` | [`GeometryWithImportedGeometry`](/docs/kcl/types/GeometryWithImportedGeometry) | The sketch, solid, or imported geometry to be cloned | Yes | +| `geometry` | [`Solid`](/docs/kcl/types/std-types-Solid) or [`Sketch`](/docs/kcl/types/std-types-Sketch) or [`ImportedGeometry`](/docs/kcl/types#ImportedGeometry) | The sketch, solid, or imported geometry to be cloned | Yes | ### Returns -[`GeometryWithImportedGeometry`](/docs/kcl/types/GeometryWithImportedGeometry) - A geometry including an imported geometry. +[`Solid`](/docs/kcl/types/std-types-Solid) or [`Sketch`](/docs/kcl/types/std-types-Sketch) or [`ImportedGeometry`](/docs/kcl/types#ImportedGeometry) - A geometry including an imported geometry. ### Examples diff --git a/docs/kcl/close.md b/docs/kcl/close.md index 72d74fbae..dd731e779 100644 --- a/docs/kcl/close.md +++ b/docs/kcl/close.md @@ -10,9 +10,9 @@ Construct a line segment from the current origin back to the profile's origin, e ```kcl close( - sketch: [Sketch](/docs/kcl/types/Sketch), - tag?: [TagDeclarator](/docs/kcl/types#tag-declaration), -): [Sketch](/docs/kcl/types/Sketch) + sketch: Sketch, + tag?: TagDeclarator, +): Sketch ``` @@ -20,12 +20,12 @@ close( | Name | Type | Description | Required | |----------|------|-------------|----------| -| `sketch` | [`Sketch`](/docs/kcl/types/Sketch) | The sketch you want to close | Yes | -| `tag` | [`TagDeclarator`](/docs/kcl/types#tag-declaration) | Create a new tag which refers to this line | No | +| `sketch` | [`Sketch`](/docs/kcl/types/std-types-Sketch) | The sketch you want to close | Yes | +| [`tag`](/docs/kcl/types/std-types-tag) | [`TagDeclarator`](/docs/kcl/types#TagDeclarator) | Create a new tag which refers to this line | No | ### Returns -[`Sketch`](/docs/kcl/types/Sketch) +[`Sketch`](/docs/kcl/types/std-types-Sketch) ### Examples diff --git a/docs/kcl/e.md b/docs/kcl/e.md deleted file mode 100644 index 7ae401b60..000000000 --- a/docs/kcl/e.md +++ /dev/null @@ -1,42 +0,0 @@ ---- -title: "e" -excerpt: "Return the value of Euler’s number `e`." -layout: manual ---- - -**WARNING:** This function is deprecated. - -Return the value of Euler’s number `e`. - -**DEPRECATED** use the constant E - -```js -e(): number -``` - -### Tags - -* `math` - - - -### Returns - -[`number`](/docs/kcl/types/number) - - -### Examples - -```js -exampleSketch = startSketchOn(XZ) - |> startProfile(at = [0, 0]) - |> angledLine(angle = 30, length = 2 * e() ^ 2) - |> yLine(endAbsolute = 0) - |> close() - -example = extrude(exampleSketch, length = 10) -``` - -![Rendered example of e 0](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABQAAAALQCAYAAADPfd1WAADq+klEQVR4Ae3AA6AkWZbG8f937o3IzKdyS2Oubdu2bdu2bdu2bWmMnpZKr54yMyLu+Xa3anqmhztr1a8+6EEP4qqrrrrqqquuuuqqq6666qqrrrrqqquu+j+JylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/inL8+HGuuuqqq6666qqrrrrqqqv+t7vmmmse/D7v8z5fdXh4eEkSh4eHu1x11VVXXXXVVehBD3oQV1111VVXXXXVVVddddVV/1tdc801D37t137t93qnd3qnz+aZ7rvvvls/5EM+5CFcddVVV1111VWU48ePc9VVV1111VVXXXXVVVdd9b/NNddc8+A3e7M3+6hP+qRP+ukXf/EXf22A3/zN3wTgpptuOn7NNdc8+E//9E9/hquuuuqqq676/41y/Phxrrrqqquuuuqqq6666qqr/jd5x3d8x8/6pE/6pJ9+8Rd/8dcG+M3f/E1+4id+gsc//vE8/elP51Vf9VV5yEMe8tIA//AP//A7XHXVVVddddX/X5Tjx49z1VVXXXXVVVddddVVV131v8E7vuM7ftaHf/iHf/crvdIrvTXA05/+dL7jO76Dxz/+8axWKwBWqxUXL17ksY99LNdcc82Db7311r85e/bsrVx11VVXXXXV/0/oQQ96EFddddVVV1111VVXXXXVVf+TvdiLvdhrf/iHf/h3XXPNNQ8GuHjxIj/5kz/J05/+dJ6bJABe53Veh9d93dflvvvuu/VDPuRDHsJVV1111VVX/f9EOX78OFddddVVV1111VVXXXXVVf8TXXPNNQ/+pE/6pJ96p3d6p8/e3Nw8fvHiRX7xF3+Rn/zJn2R3d5cHkoQk7re7u8v111/PTTfddPyaa6558J/+6Z/+DFddddVVV131/w/l+PHjXHXVVVddddVVV1111VVX/U9yzTXXPPh93ud9vurDP/zDv/uaa6558MWLF/mjP/ojfvAHf5B77rmHB5KEJJ7barXi6U9/Oo997GN5zGMe89IA//AP//A7XHXVVVddddX/L5Tjx49z1VVXXXXVVVddddVVV131P8E111zz4Dd7szf7qE/6pE/66Yc85CEvDfCbv/mb/OAP/iBPf/rTeW6SeGFWqxX33HMPL/MyL8M111zz4FtvvfVvzp49eytXXXXVVVdd9f8HetCDHsRVV1111VVXXXXVVVddddV/p2uuuebBr/3ar/1e7/RO7/TZPNNv/uZv8pu/+Zs8P5L413id13kdXvd1X5f77rvv1s/6rM96nfvuu+9Wrrrqqquuuur/B8rx48e56qqrrrrqqquuuuqqq6767/KO7/iOn/VJn/RJP/3iL/7irw3w9Kc/ne/4ju/g8Y9/PM9NEpL417p06RLXXXcdN9100/GHPOQhL/1bv/Vb38NVV1111VVX/f9AOX78OFddddVVV1111VVXXXXVVf/VXud1Xue9P+mTPumnXumVXumtAS5evMg3fMM38Ed/9EesViseSBKS+NeShCRWqxW33norj3nMY7jlllseDPAP//APv8NVV1111VVX/d9HOX78OFddddVVV1111VVXXXXVVf9VXuzFXuy1P/dzP/e3Xud1Xue9Nzc3j1+8eJEf/MEf5Bd/8RdZrVY8N0n8a0lCEg+0Wq24++67eZmXeRmuueaaB996661/c/bs2Vu56qqrrrrqqv/b0IMe9CCuuuqqq6666qqrrrrqqqv+s11zzTUP/vAP//DverEXe7HXBrh48SJ/9Vd/xW/+5m/y/Eji30ISL8zrvM7r8Dqv8zrcd999t37WZ33W69x33323ctVVV1111VX/d1GOHz/OVVddddVVV1111VVXXXXVf5ZrrrnmwW/2Zm/2UZ/0SZ/009dcc82DL168yB/90R/xgz/4gzz96U/nuUlCEv9akpDEv2R3d5frrruOm2666fhDHvKQl/6t3/qt7+Gqq6666qqr/u+iHD9+nKuuuuqqq6666qqrrrrqqv9o11xzzYPf7M3e7KM+6ZM+6adf/MVf/LUBfvM3f5Mf/MEf5OlPfzrPjyT+tSQhiRfVarXi1ltv5TGPeQy33HLLgwH+4R/+4Xe46qqrrrrqqv+bKMePH+eqq6666qqrrrrqqquuuuo/0ju+4zt+1id90if99Iu/+Iu/NsBv/uZv8h3f8R08/elP5/mRhCT+tSTxryWJ9XrNPffcw8u8zMtwzTXXPPjWW2/9m7Nnz97KVVddddVVV/3fQzl+/DhXXXXVVVddddVVV1111VX/Ed7xHd/xsz73cz/3t1/8xV/8tQGe/vSn8x3f8R08/vGP5/mRhCT+tSQhiX8tSdxvd3cXgBd/8Rc//mIv9mKv/Wd/9mc/c3h4uMtVV1111VVX/d+CHvSgB3HVVVddddVVV1111VVXXfXv8WIv9mKv/eEf/uHfdc011zwY4OLFi/zkT/4kT3/603l+JPFvIYl/C0k8P8ePH+dt3uZtePCDH8x9991364d8yIc8hKuuuuqqq676v4Vy/Phxrrrqqquuuuqqq6666qqr/i2uueaaB3/SJ33ST73TO73TZ29ubh6/ePEiv/iLv8hP/uRPsru7y/MjiX8tSUjiX0sSknhBVqsVt956K495zGM4derUcYB/+Id/+B2uuuqqq6666v8O9KAHPYirrrrqqquuuuqqq6666qp/jWuuuebBH/7hH/5dL/ZiL/baABcvXuSv/uqv+M3f/E1eEEn8W0jiX0sS/xrHjx/nYz7mYwD4zM/8zNf5h3/4h9/mqquuuuqqq/5voBw/fpyrrrrqqquuuuqqq6666qoXxTXXXPPgN3uzN/uoT/qkT/rpa6655sEXL17kj/7oj/jBH/xBnv70p/P8SEIS/1qSkMS/liT+tVarFZJ48IMfzIu92Iu99p/92Z/9zOHh4S5XXXXVVVdd9b8fetCDHsRVV1111VVXXXXVVVddddULc8011zz4tV/7td/rnd7pnT6bZ/rN3/xNfvM3f5MXRhL/WpL4t5DEv4Uk7vfe7/3ePPjBD+a+++679UM+5EMewlVXXXXVVVf970c5fvw4V1111VVXXXXVVVddddVVL8g7vuM7ftYnfdIn/fSLv/iLvzbAb/7mb/Id3/EdPP3pT+cFkYQk/jUkIYl/LUlI4l9LEpJ4oFtvvZVHP/rRnDp16jjAP/zDP/wOV1111VVXXfW/G+X48eNcddVVV1111VVXXXXVVVc9t3d8x3f8rM/93M/97Rd/8Rd/bYCnP/3pfMd3fAePf/zjeUEkIYl/LUn8W0ji30ISz89qteIJT3gCr/zKr8yLv/iLv/bZs2efceutt/41V1111VVXXfW/F+X48eNcddVVV1111VVXXXXVVVfd78Ve7MVe+3M/93N/65Ve6ZXeGuDixYv84A/+IL/5m7/JarXiBZHEv5YkJPGvJQlJ/GtJQhIvzGq1Ynd3l0c/+tE8+MEPfuk/+7M/+5nDw8Ndrrrqqquuuup/J/SgBz2Iq6666qqrrrrqqquuuuqqa6655sEf/uEf/l0v9mIv9toAFy9e5Dd/8zf5q7/6K14YSfxrSeLfQhL/FpL413rrt35rXvqlX5r77rvv1g/5kA95CFddddVVV131vxPl+PHjXHXVVVddddVVV1111VX/f11zzTUPfp/3eZ+v+vAP//Dvvuaaax588eJF/uiP/ogf/MEf5J577uEFkYQk/rUk8a8lCUn8a0lCEv8W9957L49+9KM5derU8WuuuebBf/qnf/ozXHXVVVddddX/PuhBD3oQV1111VVXXXXVVVddddX/P9dcc82DX/u1X/u93umd3umzAS5evMhf/dVf8Zu/+Zv8SyTxryWJfwtJ/FtI4t9CEvc7fvw4H/VRHwXA13/917/Pb/3Wb303V1111VVXXfW/C3rQgx7EVVddddVVV1111VVXXfX/xzXXXPPg137t136vd3qnd/psnuk3f/M3+c3f/E3+JZL415LEv4Uk/i0k8W8hiefnpV/6pXmrt3or7rvvvls/67M+63Xuu+++W7nqqquuuuqq/z3Qgx70IK666qqrrrrqqquuuuqq/x/e8R3f8bPe6Z3e6bN5pt/8zd/kL//yL9nd3eWFkcS/hST+tSTxbyGJfwtJ/Eve6q3eipd+6Zfmvvvuu/VDPuRDHsJVV1111VVX/e9BOX78OFddddVVV1111VVXXXXV/23v+I7v+Fmf+7mf+9sv/uIv/toAT3/60/mO7/gOHv/4x7NarXhhJPGvJQlJ/GtIQhL/WpKQxL+WJCTxorj33nt59KMfzalTp45fc801D/7TP/3Tn+Gqq6666qqr/negHD9+nKuuuuqqq6666qqrrrrq/6YXe7EXe+3P/dzP/a1XeqVXemuAixcv8oM/+IP85m/+JqvVihdGEpL415CEJP61JPFvIYl/C0n8a6xWK574xCfyyq/8yjzkIQ956bNnzz7j1ltv/Wuuuuqqq6666n8+9KAHPYirrrrqqquuuuqqq6666v+Wa6655sEf/uEf/l0v9mIv9toAFy9e5Dd/8zf5q7/6K/4lkvjXksS/hST+LSTxbyGJfwtJALzUS70Ub/VWb8V9991362d91me9zn333XcrV1111VVXXfU/G3rQgx7EVVddddVVV1111VVXXfV/wzXXXPPgd3zHd/ys13md13lvgIsXL/JXf/VX/OZv/iYvCkn8a0niX0sS/xaS+LeQxL+VJB7ord7qrXipl3op7rvvvls/5EM+5CFcddVVV1111f9slOPHj3PV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rbfyopDEi0ISLypJvKgk8aKSxItKEi8qSbyoJPH8vPqrvzqv8Rqvwf329vb4lV/5Fe644w7+L7DNv5UkrnpOtrnqX882/5vY5n8S2/x3ss1/lptvvhmA++6771auuuqqq6666l+HylVXXXXVVVf9L/I6r/M67wXwV3/1V7woJPGikMSLShIvKkm8KCTxryGJF5UkXlSSeG6v/uqvzmu8xmtwv729PX7lV36FO+64g6uusM1VV/1r2OZ/I9v8T2Ob/062+a909uzZZ3DVVVddddVV/zpUrrrqqquuuup/kRd7sRd7bYBbb72VF0YSLypJvKgk8aKSxItCEv8aknhRSeJFIYnn9uqv/uq8xmu8Bvfb29vjl3/5l7njjjuQxFVXXfUvs83/Zrb5n8Y2/91s81/t5ptvBuAf/uEffpurrrrqqquu+tehctVVV1111VX/S7zO67zOewP89V//Nbu7u7wgknhRSeJFJYkXhSReVJL415DEi0ISLypJPNCrv/qr8xqv8Rrcb29vj1/+5V/mjjvu4H62eUEkcdVV/5/Y5v8C2/xPZZv/brb572AbgGPHjgFw33333cpVV1111VVX/etQueqqq6666qr/Jd7xHd/xswD+6q/+ihdEEi8qSbwoJPGiksSLShIvKkm8qCTxopLE/V791V+d13iN1+B+e3t7/OEf/iGPe9zj+NewzQsiiauu+t/INv/X2OZ/Ktv8T2Cb/w62ueqqq6666qr/QFSuuuqqq6666n+B13md13nva6655sEAt956K8+PJF4UknhRSeJFJYkXlSReVJJ4UUniRSUJgFd/9VfnNV7jNbjf3t4ef/RHf8Q//MM/8B/NNi+MJK666r+Lbf6vss3/ZLb5n8I2/x1s84LcfPPNAPzDP/zDb3PVVVddddVV/3pUrrrqqquuuup/gRd7sRd7LYDf+q3f4vmRxItCEi8qSbyoJPGiksSLShIvKkm8qCTx6q/+6rzGa7wG99vb2+OP/uiP+Id/+Af+u9jmhZHEVVf9W9jm/wvb/G9gm/8JbPPfxTYvimPHjgFw33333cpVV1111VVX/etRueqqq6666qr/BV7ndV7nvQH++q//mgeSxItKEi8qSbyoJPGikMS/hiReVJJ4UUji1V/91XmN13gN7re3t8cf/dEf8Q//8A/8T2ebF4Ukrvr/wzb/X9nmfwvb/E9h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STzTfffddytXXXXVVVdd9R8PPehBD+Kqq6666qqrrrrqqquuuuqqq6666qqrrvo/icpVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KfwQul2P7hK2iWwAAAABJRU5ErkJggg==) - - diff --git a/docs/kcl/extrude.md b/docs/kcl/extrude.md index 7a0d18735..6c9e0ebdf 100644 --- a/docs/kcl/extrude.md +++ b/docs/kcl/extrude.md @@ -10,13 +10,13 @@ You can provide more than one sketch to extrude, and they will all be extruded i ```kcl extrude( - sketches: [[[Sketch](/docs/kcl/types/Sketch)]](/docs/kcl/types/[Sketch](/docs/kcl/types/Sketch)), - length: [number](/docs/kcl/types/number), - symmetric?: [bool](/docs/kcl/types/bool), - bidirectionalLength?: [number](/docs/kcl/types/number), - tagStart?: [TagDeclarator](/docs/kcl/types#tag-declaration), - tagEnd?: [TagDeclarator](/docs/kcl/types#tag-declaration), -): [[[Solid](/docs/kcl/types/Solid)]](/docs/kcl/types/[Solid](/docs/kcl/types/Solid)) + sketches: [Sketch], + length: number, + symmetric?: bool, + bidirectionalLength?: number, + tagStart?: TagDeclarator, + tagEnd?: TagDeclarator, +): [Solid] ``` @@ -24,16 +24,16 @@ extrude( | Name | Type | Description | Required | |----------|------|-------------|----------| -| `sketches` | [`[Sketch]`](/docs/kcl/types/Sketch) | Which sketch or sketches should be extruded | Yes | -| `length` | [`number`](/docs/kcl/types/number) | How far to extrude the given sketches | Yes | -| `symmetric` | [`bool`](/docs/kcl/types/bool) | If true, the extrusion will happen symmetrically around the sketch. Otherwise, the | No | -| `bidirectionalLength` | [`number`](/docs/kcl/types/number) | If specified, will also extrude in the opposite direction to 'distance' to the specified distance. If 'symmetric' is true, this value is ignored. | No | -| `tagStart` | [`TagDeclarator`](/docs/kcl/types#tag-declaration) | A named tag for the face at the start of the extrusion, i.e. the original sketch | No | -| `tagEnd` | [`TagDeclarator`](/docs/kcl/types#tag-declaration) | A named tag for the face at the end of the extrusion, i.e. the new face created by extruding the original sketch | No | +| `sketches` | [`[Sketch]`](/docs/kcl/types/std-types-Sketch) | Which sketch or sketches should be extruded | Yes | +| `length` | [`number`](/docs/kcl/types/std-types-number) | How far to extrude the given sketches | Yes | +| `symmetric` | [`bool`](/docs/kcl/types/std-types-bool) | If true, the extrusion will happen symmetrically around the sketch. Otherwise, the | No | +| `bidirectionalLength` | [`number`](/docs/kcl/types/std-types-number) | If specified, will also extrude in the opposite direction to 'distance' to the specified distance. If 'symmetric' is true, this value is ignored. | No | +| `tagStart` | [`TagDeclarator`](/docs/kcl/types#TagDeclarator) | A named tag for the face at the start of the extrusion, i.e. the original sketch | No | +| `tagEnd` | [`TagDeclarator`](/docs/kcl/types#TagDeclarator) | A named tag for the face at the end of the extrusion, i.e. the new face created by extruding the original sketch | No | ### Returns -[`[Solid]`](/docs/kcl/types/Solid) +[`[Solid]`](/docs/kcl/types/std-types-Solid) ### Examples diff --git a/docs/kcl/fromCm.md b/docs/kcl/fromCm.md deleted file mode 100644 index 152a4e6c7..000000000 --- a/docs/kcl/fromCm.md +++ /dev/null @@ -1,49 +0,0 @@ ---- -title: "fromCm" -excerpt: "Converts a number from centimeters to the current default unit." -layout: manual ---- - -**WARNING:** This function is deprecated. - -Converts a number from centimeters to the current default unit. - -*DEPRECATED* prefer using explicit numeric suffixes (e.g., `42cm`) or the `to...` conversion functions. - -No matter what units the current file uses, this function will always return a number equivalent to the input in centimeters. - -For example, if the current file uses inches, `fromCm(1)` will return `0.393701`. If the current file uses millimeters, `fromCm(1)` will return `10`. If the current file uses centimeters, `fromCm(1)` will return `1`. - -**Caution**: This function is only intended to be used when you absolutely MUST have different units in your code than the file settings. Otherwise, it is a bad pattern to use this function. - -We merely provide these functions for convenience and readability, as `fromCm(10)` is more readable that your intent is "I want 10 centimeters" than `10 * 10`, if the file settings are in millimeters. - -```js -fromCm(input: number): number -``` - -### Tags - -* `units` - - -### Arguments - -| Name | Type | Description | Required | -|----------|------|-------------|----------| -| `input` | [`number`](/docs/kcl/types/number) | | Yes | - -### Returns - -[`number`](/docs/kcl/types/number) - - -### Examples - -```js -totalWidth = fromCm(10) -``` - -![Rendered example of fromCm 0](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABQAAAALQCAYAAADPfd1WAABMiklEQVR4Ae3AA6AkWZbG8f937o3IzKdyS2Oubdu2bdu2bdu2bWmMnpZKr54yMyLu+Xa3anqmhztr1a8+6EEP4qqrrrrqqquuuuqqq6666qqrrrrqqquu+j+JylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V/FPwKn4gueWQqZ4gAAAABJRU5ErkJggg==) - - diff --git a/docs/kcl/fromFt.md b/docs/kcl/fromFt.md deleted file mode 100644 index 945e6ada3..000000000 --- a/docs/kcl/fromFt.md +++ /dev/null @@ -1,49 +0,0 @@ ---- -title: "fromFt" -excerpt: "Converts a number from feet to the current default unit." -layout: manual ---- - -**WARNING:** This function is deprecated. - -Converts a number from feet to the current default unit. - -*DEPRECATED* prefer using explicit numeric suffixes (e.g., `42ft`) or the `to...` conversion functions. - -No matter what units the current file uses, this function will always return a number equivalent to the input in feet. - -For example, if the current file uses inches, `fromFt(1)` will return `12`. If the current file uses millimeters, `fromFt(1)` will return `304.8`. If the current file uses feet, `fromFt(1)` will return `1`. - -**Caution**: This function is only intended to be used when you absolutely MUST have different units in your code than the file settings. Otherwise, it is a bad pattern to use this function. - -We merely provide these functions for convenience and readability, as `fromFt(10)` is more readable that your intent is "I want 10 feet" than `10 * 304.8`, if the file settings are in millimeters. - -```js -fromFt(input: number): number -``` - -### Tags - -* `units` - - -### Arguments - -| Name | Type | Description | Required | -|----------|------|-------------|----------| -| `input` | [`number`](/docs/kcl/types/number) | | Yes | - -### Returns - -[`number`](/docs/kcl/types/number) - - -### Examples - -```js -totalWidth = fromFt(10) -``` - -![Rendered example of fromFt 0](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABQAAAALQCAYAAADPfd1WAABMiklEQVR4Ae3AA6AkWZbG8f937o3IzKdyS2Oubdu2bdu2bdu2bWmMnpZKr54yMyLu+Xa3anqmhztr1a8+6EEP4qqrrrrqqquuuuqqq6666qqrrrrqqquu+j+JylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V/FPwKn4gueWQqZ4gAAAABJRU5ErkJggg==) - - diff --git a/docs/kcl/fromInches.md b/docs/kcl/fromInches.md deleted file mode 100644 index d64a2477b..000000000 --- a/docs/kcl/fromInches.md +++ /dev/null @@ -1,49 +0,0 @@ ---- -title: "fromInches" -excerpt: "Converts a number from inches to the current default unit." -layout: manual ---- - -**WARNING:** This function is deprecated. - -Converts a number from inches to the current default unit. - -*DEPRECATED* prefer using explicit numeric suffixes (e.g., `42inch`) or the `to...` conversion functions. - -No matter what units the current file uses, this function will always return a number equivalent to the input in inches. - -For example, if the current file uses inches, `fromInches(1)` will return `1`. If the current file uses millimeters, `fromInches(1)` will return `25.4`. - -**Caution**: This function is only intended to be used when you absolutely MUST have different units in your code than the file settings. Otherwise, it is a bad pattern to use this function. - -We merely provide these functions for convenience and readability, as `fromInches(10)` is more readable that your intent is "I want 10 inches" than `10 * 25.4`, if the file settings are in millimeters. - -```js -fromInches(input: number): number -``` - -### Tags - -* `units` - - -### Arguments - -| Name | Type | Description | Required | -|----------|------|-------------|----------| -| `input` | [`number`](/docs/kcl/types/number) | | Yes | - -### Returns - -[`number`](/docs/kcl/types/number) - - -### Examples - -```js -totalWidth = fromInches(10) -``` - -![Rendered example of fromInches 0](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABQAAAALQCAYAAADPfd1WAABMiklEQVR4Ae3AA6AkWZbG8f937o3IzKdyS2Oubdu2bdu2bdu2bWmMnpZKr54yMyLu+Xa3anqmhztr1a8+6EEP4qqrrrrqqquuuuqqq6666qqrrrrqqquu+j+JylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V/FPwKn4gueWQqZ4gAAAABJRU5ErkJggg==) - - diff --git a/docs/kcl/fromM.md b/docs/kcl/fromM.md deleted file mode 100644 index 3fe12845f..000000000 --- a/docs/kcl/fromM.md +++ /dev/null @@ -1,49 +0,0 @@ ---- -title: "fromM" -excerpt: "Converts a number from meters to the current default unit." -layout: manual ---- - -**WARNING:** This function is deprecated. - -Converts a number from meters to the current default unit. - -*DEPRECATED* prefer using explicit numeric suffixes (e.g., `42m`) or the `to...` conversion functions. - -No matter what units the current file uses, this function will always return a number equivalent to the input in meters. - -For example, if the current file uses inches, `fromM(1)` will return `39.3701`. If the current file uses millimeters, `fromM(1)` will return `1000`. If the current file uses meters, `fromM(1)` will return `1`. - -**Caution**: This function is only intended to be used when you absolutely MUST have different units in your code than the file settings. Otherwise, it is a bad pattern to use this function. - -We merely provide these functions for convenience and readability, as `fromM(10)` is more readable that your intent is "I want 10 meters" than `10 * 1000`, if the file settings are in millimeters. - -```js -fromM(input: number): number -``` - -### Tags - -* `units` - - -### Arguments - -| Name | Type | Description | Required | -|----------|------|-------------|----------| -| `input` | [`number`](/docs/kcl/types/number) | | Yes | - -### Returns - -[`number`](/docs/kcl/types/number) - - -### Examples - -```js -totalWidth = 10 * fromM(10) -``` - -![Rendered example of fromM 0](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABQAAAALQCAYAAADPfd1WAABMiklEQVR4Ae3AA6AkWZbG8f937o3IzKdyS2Oubdu2bdu2bdu2bWmMnpZKr54yMyLu+Xa3anqmhztr1a8+6EEP4qqrrrrqqquuuuqqq6666qqrrrrqqquu+j+JylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V/FPwKn4gueWQqZ4gAAAABJRU5ErkJggg==) - - diff --git a/docs/kcl/fromMm.md b/docs/kcl/fromMm.md deleted file mode 100644 index 40fc7b45e..000000000 --- a/docs/kcl/fromMm.md +++ /dev/null @@ -1,49 +0,0 @@ ---- -title: "fromMm" -excerpt: "Converts a number from mm to the current default unit." -layout: manual ---- - -**WARNING:** This function is deprecated. - -Converts a number from mm to the current default unit. - -*DEPRECATED* prefer using explicit numeric suffixes (e.g., `42mm`) or the `to...` conversion functions. - -No matter what units the current file uses, this function will always return a number equivalent to the input in millimeters. - -For example, if the current file uses inches, `fromMm(1)` will return `1/25.4`. If the current file uses millimeters, `fromMm(1)` will return `1`. - -**Caution**: This function is only intended to be used when you absolutely MUST have different units in your code than the file settings. Otherwise, it is a bad pattern to use this function. - -We merely provide these functions for convenience and readability, as `fromMm(10)` is more readable that your intent is "I want 10 millimeters" than `10 * (1/25.4)`, if the file settings are in inches. - -```js -fromMm(input: number): number -``` - -### Tags - -* `units` - - -### Arguments - -| Name | Type | Description | Required | -|----------|------|-------------|----------| -| `input` | [`number`](/docs/kcl/types/number) | | Yes | - -### Returns - -[`number`](/docs/kcl/types/number) - - -### Examples - -```js -totalWidth = fromMm(10) -``` - -![Rendered example of fromMm 0](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABQAAAALQCAYAAADPfd1WAABMiklEQVR4Ae3AA6AkWZbG8f937o3IzKdyS2Oubdu2bdu2bdu2bWmMnpZKr54yMyLu+Xa3anqmhztr1a8+6EEP4qqrrrrqqquuuuqqq6666qqrrrrqqquu+j+JylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V/FPwKn4gueWQqZ4gAAAABJRU5ErkJggg==) - - diff --git a/docs/kcl/fromYd.md b/docs/kcl/fromYd.md deleted file mode 100644 index 01c4707d5..000000000 --- a/docs/kcl/fromYd.md +++ /dev/null @@ -1,49 +0,0 @@ ---- -title: "fromYd" -excerpt: "Converts a number from yards to the current default unit." -layout: manual ---- - -**WARNING:** This function is deprecated. - -Converts a number from yards to the current default unit. - -*DEPRECATED* prefer using explicit numeric suffixes (e.g., `42yd`) or the `to...` conversion functions. - -No matter what units the current file uses, this function will always return a number equivalent to the input in yards. - -For example, if the current file uses inches, `fromYd(1)` will return `36`. If the current file uses millimeters, `fromYd(1)` will return `914.4`. If the current file uses yards, `fromYd(1)` will return `1`. - -**Caution**: This function is only intended to be used when you absolutely MUST have different units in your code than the file settings. Otherwise, it is a bad pattern to use this function. - -We merely provide these functions for convenience and readability, as `fromYd(10)` is more readable that your intent is "I want 10 yards" than `10 * 914.4`, if the file settings are in millimeters. - -```js -fromYd(input: number): number -``` - -### Tags - -* `units` - - -### Arguments - -| Name | Type | Description | Required | -|----------|------|-------------|----------| -| `input` | [`number`](/docs/kcl/types/number) | | Yes | - -### Returns - -[`number`](/docs/kcl/types/number) - - -### Examples - -```js -totalWidth = fromYd(10) -``` - -![Rendered example of fromYd 0](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABQAAAALQCAYAAADPfd1WAABMiklEQVR4Ae3AA6AkWZbG8f937o3IzKdyS2Oubdu2bdu2bdu2bWmMnpZKr54yMyLu+Xa3anqmhztr1a8+6EEP4qqrrrrqqquuuuqqq6666qqrrrrqqquu+j+JylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V/FPwKn4gueWQqZ4gAAAABJRU5ErkJggg==) - - diff --git a/docs/kcl/std-helix.md b/docs/kcl/functions/std-helix.md similarity index 99% rename from docs/kcl/std-helix.md rename to docs/kcl/functions/std-helix.md index d1a89818b..5b018d334 100644 --- a/docs/kcl/std-helix.md +++ b/docs/kcl/functions/std-helix.md @@ -10,14 +10,14 @@ Create a helix. ```kcl helix( - revolutions: [number](/docs/kcl/types/number)(_), - angleStart: [number](/docs/kcl/types/number)(Angle), - ccw?: [bool](/docs/kcl/types/bool), - radius?: [number](/docs/kcl/types/number)(Length), - axis?: [Axis3d](/docs/kcl/types/Axis3d) | [Edge](/docs/kcl/types/Edge), - length?: [number](/docs/kcl/types/number)(Length), - cylinder?: [Solid](/docs/kcl/types/Solid), -): [Helix](/docs/kcl/types/Helix) + revolutions: number(_), + angleStart: number(Angle), + ccw?: bool, + radius?: number(Length), + axis?: Axis3d | Edge, + length?: number(Length), + cylinder?: Solid, +): Helix ``` @@ -27,15 +27,15 @@ helix( |----------|------|-------------|----------| | `revolutions` | `number(_)` | Number of revolutions. | Yes | | `angleStart` | `number(Angle)` | Start angle. | Yes | -| `ccw` | [`bool`](/docs/kcl/types/bool) | Is the helix rotation counter clockwise? The default is `false`. | No | +| `ccw` | [`bool`](/docs/kcl/types/std-types-bool) | Is the helix rotation counter clockwise? The default is `false`. | No | | `radius` | `number(Length)` | Radius of the helix. | No | -| `axis` | [`Axis3d`](/docs/kcl/types/Axis3d) or [`Edge`](/docs/kcl/types/Edge) | Axis to use for the helix. | No | +| `axis` | [`Axis3d`](/docs/kcl/types/std-types-Axis3d) or [`Edge`](/docs/kcl/types/std-types-Edge) | Axis to use for the helix. | No | | `length` | `number(Length)` | Length of the helix. This is not necessary if the helix is created around an edge. If not given the length of the edge is used. | No | -| `cylinder` | [`Solid`](/docs/kcl/types/Solid) | Cylinder to create the helix on. | No | +| `cylinder` | [`Solid`](/docs/kcl/types/std-types-Solid) | Cylinder to create the helix on. | No | ### Returns -[`Helix`](/docs/kcl/types/Helix) +[`Helix`](/docs/kcl/types/std-types-Helix) ### Examples diff --git a/docs/kcl/std-math-abs.md b/docs/kcl/functions/std-math-abs.md similarity index 99% rename from docs/kcl/std-math-abs.md rename to docs/kcl/functions/std-math-abs.md index 775bf770d..795b87b02 100644 --- a/docs/kcl/std-math-abs.md +++ b/docs/kcl/functions/std-math-abs.md @@ -9,7 +9,7 @@ Compute the absolute value of a number. ```kcl -abs(@input: [number](/docs/kcl/types/number)): [number](/docs/kcl/types/number) +abs(@input: number): number ``` @@ -17,11 +17,11 @@ abs(@input: [number](/docs/kcl/types/number)): [number](/docs/kcl/types/number) | Name | Type | Description | Required | |----------|------|-------------|----------| -| `input` | [`number`](/docs/kcl/types/number) | | Yes | +| `input` | [`number`](/docs/kcl/types/std-types-number) | | Yes | ### Returns -[`number`](/docs/kcl/types/number) +[`number`](/docs/kcl/types/std-types-number) ### Examples diff --git a/docs/kcl/std-math-acos.md b/docs/kcl/functions/std-math-acos.md similarity index 99% rename from docs/kcl/std-math-acos.md rename to docs/kcl/functions/std-math-acos.md index 6ca5b68fb..a7751c2a4 100644 --- a/docs/kcl/std-math-acos.md +++ b/docs/kcl/functions/std-math-acos.md @@ -9,7 +9,7 @@ Compute the arccosine of a number. ```kcl -acos(@num: [number](/docs/kcl/types/number)(_)): [number](/docs/kcl/types/number)(rad) +acos(@num: number(_)): number(rad) ``` diff --git a/docs/kcl/std-math-asin.md b/docs/kcl/functions/std-math-asin.md similarity index 99% rename from docs/kcl/std-math-asin.md rename to docs/kcl/functions/std-math-asin.md index c475f99a9..50d982300 100644 --- a/docs/kcl/std-math-asin.md +++ b/docs/kcl/functions/std-math-asin.md @@ -9,7 +9,7 @@ Compute the arcsine of a number. ```kcl -asin(@num: [number](/docs/kcl/types/number)(_)): [number](/docs/kcl/types/number)(rad) +asin(@num: number(_)): number(rad) ``` diff --git a/docs/kcl/std-math-atan.md b/docs/kcl/functions/std-math-atan.md similarity index 87% rename from docs/kcl/std-math-atan.md rename to docs/kcl/functions/std-math-atan.md index b3a873324..63d6a7bea 100644 --- a/docs/kcl/std-math-atan.md +++ b/docs/kcl/functions/std-math-atan.md @@ -9,7 +9,7 @@ Compute the arctangent of a number. Consider using `atan2()` instead for the true inverse of tangent. ```kcl -atan(@num: [number](/docs/kcl/types/number)(_)): [number](/docs/kcl/types/number)(rad) +atan(@num: number(_)): number(rad) ``` diff --git a/docs/kcl/std-math-atan2.md b/docs/kcl/functions/std-math-atan2.md similarity index 99% rename from docs/kcl/std-math-atan2.md rename to docs/kcl/functions/std-math-atan2.md index 8df61ef69..30432058d 100644 --- a/docs/kcl/std-math-atan2.md +++ b/docs/kcl/functions/std-math-atan2.md @@ -10,9 +10,9 @@ Compute the four quadrant arctangent of Y and X. ```kcl atan2( - y: [number](/docs/kcl/types/number)(Length), - x: [number](/docs/kcl/types/number)(Length), -): [number](/docs/kcl/types/number)(rad) + y: number(Length), + x: number(Length), +): number(rad) ``` diff --git a/docs/kcl/std-math-ceil.md b/docs/kcl/functions/std-math-ceil.md similarity index 99% rename from docs/kcl/std-math-ceil.md rename to docs/kcl/functions/std-math-ceil.md index 376b22b96..d5e0612b1 100644 --- a/docs/kcl/std-math-ceil.md +++ b/docs/kcl/functions/std-math-ceil.md @@ -9,7 +9,7 @@ Compute the smallest integer greater than or equal to a number. ```kcl -ceil(@input: [number](/docs/kcl/types/number)): [number](/docs/kcl/types/number) +ceil(@input: number): number ``` @@ -17,11 +17,11 @@ ceil(@input: [number](/docs/kcl/types/number)): [number](/docs/kcl/types/number) | Name | Type | Description | Required | |----------|------|-------------|----------| -| `input` | [`number`](/docs/kcl/types/number) | | Yes | +| `input` | [`number`](/docs/kcl/types/std-types-number) | | Yes | ### Returns -[`number`](/docs/kcl/types/number) +[`number`](/docs/kcl/types/std-types-number) ### Examples diff --git a/docs/kcl/std-math-cos.md b/docs/kcl/functions/std-math-cos.md similarity index 99% rename from docs/kcl/std-math-cos.md rename to docs/kcl/functions/std-math-cos.md index d5d447067..92b39e469 100644 --- a/docs/kcl/std-math-cos.md +++ b/docs/kcl/functions/std-math-cos.md @@ -9,7 +9,7 @@ Compute the cosine of a number. ```kcl -cos(@num: [number](/docs/kcl/types/number)(Angle)): [number](/docs/kcl/types/number)(_) +cos(@num: number(Angle)): number(_) ``` diff --git a/docs/kcl/std-math-floor.md b/docs/kcl/functions/std-math-floor.md similarity index 99% rename from docs/kcl/std-math-floor.md rename to docs/kcl/functions/std-math-floor.md index 9c410ab66..6745622ac 100644 --- a/docs/kcl/std-math-floor.md +++ b/docs/kcl/functions/std-math-floor.md @@ -9,7 +9,7 @@ Compute the largest integer less than or equal to a number. ```kcl -floor(@input: [number](/docs/kcl/types/number)): [number](/docs/kcl/types/number) +floor(@input: number): number ``` @@ -17,11 +17,11 @@ floor(@input: [number](/docs/kcl/types/number)): [number](/docs/kcl/types/number | Name | Type | Description | Required | |----------|------|-------------|----------| -| `input` | [`number`](/docs/kcl/types/number) | | Yes | +| `input` | [`number`](/docs/kcl/types/std-types-number) | | Yes | ### Returns -[`number`](/docs/kcl/types/number) +[`number`](/docs/kcl/types/std-types-number) ### Examples diff --git a/docs/kcl/std-math-ln.md b/docs/kcl/functions/std-math-ln.md similarity index 99% rename from docs/kcl/std-math-ln.md rename to docs/kcl/functions/std-math-ln.md index a958f9cb6..bf5a20aaa 100644 --- a/docs/kcl/std-math-ln.md +++ b/docs/kcl/functions/std-math-ln.md @@ -9,7 +9,7 @@ Compute the natural logarithm of the number. ```kcl -ln(@input: [number](/docs/kcl/types/number)): [number](/docs/kcl/types/number) +ln(@input: number): number ``` @@ -17,11 +17,11 @@ ln(@input: [number](/docs/kcl/types/number)): [number](/docs/kcl/types/number) | Name | Type | Description | Required | |----------|------|-------------|----------| -| `input` | [`number`](/docs/kcl/types/number) | | Yes | +| `input` | [`number`](/docs/kcl/types/std-types-number) | | Yes | ### Returns -[`number`](/docs/kcl/types/number) +[`number`](/docs/kcl/types/std-types-number) ### Examples diff --git a/docs/kcl/std-math-log.md b/docs/kcl/functions/std-math-log.md similarity index 99% rename from docs/kcl/std-math-log.md rename to docs/kcl/functions/std-math-log.md index c4492573c..46c25b1d4 100644 --- a/docs/kcl/std-math-log.md +++ b/docs/kcl/functions/std-math-log.md @@ -12,9 +12,9 @@ and `log10` can produce more accurate results for base 10. ```kcl log( - @input: [number](/docs/kcl/types/number), - base: [number](/docs/kcl/types/number)(_), -): [number](/docs/kcl/types/number) + @input: number, + base: number(_), +): number ``` @@ -22,12 +22,12 @@ log( | Name | Type | Description | Required | |----------|------|-------------|----------| -| `input` | [`number`](/docs/kcl/types/number) | The number to compute the logarithm of. | Yes | +| `input` | [`number`](/docs/kcl/types/std-types-number) | The number to compute the logarithm of. | Yes | | `base` | `number(_)` | The base of the logarithm. | Yes | ### Returns -[`number`](/docs/kcl/types/number) +[`number`](/docs/kcl/types/std-types-number) ### Examples diff --git a/docs/kcl/std-math-log10.md b/docs/kcl/functions/std-math-log10.md similarity index 99% rename from docs/kcl/std-math-log10.md rename to docs/kcl/functions/std-math-log10.md index dba8b68c9..a7be136a2 100644 --- a/docs/kcl/std-math-log10.md +++ b/docs/kcl/functions/std-math-log10.md @@ -9,7 +9,7 @@ Compute the base 10 logarithm of the number. ```kcl -log10(@input: [number](/docs/kcl/types/number)): [number](/docs/kcl/types/number) +log10(@input: number): number ``` @@ -17,11 +17,11 @@ log10(@input: [number](/docs/kcl/types/number)): [number](/docs/kcl/types/number | Name | Type | Description | Required | |----------|------|-------------|----------| -| `input` | [`number`](/docs/kcl/types/number) | | Yes | +| `input` | [`number`](/docs/kcl/types/std-types-number) | | Yes | ### Returns -[`number`](/docs/kcl/types/number) +[`number`](/docs/kcl/types/std-types-number) ### Examples diff --git a/docs/kcl/std-math-log2.md b/docs/kcl/functions/std-math-log2.md similarity index 99% rename from docs/kcl/std-math-log2.md rename to docs/kcl/functions/std-math-log2.md index 474f3dd0f..c607e63cf 100644 --- a/docs/kcl/std-math-log2.md +++ b/docs/kcl/functions/std-math-log2.md @@ -9,7 +9,7 @@ Compute the base 2 logarithm of the number. ```kcl -log2(@input: [number](/docs/kcl/types/number)): [number](/docs/kcl/types/number) +log2(@input: number): number ``` @@ -17,11 +17,11 @@ log2(@input: [number](/docs/kcl/types/number)): [number](/docs/kcl/types/number) | Name | Type | Description | Required | |----------|------|-------------|----------| -| `input` | [`number`](/docs/kcl/types/number) | | Yes | +| `input` | [`number`](/docs/kcl/types/std-types-number) | | Yes | ### Returns -[`number`](/docs/kcl/types/number) +[`number`](/docs/kcl/types/std-types-number) ### Examples diff --git a/docs/kcl/std-math-max.md b/docs/kcl/functions/std-math-max.md similarity index 99% rename from docs/kcl/std-math-max.md rename to docs/kcl/functions/std-math-max.md index 4ce618be6..891c68ec4 100644 --- a/docs/kcl/std-math-max.md +++ b/docs/kcl/functions/std-math-max.md @@ -9,7 +9,7 @@ Compute the maximum of the given arguments. ```kcl -max(@input: [[number](/docs/kcl/types/number); 1+]): [number](/docs/kcl/types/number) +max(@input: [number; 1+]): number ``` @@ -17,11 +17,11 @@ max(@input: [[number](/docs/kcl/types/number); 1+]): [number](/docs/kcl/types/nu | Name | Type | Description | Required | |----------|------|-------------|----------| -| `input` | `[number; 1+]` | An array of numbers to compute the maximum of. | Yes | +| `input` | [`[number; 1+]`](/docs/kcl/types/std-types-number) | An array of numbers to compute the maximum of. | Yes | ### Returns -[`number`](/docs/kcl/types/number) +[`number`](/docs/kcl/types/std-types-number) ### Examples diff --git a/docs/kcl/std-math-min.md b/docs/kcl/functions/std-math-min.md similarity index 99% rename from docs/kcl/std-math-min.md rename to docs/kcl/functions/std-math-min.md index ecac801d0..05222ceb0 100644 --- a/docs/kcl/std-math-min.md +++ b/docs/kcl/functions/std-math-min.md @@ -9,7 +9,7 @@ Compute the minimum of the given arguments. ```kcl -min(@input: [[number](/docs/kcl/types/number); 1+]): [number](/docs/kcl/types/number) +min(@input: [number; 1+]): number ``` @@ -17,11 +17,11 @@ min(@input: [[number](/docs/kcl/types/number); 1+]): [number](/docs/kcl/types/nu | Name | Type | Description | Required | |----------|------|-------------|----------| -| `input` | `[number; 1+]` | An array of numbers to compute the minimum of. | Yes | +| `input` | [`[number; 1+]`](/docs/kcl/types/std-types-number) | An array of numbers to compute the minimum of. | Yes | ### Returns -[`number`](/docs/kcl/types/number) +[`number`](/docs/kcl/types/std-types-number) ### Examples diff --git a/docs/kcl/std-math-polar.md b/docs/kcl/functions/std-math-polar.md similarity index 99% rename from docs/kcl/std-math-polar.md rename to docs/kcl/functions/std-math-polar.md index 8873e2b5f..190839a08 100644 --- a/docs/kcl/std-math-polar.md +++ b/docs/kcl/functions/std-math-polar.md @@ -11,9 +11,9 @@ cartesian (x/y/z grid) coordinates. ```kcl polar( - angle: [number](/docs/kcl/types/number)(rad), - length: [number](/docs/kcl/types/number)(Length), -): [Point2d](/docs/kcl/types/Point2d) + angle: number(rad), + length: number(Length), +): Point2d ``` @@ -26,7 +26,7 @@ polar( ### Returns -[`Point2d`](/docs/kcl/types/Point2d) +[`Point2d`](/docs/kcl/types/std-types-Point2d) ### Examples diff --git a/docs/kcl/std-math-pow.md b/docs/kcl/functions/std-math-pow.md similarity index 99% rename from docs/kcl/std-math-pow.md rename to docs/kcl/functions/std-math-pow.md index 5a06e0bca..165fef823 100644 --- a/docs/kcl/std-math-pow.md +++ b/docs/kcl/functions/std-math-pow.md @@ -10,9 +10,9 @@ Compute the number to a power. ```kcl pow( - @input: [number](/docs/kcl/types/number), - exp: [number](/docs/kcl/types/number)(_), -): [number](/docs/kcl/types/number) + @input: number, + exp: number(_), +): number ``` @@ -20,12 +20,12 @@ pow( | Name | Type | Description | Required | |----------|------|-------------|----------| -| `input` | [`number`](/docs/kcl/types/number) | The number to raise. | Yes | +| `input` | [`number`](/docs/kcl/types/std-types-number) | The number to raise. | Yes | | `exp` | `number(_)` | The power to raise to. | Yes | ### Returns -[`number`](/docs/kcl/types/number) +[`number`](/docs/kcl/types/std-types-number) ### Examples diff --git a/docs/kcl/std-math-rem.md b/docs/kcl/functions/std-math-rem.md similarity index 98% rename from docs/kcl/std-math-rem.md rename to docs/kcl/functions/std-math-rem.md index 95667f036..aa1a5ad2f 100644 --- a/docs/kcl/std-math-rem.md +++ b/docs/kcl/functions/std-math-rem.md @@ -11,9 +11,9 @@ If `num` is negative, the result will be too. ```kcl rem( - @num: [number](/docs/kcl/types/number), - divisor: [number](/docs/kcl/types/number), -): [number](/docs/kcl/types/number) + @num: number, + divisor: number, +): number ``` @@ -21,12 +21,12 @@ rem( | Name | Type | Description | Required | |----------|------|-------------|----------| -| `num` | [`number`](/docs/kcl/types/number) | The number which will be divided by `divisor`. | Yes | -| `divisor` | [`number`](/docs/kcl/types/number) | The number which will divide `num`. | Yes | +| `num` | [`number`](/docs/kcl/types/std-types-number) | The number which will be divided by `divisor`. | Yes | +| `divisor` | [`number`](/docs/kcl/types/std-types-number) | The number which will divide `num`. | Yes | ### Returns -[`number`](/docs/kcl/types/number) +[`number`](/docs/kcl/types/std-types-number) ### Examples diff --git a/docs/kcl/std-math-round.md b/docs/kcl/functions/std-math-round.md similarity index 99% rename from docs/kcl/std-math-round.md rename to docs/kcl/functions/std-math-round.md index 0bb9ed4de..9d643595b 100644 --- a/docs/kcl/std-math-round.md +++ b/docs/kcl/functions/std-math-round.md @@ -9,7 +9,7 @@ Round a number to the nearest integer. ```kcl -round(@input: [number](/docs/kcl/types/number)): [number](/docs/kcl/types/number) +round(@input: number): number ``` @@ -17,11 +17,11 @@ round(@input: [number](/docs/kcl/types/number)): [number](/docs/kcl/types/number | Name | Type | Description | Required | |----------|------|-------------|----------| -| `input` | [`number`](/docs/kcl/types/number) | | Yes | +| `input` | [`number`](/docs/kcl/types/std-types-number) | | Yes | ### Returns -[`number`](/docs/kcl/types/number) +[`number`](/docs/kcl/types/std-types-number) ### Examples diff --git a/docs/kcl/std-math-sin.md b/docs/kcl/functions/std-math-sin.md similarity index 99% rename from docs/kcl/std-math-sin.md rename to docs/kcl/functions/std-math-sin.md index 965ff8ebd..b325aedd8 100644 --- a/docs/kcl/std-math-sin.md +++ b/docs/kcl/functions/std-math-sin.md @@ -9,7 +9,7 @@ Compute the sine of a number. ```kcl -sin(@num: [number](/docs/kcl/types/number)(Angle)): [number](/docs/kcl/types/number)(_) +sin(@num: number(Angle)): number(_) ``` diff --git a/docs/kcl/std-math-sqrt.md b/docs/kcl/functions/std-math-sqrt.md similarity index 99% rename from docs/kcl/std-math-sqrt.md rename to docs/kcl/functions/std-math-sqrt.md index 2b07cc97a..945a7689f 100644 --- a/docs/kcl/std-math-sqrt.md +++ b/docs/kcl/functions/std-math-sqrt.md @@ -9,7 +9,7 @@ Compute the square root of a number. ```kcl -sqrt(@input: [number](/docs/kcl/types/number)): [number](/docs/kcl/types/number) +sqrt(@input: number): number ``` @@ -17,11 +17,11 @@ sqrt(@input: [number](/docs/kcl/types/number)): [number](/docs/kcl/types/number) | Name | Type | Description | Required | |----------|------|-------------|----------| -| `input` | [`number`](/docs/kcl/types/number) | | Yes | +| `input` | [`number`](/docs/kcl/types/std-types-number) | | Yes | ### Returns -[`number`](/docs/kcl/types/number) +[`number`](/docs/kcl/types/std-types-number) ### Examples diff --git a/docs/kcl/std-math-tan.md b/docs/kcl/functions/std-math-tan.md similarity index 99% rename from docs/kcl/std-math-tan.md rename to docs/kcl/functions/std-math-tan.md index 22ceb195b..034c58c0f 100644 --- a/docs/kcl/std-math-tan.md +++ b/docs/kcl/functions/std-math-tan.md @@ -9,7 +9,7 @@ Compute the tangent of a number. ```kcl -tan(@num: [number](/docs/kcl/types/number)(Angle)): [number](/docs/kcl/types/number)(_) +tan(@num: number(Angle)): number(_) ``` diff --git a/docs/kcl/std-offsetPlane.md b/docs/kcl/functions/std-offsetPlane.md similarity index 99% rename from docs/kcl/std-offsetPlane.md rename to docs/kcl/functions/std-offsetPlane.md index 5d26f6d3f..40b4fda23 100644 --- a/docs/kcl/std-offsetPlane.md +++ b/docs/kcl/functions/std-offsetPlane.md @@ -10,10 +10,10 @@ For example, if you offset the `XZ` plane by 10, the new plane will be parallel plane and 10 units away from it. ```kcl -offset[Plane](/docs/kcl/types/Plane)( - @plane: [Plane](/docs/kcl/types/Plane), - offset: [number](/docs/kcl/types/number)(Length), -): [Plane](/docs/kcl/types/Plane) +offsetPlane( + @plane: Plane, + offset: number(Length), +): Plane ``` @@ -21,12 +21,12 @@ offset[Plane](/docs/kcl/types/Plane)( | Name | Type | Description | Required | |----------|------|-------------|----------| -| `plane` | [`Plane`](/docs/kcl/types/Plane) | The plane (e.g. `XY`) which this new plane is created from. | Yes | +| `plane` | [`Plane`](/docs/kcl/types/std-types-Plane) | The plane (e.g. `XY`) which this new plane is created from. | Yes | | `offset` | `number(Length)` | Distance from the standard plane this new plane will be created at. | Yes | ### Returns -[`Plane`](/docs/kcl/types/Plane) +[`Plane`](/docs/kcl/types/std-types-Plane) ### Examples diff --git a/docs/kcl/std-revolve.md b/docs/kcl/functions/std-revolve.md similarity index 99% rename from docs/kcl/std-revolve.md rename to docs/kcl/functions/std-revolve.md index f59bf77c1..53990f087 100644 --- a/docs/kcl/std-revolve.md +++ b/docs/kcl/functions/std-revolve.md @@ -19,15 +19,15 @@ revolved around the same axis. ```kcl revolve( - @sketches: [[Sketch](/docs/kcl/types/Sketch); 1+], - axis: [Axis2d](/docs/kcl/types/Axis2d) | [Edge](/docs/kcl/types/Edge), - angle?: [number](/docs/kcl/types/number)(Angle), - tolerance?: [number](/docs/kcl/types/number)(Length), - symmetric?: [bool](/docs/kcl/types/bool), - bidirectionalAngle?: [number](/docs/kcl/types/number)(Angle), + @sketches: [Sketch; 1+], + axis: Axis2d | Edge, + angle?: number(Angle), + tolerance?: number(Length), + symmetric?: bool, + bidirectionalAngle?: number(Angle), tagStart?: tag, tagEnd?: tag, -): [Solid](/docs/kcl/types/Solid) +): Solid ``` @@ -35,18 +35,18 @@ revolve( | Name | Type | Description | Required | |----------|------|-------------|----------| -| `sketches` | `[Sketch; 1+]` | The sketch or set of sketches that should be revolved | Yes | -| `axis` | [`Axis2d`](/docs/kcl/types/Axis2d) or [`Edge`](/docs/kcl/types/Edge) | Axis of revolution. | Yes | +| `sketches` | [`[Sketch; 1+]`](/docs/kcl/types/std-types-Sketch) | The sketch or set of sketches that should be revolved | Yes | +| `axis` | [`Axis2d`](/docs/kcl/types/std-types-Axis2d) or [`Edge`](/docs/kcl/types/std-types-Edge) | Axis of revolution. | Yes | | `angle` | `number(Angle)` | Angle to revolve (in degrees). Default is 360. | No | | `tolerance` | `number(Length)` | Tolerance for the revolve operation. | No | -| `symmetric` | [`bool`](/docs/kcl/types/bool) | If true, the extrusion will happen symmetrically around the sketch. Otherwise, the extrusion will happen on only one side of the sketch. | No | +| `symmetric` | [`bool`](/docs/kcl/types/std-types-bool) | If true, the extrusion will happen symmetrically around the sketch. Otherwise, the extrusion will happen on only one side of the sketch. | No | | `bidirectionalAngle` | `number(Angle)` | If specified, will also revolve in the opposite direction to 'angle' to the specified angle. If 'symmetric' is true, this value is ignored. | No | -| `tagStart` | `tag` | A named tag for the face at the start of the revolve, i.e. the original sketch. | No | -| `tagEnd` | `tag` | A named tag for the face at the end of the revolve. | No | +| `tagStart` | [`tag`](/docs/kcl/types/std-types-tag) | A named tag for the face at the start of the revolve, i.e. the original sketch. | No | +| `tagEnd` | [`tag`](/docs/kcl/types/std-types-tag) | A named tag for the face at the end of the revolve. | No | ### Returns -[`Solid`](/docs/kcl/types/Solid) +[`Solid`](/docs/kcl/types/std-types-Solid) ### Examples diff --git a/docs/kcl/std-sketch-circle.md b/docs/kcl/functions/std-sketch-circle.md similarity index 99% rename from docs/kcl/std-sketch-circle.md rename to docs/kcl/functions/std-sketch-circle.md index 288158cc9..3b62f4f2f 100644 --- a/docs/kcl/std-sketch-circle.md +++ b/docs/kcl/functions/std-sketch-circle.md @@ -11,11 +11,11 @@ the provided (x, y) origin point. ```kcl circle( - @sketch_or_surface: [Sketch](/docs/kcl/types/Sketch) | [Plane](/docs/kcl/types/Plane) | [Face](/docs/kcl/types/Face), - center: [Point2d](/docs/kcl/types/Point2d), - radius: [number](/docs/kcl/types/number)(Length), + @sketch_or_surface: Sketch | Plane | Face, + center: Point2d, + radius: number(Length), tag?: tag, -): [Sketch](/docs/kcl/types/Sketch) +): Sketch ``` @@ -23,14 +23,14 @@ circle( | Name | Type | Description | Required | |----------|------|-------------|----------| -| `sketch_or_surface` | [`Sketch`](/docs/kcl/types/Sketch) or [`Plane`](/docs/kcl/types/Plane) or [`Face`](/docs/kcl/types/Face) | Sketch to extend, or plane or surface to sketch on. | Yes | -| `center` | [`Point2d`](/docs/kcl/types/Point2d) | The center of the circle. | Yes | +| `sketch_or_surface` | [`Sketch`](/docs/kcl/types/std-types-Sketch) or [`Plane`](/docs/kcl/types/std-types-Plane) or [`Face`](/docs/kcl/types/std-types-Face) | Sketch to extend, or plane or surface to sketch on. | Yes | +| `center` | [`Point2d`](/docs/kcl/types/std-types-Point2d) | The center of the circle. | Yes | | `radius` | `number(Length)` | The radius of the circle. | Yes | -| `tag` | `tag` | Create a new tag which refers to this circle. | No | +| [`tag`](/docs/kcl/types/std-types-tag) | [`tag`](/docs/kcl/types/std-types-tag) | Create a new tag which refers to this circle. | No | ### Returns -[`Sketch`](/docs/kcl/types/Sketch) +[`Sketch`](/docs/kcl/types/std-types-Sketch) ### Examples diff --git a/docs/kcl/std-sketch-mirror2d.md b/docs/kcl/functions/std-sketch-mirror2d.md similarity index 99% rename from docs/kcl/std-sketch-mirror2d.md rename to docs/kcl/functions/std-sketch-mirror2d.md index 53ea5ed58..fa4b9e23a 100644 --- a/docs/kcl/std-sketch-mirror2d.md +++ b/docs/kcl/functions/std-sketch-mirror2d.md @@ -12,9 +12,9 @@ Mirror occurs around a local sketch axis rather than a global axis. ```kcl mirror2d( - @sketches: [[Sketch](/docs/kcl/types/Sketch); 1+], - axis: [Axis2d](/docs/kcl/types/Axis2d) | [Edge](/docs/kcl/types/Edge), -): [Sketch](/docs/kcl/types/Sketch) + @sketches: [Sketch; 1+], + axis: Axis2d | Edge, +): Sketch ``` @@ -22,12 +22,12 @@ mirror2d( | Name | Type | Description | Required | |----------|------|-------------|----------| -| `sketches` | `[Sketch; 1+]` | The sketch or sketches to be reflected. | Yes | -| `axis` | [`Axis2d`](/docs/kcl/types/Axis2d) or [`Edge`](/docs/kcl/types/Edge) | The axis to reflect around. | Yes | +| `sketches` | [`[Sketch; 1+]`](/docs/kcl/types/std-types-Sketch) | The sketch or sketches to be reflected. | Yes | +| `axis` | [`Axis2d`](/docs/kcl/types/std-types-Axis2d) or [`Edge`](/docs/kcl/types/std-types-Edge) | The axis to reflect around. | Yes | ### Returns -[`Sketch`](/docs/kcl/types/Sketch) +[`Sketch`](/docs/kcl/types/std-types-Sketch) ### Examples diff --git a/docs/kcl/std-solid-chamfer.md b/docs/kcl/functions/std-solid-chamfer.md similarity index 99% rename from docs/kcl/std-solid-chamfer.md rename to docs/kcl/functions/std-solid-chamfer.md index 2c9fbf23f..087d3ae4e 100644 --- a/docs/kcl/std-solid-chamfer.md +++ b/docs/kcl/functions/std-solid-chamfer.md @@ -12,11 +12,11 @@ a sharp, straight transitional edge. ```kcl chamfer( - @solid: [Solid](/docs/kcl/types/Solid), - length: [number](/docs/kcl/types/number)(Length), - tags: [[Edge](/docs/kcl/types/Edge); 1+], + @solid: Solid, + length: number(Length), + tags: [Edge; 1+], tag?: tag, -): [Solid](/docs/kcl/types/Solid) +): Solid ``` @@ -24,14 +24,14 @@ chamfer( | Name | Type | Description | Required | |----------|------|-------------|----------| -| `solid` | [`Solid`](/docs/kcl/types/Solid) | The solid whose edges should be chamfered | Yes | +| `solid` | [`Solid`](/docs/kcl/types/std-types-Solid) | The solid whose edges should be chamfered | Yes | | `length` | `number(Length)` | The length of the chamfer | Yes | -| `tags` | `[Edge; 1+]` | The paths you want to chamfer | Yes | -| `tag` | `tag` | Create a new tag which refers to this chamfer | No | +| `tags` | [`[Edge; 1+]`](/docs/kcl/types/std-types-Edge) | The paths you want to chamfer | Yes | +| [`tag`](/docs/kcl/types/std-types-tag) | [`tag`](/docs/kcl/types/std-types-tag) | Create a new tag which refers to this chamfer | No | ### Returns -[`Solid`](/docs/kcl/types/Solid) +[`Solid`](/docs/kcl/types/std-types-Solid) ### Examples @@ -76,7 +76,7 @@ sg = startSketchOn(XY) return sg } -part001 = cube([0,0], 20) +part001 = cube(pos = [0,0], scale = 20) |> close(tag = $line1) |> extrude(length = 20) // We tag the chamfer to reference it later. diff --git a/docs/kcl/std-solid-fillet.md b/docs/kcl/functions/std-solid-fillet.md similarity index 99% rename from docs/kcl/std-solid-fillet.md rename to docs/kcl/functions/std-solid-fillet.md index c7c67a103..bfa7bb36d 100644 --- a/docs/kcl/std-solid-fillet.md +++ b/docs/kcl/functions/std-solid-fillet.md @@ -12,12 +12,12 @@ will smoothly blend the transition. ```kcl fillet( - @solid: [Solid](/docs/kcl/types/Solid), - radius: [number](/docs/kcl/types/number)(Length), - tags: [[Edge](/docs/kcl/types/Edge); 1+], - tolerance?: [number](/docs/kcl/types/number)(Length), + @solid: Solid, + radius: number(Length), + tags: [Edge; 1+], + tolerance?: number(Length), tag?: tag, -): [Solid](/docs/kcl/types/Solid) +): Solid ``` @@ -25,15 +25,15 @@ fillet( | Name | Type | Description | Required | |----------|------|-------------|----------| -| `solid` | [`Solid`](/docs/kcl/types/Solid) | The solid whose edges should be filletted | Yes | +| `solid` | [`Solid`](/docs/kcl/types/std-types-Solid) | The solid whose edges should be filletted | Yes | | `radius` | `number(Length)` | The radius of the fillet | Yes | -| `tags` | `[Edge; 1+]` | The paths you want to fillet | Yes | +| `tags` | [`[Edge; 1+]`](/docs/kcl/types/std-types-Edge) | The paths you want to fillet | Yes | | `tolerance` | `number(Length)` | The tolerance for this fillet | No | -| `tag` | `tag` | Create a new tag which refers to this fillet | No | +| [`tag`](/docs/kcl/types/std-types-tag) | [`tag`](/docs/kcl/types/std-types-tag) | Create a new tag which refers to this fillet | No | ### Returns -[`Solid`](/docs/kcl/types/Solid) +[`Solid`](/docs/kcl/types/std-types-Solid) ### Examples diff --git a/docs/kcl/std-solid-hollow.md b/docs/kcl/functions/std-solid-hollow.md similarity index 99% rename from docs/kcl/std-solid-hollow.md rename to docs/kcl/functions/std-solid-hollow.md index dfc41a983..bcaba01aa 100644 --- a/docs/kcl/std-solid-hollow.md +++ b/docs/kcl/functions/std-solid-hollow.md @@ -11,9 +11,9 @@ provided thickness remains around the exterior of the shape. ```kcl hollow( - @solid: [Solid](/docs/kcl/types/Solid), - thickness: [number](/docs/kcl/types/number)(Length), -): [Solid](/docs/kcl/types/Solid) + @solid: Solid, + thickness: number(Length), +): Solid ``` @@ -21,12 +21,12 @@ hollow( | Name | Type | Description | Required | |----------|------|-------------|----------| -| `solid` | [`Solid`](/docs/kcl/types/Solid) | Which solid to hollow out | Yes | +| `solid` | [`Solid`](/docs/kcl/types/std-types-Solid) | Which solid to hollow out | Yes | | `thickness` | `number(Length)` | The thickness of the remaining shell | Yes | ### Returns -[`Solid`](/docs/kcl/types/Solid) +[`Solid`](/docs/kcl/types/std-types-Solid) ### Examples diff --git a/docs/kcl/std-solid-shell.md b/docs/kcl/functions/std-solid-shell.md similarity index 99% rename from docs/kcl/std-solid-shell.md rename to docs/kcl/functions/std-solid-shell.md index 38a28970a..2f119ced7 100644 --- a/docs/kcl/std-solid-shell.md +++ b/docs/kcl/functions/std-solid-shell.md @@ -11,10 +11,10 @@ provided thickness remains, taking volume starting at the providedface, leaving ```kcl shell( - @solids: [[Solid](/docs/kcl/types/Solid); 1+], - thickness: [number](/docs/kcl/types/number)(Length), + @solids: [Solid; 1+], + thickness: number(Length), faces: [tag; 1+], -): [[[Solid](/docs/kcl/types/Solid)]](/docs/kcl/types/[Solid](/docs/kcl/types/Solid)) +): [Solid] ``` @@ -22,13 +22,13 @@ shell( | Name | Type | Description | Required | |----------|------|-------------|----------| -| `solids` | `[Solid; 1+]` | Which solid (or solids) to shell out | Yes | +| `solids` | [`[Solid; 1+]`](/docs/kcl/types/std-types-Solid) | Which solid (or solids) to shell out | Yes | | `thickness` | `number(Length)` | The thickness of the shell | Yes | -| `faces` | `[tag; 1+]` | The faces you want removed | Yes | +| `faces` | [`[tag; 1+]`](/docs/kcl/types/std-types-tag) | The faces you want removed | Yes | ### Returns -[`[Solid]`](/docs/kcl/types/Solid) +[`[Solid]`](/docs/kcl/types/std-types-Solid) ### Examples diff --git a/docs/kcl/std-units-toCentimeters.md b/docs/kcl/functions/std-units-toCentimeters.md similarity index 77% rename from docs/kcl/std-units-toCentimeters.md rename to docs/kcl/functions/std-units-toCentimeters.md index ace5545d1..91b4ee4bd 100644 --- a/docs/kcl/std-units-toCentimeters.md +++ b/docs/kcl/functions/std-units-toCentimeters.md @@ -9,7 +9,7 @@ Convert a number to centimeters from its current units. ```kcl -units::toCentimeters(@num: [number](/docs/kcl/types/number)(cm)): [number](/docs/kcl/types/number)(cm) +units::toCentimeters(@num: number(cm)): number(cm) ``` diff --git a/docs/kcl/std-units-toDegrees.md b/docs/kcl/functions/std-units-toDegrees.md similarity index 99% rename from docs/kcl/std-units-toDegrees.md rename to docs/kcl/functions/std-units-toDegrees.md index f933d817f..269f2ee83 100644 --- a/docs/kcl/std-units-toDegrees.md +++ b/docs/kcl/functions/std-units-toDegrees.md @@ -9,7 +9,7 @@ Converts a number to degrees from its current units. ```kcl -units::toDegrees(@num: [number](/docs/kcl/types/number)(deg)): [number](/docs/kcl/types/number)(deg) +units::toDegrees(@num: number(deg)): number(deg) ``` diff --git a/docs/kcl/std-units-toFeet.md b/docs/kcl/functions/std-units-toFeet.md similarity index 78% rename from docs/kcl/std-units-toFeet.md rename to docs/kcl/functions/std-units-toFeet.md index e641eb290..389efa16d 100644 --- a/docs/kcl/std-units-toFeet.md +++ b/docs/kcl/functions/std-units-toFeet.md @@ -9,7 +9,7 @@ Convert a number to feet from its current units. ```kcl -units::toFeet(@num: [number](/docs/kcl/types/number)(ft)): [number](/docs/kcl/types/number)(ft) +units::toFeet(@num: number(ft)): number(ft) ``` diff --git a/docs/kcl/std-units-toInches.md b/docs/kcl/functions/std-units-toInches.md similarity index 78% rename from docs/kcl/std-units-toInches.md rename to docs/kcl/functions/std-units-toInches.md index 4b5e96720..c38ed2379 100644 --- a/docs/kcl/std-units-toInches.md +++ b/docs/kcl/functions/std-units-toInches.md @@ -9,7 +9,7 @@ Convert a number to inches from its current units. ```kcl -units::toInches(@num: [number](/docs/kcl/types/number)(in)): [number](/docs/kcl/types/number)(in) +units::toInches(@num: number(in)): number(in) ``` diff --git a/docs/kcl/std-units-toMeters.md b/docs/kcl/functions/std-units-toMeters.md similarity index 78% rename from docs/kcl/std-units-toMeters.md rename to docs/kcl/functions/std-units-toMeters.md index e8b059b99..d9e214e67 100644 --- a/docs/kcl/std-units-toMeters.md +++ b/docs/kcl/functions/std-units-toMeters.md @@ -9,7 +9,7 @@ Convert a number to meters from its current units. ```kcl -units::toMeters(@num: [number](/docs/kcl/types/number)(m)): [number](/docs/kcl/types/number)(m) +units::toMeters(@num: number(m)): number(m) ``` diff --git a/docs/kcl/std-units-toMillimeters.md b/docs/kcl/functions/std-units-toMillimeters.md similarity index 77% rename from docs/kcl/std-units-toMillimeters.md rename to docs/kcl/functions/std-units-toMillimeters.md index 1a485b2b5..dafde0542 100644 --- a/docs/kcl/std-units-toMillimeters.md +++ b/docs/kcl/functions/std-units-toMillimeters.md @@ -9,7 +9,7 @@ Convert a number to millimeters from its current units. ```kcl -units::toMillimeters(@num: [number](/docs/kcl/types/number)(mm)): [number](/docs/kcl/types/number)(mm) +units::toMillimeters(@num: number(mm)): number(mm) ``` diff --git a/docs/kcl/std-units-toRadians.md b/docs/kcl/functions/std-units-toRadians.md similarity index 99% rename from docs/kcl/std-units-toRadians.md rename to docs/kcl/functions/std-units-toRadians.md index 6857f4bd7..4fd89d332 100644 --- a/docs/kcl/std-units-toRadians.md +++ b/docs/kcl/functions/std-units-toRadians.md @@ -9,7 +9,7 @@ Converts a number to radians from its current units. ```kcl -units::toRadians(@num: [number](/docs/kcl/types/number)(rad)): [number](/docs/kcl/types/number)(rad) +units::toRadians(@num: number(rad)): number(rad) ``` diff --git a/docs/kcl/std-units-toYards.md b/docs/kcl/functions/std-units-toYards.md similarity index 78% rename from docs/kcl/std-units-toYards.md rename to docs/kcl/functions/std-units-toYards.md index 26de1bbfc..52293f421 100644 --- a/docs/kcl/std-units-toYards.md +++ b/docs/kcl/functions/std-units-toYards.md @@ -9,7 +9,7 @@ Converts a number to yards from its current units. ```kcl -units::toYards(@num: [number](/docs/kcl/types/number)(yd)): [number](/docs/kcl/types/number)(yd) +units::toYards(@num: number(yd)): number(yd) ``` diff --git a/docs/kcl/getCommonEdge.md b/docs/kcl/getCommonEdge.md index e3e4ec748..32b65ab72 100644 --- a/docs/kcl/getCommonEdge.md +++ b/docs/kcl/getCommonEdge.md @@ -9,7 +9,7 @@ Get the shared edge between two faces. ```kcl -getCommon[Edge](/docs/kcl/types/Edge)(faces: [[TagIdentifier](/docs/kcl/types#tag-identifier)]): Uuid +getCommonEdge(faces: [TagIdentifier]): Uuid ``` @@ -17,7 +17,7 @@ getCommon[Edge](/docs/kcl/types/Edge)(faces: [[TagIdentifier](/docs/kcl/types#ta | Name | Type | Description | Required | |----------|------|-------------|----------| -| `faces` | `[TagIdentifier]` | The tags of the faces you want to find the common edge between | Yes | +| `faces` | [`[TagIdentifier]`](/docs/kcl/types#TagIdentifier) | The tags of the faces you want to find the common edge between | Yes | ### Returns diff --git a/docs/kcl/getNextAdjacentEdge.md b/docs/kcl/getNextAdjacentEdge.md index efb08372b..1619bde57 100644 --- a/docs/kcl/getNextAdjacentEdge.md +++ b/docs/kcl/getNextAdjacentEdge.md @@ -9,7 +9,7 @@ Get the next adjacent edge to the edge given. ```kcl -getNextAdjacent[Edge](/docs/kcl/types/Edge)(edge: [TagIdentifier](/docs/kcl/types#tag-identifier)): Uuid +getNextAdjacentEdge(edge: TagIdentifier): Uuid ``` @@ -17,7 +17,7 @@ getNextAdjacent[Edge](/docs/kcl/types/Edge)(edge: [TagIdentifier](/docs/kcl/type | Name | Type | Description | Required | |----------|------|-------------|----------| -| `edge` | [`TagIdentifier`](/docs/kcl/types#tag-identifier) | The tag of the edge you want to find the next adjacent edge of. | Yes | +| `edge` | [`TagIdentifier`](/docs/kcl/types#TagIdentifier) | The tag of the edge you want to find the next adjacent edge of. | Yes | ### Returns diff --git a/docs/kcl/getOppositeEdge.md b/docs/kcl/getOppositeEdge.md index 5503c82fa..430e56cd8 100644 --- a/docs/kcl/getOppositeEdge.md +++ b/docs/kcl/getOppositeEdge.md @@ -9,7 +9,7 @@ Get the opposite edge to the edge given. ```kcl -getOpposite[Edge](/docs/kcl/types/Edge)(edge: [TagIdentifier](/docs/kcl/types#tag-identifier)): Uuid +getOppositeEdge(edge: TagIdentifier): Uuid ``` @@ -17,7 +17,7 @@ getOpposite[Edge](/docs/kcl/types/Edge)(edge: [TagIdentifier](/docs/kcl/types#ta | Name | Type | Description | Required | |----------|------|-------------|----------| -| `edge` | [`TagIdentifier`](/docs/kcl/types#tag-identifier) | The tag of the edge you want to find the opposite edge of. | Yes | +| `edge` | [`TagIdentifier`](/docs/kcl/types#TagIdentifier) | The tag of the edge you want to find the opposite edge of. | Yes | ### Returns diff --git a/docs/kcl/getPreviousAdjacentEdge.md b/docs/kcl/getPreviousAdjacentEdge.md index 07f7dca58..75fe03a09 100644 --- a/docs/kcl/getPreviousAdjacentEdge.md +++ b/docs/kcl/getPreviousAdjacentEdge.md @@ -9,7 +9,7 @@ Get the previous adjacent edge to the edge given. ```kcl -getPreviousAdjacent[Edge](/docs/kcl/types/Edge)(edge: [TagIdentifier](/docs/kcl/types#tag-identifier)): Uuid +getPreviousAdjacentEdge(edge: TagIdentifier): Uuid ``` @@ -17,7 +17,7 @@ getPreviousAdjacent[Edge](/docs/kcl/types/Edge)(edge: [TagIdentifier](/docs/kcl/ | Name | Type | Description | Required | |----------|------|-------------|----------| -| `edge` | [`TagIdentifier`](/docs/kcl/types#tag-identifier) | The tag of the edge you want to find the previous adjacent edge of. | Yes | +| `edge` | [`TagIdentifier`](/docs/kcl/types#TagIdentifier) | The tag of the edge you want to find the previous adjacent edge of. | Yes | ### Returns diff --git a/docs/kcl/index.md b/docs/kcl/index.md index 2ad34ff11..59ae2a4a2 100644 --- a/docs/kcl/index.md +++ b/docs/kcl/index.md @@ -12,24 +12,10 @@ layout: manual * [`Modules`](kcl/modules) * [`Settings`](kcl/settings) * [`Known Issues`](kcl/known-issues) -* [`Constants`](kcl/consts) -### Standard library +### Functions -* **Primitive types** - * [`bool`](kcl/types/bool) - * [`number`](kcl/types/number) - * [`string`](kcl/types/string) - * [`tag`](kcl/types/tag) * **std** - * [`END`](kcl/consts/std-END) - * [`START`](kcl/consts/std-START) - * [`X`](kcl/consts/std-X) - * [`XY`](kcl/consts/std-XY) - * [`XZ`](kcl/consts/std-XZ) - * [`Y`](kcl/consts/std-Y) - * [`YZ`](kcl/consts/std-YZ) - * [`Z`](kcl/consts/std-Z) * [`angledLine`](kcl/angledLine) * [`angledLineThatIntersects`](kcl/angledLineThatIntersects) * [`appearance`](kcl/appearance) @@ -45,7 +31,7 @@ layout: manual * [`getNextAdjacentEdge`](kcl/getNextAdjacentEdge) * [`getOppositeEdge`](kcl/getOppositeEdge) * [`getPreviousAdjacentEdge`](kcl/getPreviousAdjacentEdge) - * [`helix`](kcl/std-helix) + * [`helix`](kcl/functions/std-helix) * [`intersect`](kcl/intersect) * [`involuteCircular`](kcl/involuteCircular) * [`lastSegX`](kcl/lastSegX) @@ -56,7 +42,7 @@ layout: manual * [`line`](kcl/line) * [`loft`](kcl/loft) * [`map`](kcl/map) - * [`offsetPlane`](kcl/std-offsetPlane) + * [`offsetPlane`](kcl/functions/std-offsetPlane) * [`patternCircular2d`](kcl/patternCircular2d) * [`patternCircular3d`](kcl/patternCircular3d) * [`patternLinear2d`](kcl/patternLinear2d) @@ -70,7 +56,7 @@ layout: manual * [`profileStartY`](kcl/profileStartY) * [`push`](kcl/push) * [`reduce`](kcl/reduce) - * [`revolve`](kcl/std-revolve) + * [`revolve`](kcl/functions/std-revolve) * [`rotate`](kcl/rotate) * [`scale`](kcl/scale) * [`segAng`](kcl/segAng) @@ -92,61 +78,90 @@ layout: manual * [`union`](kcl/union) * [`xLine`](kcl/xLine) * [`yLine`](kcl/yLine) +* **std::math** + * [`abs`](kcl/functions/std-math-abs) + * [`acos`](kcl/functions/std-math-acos) + * [`asin`](kcl/functions/std-math-asin) + * [`atan`](kcl/functions/std-math-atan) + * [`atan2`](kcl/functions/std-math-atan2) + * [`ceil`](kcl/functions/std-math-ceil) + * [`cos`](kcl/functions/std-math-cos) + * [`floor`](kcl/functions/std-math-floor) + * [`ln`](kcl/functions/std-math-ln) + * [`log`](kcl/functions/std-math-log) + * [`log10`](kcl/functions/std-math-log10) + * [`log2`](kcl/functions/std-math-log2) + * [`max`](kcl/functions/std-math-max) + * [`min`](kcl/functions/std-math-min) + * [`polar`](kcl/functions/std-math-polar) + * [`pow`](kcl/functions/std-math-pow) + * [`rem`](kcl/functions/std-math-rem) + * [`round`](kcl/functions/std-math-round) + * [`sin`](kcl/functions/std-math-sin) + * [`sqrt`](kcl/functions/std-math-sqrt) + * [`tan`](kcl/functions/std-math-tan) +* **std::sketch** + * [`circle`](kcl/functions/std-sketch-circle) + * [`mirror2d`](kcl/functions/std-sketch-mirror2d) +* **std::solid** + * [`chamfer`](kcl/functions/std-solid-chamfer) + * [`fillet`](kcl/functions/std-solid-fillet) + * [`hollow`](kcl/functions/std-solid-hollow) + * [`shell`](kcl/functions/std-solid-shell) +* **std::units** + * [`units::toCentimeters`](kcl/functions/std-units-toCentimeters) + * [`units::toDegrees`](kcl/functions/std-units-toDegrees) + * [`units::toFeet`](kcl/functions/std-units-toFeet) + * [`units::toInches`](kcl/functions/std-units-toInches) + * [`units::toMeters`](kcl/functions/std-units-toMeters) + * [`units::toMillimeters`](kcl/functions/std-units-toMillimeters) + * [`units::toRadians`](kcl/functions/std-units-toRadians) + * [`units::toYards`](kcl/functions/std-units-toYards) + +### Constants + +* **std** + * [`END`](kcl/consts/std-END) + * [`START`](kcl/consts/std-START) + * [`X`](kcl/consts/std-X) + * [`XY`](kcl/consts/std-XY) + * [`XZ`](kcl/consts/std-XZ) + * [`Y`](kcl/consts/std-Y) + * [`YZ`](kcl/consts/std-YZ) + * [`Z`](kcl/consts/std-Z) * **std::math** * [`E`](kcl/consts/std-math-E) * [`PI`](kcl/consts/std-math-PI) * [`TAU`](kcl/consts/std-math-TAU) - * [`abs`](kcl/std-math-abs) - * [`acos`](kcl/std-math-acos) - * [`asin`](kcl/std-math-asin) - * [`atan`](kcl/std-math-atan) - * [`atan2`](kcl/std-math-atan2) - * [`ceil`](kcl/std-math-ceil) - * [`cos`](kcl/std-math-cos) - * [`floor`](kcl/std-math-floor) - * [`ln`](kcl/std-math-ln) - * [`log`](kcl/std-math-log) - * [`log10`](kcl/std-math-log10) - * [`log2`](kcl/std-math-log2) - * [`max`](kcl/std-math-max) - * [`min`](kcl/std-math-min) - * [`polar`](kcl/std-math-polar) - * [`pow`](kcl/std-math-pow) - * [`rem`](kcl/std-math-rem) - * [`round`](kcl/std-math-round) - * [`sin`](kcl/std-math-sin) - * [`sqrt`](kcl/std-math-sqrt) - * [`tan`](kcl/std-math-tan) -* **std::sketch** - * [`circle`](kcl/std-sketch-circle) - * [`mirror2d`](kcl/std-sketch-mirror2d) -* **std::solid** - * [`chamfer`](kcl/std-solid-chamfer) - * [`fillet`](kcl/std-solid-fillet) - * [`hollow`](kcl/std-solid-hollow) - * [`shell`](kcl/std-solid-shell) * **std::turns** * [`turns::HALF_TURN`](kcl/consts/std-turns-HALF_TURN) * [`turns::QUARTER_TURN`](kcl/consts/std-turns-QUARTER_TURN) * [`turns::THREE_QUARTER_TURN`](kcl/consts/std-turns-THREE_QUARTER_TURN) * [`turns::ZERO`](kcl/consts/std-turns-ZERO) + +### Types + +See also the [types overview](types) + +* **Primitive types** + * [`End`](kcl/types.md#End) + * [`ImportedGeometry`](kcl/types.md#ImportedGeometry) + * [`Start`](kcl/types.md#Start) + * [`TagDeclarator`](kcl/types.md#TagDeclarator) + * [`TagIdentifier`](kcl/types.md#TagIdentifier) + * [`any`](kcl/types/std-types-any) + * [`bool`](kcl/types/std-types-bool) + * [`number`](kcl/types/std-types-number) + * [`string`](kcl/types/std-types-string) + * [`tag`](kcl/types/std-types-tag) * **std::types** - * [`Axis2d`](kcl/types/Axis2d) - * [`Axis3d`](kcl/types/Axis3d) - * [`Edge`](kcl/types/Edge) - * [`Face`](kcl/types/Face) - * [`Helix`](kcl/types/Helix) - * [`Plane`](kcl/types/Plane) - * [`Point2d`](kcl/types/Point2d) - * [`Point3d`](kcl/types/Point3d) - * [`Sketch`](kcl/types/Sketch) - * [`Solid`](kcl/types/Solid) -* **std::units** - * [`units::toCentimeters`](kcl/std-units-toCentimeters) - * [`units::toDegrees`](kcl/std-units-toDegrees) - * [`units::toFeet`](kcl/std-units-toFeet) - * [`units::toInches`](kcl/std-units-toInches) - * [`units::toMeters`](kcl/std-units-toMeters) - * [`units::toMillimeters`](kcl/std-units-toMillimeters) - * [`units::toRadians`](kcl/std-units-toRadians) - * [`units::toYards`](kcl/std-units-toYards) + * [`Axis2d`](kcl/types/std-types-Axis2d) + * [`Axis3d`](kcl/types/std-types-Axis3d) + * [`Edge`](kcl/types/std-types-Edge) + * [`Face`](kcl/types/std-types-Face) + * [`Helix`](kcl/types/std-types-Helix) + * [`Plane`](kcl/types/std-types-Plane) + * [`Point2d`](kcl/types/std-types-Point2d) + * [`Point3d`](kcl/types/std-types-Point3d) + * [`Sketch`](kcl/types/std-types-Sketch) + * [`Solid`](kcl/types/std-types-Solid) diff --git a/docs/kcl/int.md b/docs/kcl/int.md deleted file mode 100644 index 1ff85f72b..000000000 --- a/docs/kcl/int.md +++ /dev/null @@ -1,52 +0,0 @@ ---- -title: "int" -excerpt: "Convert a number to an integer." -layout: manual ---- - -**WARNING:** This function is deprecated. - -Convert a number to an integer. - -DEPRECATED use floor(), ceil(), or round(). - -```js -int(num: number): number -``` - -### Tags - -* `convert` - - -### Arguments - -| Name | Type | Description | Required | -|----------|------|-------------|----------| -| `num` | [`number`](/docs/kcl/types/number) | | Yes | - -### Returns - -[`number`](/docs/kcl/types/number) - - -### Examples - -```js -n = int(ceil(5 / 2)) -assert(n, isEqualTo = 3, error = "5/2 = 2.5, rounded up makes 3") -// Draw n cylinders. -startSketchOn(XZ) - |> circle(center = [0, 0], radius = 2) - |> extrude(length = 5) - |> patternTransform( - instances = n, - transform = fn(id) { - return { translate = [4 * id, 0, 0] } - }, - ) -``` - -![Rendered example of int 0](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABQAAAALQCAYAAADPfd1WAAFk00lEQVR4Ae3AA6AkWZbG8f937o3IzKdyS2Oubdu2bdu2bdu2bWmMnpZKr54yMyLu+Xa3anqmhztr1a8+6EEP4qqrrrrqqquuuuqqq6666qqrrrrqqquu+j+JylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXvVDXXHPNgwFe7MVe7LXPnDnzIIBrrrnmwddcc82DAc6cOfPga6655sG8EPfdd9+tPNPZs2dvve+++24F+Id/+IffAbjvvvtu/Yd/+Iff5qqr/pWuueaaB585c+bBL/ZiL/ZaANdcc82Dr7nmmgcDnDlz5sHXXHPNg3kh7rvvvlsBzp49eyvPdN99990K8A//8A+/c99999169uzZW++7775bueqqf4VrrrnmwQAv9mIv9tpnzpx5EMA111zz4GuuuebBZ86ceTDANddc82BeiPvuu+9Wnuns2bO33nfffbcC/MM//MPvANx33323/sM//MNvc9VVV1111VVXvTDoQQ96EFddddVVV1111RXXXHPNg1/sxV7stc+cOfOgF3/xF3/tF3uxF3ttgIsXLwJw8eJFnv70p3O/3d1dLl68yP12d3d5fo4fPw7AiRMnADh+/DgnTpzgxIkTADzkIQ8B4L777rv1H/7hH34b4B/+4R9+57777rv1H/7hH36bq/7fu+aaax585syZB7/Yi73Ya11zzTUPvuaaax585syZB19zzTUPftKTnnRr13UPvnjxIk94whO49tpr2d3d5eLFi9xvd3eXF+T48eMAnDhxAoCHPOQhABw/fpwTJ05w4sQJ7rvvvlsB/uEf/uG3/+Ef/uF37rvvvlv/4R/+4be56irgmmuuefBrv/ZrvxfAi7/4i7/2i73Yi702wMWLFwHY3d3laU97Gvfb3d3l4sWL2AZgd3eX52abEydOAHDixAkAjh8/zokTJwA4ceIED33oQwG47777bj179uyt9913363/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vTYPsL+/z1133cVdd93F/v4+d999N/8ekvj3kMS/1fb2No985CMBeNmXfVke6L777rv1t37rt777H/7hH37nH/7hH36bq/5fuuaaax782q/92u/14i/+4q/9Yi/2Yq/NMx0eHgJw7733ct999/H0pz+dF4Uk/iWSeFFI4oWRxL9EEhsbG2xubnLmzBnOnDnDmTNnODw8ZHNzE4D77rvv1t/6rd/67n/4h3/4nX/4h3/4ba76f+eaa6558JkzZx78Oq/zOu/1Yi/2Yq99zTXXPJhnWq/XXLp0ib29PdbrNXt7e9xPEg8kiecmiecmiQeSxHOTxHOTxPMjiecmiefW9z0nT54E4LrrruOB7rvvvlvPnj1769///d//9m//9m9/z3333XcrV1111VVXXfWfBz3oQQ/iqquuuuqqq/6rXHPNNQ8+c+bMg1/sxV7stSTpHd/xHT+LB9jf3wfgrrvu4u6772Z/f5+77rqLF5Uk/j0k8S/Z3t4G4BGPeAQAN9xwA9dffz0PdN9999169uzZW//+7//+t3/7t3/7e+67775bueqqB7jmmmse/GIv9mKv/WIv9mKvdc011zz4xV7sxV6bBzg8POS+++7j4OCAw8NDDg8Pue+++3ggSfxLJPGikMQLI4nntrm5ycbGBmfOnOGaa67hzJkzPNB99913K8Bv/dZvfTfAj/7oj34OV131XK655poHv9iLvdhrv87rvM57vdiLvdhr8wDr9Zr1es16vWZvb4/1es3e3h6SeG6SeCBJPDdJPDdJPDdJPDdJPD+z2Yy+79na2gJga2uLra0tntt9991362/91m999z/8wz/8zj/8wz/8NlddddVVV131Xwc96EEP4qqrrrrqqqv+u1xzzTUPBnixF3ux136xF3ux17rmmmse/GIv9mKvzXPZ398H4K677gLg7rvvZn9/H4D9/X329/e5nyT+PXZ2dgDY2tpie3ubra0tAG644Qauv/56np/77rvv1n/4h3/47fvuu+/Wf/iHf/idf/iHf/htrrrqX+Gaa6558Iu92Iu99ou92Iu91jXXXPPgF3uxF3ttnsvh4SEAh4eHHB4ect999wFweHjI4eEhh4eHPDdJvCgk8dw2NzfZ2NgA4JprrgHgmmuuAeDMmTM8t/vuu+9WgN/6rd/67n/4h3/4nX/4h3/4ba666l/hzJkzD5KkF3uxF3vtF3uxF3uta6655sEv9mIv9tr33Xffrddcc82Deab1es16vWa9XrO/vw/Aer1mGAbW6zWSeG6SeG6SeG6SeKC+75FE3/f0fU/f98xmM/q+Z2tri+fnvvvuu/Uf/uEffvu+++679R/+4R9+5x/+4R9+m6uuuuqqq67674Me9KAHcdVVV1111VX/k1xzzTUPPnPmzIOvueaaB7/Yi73Ya11zzTUPPnPmzIOvueaaB/NC7O/vc7/9/X0ADg4OeEG2tra43/b2NgDb29u8MPfdd9+tAP/wD//w2/fdd9+t//AP//A7//AP//DbXHXVf4JrrrnmwS/2Yi/22i/2Yi/2WgDXXHPNg1/sxV7stXkhDg8Pud/h4SH3Ozo6wjYPJImNjQ0eaHNzk83NTf4l9913361nz5699e///u9/++zZs8+47777bv2Hf/iH3+aqq/6DnTlz5kHXXHPNQ6655poHv9iLvdhrXXPNNQ9+sRd7sdfmhViv19xvGAbut16vkYRtJPFAfd9zv9lsRt/3/Evuu+++W8+ePXvr3//93/82wD/8wz/8zj/8wz/8NlddddVVV131Pwt60IMexFVXXXXVVVf9b3DNNdc8GODMmTMPvuaaax505syZB19zzTUPvuaaax4McObMmQdfc801D+ZfcN999916zTXXPJhnuu+++2695pprHnzffffdCnD27Nlb77vvvlvvu+++WwHOnj37jPvuu+/Wf/iHf/htrrrqf4BrrrnmwWfOnHnwNddc8+AzZ8486JprrnkwwDXXXPPgM2fOPBjgmmuueTAvgvvuu+/Wa6655sE803333XcrwNmzZ28F+Pu///vfBjh79uwz7rvvvlvPnj1763333XcrV1313+yaa6558JkzZx58zTXXPBjgxV7sxV4L4JprrnkwwJkzZx58zTXXPJh/g/vuu+9Wnuns2bO33nfffbfed999twL8wz/8w+8A/MM//MNvc9VVV1111VX/O6AHPehBXHXVVVddddX/Rddcc82DbVuSeADbliSA++6771auuur/sGuuuebBALYtSTyAbUvSfffddytXXfV/2DXXXPNgnsm2JYkHsG1Juu+++27lqquuuuqqq/7vQQ960IO46qqrrrrqqquuuuqqq6666qqrrrrqqqv+T6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4p/BOit0SjAd94mAAAAAElFTkSuQmCC) - - diff --git a/docs/kcl/intersect.md b/docs/kcl/intersect.md index 91911bbc0..22da99281 100644 --- a/docs/kcl/intersect.md +++ b/docs/kcl/intersect.md @@ -10,9 +10,9 @@ Intersect computes the geometric intersection of multiple solid bodies, returnin ```kcl intersect( - solids: [[[Solid](/docs/kcl/types/Solid)]](/docs/kcl/types/[Solid](/docs/kcl/types/Solid)), - tolerance?: [number](/docs/kcl/types/number), -): [[[Solid](/docs/kcl/types/Solid)]](/docs/kcl/types/[Solid](/docs/kcl/types/Solid)) + solids: [Solid], + tolerance?: number, +): [Solid] ``` @@ -20,12 +20,12 @@ intersect( | Name | Type | Description | Required | |----------|------|-------------|----------| -| `solids` | [`[Solid]`](/docs/kcl/types/Solid) | The solids to intersect. | Yes | -| `tolerance` | [`number`](/docs/kcl/types/number) | The tolerance to use for the intersection operation. | No | +| `solids` | [`[Solid]`](/docs/kcl/types/std-types-Solid) | The solids to intersect. | Yes | +| `tolerance` | [`number`](/docs/kcl/types/std-types-number) | The tolerance to use for the intersection operation. | No | ### Returns -[`[Solid]`](/docs/kcl/types/Solid) +[`[Solid]`](/docs/kcl/types/std-types-Solid) ### Examples @@ -44,8 +44,8 @@ fn cube(center, size) { |> extrude(length = 10) } -part001 = cube([0, 0], 10) -part002 = cube([7, 3], 5) +part001 = cube(center = [0, 0], size = 10) +part002 = cube(center = [7, 3], size = 5) |> translate(z = 1) intersectedPart = intersect([part001, part002]) @@ -69,8 +69,8 @@ fn cube(center, size) { |> extrude(length = 10) } -part001 = cube([0, 0], 10) -part002 = cube([7, 3], 5) +part001 = cube(center = [0, 0], size = 10) +part002 = cube(center = [7, 3], size = 5) |> translate(z = 1) // This is the equivalent of: intersect([part001, part002]) diff --git a/docs/kcl/involuteCircular.md b/docs/kcl/involuteCircular.md index d36928247..cd0c1a27e 100644 --- a/docs/kcl/involuteCircular.md +++ b/docs/kcl/involuteCircular.md @@ -10,13 +10,13 @@ Extend the current sketch with a new involute circular curve. ```kcl involuteCircular( - sketch: [Sketch](/docs/kcl/types/Sketch), - startRadius: [number](/docs/kcl/types/number), - endRadius: [number](/docs/kcl/types/number), - angle: [number](/docs/kcl/types/number), - reverse?: [bool](/docs/kcl/types/bool), - tag?: [TagDeclarator](/docs/kcl/types#tag-declaration), -): [Sketch](/docs/kcl/types/Sketch) + sketch: Sketch, + startRadius: number, + endRadius: number, + angle: number, + reverse?: bool, + tag?: TagDeclarator, +): Sketch ``` @@ -24,16 +24,16 @@ involuteCircular( | Name | Type | Description | Required | |----------|------|-------------|----------| -| `sketch` | [`Sketch`](/docs/kcl/types/Sketch) | Which sketch should this path be added to? | Yes | -| `startRadius` | [`number`](/docs/kcl/types/number) | The involute is described between two circles, start_radius is the radius of the inner circle. | Yes | -| `endRadius` | [`number`](/docs/kcl/types/number) | The involute is described between two circles, end_radius is the radius of the outer circle. | Yes | -| `angle` | [`number`](/docs/kcl/types/number) | The angle to rotate the involute by. A value of zero will produce a curve with a tangent along the x-axis at the start point of the curve. | Yes | -| `reverse` | [`bool`](/docs/kcl/types/bool) | If reverse is true, the segment will start from the end of the involute, otherwise it will start from that start. Defaults to false. | No | -| `tag` | [`TagDeclarator`](/docs/kcl/types#tag-declaration) | Create a new tag which refers to this line | No | +| `sketch` | [`Sketch`](/docs/kcl/types/std-types-Sketch) | Which sketch should this path be added to? | Yes | +| `startRadius` | [`number`](/docs/kcl/types/std-types-number) | The involute is described between two circles, start_radius is the radius of the inner circle. | Yes | +| `endRadius` | [`number`](/docs/kcl/types/std-types-number) | The involute is described between two circles, end_radius is the radius of the outer circle. | Yes | +| `angle` | [`number`](/docs/kcl/types/std-types-number) | The angle to rotate the involute by. A value of zero will produce a curve with a tangent along the x-axis at the start point of the curve. | Yes | +| `reverse` | [`bool`](/docs/kcl/types/std-types-bool) | If reverse is true, the segment will start from the end of the involute, otherwise it will start from that start. Defaults to false. | No | +| [`tag`](/docs/kcl/types/std-types-tag) | [`TagDeclarator`](/docs/kcl/types#TagDeclarator) | Create a new tag which refers to this line | No | ### Returns -[`Sketch`](/docs/kcl/types/Sketch) +[`Sketch`](/docs/kcl/types/std-types-Sketch) ### Examples diff --git a/docs/kcl/lastSegX.md b/docs/kcl/lastSegX.md index f1d2807e9..db5c4a4b4 100644 --- a/docs/kcl/lastSegX.md +++ b/docs/kcl/lastSegX.md @@ -9,7 +9,7 @@ Extract the 'x' axis value of the last line segment in the provided 2-d sketch. ```kcl -lastSegX(sketch: [Sketch](/docs/kcl/types/Sketch)): [number](/docs/kcl/types/number) +lastSegX(sketch: Sketch): number ``` @@ -17,11 +17,11 @@ lastSegX(sketch: [Sketch](/docs/kcl/types/Sketch)): [number](/docs/kcl/types/num | Name | Type | Description | Required | |----------|------|-------------|----------| -| `sketch` | [`Sketch`](/docs/kcl/types/Sketch) | The sketch whose line segment is being queried | Yes | +| `sketch` | [`Sketch`](/docs/kcl/types/std-types-Sketch) | The sketch whose line segment is being queried | Yes | ### Returns -[`number`](/docs/kcl/types/number) +[`number`](/docs/kcl/types/std-types-number) ### Examples diff --git a/docs/kcl/lastSegY.md b/docs/kcl/lastSegY.md index 3d1d078eb..638df839d 100644 --- a/docs/kcl/lastSegY.md +++ b/docs/kcl/lastSegY.md @@ -9,7 +9,7 @@ Extract the 'y' axis value of the last line segment in the provided 2-d sketch. ```kcl -lastSegY(sketch: [Sketch](/docs/kcl/types/Sketch)): [number](/docs/kcl/types/number) +lastSegY(sketch: Sketch): number ``` @@ -17,11 +17,11 @@ lastSegY(sketch: [Sketch](/docs/kcl/types/Sketch)): [number](/docs/kcl/types/num | Name | Type | Description | Required | |----------|------|-------------|----------| -| `sketch` | [`Sketch`](/docs/kcl/types/Sketch) | The sketch whose line segment is being queried | Yes | +| `sketch` | [`Sketch`](/docs/kcl/types/std-types-Sketch) | The sketch whose line segment is being queried | Yes | ### Returns -[`number`](/docs/kcl/types/number) +[`number`](/docs/kcl/types/std-types-number) ### Examples diff --git a/docs/kcl/legAngX.md b/docs/kcl/legAngX.md index ea374a70c..b0134682e 100644 --- a/docs/kcl/legAngX.md +++ b/docs/kcl/legAngX.md @@ -10,9 +10,9 @@ Compute the angle of the given leg for x. ```kcl legAngX( - hypotenuse: [number](/docs/kcl/types/number), - leg: [number](/docs/kcl/types/number), -): [number](/docs/kcl/types/number) + hypotenuse: number, + leg: number, +): number ``` ### Tags @@ -24,12 +24,12 @@ legAngX( | Name | Type | Description | Required | |----------|------|-------------|----------| -| `hypotenuse` | [`number`](/docs/kcl/types/number) | The length of the triangle's hypotenuse | Yes | -| `leg` | [`number`](/docs/kcl/types/number) | The length of one of the triangle's legs (i.e. non-hypotenuse side) | Yes | +| `hypotenuse` | [`number`](/docs/kcl/types/std-types-number) | The length of the triangle's hypotenuse | Yes | +| `leg` | [`number`](/docs/kcl/types/std-types-number) | The length of one of the triangle's legs (i.e. non-hypotenuse side) | Yes | ### Returns -[`number`](/docs/kcl/types/number) +[`number`](/docs/kcl/types/std-types-number) ### Examples diff --git a/docs/kcl/legAngY.md b/docs/kcl/legAngY.md index 2396c499b..7ecd6ea3b 100644 --- a/docs/kcl/legAngY.md +++ b/docs/kcl/legAngY.md @@ -10,9 +10,9 @@ Compute the angle of the given leg for y. ```kcl legAngY( - hypotenuse: [number](/docs/kcl/types/number), - leg: [number](/docs/kcl/types/number), -): [number](/docs/kcl/types/number) + hypotenuse: number, + leg: number, +): number ``` ### Tags @@ -24,12 +24,12 @@ legAngY( | Name | Type | Description | Required | |----------|------|-------------|----------| -| `hypotenuse` | [`number`](/docs/kcl/types/number) | The length of the triangle's hypotenuse | Yes | -| `leg` | [`number`](/docs/kcl/types/number) | The length of one of the triangle's legs (i.e. non-hypotenuse side) | Yes | +| `hypotenuse` | [`number`](/docs/kcl/types/std-types-number) | The length of the triangle's hypotenuse | Yes | +| `leg` | [`number`](/docs/kcl/types/std-types-number) | The length of one of the triangle's legs (i.e. non-hypotenuse side) | Yes | ### Returns -[`number`](/docs/kcl/types/number) +[`number`](/docs/kcl/types/std-types-number) ### Examples diff --git a/docs/kcl/legLen.md b/docs/kcl/legLen.md index 052b01a8c..9fc976ef7 100644 --- a/docs/kcl/legLen.md +++ b/docs/kcl/legLen.md @@ -10,9 +10,9 @@ Compute the length of the given leg. ```kcl legLen( - hypotenuse: [number](/docs/kcl/types/number), - leg: [number](/docs/kcl/types/number), -): [number](/docs/kcl/types/number) + hypotenuse: number, + leg: number, +): number ``` ### Tags @@ -24,12 +24,12 @@ legLen( | Name | Type | Description | Required | |----------|------|-------------|----------| -| `hypotenuse` | [`number`](/docs/kcl/types/number) | The length of the triangle's hypotenuse | Yes | -| `leg` | [`number`](/docs/kcl/types/number) | The length of one of the triangle's legs (i.e. non-hypotenuse side) | Yes | +| `hypotenuse` | [`number`](/docs/kcl/types/std-types-number) | The length of the triangle's hypotenuse | Yes | +| `leg` | [`number`](/docs/kcl/types/std-types-number) | The length of one of the triangle's legs (i.e. non-hypotenuse side) | Yes | ### Returns -[`number`](/docs/kcl/types/number) +[`number`](/docs/kcl/types/std-types-number) ### Examples diff --git a/docs/kcl/line.md b/docs/kcl/line.md index 89b9d7da5..768f50940 100644 --- a/docs/kcl/line.md +++ b/docs/kcl/line.md @@ -10,11 +10,11 @@ Extend the current sketch with a new straight line. ```kcl line( - sketch: [Sketch](/docs/kcl/types/Sketch), - endAbsolute?: [[[number](/docs/kcl/types/number)]](/docs/kcl/types/[number](/docs/kcl/types/number)), - end?: [[[number](/docs/kcl/types/number)]](/docs/kcl/types/[number](/docs/kcl/types/number)), - tag?: [TagDeclarator](/docs/kcl/types#tag-declaration), -): [Sketch](/docs/kcl/types/Sketch) + sketch: Sketch, + endAbsolute?: Point2d, + end?: Point2d, + tag?: TagDeclarator, +): Sketch ``` @@ -22,14 +22,14 @@ line( | Name | Type | Description | Required | |----------|------|-------------|----------| -| `sketch` | [`Sketch`](/docs/kcl/types/Sketch) | Which sketch should this path be added to? | Yes | -| `endAbsolute` | [`[number]`](/docs/kcl/types/number) | Which absolute point should this line go to? Incompatible with `end`. | No | -| `end` | [`[number]`](/docs/kcl/types/number) | How far away (along the X and Y axes) should this line go? Incompatible with `endAbsolute`. | No | -| `tag` | [`TagDeclarator`](/docs/kcl/types#tag-declaration) | Create a new tag which refers to this line | No | +| `sketch` | [`Sketch`](/docs/kcl/types/std-types-Sketch) | Which sketch should this path be added to? | Yes | +| `endAbsolute` | [`Point2d`](/docs/kcl/types/std-types-Point2d) | Which absolute point should this line go to? Incompatible with `end`. | No | +| `end` | [`Point2d`](/docs/kcl/types/std-types-Point2d) | How far away (along the X and Y axes) should this line go? Incompatible with `endAbsolute`. | No | +| [`tag`](/docs/kcl/types/std-types-tag) | [`TagDeclarator`](/docs/kcl/types#TagDeclarator) | Create a new tag which refers to this line | No | ### Returns -[`Sketch`](/docs/kcl/types/Sketch) +[`Sketch`](/docs/kcl/types/std-types-Sketch) ### Examples diff --git a/docs/kcl/loft.md b/docs/kcl/loft.md index 3f629fbaf..5e9619237 100644 --- a/docs/kcl/loft.md +++ b/docs/kcl/loft.md @@ -10,14 +10,14 @@ The sketches need to closed and on the same plane. ```kcl loft( - sketches: [[[Sketch](/docs/kcl/types/Sketch)]](/docs/kcl/types/[Sketch](/docs/kcl/types/Sketch)), - vDegree: NonZeroU32, - bezApproximateRational: [bool](/docs/kcl/types/bool), - baseCurveIndex?: integer, - tolerance?: [number](/docs/kcl/types/number), - tagStart?: [TagDeclarator](/docs/kcl/types#tag-declaration), - tagEnd?: [TagDeclarator](/docs/kcl/types#tag-declaration), -): [Solid](/docs/kcl/types/Solid) + sketches: [Sketch], + vDegree: number, + bezApproximateRational: bool, + baseCurveIndex?: number, + tolerance?: number, + tagStart?: TagDeclarator, + tagEnd?: TagDeclarator, +): Solid ``` @@ -25,17 +25,17 @@ loft( | Name | Type | Description | Required | |----------|------|-------------|----------| -| `sketches` | [`[Sketch]`](/docs/kcl/types/Sketch) | Which sketches to loft. Must include at least 2 sketches. | Yes | -| `vDegree` | `NonZeroU32` | Degree of the interpolation. Must be greater than zero. For example, use 2 for quadratic, or 3 for cubic interpolation in the V direction. This defaults to 2, if not specified. | Yes | -| `bezApproximateRational` | [`bool`](/docs/kcl/types/bool) | Attempt to approximate rational curves (such as arcs) using a bezier. This will remove banding around interpolations between arcs and non-arcs. It may produce errors in other scenarios Over time, this field won't be necessary. | Yes | -| `baseCurveIndex` | `integer` | This can be set to override the automatically determined topological base curve, which is usually the first section encountered. | No | -| `tolerance` | [`number`](/docs/kcl/types/number) | Tolerance for the loft operation. | No | -| `tagStart` | [`TagDeclarator`](/docs/kcl/types#tag-declaration) | A named tag for the face at the start of the loft, i.e. the original sketch | No | -| `tagEnd` | [`TagDeclarator`](/docs/kcl/types#tag-declaration) | A named tag for the face at the end of the loft, i.e. the last sketch | No | +| `sketches` | [`[Sketch]`](/docs/kcl/types/std-types-Sketch) | Which sketches to loft. Must include at least 2 sketches. | Yes | +| `vDegree` | [`number`](/docs/kcl/types/std-types-number) | Degree of the interpolation. Must be greater than zero. For example, use 2 for quadratic, or 3 for cubic interpolation in the V direction. This defaults to 2, if not specified. | Yes | +| `bezApproximateRational` | [`bool`](/docs/kcl/types/std-types-bool) | Attempt to approximate rational curves (such as arcs) using a bezier. This will remove banding around interpolations between arcs and non-arcs. It may produce errors in other scenarios Over time, this field won't be necessary. | Yes | +| `baseCurveIndex` | [`number`](/docs/kcl/types/std-types-number) | This can be set to override the automatically determined topological base curve, which is usually the first section encountered. | No | +| `tolerance` | [`number`](/docs/kcl/types/std-types-number) | Tolerance for the loft operation. | No | +| `tagStart` | [`TagDeclarator`](/docs/kcl/types#TagDeclarator) | A named tag for the face at the start of the loft, i.e. the original sketch | No | +| `tagEnd` | [`TagDeclarator`](/docs/kcl/types#TagDeclarator) | A named tag for the face at the end of the loft, i.e. the last sketch | No | ### Returns -[`Solid`](/docs/kcl/types/Solid) +[`Solid`](/docs/kcl/types/std-types-Solid) ### Examples diff --git a/docs/kcl/map.md b/docs/kcl/map.md index 76bfb8754..490420335 100644 --- a/docs/kcl/map.md +++ b/docs/kcl/map.md @@ -10,9 +10,9 @@ Given a list like `[a, b, c]`, and a function like `f`, returns `[f(a), f(b), f( ```kcl map( - array: [[[KclValue](/docs/kcl/types/KclValue)]](/docs/kcl/types/[KclValue](/docs/kcl/types/KclValue)), + array: [any], f: FunctionSource, -): [[[KclValue](/docs/kcl/types/KclValue)]](/docs/kcl/types/[KclValue](/docs/kcl/types/KclValue)) +): [any] ``` @@ -20,19 +20,19 @@ map( | Name | Type | Description | Required | |----------|------|-------------|----------| -| `array` | [`[KclValue]`](/docs/kcl/types/KclValue) | Input array. The output array is this input array, but every element has had the function `f` run on it. | Yes | +| `array` | [`[any]`](/docs/kcl/types/std-types-any) | Input array. The output array is this input array, but every element has had the function `f` run on it. | Yes | | `f` | `FunctionSource` | A function. The output array is just the input array, but `f` has been run on every item. | Yes | ### Returns -[`[KclValue]`](/docs/kcl/types/KclValue) +[`[any]`](/docs/kcl/types/std-types-any) ### Examples ```kcl r = 10 // radius -fn drawCircle(id) { +fn drawCircle(@id) { return startSketchOn(XY) |> circle(center = [id * 2 * r, 0], radius = r) } diff --git a/docs/kcl/modules.md b/docs/kcl/modules.md index 262780c51..47c4daa9a 100644 --- a/docs/kcl/modules.md +++ b/docs/kcl/modules.md @@ -12,7 +12,7 @@ to other modules. ```kcl // util.kcl -export fn increment(x) { +export fn increment(@x) { return x + 1 } ``` @@ -37,11 +37,11 @@ Multiple functions can be exported in a file. ```kcl // util.kcl -export fn increment(x) { +export fn increment(@x) { return x + 1 } -export fn decrement(x) { +export fn decrement(@x) { return x - 1 } ``` @@ -81,7 +81,7 @@ fn cube(center) { |> extrude(length = 10) } -myCube = cube([0, 0]) +myCube = cube(center = [0, 0]) ``` *Pros* diff --git a/docs/kcl/patternCircular2d.md b/docs/kcl/patternCircular2d.md index baf651308..00eaf2ea3 100644 --- a/docs/kcl/patternCircular2d.md +++ b/docs/kcl/patternCircular2d.md @@ -10,13 +10,13 @@ Repeat a 2-dimensional sketch some number of times along a partial or complete c ```kcl patternCircular2d( - sketchSet: [[[Sketch](/docs/kcl/types/Sketch)]](/docs/kcl/types/[Sketch](/docs/kcl/types/Sketch)), - instances: integer, - center: [[[number](/docs/kcl/types/number)]](/docs/kcl/types/[number](/docs/kcl/types/number)), - arcDegrees: [number](/docs/kcl/types/number), - rotateDuplicates: [bool](/docs/kcl/types/bool), - useOriginal?: [bool](/docs/kcl/types/bool), -): [[[Sketch](/docs/kcl/types/Sketch)]](/docs/kcl/types/[Sketch](/docs/kcl/types/Sketch)) + sketchSet: [Sketch], + instances: number, + center: Point2d, + arcDegrees: number, + rotateDuplicates: bool, + useOriginal?: bool, +): [Sketch] ``` @@ -24,16 +24,16 @@ patternCircular2d( | Name | Type | Description | Required | |----------|------|-------------|----------| -| `sketchSet` | [`[Sketch]`](/docs/kcl/types/Sketch) | Which sketch(es) to pattern | Yes | -| `instances` | `integer` | The number of total instances. Must be greater than or equal to 1. This includes the original entity. For example, if instances is 2, there will be two copies -- the original, and one new copy. If instances is 1, this has no effect. | Yes | -| `center` | [`[number]`](/docs/kcl/types/number) | The center about which to make the pattern. This is a 2D vector. | Yes | -| `arcDegrees` | [`number`](/docs/kcl/types/number) | The arc angle (in degrees) to place the repetitions. Must be greater than 0. | Yes | -| `rotateDuplicates` | [`bool`](/docs/kcl/types/bool) | Whether or not to rotate the duplicates as they are copied. | Yes | -| `useOriginal` | [`bool`](/docs/kcl/types/bool) | If the target was sketched on an extrusion, setting this will use the original sketch as the target, not the entire joined solid. Defaults to false. | No | +| `sketchSet` | [`[Sketch]`](/docs/kcl/types/std-types-Sketch) | Which sketch(es) to pattern | Yes | +| `instances` | [`number`](/docs/kcl/types/std-types-number) | The number of total instances. Must be greater than or equal to 1. This includes the original entity. For example, if instances is 2, there will be two copies -- the original, and one new copy. If instances is 1, this has no effect. | Yes | +| `center` | [`Point2d`](/docs/kcl/types/std-types-Point2d) | The center about which to make the pattern. This is a 2D vector. | Yes | +| `arcDegrees` | [`number`](/docs/kcl/types/std-types-number) | The arc angle (in degrees) to place the repetitions. Must be greater than 0. | Yes | +| `rotateDuplicates` | [`bool`](/docs/kcl/types/std-types-bool) | Whether or not to rotate the duplicates as they are copied. | Yes | +| `useOriginal` | [`bool`](/docs/kcl/types/std-types-bool) | If the target was sketched on an extrusion, setting this will use the original sketch as the target, not the entire joined solid. Defaults to false. | No | ### Returns -[`[Sketch]`](/docs/kcl/types/Sketch) +[`[Sketch]`](/docs/kcl/types/std-types-Sketch) ### Examples diff --git a/docs/kcl/patternCircular3d.md b/docs/kcl/patternCircular3d.md index a7eb350ed..0276595e7 100644 --- a/docs/kcl/patternCircular3d.md +++ b/docs/kcl/patternCircular3d.md @@ -10,14 +10,14 @@ Repeat a 3-dimensional solid some number of times along a partial or complete ci ```kcl patternCircular3d( - solids: [[[Solid](/docs/kcl/types/Solid)]](/docs/kcl/types/[Solid](/docs/kcl/types/Solid)), - instances: integer, - axis: [[[number](/docs/kcl/types/number)]](/docs/kcl/types/[number](/docs/kcl/types/number)), - center: [[[number](/docs/kcl/types/number)]](/docs/kcl/types/[number](/docs/kcl/types/number)), - arcDegrees: [number](/docs/kcl/types/number), - rotateDuplicates: [bool](/docs/kcl/types/bool), - useOriginal?: [bool](/docs/kcl/types/bool), -): [[[Solid](/docs/kcl/types/Solid)]](/docs/kcl/types/[Solid](/docs/kcl/types/Solid)) + solids: [Solid], + instances: number, + axis: [number], + center: Point3d, + arcDegrees: number, + rotateDuplicates: bool, + useOriginal?: bool, +): [Solid] ``` @@ -25,17 +25,17 @@ patternCircular3d( | Name | Type | Description | Required | |----------|------|-------------|----------| -| `solids` | [`[Solid]`](/docs/kcl/types/Solid) | Which solid(s) to pattern | Yes | -| `instances` | `integer` | The number of total instances. Must be greater than or equal to 1. This includes the original entity. For example, if instances is 2, there will be two copies -- the original, and one new copy. If instances is 1, this has no effect. | Yes | -| `axis` | [`[number]`](/docs/kcl/types/number) | The axis around which to make the pattern. This is a 3D vector | Yes | -| `center` | [`[number]`](/docs/kcl/types/number) | The center about which to make the pattern. This is a 3D vector. | Yes | -| `arcDegrees` | [`number`](/docs/kcl/types/number) | The arc angle (in degrees) to place the repetitions. Must be greater than 0. | Yes | -| `rotateDuplicates` | [`bool`](/docs/kcl/types/bool) | Whether or not to rotate the duplicates as they are copied. | Yes | -| `useOriginal` | [`bool`](/docs/kcl/types/bool) | If the target was sketched on an extrusion, setting this will use the original sketch as the target, not the entire joined solid. Defaults to false. | No | +| `solids` | [`[Solid]`](/docs/kcl/types/std-types-Solid) | Which solid(s) to pattern | Yes | +| `instances` | [`number`](/docs/kcl/types/std-types-number) | The number of total instances. Must be greater than or equal to 1. This includes the original entity. For example, if instances is 2, there will be two copies -- the original, and one new copy. If instances is 1, this has no effect. | Yes | +| `axis` | [`[number]`](/docs/kcl/types/std-types-number) | The axis around which to make the pattern. This is a 3D vector | Yes | +| `center` | [`Point3d`](/docs/kcl/types/std-types-Point3d) | The center about which to make the pattern. This is a 3D vector. | Yes | +| `arcDegrees` | [`number`](/docs/kcl/types/std-types-number) | The arc angle (in degrees) to place the repetitions. Must be greater than 0. | Yes | +| `rotateDuplicates` | [`bool`](/docs/kcl/types/std-types-bool) | Whether or not to rotate the duplicates as they are copied. | Yes | +| `useOriginal` | [`bool`](/docs/kcl/types/std-types-bool) | If the target was sketched on an extrusion, setting this will use the original sketch as the target, not the entire joined solid. Defaults to false. | No | ### Returns -[`[Solid]`](/docs/kcl/types/Solid) +[`[Solid]`](/docs/kcl/types/std-types-Solid) ### Examples diff --git a/docs/kcl/patternLinear2d.md b/docs/kcl/patternLinear2d.md index ac9fc71ad..5a8916700 100644 --- a/docs/kcl/patternLinear2d.md +++ b/docs/kcl/patternLinear2d.md @@ -10,12 +10,12 @@ Repeat a 2-dimensional sketch along some dimension, with a dynamic amount of dis ```kcl patternLinear2d( - sketches: [[[Sketch](/docs/kcl/types/Sketch)]](/docs/kcl/types/[Sketch](/docs/kcl/types/Sketch)), - instances: integer, - distance: [number](/docs/kcl/types/number), - axis: [[[number](/docs/kcl/types/number)]](/docs/kcl/types/[number](/docs/kcl/types/number)), - useOriginal?: [bool](/docs/kcl/types/bool), -): [[[Sketch](/docs/kcl/types/Sketch)]](/docs/kcl/types/[Sketch](/docs/kcl/types/Sketch)) + sketches: [Sketch], + instances: number, + distance: number, + axis: Point2d, + useOriginal?: bool, +): [Sketch] ``` @@ -23,15 +23,15 @@ patternLinear2d( | Name | Type | Description | Required | |----------|------|-------------|----------| -| `sketches` | [`[Sketch]`](/docs/kcl/types/Sketch) | The sketch(es) to duplicate | Yes | -| `instances` | `integer` | The number of total instances. Must be greater than or equal to 1. This includes the original entity. For example, if instances is 2, there will be two copies -- the original, and one new copy. If instances is 1, this has no effect. | Yes | -| `distance` | [`number`](/docs/kcl/types/number) | Distance between each repetition. Also known as 'spacing'. | Yes | -| `axis` | [`[number]`](/docs/kcl/types/number) | The axis of the pattern. A 2D vector. | Yes | -| `useOriginal` | [`bool`](/docs/kcl/types/bool) | If the target was sketched on an extrusion, setting this will use the original sketch as the target, not the entire joined solid. Defaults to false. | No | +| `sketches` | [`[Sketch]`](/docs/kcl/types/std-types-Sketch) | The sketch(es) to duplicate | Yes | +| `instances` | [`number`](/docs/kcl/types/std-types-number) | The number of total instances. Must be greater than or equal to 1. This includes the original entity. For example, if instances is 2, there will be two copies -- the original, and one new copy. If instances is 1, this has no effect. | Yes | +| `distance` | [`number`](/docs/kcl/types/std-types-number) | Distance between each repetition. Also known as 'spacing'. | Yes | +| `axis` | [`Point2d`](/docs/kcl/types/std-types-Point2d) | The axis of the pattern. A 2D vector. | Yes | +| `useOriginal` | [`bool`](/docs/kcl/types/std-types-bool) | If the target was sketched on an extrusion, setting this will use the original sketch as the target, not the entire joined solid. Defaults to false. | No | ### Returns -[`[Sketch]`](/docs/kcl/types/Sketch) +[`[Sketch]`](/docs/kcl/types/std-types-Sketch) ### Examples diff --git a/docs/kcl/patternLinear3d.md b/docs/kcl/patternLinear3d.md index f6c556eae..6aca53d0f 100644 --- a/docs/kcl/patternLinear3d.md +++ b/docs/kcl/patternLinear3d.md @@ -10,12 +10,12 @@ Repeat a 3-dimensional solid along a linear path, with a dynamic amount of dista ```kcl patternLinear3d( - solids: [[[Solid](/docs/kcl/types/Solid)]](/docs/kcl/types/[Solid](/docs/kcl/types/Solid)), - instances: integer, - distance: [number](/docs/kcl/types/number), - axis: [[[number](/docs/kcl/types/number)]](/docs/kcl/types/[number](/docs/kcl/types/number)), - useOriginal?: [bool](/docs/kcl/types/bool), -): [[[Solid](/docs/kcl/types/Solid)]](/docs/kcl/types/[Solid](/docs/kcl/types/Solid)) + solids: [Solid], + instances: number, + distance: number, + axis: Point3d, + useOriginal?: bool, +): [Solid] ``` @@ -23,15 +23,15 @@ patternLinear3d( | Name | Type | Description | Required | |----------|------|-------------|----------| -| `solids` | [`[Solid]`](/docs/kcl/types/Solid) | The solid(s) to duplicate | Yes | -| `instances` | `integer` | The number of total instances. Must be greater than or equal to 1. This includes the original entity. For example, if instances is 2, there will be two copies -- the original, and one new copy. If instances is 1, this has no effect. | Yes | -| `distance` | [`number`](/docs/kcl/types/number) | Distance between each repetition. Also known as 'spacing'. | Yes | -| `axis` | [`[number]`](/docs/kcl/types/number) | The axis of the pattern. A 2D vector. | Yes | -| `useOriginal` | [`bool`](/docs/kcl/types/bool) | If the target was sketched on an extrusion, setting this will use the original sketch as the target, not the entire joined solid. Defaults to false. | No | +| `solids` | [`[Solid]`](/docs/kcl/types/std-types-Solid) | The solid(s) to duplicate | Yes | +| `instances` | [`number`](/docs/kcl/types/std-types-number) | The number of total instances. Must be greater than or equal to 1. This includes the original entity. For example, if instances is 2, there will be two copies -- the original, and one new copy. If instances is 1, this has no effect. | Yes | +| `distance` | [`number`](/docs/kcl/types/std-types-number) | Distance between each repetition. Also known as 'spacing'. | Yes | +| `axis` | [`Point3d`](/docs/kcl/types/std-types-Point3d) | The axis of the pattern. A 2D vector. | Yes | +| `useOriginal` | [`bool`](/docs/kcl/types/std-types-bool) | If the target was sketched on an extrusion, setting this will use the original sketch as the target, not the entire joined solid. Defaults to false. | No | ### Returns -[`[Solid]`](/docs/kcl/types/Solid) +[`[Solid]`](/docs/kcl/types/std-types-Solid) ### Examples diff --git a/docs/kcl/patternTransform.md b/docs/kcl/patternTransform.md index 943e3ee60..7702b50a7 100644 --- a/docs/kcl/patternTransform.md +++ b/docs/kcl/patternTransform.md @@ -36,11 +36,11 @@ The transform function returns a transform object. All properties of the object ```kcl patternTransform( - solids: [[[Solid](/docs/kcl/types/Solid)]](/docs/kcl/types/[Solid](/docs/kcl/types/Solid)), - instances: integer, + solids: [Solid], + instances: number, transform: FunctionSource, - useOriginal?: [bool](/docs/kcl/types/bool), -): [[[Solid](/docs/kcl/types/Solid)]](/docs/kcl/types/[Solid](/docs/kcl/types/Solid)) + useOriginal?: bool, +): [Solid] ``` @@ -48,21 +48,21 @@ patternTransform( | Name | Type | Description | Required | |----------|------|-------------|----------| -| `solids` | [`[Solid]`](/docs/kcl/types/Solid) | The solid(s) to duplicate | Yes | -| `instances` | `integer` | The number of total instances. Must be greater than or equal to 1. This includes the original entity. For example, if instances is 2, there will be two copies -- the original, and one new copy. If instances is 1, this has no effect. | Yes | +| `solids` | [`[Solid]`](/docs/kcl/types/std-types-Solid) | The solid(s) to duplicate | Yes | +| `instances` | [`number`](/docs/kcl/types/std-types-number) | The number of total instances. Must be greater than or equal to 1. This includes the original entity. For example, if instances is 2, there will be two copies -- the original, and one new copy. If instances is 1, this has no effect. | Yes | | `transform` | `FunctionSource` | How each replica should be transformed. The transform function takes a single parameter: an integer representing which number replication the transform is for. E.g. the first replica to be transformed will be passed the argument `1`. This simplifies your math: the transform function can rely on id `0` being the original instance passed into the `patternTransform`. See the examples. | Yes | -| `useOriginal` | [`bool`](/docs/kcl/types/bool) | If the target was sketched on an extrusion, setting this will use the original sketch as the target, not the entire joined solid. Defaults to false. | No | +| `useOriginal` | [`bool`](/docs/kcl/types/std-types-bool) | If the target was sketched on an extrusion, setting this will use the original sketch as the target, not the entire joined solid. Defaults to false. | No | ### Returns -[`[Solid]`](/docs/kcl/types/Solid) +[`[Solid]`](/docs/kcl/types/std-types-Solid) ### Examples ```kcl // Each instance will be shifted along the X axis. -fn transform(id) { +fn transform(@id) { return { translate = [4 * id, 0, 0] } } @@ -79,7 +79,7 @@ sketch001 = startSketchOn(XZ) // Each instance will be shifted along the X axis, // with a gap between the original (at x = 0) and the first replica // (at x = 8). This is because `id` starts at 1. -fn transform(id) { +fn transform(@id) { return { translate = [4 * (1 + id), 0, 0] } } @@ -112,7 +112,7 @@ fn cube(length, center) { } width = 20 -fn transform(i) { +fn transform(@i) { return { // Move down each time. translate = [0, 0, -i * width], @@ -127,7 +127,7 @@ fn transform(i) { } } -myCubes = cube(width, [100, 0]) +myCubes = cube(length = width, center = [100, 0]) |> patternTransform(instances = 25, transform = transform) ``` @@ -154,7 +154,7 @@ fn cube(length, center) { } width = 20 -fn transform(i) { +fn transform(@i) { return { translate = [0, 0, -i * width], rotation = { @@ -164,7 +164,7 @@ fn transform(i) { } } } -myCubes = cube(width, [100, 100]) +myCubes = cube(length = width, center = [100, 100]) |> patternTransform(instances = 4, transform = transform) ``` @@ -177,7 +177,7 @@ h = 10 // layer height t = 0.005 // taper factor [0-1) // Defines how to modify each layer of the vase. // Each replica is shifted up the Z axis, and has a smoothly-varying radius -fn transform(replicaId) { +fn transform(@replicaId) { scale = r * abs(1 - (t * replicaId)) * (5 + cos((replicaId / 8): number(rad))) return { translate = [0, 0, replicaId * 10], @@ -200,7 +200,7 @@ vase = layer() ![Rendered example of patternTransform 4](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABQAAAALQCAYAAADPfd1WAAOi4klEQVR4Ae3AA6AkWZbG8f937o3IzKdyS2Oubdu2bdu2bdu2bWmMnpZKr54yMyLu+Xa3anqmhztr1a8+6EEP4qqrrrrqqquuuuqqq6666qqrrrrqqquu+j+JylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qr/Vtdcc82DAc6cOfNggGuuuebBAGfOnHkQD3DNNdc8GOCaa655MM/lzJkzD+b5uOaaax7Mv+C+++67lRfi7Nmzt/IA9913360803333XcrwNmzZ5/BM9133323Apw9e/ZWgPvuu+9Wrrrqqquuuuqqq67674Ie9KAHcdVVV1111VVXXXXVf5xrrrnmwQBnzpx58DXXXPPgM2fOPAjgmmuuefA111zzYIAzZ848+JprrnkwL8Rf/uVfArBarbjfpUuXuN/e3h7Pz6VLl5DEv9WxY8d4fnZ2drjfzs4OAMeOHWO9XgPwsi/7srwg9913360809mzZ2+97777bgW47777bj179uwz7rvvvlsBzp49e+t99913K1ddddVVV1111VVX/UdBD3rQg7jqqquuuuqqq6666kV3zTXXPPjMmTMPfrEXe7HXArjmmmsefM011zz4zJkzD77mmmsezHP5y7/8S1arFQCXLl1ib28PgEuXLrG3t8d/BEn8V5LEi2pnZ4f77ezscOzYMQB2dnaYzWa87Mu+LA9033333Qpw9uzZW++7775bAf7hH/7hd+67775bz549e+t99913K1ddddVVV111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ylN4mZd5GR7/+Mezv7/PE57wBO63vb3NYx7zGF7xFV8RgDvvvJPHP/7xvP7rvz5f9VVf9d2///u//z5cddVVV1111VVX/f9C5aqrrrrqqquuuur/oVrr7/z2b/82L/uyL8uP/diPcenSJV7lVV6FS5cu8Q7v8A78wz/8A4973OPY29vj8Y9/PI9//OP54z/+Y2666Sb29va439mzZ3nsYx/LG77hG7K3t8cdd9zBHXfcwd7eHnfccQfPbW9vD0k8/vGPB+Bxj3scD7SzswPAzs4OOzs7bG9v03Ude3t77OzssLe3x/12dnYAuHjxIseOHQPgpptu4t9rd3eXzARgd3eX48ePA7C3t8f99vb22N/fZ29vj/l8zq//+q+zt7cHwJ133sm/xc7ODo9+9KMBeKVXeiUA9vb2+Ku/+ivud8cdd3D+/Hm+93u/lwfa3t7mMY95DK/4iq/InXfeCcCf/umf8qd/+qe853u+J7/9279N13W/w1VXXXXVVVddddX/P1Suuuqqq6666qqr/h+65pprHvzar/3a3HHHHbzKq7wKv/Irv8LjHvc4HvvYx7Kzs8OxY8d4h3d4B+644w4e97jHcccdd7C3t8fjHvc4AP74j/+YnZ0dbrrpJu63s7PD2bNneexjH8tNN93E3t4eAHfccQd33HEH+/v77O3tsbe3xwuyt7cHwN7eHi+qnZ0d7rezs8Nz29nZ4YXZ29vjue3v7wOwt7fHCyKJf4udnR22t7e58cYbAbjpppu48cYb2dvbY39/n6c85SkA3HnnnQDM53N+8id/kjvvvBNJPND29jaPecxjeMVXfEXuvPNO7vc93/M97O/v8zZv8zYAPPaxj731N3/zN2/lqquuuuqqq6666v8fKlddddVVV1111VX/j910003s7e3xRm/0RvzKr/wKf/zHf8zjHvc4XuVVXoWdnR3Onj3L27/927O3t8fjHvc4Hve4x7G3twfA3t4ej3vc43jc4x4HwM7ODjfddBN7e3vccccd3HTTTQA85SlP4eEPfzg7OzvcdNNN7O3tAXDHHXcAcOedd7K3twfAHXfcwb/W3t4eAJLY39/nud155538R5LEC7OzswPA9vY2N954IwA7Ozvs7Oxw4403ArC3t8edd97Jfffdx4033sj97rjjDubzOT/5kz/JnXfeyQNJAmB7e5vHPOYxPPrRjwbg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+dne3uYxj3kMN954IzfeeCN7e3v81V/9Fff70z/9U/70T/+UB9re3ub1X//12d7e5nd+53e45ppr+N7v/V5e7/Vej1tvvZVhGG7lqquuuuqqq6666v8nKlddddVVV1111VX/T73O67zOe//QD/0QH/VRH8U//MM/8Md//Me88iu/MgBnz57l7d/+7bnjjjv44z/+Y/b29tjb2+OP//iPAdjZ2eGmm24CYGdnh52dHfb29njlV35l9vb22NvbY29vjzvvvJM77riDvb09ntve3h57e3u8IDs7OwDs7Oyws7PDfffdx87ODs/P7bffzou92IvxQDs7O/xb3X777ezt7XHzzTezv78PwB133MHOzg57e3vM53P29/f5yZ/8SQDuvPNOXlSSuN/29jY7OzvceOON3Hjjjdx4443s7e2xv7/PU57yFG688UYAFosF3/M938P+/j4PtL29zWMe8xhe8RVfkd/5nd/hZV7mZVgsFvzGb/wGN954I495zGP4nu/5Hm655Rauuuqqq6666qqr/p9CD3rQg7jqqquuuuqqq676/+ibvumbnn7NNdc8+Hd+53d4mZd5GX78x3+cvb09AF75lV+ZV37lV+aP//iPeexjH8sdd9zB4x73OO644w6e287ODjfddBM33XQTOzs73HTTTQD8zd/8DadOneKmm25ib2+Pvb099vb2uPPOO9nb2+OOO+7gRSWJf62dnR1eVHt7e0jiP8vOzg4AN954Izs7O9x4443ceOONAOzt7fFXf/VXvNZrvRYAe3t7POEJT+DOO+/kzjvv5PnZ3t7mFV/xFXnMYx7D4x//eB7zmMfwp3/6p/zpn/4pANvb27zXe70Xv/3bv81rv/Zrc9999936IR/yIQ/hqquuuuqqq6666v8fKlddddVVV1111VX/z61WK/7qr/6Kt3/7t+eP//iPedzjHscf//Ef87jHPY7HPvax7OzscPbsWd7+7d+evb09Hve4x/G4xz2Ovb09APb29njc4x7H4x73OCSxs7PDTTfdxPb2Nvfb2dlhZ2eHv/mbv+Exj3kMN910EwB7e3vs7e2xt7fHnXfeCcDe3h57e3vs7e0hiX+rvb09XhSSkMS/187ODgA33ngj29vbANx0003ceOONAOzt7QHwV3/1V9x4440A7O3tsb+/z2Kx4Kd+6qe48847eUG2t7d5zGMew6Mf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7rzzTu644w729va48847eWH29vbY29vjzjvvBODxj388AJIA2NnZAWB7exuAYRg4e/Ys29vb7OzssLe3B8D+/j73297e5l9jf3+f++3t7QGwv7/P/fb29tjf3+dpT3sae3t77O/v86KQxAuyvb3Nox/9aABe8RVfEYD9/X3+6q/+ige6ePEi3/u938vzs729zWMe8xhe4RVegf39fe73jd/4jTzQ677u63LjjTfyPd/zPRw7dgyA7e1tdnd3ueaaax78Oq/zOu/9W7/1W9/NVVddddVVV1111f8t6EEPehBXXXXVVVddddVV/9d8+Id/+Hdde+217723t8crv/Ir8+M//uPccccd3HTTTdx99918xEd8BH/8x3/MH//xHyOJ++3s7PAGb/AG/OVf/iUv+7Ivy87ODo973OO48847ueOOO3hBdnZ2uOmmm7jpppt4zGMeA8Dv/u7v8tCHPpSbbrqJvb09AO68807uuOMO9vb2uPPOO3lhJPGfRRL/2SRxv+3tbQAe/ehHA3DjjTdy4403sr+/z97eHk996lN5zdd8Tfb399nb2+POO+/kCU94Avv7+7wg29vbPPrRj+YVX/EV2d/f57d+67d4ndd5HX7jN36Du+66iwd63dd9XW688UZ+8id/kmPHjnHXXXfx6Ec/mtd93dcF4M4772R3d/e3P/MzP/N1uOqqq6666qqrrvq/hcpVV1111VVXXXXV/zHXXHPNg1/ndV7nvff29vjVX/1Vbr31Vl75lV+ZH//xH+eOO+7gsY99LACPfexjeexjH8tP/MRPsLe3B8De3h4/8RM/wc7ODgA7Ozvs7Ozwyq/8yuzt7fEnf/InPO5xj+O57e/v8/jHP57HP/7x/Nqv/Ro7OzvceOON7O/vc8cdd3DTTTcB8PSnP53HPOYx3HTTTQDs7e2xt7fH/v4+d9xxBwD7+/vceeed/GeRxH+G7e1tAHZ2drjxxhsBuPHGG7nxxhsB2N/fZ29vj6c+9ans7Oxwv/39febzOT/90z/NnXfeyQuzvb3Nox/9aG688UZuvPFG7rzzTvb39wHITL7v+76PB9re3uZ1X/d12dnZYXt7m2PHjnHXXXcB8KhHPYpbb72Vs2fP8uhHP5qu6x78Yi/2Yq/9D//wD7/NVVddddVVV1111f8dVK666qqrrrrqqqv+j/nwD//w7wLY2dlhb2+P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8AqvwF133cUNN9zAn/3Zn/Hnf/7nPND29jav+7qvyziOnDx5ku///u/nfu/+7u/O0572NG699VYe/ehH86hHPQqAf/iHf/jtz/zMz3wdrrrqqquuuuqqq/7nonLVVVddddVVV131P9iLvdiLvfaLvdiLvfYdd9zBzs4OAHfccQev/MqvzM7ODo997GN53OMex97eHn/yJ3/C273d2/FXf/VXvN3bvR0/8RM/wd7eHgB7e3v8yZ/8CY9//OO56aab+N7v/V7e+q3fmsc+9rE8/vGP5/GPfzx7e3s80N7eHnt7ezz+8Y9nZ2eHG2+8EYCdnR1+53d+h5d5mZfhlV7pldjb2+POO+/kjjvuYH9/nzvvvJN/yd7eHnt7e9x55508t52dHQC2t7cZhoH77ruPruu43/7+Ptvb2+zs7PCMZzyD48ePA3Ds2DF2dna434033si/x6VLl7h06RK7u7s86EEPYn9/H4C9vT329/fZ29sDYBxH9vf3+d7v/V729/d5bpL419je3ubRj340AK/wCq8AwP7+Pn/1V3/FjTfeyN7eHovFgv39fb7v+74PSTw/29vbPOpRj+IVXuEV2N/f5/u+7/t4vdd7Pb7/+7+f/f19Hmh7e5u3equ34sKFC5w8eZLv//7v536PetSj2N7eZj6fc9ddd/HoRz8agLvuuosXe7EXe+0Xe7EXe+1/+Id/+G2uuuqqq6666qqr/meictVVV1111VVXXfU/2Id/+Id/F8DjHvc4brrpJnZ2dgD44z/+Y86cOcMrv/Irc8cdd7C/v8/e3h4/8RM/wRu8wRvwV3/1V7zd270dj3vc4/iTP/kT7re3t8fjHvc4dnZ22Nvb46abbuLGG2/kMY95DHfeeSePe9zjuPPOO3lue3t77O3t8fjHP56dnR1uvPFG9vf3AdjZ2eGv//qveexjH8uNN97I3t4e+/v73HHHHdx5553ceeed/Gvs7e0BsLe3x5133okknvCEJ/CCbG9vc7+dnR3ut729zYtCEgD7+/s80N7eHvv7+/xbSeJfsr29zfb2NjfeeCM33HADN954IwD7+/v81V/9FQD7+/s84QlPYLFY8I3f+I08kCSe2/b2No961KN4hVd4Bfb399nf3wdAEj/zMz/Dc3vUox7F677u6/I3f/M3nDlzhu///u/nftvb27zu674uv/M7v8Mdd9yBJO73xCc+kRtuuIF3f/d3/65P+ZRPeQhXXXXVVVddddVV/zOhBz3oQVx11VVXXXXVVVf9T/SO7/iOn/VO7/ROnw3wrd/6rbzjO74jEcF3fud3AvD2b//2tNY4ceIE3/Vd38X9dnZ2eMxjHsMwDLzma74mj3vc4/iTP/kT9vb2eG47Ozu80iu9Er/5m7/JS77kS/Kar/ma7O3t8fjHP54/+ZM/4UWxs7PDjTfeyE033cSNN97Izs4OP/dzP8fDH/5wdnZ2uPHGG9nb22N/f5+9vT3uvPNO9vb2uPPOO/mXSOI/kyT+M0jigba3twG48cYb2d7e5oYbbuDGG28EYH9/n729PZ761Kfymq/5muzv73PnnXeyv7/PE57wBPb393l+JHG/7e1tHvWoR/HoRz+a7e1tfvd3f5e//du/5ZVe6ZV44hOfyP7+Ps9te3ub133d12V7e5vf+q3f4lGPehS/+Zu/yQO91Vu9FeM40nUdP/uzPwvAu73bu7G9vc3Xfu3X8pEf+ZEA/NZv/dZ3f/3Xf/37cNVVV1111VVXXfU/D5Wrrrrqqquuuuqq/6He6Z3e6bN5ppMnT3L8+HEAbrrpJu644w5+9Vd/lTd8wzcE4A3e4A34tV/7NQD29vb4kz/5E17plV4JgJ2dHd7u7d6Oxz3ucfzJn/wJD7S3t8ev//qvs7Ozw2w2A+C3f/u3edmXfVne+73fmzvvvJM77riDxz/+8bwge3t77O3t8YQnPAGAnZ0dbrzxRh5oZ2eHnZ0dzp8/z2Me8xhuvPFGAPb29tjf32dvb4+9vT329/fZ29tjf3+f/f19/jNJ4j/S9vY2Ozs77OzssL29DcANN9zAjTfeCMD+/j4AT3/609nZ2QFgf3+fvb097rrrLqZp4hu/8Rv5l0gCYHt7m0c96lHs7OzwqEc9iv39ff7qr/6Kl3mZl2GxWHD8+HH+/M//nOfn5V/+5XmFV3gF7rrrLra3t9na2uI3f/M3eaC3equ3Ynt7G4Af+IEfAGB7e5vt7W0ATp06BcD+/j4v9mIv9tpcddVVV1111VVX/c+EHvSgB3HVVVddddVVV131P83rvM7rvPeHf/iHfxfP9J3f+Z288iu/Mo997GN53OMex6/+6q8CsLOzw/u+7/uyt7fH4x73OP7kT/6EB9rZ2eGVXumVOHfuHC/90i8NwK/92q9xxx13IInntrOzw4033shNN93Eb/zGb/CSL/mSvPRLvzQAd955J3fccQd33nkne3t7PJAkXpidnR1uvPFGAG688UZ2dna48cYbud/f/u3f0nUdOzs73Hjjjdxvb28PgP39ffb29gDY399nb28PgP39fQD29vYA2N/f518iiRdme3ub++3s7ACwvb0NwPb2NgA7Oztsb28DcOONN3K//f19AO68807uu+8+XvM1X5P77e/vc+edd7K/v8+dd97JXXfdxb/Wzs4Oj3rUo7jxxhu54YYb2N/f56/+6q/427/9W972bd+WO++8kz//8z/nBdne3uat3uqtAPirv/orHv7wh/Obv/mb7O/v80Cv+7qvyw033MD29jY/+7M/y1133QXA67zO63DDDTdw11138ed//ue827u9G/f7rd/6re/++q//+vfhqquuuuqqq6666n8W9KAHPYirrrrqqquuuuqq/0muueaaB3/TN33T0x/3uMdx0003sbOzw3d+53cC8L7v+77s7e3x4z/+4+zt7SGJnZ0d3ud93oe9vT3uuOMOfu3Xfo3n9tjHPpbHPOYxPO1pT+M1X/M12dvb49d+7de48847eUF2dna48cYbecxjHsNNN93E7/7u7/LQhz6Um266ib29Pe68804e97jHcdddd/FvtbOzw/b2Njs7O9x4440A7OzssL29zc7ODvf7uZ/7OY4dO8bx48c5deoU99ve3gZgZ2eH52dvb48HksRz297e5gXZ39/nfnt7ewCcP3+e3d1dAF7zNV+T++3v77O3t8f+/j77+/sA3Hnnndx11138W21vb7O9vc2NN97Iox/9aLa3t9nf3+ev/uqveM3XfE329/d5whOewJ//+Z/zwmxvb/O6r/u63HDDDfzu7/4uL/MyL8Of/dmf8cQnPpEHksRbvuVbsr29zfb2Nj/7sz/LXXfdBcD29jbv9m7vBsDP/uzPsr+/z7u927uxv7/P/v4+GxsbfOZnfubr3Hnnnb/NVVddddVVV1111f8c6EEPehBXXXXVVVddddVV/5N87ud+7m+92Iu92Gs/7nGPY2dnh5tuuokf//Ef54477uCVX/mVuf766yml8BM/8RPcb2dnh/d5n/dhb28PgJ/4iZ9gb2+PB9rZ2eGmm27iDd7gDfjd3/1dXvM1X5O9vT3+5E/+hMc//vG8MDs7O9x4443s7OzwSq/0SgD87d/+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13md1+H3f//3efVXf3UAzp49+4wP/uAPfjBXXXXVVVddddVV/z3Qgx70IK666qqrrrrqqqv+O7zO67zOe3/4h3/4dwHs7e3xq7/6q7z+678+BwcH/PiP/zgApRTe5m3ehr29PX7t136N++3s7PB2b/d2/PVf/zUv/dIvzeMe9zj+5E/+hOd27NgxXumVXonHPOYx3HHHHezs7HDnnXfyuMc9jjvvvJMXZmdnh8c85jHceOON3HTTTQDceeed3Hjjjezt7XHnnXdy55138vjHP55/DUk8t+3tbQB2dnbY3t5mZ2eH7e1tdnZ2ANje3mZnZ4cH+tu//VuOHTsGwPHjxwGICLa3t/n3unTpEgC7u7vc70EPehAPtL+/D8De3h77+/vs7+8DcOeddwJw11138aKQxAuyvb3NDTfcwPb2No9+9KPZ3t5mf3+f7e1tAPb393nCE57AE5/4RPb393lukrjf9vY2j3rUo3j5l3959vf32d7e5q677uK3fuu32N/f57k96lGP4nVe53X4m7/5G86cOcPP/uzP8kBv+ZZvyfb2Nl/91V/NNddcA8BbvMVbcMMNN/Dbv/3bvNzLvRzb29sAfOZnfubr/MM//MNvc9VVV1111VVXXfVfDz3oQQ/iqquuuuqqq6666r/D537u5/7Wi73Yi7323t4eAD/+4z/O6dOnee3Xfm1+/Md/nL29PXZ2dnjf931f9vb2eNzjHsef/MmfcL+dnR0e85jHMAwDr/mar8njHvc4/uRP/oS9vT0AJPFAb/AGb8Bv/MZv8Jqv+Zq85Eu+JHfccQePf/zjefzjH88LI4mdnR1uvPFGbrzxRh7zmMcA8Ld/+7ecOnWKG2+8kb29Pe68807uvPNO9vb2uPPOO3l+JPHvsb29DcDOzg4A29vb3G9nZweAnZ0dntv29jbPz/7+Ps9tb2+P++3v7yOJvb09APb399nf3+c/giSe2/b2No961KMAeIVXeAUA9vf3+au/+ite8zVfk/39ffb397nzzjv58z//c14YSQBsb2/z8i//8jzqUY/irrvu4jd+4zd4vdd7PX7rt36L/f19ntv29jav8zqvww033MD3fd/38Yqv+Ir81m/9Fg/08i//8rz8y788AD/4gz/I/v4+AB/0QR/E7/zO73DnnXfyFm/xFmxvb7O/v89tt93225/5mZ/5Olx11VVXXXXV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VVddddVV/1WuueaaB3/TN33T03mmxz3ucTzucY/jFV7hFThx4gTf+Z3fCcBjH/tY5vM5L/3SL82v/dqvcccdd3C/nZ0dDg8PecmXfEle+qVfmsc97nH8yZ/8CQCSuN/Ozg6Pecxj+LM/+zNe8zVfk5d8yZdkb2+PP/mTP+Hxj388L8yxY8e48cYbufHGG7nxxhvZ2dnhb//2bzl16hQ33ngje3t73Hnnndx55508/vGP54WRxItie3sbgJ2dHba3t9nZ2WF7e5udnR0Atre3AdjZ2eFv//ZvOXbsGPc7fvw4AMeOHePf69KlS9xvd3eX+126dImXfMmXBGB/fx+Avb099vf32d/fB+DOO+8E4K677uK5SeJfa3t7m+3tbW644QZuvPFGbrjhBvb39/mrv/orXvM1X5P9/X2e8IQncPfdd3PXXXfxL9ne3uZ1Xud1uOGGG/jd3/1dXvM1X5M///M/58///M95fm644Qbe8i3fkmc84xl83/d9Hy/1Ui/FXXfdxf1uuOEG3uIt3oKf/dmfRRJ33XUXAO/6ru/KhQsXePrTn87111/Pox71KADuu+++W7/+67/+ff7hH/7ht7nqqquuuuqqq676r0Hlqquuuuqqq6666r/QO77jO34WD7Czs8Pe3h6lFHZ2drjpppu48847efzjH88rvdIr8dd//de8wRu8AT/xEz/B3t4eAHt7e+zs7ND3PTs7O7zyK78yOzs7/Omf/il7e3vcb29vjz/5kz9hZ2eH5XIJwF//9V/zBm/wBrzSK70Sj3/843n84x/P3t4eDySJvb099vb2ePzjHw/Azs4ON954I6dOnQJgZ2eHW2+9lcc85jG8/uu/Pnt7e9x5553ceeed7O3tceeddwIgiRfV/v4+APv7+/xLtre3kcTOzg4A29vbPND29jbPbWdnhwfa29vjuUlif3+f++3t7QGwv78PwO///u/zbyGJf8n29jYAj3rUowB4hVd4BQD29/f5q7/6K2644Qbut1gs+P7v/3729/eRxAuzvb3Nox71KB71qEcB8Fd/9Vdsb2+zsbHBN3/zN/P8bG9v86hHPYqXf/mXB6DrOs6cOcNdd93F/ba3t3mLt3gLfud3focbbriBv/iLvwDgUY96FNvb2wD88i//Mtdffz33u+aaax78Oq/zOu/1D//wD7/NVVddddVVV1111X8N9KAH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XXXVf4R3fMd3/Kx3eqd3+myAvb09dnZ2eNzjHsef/MmfcHh4yId/+Ifzx3/8x/zJn/wJOzs73HTTTcxmM176pV+axz/+8fzJn/wJ97vxxht5pVd6JZ72tKfx0i/90jz+8Y/nT/7kT3huOzs7POYxj+HP//zPecmXfEle4zVeg729PR7/+Mfzp3/6p7wwOzs73HjjjTzmMY/hxhtv5Pd+7/d46EMfyo033sje3h533nknd955J094whP4t5DE9vY2N954IwA33ngj29vb7OzssL29zc///M8D8KAHPYiu69je3mZnZ4ft7W3ut7+/D8De3h77+/sA7O/vs7+/z/329va43/7+Pg+0v7/PCyKJ+21vb/Pctre3Adje3gZge3ub++3s7LC9vQ3A9vY229vb3G9/fx+A/f19nvrUpwJw22238W7v9m7s7+9z1113AbC/v89dd93F/v4++/v7vDCSeH62t7e54YYb2Nra4uVf/uUB2N/f56//+q95jdd4Dfb393niE5/Ik570JPb393kgSdxve3ubRz7ykTzykY8E4K//+q/527/9W175lV+Zv/iLv+D5ebmXezle7uVejmc84xmcPHmS3/7t3+buu+9GEgDXX389b/7mb87f/M3fcM011/DzP//zADzykY/ktV7rtfi+7/s+uq7jEY94BC/3ci/H/v4+29vbAPzIj/zIZ//oj/7o53DVVVddddVVV13170flqquuuuqqq6666j/I2bNnn8Ez7e3tsbOzw0033cSv/dqv8djHPpbf/d3f5aVf+qW58847ueOOO7jjjju46667AHjpl35pAP7kT/4EgDvvvJNf//Vf5zGPeQw/+7M/y1u+5VvymMc8hsc//vH8yZ/8Cffb39/nT//0T9nZ2aHve77hG76Bl3zJl+SlXuqleMxjHsOdd97J4x//eO68806e297eHnt7ezz+8Y9nZ2eHG2+8kb29PW688UZ2dnZ4xjOewWMe8xhe//Vfn729Pe68807uvPNO9vf3ufPOO3lhJAGwv7/PE57wBACe8IQncL/t7W0AdnZ2uO+++9je3uZ+e3t73HjjjQBsb28DsL29ze/93u9x/Phx5vM5N9xwAwA7OzsAbG9v8x9tf3+f++3v7wNw/vx5dnd3Wa1WPOpRj+KB9vf3Adjf32d/f5/9/X0WiwV33XUXAN/8zd/Mv4Uk7re9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4cYbb+TGG2/k937v93joQx/KjTfeyN7eHnfeeSd33nknT3jCE5DEi2p7e5udnR22t7e58cYb2d7e5sYbb+R+f/d3f8fJkycBuPHGGwHY398HYG9vj/39fQDuuusuAPb29tjf32d/f5/nRxL/0STxr7G9vQ3A9vY229vbbG9vA7C9vc329jbb29tsb29zv/39ffb393na057Gq7/6qwOwv78PwF133cX+/j533303d911Fy+IJJ7b9vY2W1tb3HDDDTzykY9ke3ub/f19/vqv/5rXeI3XYH9/nyc96Uk86UlPYn9/nweSBMD29jaPeMQjeLmXezn29/f567/+a/72b/+WV37lV+Yv//IveW4v+7Ivy8u93Muxv7/P9vY2f/EXf8Ff/uVfIgmA13zN1+SRj3wkP/dzP8ejHvUofvd3f5frr7+eN3uzN+Nv//Zvmc/nHBwc8LIv+7J83/d9H+/xHu/B933f93HTTTd999d//de/D1ddddVVV1111VX/MdCDHvQgrrrqqquuuuqqq/6jvNiLvdhrf+7nfu5v8Uw/93M/x2u91mvxJ3/yJ+zs7LBer3npl35pfu3Xfo0777yTV3qlV+KVXumV2NvbA+DXfu3XuPPOO5HEzs4Od955Jy/5ki/Ja77mawLw+Mc/nj/90z/lgXZ2drjxxht5zGMew4033sidd97JjTfeyJ133snjH/94nvCEJ/CCbG9vc+ONN3LjjTfyW7/1W9xyyy086EEP4kEPehA7Ozvs7+9z5513cuedd3LnnXeyv7/Pv9b29jY7Oztsb29z4403ArC9vc2NN94IwC/8wi8AcMsttwBw8uRJdnZ22N7e5oH29/cB2NvbA+Dg4ID77e3tAbC/v8/zs7+/z/Ozvb3N/SQBsL29zQNtb28DsL29DcD29jbb29s8t/39ffb39zl//jyXLl0C4NKlS7zZm70Z+/v7ANx1113s7+8DcPfdd3PXXXfxryEJgO3tba6//nq2t7e54YYbuP7669nf3+ev//qvAfj93/993uu93ou7776bv/iLv+AFkcTLvuzLsr29zSMf+Uj29/fZ3t5mf3+fJz3pSfzlX/4lz+1lX/ZlebmXezn29/f5nd/5HV7u5V6O3/md32F/fx9JbG1t8WZv9mYAbG9v87u/+7s86UlP4vrrr+fN3uzN+Nu//VvOnDnDX/7lX/Jmb/Zm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/j57e3vs7++zv7/Pc5PEfxRJ/EeSxL/G9vY229vbbG9vs7W1BcANN9zADTfcwP329/e59dZbuXTpEq/+6q8OwP7+Pk960pMAuOuuu7j77rv5l2xvb/PIRz6SG264geuvv579/X3++q//mtd4jddgf3+fJz3pSdx9993cfffdPLft7W0e8YhH8HIv93Ls7+/z13/91/z+7/8+b/RGb8Rf/uVfcr+trS1e67Vei+uvv57f+73f46Vf+qX53d/9Xe6++262trZ4szd7MwC2t7f5y7/8S+6++27e7M3ejGc84xl8//d/P+/7vu/LMAw86EEP4m/+5m+4cOHCd3/913/9+3DVVVddddVVV131nwM96EEP4qqrrrrqqquuuuo/y4u92Iu99vu93/v91rFjx/j+7/9+3vM935OdnR3+5E/+hPV6zUu/9Evz+Mc/nic84QkcHBzwki/5krzUS70Uj3/84/nTP/1TdnZ2ePSjH81f/MVf8BIv8RK8xmu8Bnt7e/zGb/wGd955J/e78cYbefSjH81jHvMY/u7v/o6XeImXYG9vjyc84Qnceeed3HnnnTy37e1tHvOYx3DjjTfysz/7s7zES7wED3nIQ7jxxhvZ39/nzjvv5M4772R/f58777yTF0YSANvb29x4440A3HDDDWxvb3PjjTcC8Au/8AvccsstnDx5EoAbb7yR++3v77O3t8f+/j6S2NvbY39/n/39fQD29/fZ39/n30IS/1EkAbC9vQ3A9vY2ANvb22xtbQGwvb3N9vY229vbbG9vA7C/vw/A/v4+T3va0wB49Vd/dQD29/e5++672d/fZ39/n/39fe6++25eFNvb2zzykY/k+uuv54YbbgBgf3+fv/7rv+a2227jLd/yLXnSk57Ek5/8ZPb393lu29vbPOIRj+CRj3wkAH/913/Na7zGa/CkJz2Ju+++myc/+cncb2tri9d6rdfi+uuv5/d+7/f4vd/7Pd74jd+Yv/zLvwTgZV/2ZXnZl31Z/vZv/5af//mf56EPfSjb29u82Zu9GX/7t3/LmTNnANje3uZrvuZr+LAP+zAuXbrEz/3cz73Pb/3Wb303V1111VVXXXXVVf850IMe9CCuuuqqq6666qqr/rNcc801D37VV33Vp0vi3d/93QHY29tjb2+PO++8k2EYeI3XeA3+5E/+hCc84Qk8+tGP5slPfjJv+ZZvCcCv//qvc+edd7Kzs8OjH/1o/uIv/oKXeImX4DVe4zXY29vjT//0T3nCE57A/ba3t3nMYx7Dox/9aH73d3+Xl3mZl+HGG29kb2+PJzzhCTz+8Y9nf38fAEncb3t7mxtvvJEbb7yR7e1t/vqv/5pbbrmFkydPcuONN7K/v8/e3h533nknd911F3feeSf3k8S/ZHt7m+3tbXZ2drjhhhsA2N7e5md/9mfZ2dnh+PHjABw7doxjx45x6tQpALa3t9ne3uaB9vf3ud/+/j4A+/v7PNDe3h4AkvjX2t7e5n7b29vcb3t7m+3tbZ7b/v4++/v7AJw/f55Lly4BcOnSJXZ3d7n99tv5sA/7MO666y729/cBuPvuu7nrrruQxItqe3ubra0tbrjhBq6//npuuOEGAPb39/mbv/kbbrvtNt7iLd6CJz3pSQD85V/+Jc/P9vY2j3jEI7jhhhu4/vrr2d/f56//+q956Zd+aZ70pCfxl3/5lwBIAmBra4vXeq3X4vrrr+f3fu/3+Nu//Vte5VVehb/8y78E4Prrr+c1X/M1AfiZn/kZbr75Zp785Cfzsi/7srzsy74sv/u7v8v111/P1tYW29vbbG1tAfB93/d9HDt2jO/5nu8RV1111VVXXXXVVf950IMe9CCuuuqqq6666qqr/jO99Vu/tV/zNV+TZzzjGbzma74mX//1X8+Hf/iH8/jHP569vT2e/OQn8+7v/u7ceeed/Pqv/zoAb/M2b8Pf/M3f8Bqv8Ro8/vGP50//9E/Z29tjZ2eHRz/60fzFX/wFL/ESL8FrvMZrsLe3xxOe8AT+9E//lAfa3t7mFV/xFXnMYx4DwJ133smNN97I3t4eT3ziE7nzzju58847eX62t7e58cYbufHGG9ne3ubGG28E4M477+TGG28EYH9/nzvvvJO77rqLvb097rrrLv4ttre3Adje3mZnZweA7e1tdnZ22N7e5pd+6Zd4zGMew/b2NgDHjh0DICLY3t4G4NixY/xnuXTpEgCXLl3ifnfccQeXLl0C4KVe6qXY399nf38fgIODA/b399nf32d/f58XRBIvyPb2NltbW9xwww1sb2/zyEc+EoD9/X329/e54YYbANjf3+cv/uIv2N7e5i//8i95Qba3t3nEIx7BDTfcwPXXX8/+/j7b29vs7+/zpCc9ibvvvpu7776b+0niZV/2ZXnEIx7B9vY2v/d7v8ff/u3f8iqv8ir85V/+JQBbW1u87Mu+LI985CP5vd/7PV76pV+a3/3d32V/f5/Xeq3XYmtri5/5mZ/hsY99LNdffz3b29v89E//NO/+7u/O7/7u7/KSL/mS/O7v/i7f8z3fI6666qqrrrrqqqv+86AHPehBXHXVVVddddVVV/1nuuaaax78qq/6qk9/j/d4D57xjGfwoAc9iK//+q/nPd/zPbnzzjv50z/9U97mbd6G/f19tre3efzjH8+f/umfsr+/z7Fjx3jzN39zTpw4weMf/3j+9E//FElsb2/zmMc8hhtvvJEbb7yRvb09AJ7whCfw+Mc/nv39fe63vb3NjTfeyI033shjHvMYfu/3fo+HPvSh3Hjjjezv7/P4xz+eu+66izvvvJMXZHt7mxtvvJEbb7yR7e1tbrzxRn7hF36BW265hZMnT3LjjTcCsL+/z97eHvv7+9x1113s7e1x11138aKQxItie3ub+21vbwOwvb3NA21vbyOJF2R/f5/t7W2en/39fe63v78PgCT29/fZ39/nP4IkALa3twF45CMfCcD111/PDTfcAMD+/j77+/s87WlPA+DVX/3V2d/f50lPehL7+/s86UlP4n6SeG7b29s84hGP4JGPfCTb29vs7+/z13/917zGa7wGd999N0960pN40pOexANtb2/zyEc+kpd92Zdlf3+fv/7rv+b3f//3eaM3eiP+8i//EoCtrS0e+chH8rIv+7I84xnP4EEPehB/+Zd/yV/+5V9y/fXX82Zv9mbs7+8D8Hu/93u8zMu8DNvb2/z0T/807/7u784znvEMHvSgB/F93/d9/OEf/uFD7rvvvlu56qqrrrrqqquu+s+DHvSgB3HVVVddddVVV131n+293uu9/FIv9VI86EEPYm9vj729PX76p3+a93zP9wTg13/917n77rt5yZd8SV7jNV6DP/mTP+FP//RP2dnZ4c477+QlX/Ilec3XfE0AnvCEJ/Cnf/qnAGxvb3PjjTfymMc8hhtvvJE777yTG2+8kTvvvJPHP/7xPOEJT+CBtre3ufHGG7npppt49KMfzS/8wi/w0i/90tx4443s7+9z5513cuedd7K/v8+dd97JC7K9vQ3ATTfdxA033MD29jY33ngjAL/wC7/ALbfcwsmTJ7nxxhsB2N/fZ29vj/39fQDuuusu9vb22N/fZ39/H0n8R5LEfyRJ/Fttb2+zvb3N9vY2W1tb7OzssLW1xQ033ADA/v4+ALfeeiuXLl3i1V/91dnf3wfgSU96EgB33XUXd999N8+PJAC2t7d5xCMewfb2No985CMBuO2223jGM57BS7/0S/OXf/mXADzpSU/iuT3ykY/k+uuv55GPfCT7+/tsb2+zv7/Pk5/8ZP7yL/+S+73sy74sL/uyL8v+/j6//du/zd/93d9xzTXXAPCyL/uyvOzLviy/93u/x+/93u/xsIc9jNd8zddke3ubn/7pn+bd3/3dOTg4YGtri2c84xn8zd/8Dd/zPd8jrrrqqquuuuqqq/5zoQc96EFcddVVV1111VVX/Wd7ndd5nfcGvuvDP/zDud8dd9zBzs4OtpHEr//6r3PjjTfy53/+57zHe7wHAI9//OP50z/9U3Z2dnj91399nva0p/FSL/VSADzhCU/gT//0T7nf9vY2r/iKr8hjHvMYfu/3fo/XeI3XYG9vj7vuuovHP/7x3HnnnQBIAmB7e5udnR1uuOEG/uIv/oKdnR0e9KAH8ZCHPIQbb7yR/f197rzzTu6880729/e58847eSBJPLft7W1uvPFGAG644Qa2t7e58cYbAfiFX/gFbrnlFgBOnjzJjTfeyP329/fZ399nf38fgL29Pfb39wHY399nf38fgP39ff4lkviPJInntr29DcD29jYA29vbbG1tAXDDDTcAcMMNN3C//f19AG699VYuXboEwKu/+quzv78PwN13383+/j533XUXd999Ny+K7e1tHvnIRwLwci/3cgDs7+/zN3/zNzzjGc/g9ttv5w3e4A24++67ufvuu3lu29vbPOIRj+DlXu7l2N/f56//+q95jdd4Df7yL/+SJz3pSRwcHACwtbXFIx/5SF72ZV+W/f19/vqv/5qXfumX5nd/93e5++67uf7663nN13xNAH7mZ36Gxz72sTz5yU/mzd7szTh//jynTp1ia2uLB/r6r/96gPf5rd/6re/mqquuuuqqq6666j8XetCDHsRVV1111VVXXXXVf7Zrrrnmwd/0Td/0dJ7p67/+6/nwD/9wHv/4x7Ozs8PTnvY0XuqlXorHP/7xPOEJT+D1X//1edrTnsZrvMZr8PjHP54//dM/ZW9vj52dHV7/9V+fv/qrv+I1X/M1AXjCE57A4x//ePb39wHY3t7mxhtv5DGPeQx/9Vd/xYMe9CBe4iVegr29PZ7whCdw1113ceedd/Lctre3ufHGG7nxxht59KMfDcDf/d3fcfLkSW688Ub29/e588472d/f58477+Suu+7iRbW9vc329jY7Oztsb2+zvb3N9vY2P/uzPwvAsWPHOHbsGMeOHePYsWOcOnUKgO3tbba3t3mg/f197re/vw/A/v4+D7S/v8+/1fb2Nvfb3t5GEltbWwBsb2/zQPv7+wDs7+8DcP78eS5dugTAbbfdhm1uv/123vM935P9/X0ODg4AuOuuu7j77rt5UW1vb7O1tcUNN9zA9ddfzw033ADA/v4+f/M3f8Orv/qrs7+/z913383+/j5/+Zd/yfOzvb3NIx7xCF7u5V4OgNtuu42//du/5bVe67V48pOfzF/+5V9yv62tLR75yEfysi/7suzv7/PXf/3XvPRLvzS/+7u/y913383W1hav9VqvxfXXX8/v/d7v8dIv/dL87u/+Ltvb27zma74mz3jGM+j7noODAx7xiEfw/d///bz7u78793u7t3s7cdVVV1111VVXXfWfDz3oQQ/iqquuuuqqq6666r/CO77jO37WK7/yK3/2M57xDF7zNV+Tr//6r+fDP/zDufPOO7njjjt4pVd6JQD+5E/+hCc84Qk8+tGP5s///M958zd/c06cOMHjH/94/uzP/gyA7e1t7rrrLl7iJV6Cl3mZl2F7e5s777yTJzzhCdx5553cb3t7m8c85jE8+tGP5nd/93d5mZd5GW688Ub29/e58847ecITnsCdd97J87O9vc2NN97IjTfeyKMf/WgAfv/3f5+HPOQh3HjjjQDs7+9z5513ctddd7G3t8ddd93Fv5Yktre32d7eZnt7G4Dt7W12dnbY3t7m93//97npppvY3t4G4NixYwAcO3aM+x07doz/LJcuXQLg0qVL3O+OO+7g0qVL7O/v8+qv/urs7++zv78PwMHBAfv7++zv77O/v8/9JPGi2N7eZmtrixtuuIHt7W0e+chHArC/vw/A3/zN3/Dqr/7q7O/vc/fdd7O/v8/dd9/N3XffzfOzvb3NIx7xCB71qEextbXF/v4+f/3Xf81Lv/RL86QnPYknP/nJHBwccL+trS0e+chH8rIv+7Ls7+/zO7/zO/zd3/0dL/mSL8ndd9/N1tYWj3zkI3nZl31ZnvGMZ/Cg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O+/kxhtvZH9/nyc84Qnceeed3HnnnTzQ9vY2Ozs73HDDDdx4443ceOON/MIv/AK33HILL/ESLwHA/v4+d955J3fddRd7e3vcddddvCi2t7cBuPHGGwG48cYb2d7e5vu+7/s4duwYx44d49ixYwDs7Oxw7NgxTp06BcD29jbb29s8t/39fR5of3+f++3v7/Oi2t7e5rltb28DsL29zXPb39/nfvv7+5w/f55Lly4BcOnSJS5dusRtt90GwHu+53ty9913A7C/v8/+/j533303L4rt7W0AHvnIRwLwci/3cgDs7+9z6623cunSJV791V+d/f19nvSkJ3H33Xdz991389y2t7d5xCMewSMf+Ui2t7fZ399ne3ub/f19nvzkJ/OkJz2Jg4MDALa2tnjkIx/Jy77sy7K/v89f//Vf8/u///u86qu+Kk9+8pPZ2tritV7rtbj++usBODg44Bd+4Rd4xCMewcu+7Mvyu7/7u7zsy74s+/v7bG9v8z3f8z182Id9GN/3fd8HwE//9E+Lq6666qqrrrrqqv866EEPehBXXXXVVVddddVV/5Ve53Ve571f4zVe47tuu+023uIt3gKAvb09AO68807+4i/+grd8y7cE4Kd+6qe48cYbeeITn8hLvuRL8lIv9VLceeed/Omf/in7+/s8+tGP5jGPeQw33ngjd955Jzs7O9xxxx084QlP4M477+R+N954I495zGN49KMfzS/8wi/w0i/90tx4443s7+9z55138oQnPIE777yT57a9vc3Ozg433HADN954Iz/7sz/LLbfcwi233MLJkye58cYbAdjf3+fOO+/krrvuYm9vj/39ffb393lBJPHctre3Adje3mZ7exuA7e1tnvGMZwCwvb0NwE033cT29jbHjh3jfseOHeM/w6VLl7jfpUuXuOOOOwA4ODhgf38fgAc96EEA7O/vc3BwwP7+Pvv7+wBI4kW1vb3N1tYWN9xwA9vb22xvb3P99dcDsL+/z9/8zd8A8Pu///u813u9F3fddRd33303d999N8/P9vY2j3jEI3jkIx/J9vY2+/v7/PVf/zUv/dIvzZOf/GTuvvtu7r77bu63tbXFy77sy/LIRz6S/f19/vqv/5rf//3f51Vf9VV58pOfzNbWFo985CN52Zd9WZ7xjGfwAz/wA7zxG78xT37yk3nN13xNtre3+emf/mle6ZVeia2tLba3t9na2gLg+7//+3mJl3gJfu/3fu99fuu3fuu7ueqqq6666qqrrvqvgx70oAdx1VVXXXXVVVdd9V/pmmuuefCLvdiLPf093uM9OHbsGPd7xjOewYkTJ/jTP/1TXvEVX5G/+Zu/4aVe6qV4/OMfzxOe8AQe85jH8Od//ue81Vu9Fdvb2zzhCU/g8Y9/PPv7+2xvb/OKr/iKPOYxj+Hv/u7veImXeAn29vZ4whOewOMf/3gODg4A2N7eZmdnh0c/+tE8+tGP5hd+4Re45ZZbeImXeAn29/e58847ufPOO9nf3+fOO+/kgSSxvb0NwI033sgNN9zAT//0T3Ps2DFuueUWbrnlFk6ePMnOzg7b29vs7+8DcOedd3LXXXcBsLe3x913381/lJ2dHR5oe3ub+21vb/OvcXBwgG0kAbC/vw/A/v4+/xaSeG7b29sAXH/99WxvbwNw/fXXc8MNNwCwv7/P/v4+T3va0wC47bbbuO2223iDN3gDAO6++27uvvtunp/t7W0e8YhHsL29zSMf+UgAbrvtNp7xjGfw0i/90jzpSU/i7rvv5p577uF+W1tbPPKRj+QRj3gE29vb/N7v/R6v8RqvwV/+5V/ypCc9iYODA7a2tnjkIx/Jy77sy3Lp0iV+7ud+jsc+9rH85V/+JS/7si/Ly77sy/KMZzyDU6dO8aQnPYmXfdmX5RnPeAanTp1ia2uL+33+538+f/VXfyWuuuqqq6666qqr/muhBz3oQVx11VVXXXXVVVf9V/vwD//w73qZl3mZ9z5+/Di/+7u/y2u+5msC8Hu/93u89Eu/NHfccQd7e3sMw8BLvdRLIYlf//VfZ29vj8c85jE8+clP5rVf+7XZ3t7mCU94Ao9//OPZ399ne3ubxzzmMTz60Y/mb/7mb3joQx/Kzs4Oe3t7POEJT+AJT3gCD7S9vc2jH/1o/uIv/oKdnR1e8iVfkpMnT3LjjTeyv7/PnXfeyZ133sn+/j533XUXz8/29jYAN954IzfccAPb29vceOONPNCdd97Jzs4O29vbAOzv77O/v8/+/j4Ad955JwD7+/vs7++zv7/Pv0QS/5Ek8e+1vb0NwPb2NjfccAMA29vbbG1tccMNN3C//f199vf3ueGGG7jf/v4++/v73H333QDcdddd3H333Uji+dne3uYRj3gEAC/3ci8HwP7+Pn/zN3/DM57xDG6//Xbe4A3egLvvvpu7774bAElsbW3xyEc+kq2tLR75yEeyv7/PX//1X/PSL/3SPPnJT+Yv//IvAdja2uKRj3wkL/uyL8v+/j4/8zM/w2Mf+1ie9KQnAfBar/VabG9v81d/9Vdcd9113H333bzma74mf/u3f8tLvuRLAvC3f/u3vORLviQAv/Vbv/XdX//1X/8+XHXVVVddddVVV/3XQg960IO46qqrrrrqqquu+q92zTXXPPhN3uRNnn78+HFe8zVfk9/93d/lNV/zNXmgP/mTP+EJT3gCBwcHvORLviSv8RqvweMf/3j+9E//FIBXfMVX5KlPfSov8zIvw/b2NnfeeSdPeMITuPPOOwF49KMfzY033shv/dZv8RIv8RK89Eu/NAB33nknd955J094whN4oO3tbW688UZuvPFGHv3oRwPwd3/3d5w8eZIbb7yR/f197rzzTu666y729va46667eGG2t7fZ3t5mZ2eHG264ge3tbSRxww03APALv/AL3HLLLQCcOnWK7e1ttre3ud/+/j4A+/v77O/vA7C3t8f+/j4Aktjf3+d++/v73G9/f59/DUkAbG9v80Db29sAbG9vA7C1tcX9tre32d7eBuCGG27ggfb39wG49dZbuXTpEgCv/uqvDsD+/j77+/vcfffdANx1113cfffdvCCSANje3uYRj3gEAC/3ci8HwP7+Pn/zN3/Dq7/6q7O/v8/dd9/N/v4+f/mXf8lzu/7667nhhht42Zd9Wfb39/nrv/5r/u7v/o7Xf/3X5+677+bJT34yAFtbWzzykY/kZV/2Zdnf3+dnf/Zned3XfV1+53d+B4BHPvKRvOzLvix/+7d/y0Mf+lD+8i//kkc84hFcf/31ANx9991cf/31/O7v/i6v+Zqvyc/+7M8C8Eu/9EsPue+++27lqquuuuqqq6666r8WetCDHsRVV1111VVXXXXVf4d3fMd3/KxXfuVX/uxLly7xki/5kvzu7/4uL/3SLw3A933f9/Ee7/EeAPzpn/4pOzs7/Nmf/Rlv/dZvzfb2Nk94whP40z/9U7a3t3nMYx7DK77iK/J3f/d3vMRLvAR7e3v86Z/+KU94whMA2NnZ4cYbb2R7e5tXfMVX5O/+7u94iZd4Cfb397nzzju58847ecITnsBz297e5sYbb+TGG2/k0Y9+NAB/93d/x8mTJ7nxxhvZ398H4M477+Suu+5ib2+Pu+66ixdEEvfb3t5me3ub7e1tAG688Ua2t7cB2N7eZnt7m/v94i/+Ijs7Oxw7doxjx45RawVge3sbgO3tbf4z7e/vc7/9/X2maeLSpUtcunQJgFd/9Vfnfvv7+wDs7+9z9913A7C/v8/+/j533303L6rt7W0e+chHAnDDDTdw/fXXA7C/v8/f/M3f8Oqv/urs7+9zcHDAXXfdxd13383dd9/NA21vb/OIRzyC7e1tHvnIR7K/v89f//Vf8xqv8Rrs7+/z5Cc/mb/8y7/kfi/7si/LIx7xCLa3t/m7v/s7fu/3fo9XfuVX5klPehIAj3zkI3nZl31ZDg4O+Omf/mke+9jHcs899/Car/maAPz0T/80r/RKr8QjHvEIfu7nfo63eIu34BnPeAYAT3va077767/+69+Hq6666qqrrrrqqv966EEPehBXXXXVVVddddVV/x2uueaaB7/Yi73Y09/zPd+Tixcv8qAHPYj7Pf7xj+fGG2/kb/7mb3iN13gN/vRP/5THP/7xPOYxj+G+++7jNV/zNZHE4x//eP70T/+U7e1tHvOYx/CKr/iK/N7v/R6v8Rqvwd7eHk94whO46667uPPOOwHY3t7m0Y9+NDfeeCM33ngjf/d3f8eDH/xgAPb397njjju46667uPPOO7mfJAC2t7e58cYbueGGG9je3ubGG2/kF37hF7jllls4efIkN954I/v7+wDceeed3HXXXQDs7e1x1113IYl/je3tbQC2t7fZ3t4GYHt7m52dHe63vb3N/ba3t9nf32d7e5vt7W3+Lfb393mg/f19APb39wHY39/nfgcHB+zv7wNw1113ASCJf43t7W22tra44YYb2N7eZmtrixtuuAGA/f19br31Vi5dusSrv/qrs7+/z5Oe9CQA7r77bu6++26e2/b2No94xCO44YYbuP7669nf3+ev//qveY3XeA329/d58pOfzF/+5V9yv62tLR75yEfysi/7suzv7/PXf/3XvPRLvzRPfvKT+cu//EsAXvZlX5aXfdmXZX9/n7/+67/m4Q9/OL/7u7/LIx7xCF72ZV+W3/u93+NlXuZl2N/f5/rrr+d+z3jGM3jQgx7E933f9/GHf/iHD7nvvvtu5aqrrrrqqquuuuq/HnrQgx7EVVddddVVV1111X+XD//wD/+ug4OD936Lt3gLLl26xLFjx/iGb/gGPuzDPgyAxz/+8TzmMY9hb28PgCc84Qk8/vGP5/DwkJd4iZfgpV7qpQB4whOewJ/+6Z+yvb3NjTfeyGMe8xj+6q/+ipd5mZfhxhtvZH9/nz/90z/lCU94Avfb3t7mxhtv5NGPfjQ/+7M/y0u8xEvwkIc8hBtvvJH9/X3uvPNO7rrrLvb29rjrrrt4btvb22xvb7Ozs8MNN9zA9vY2N954I7/wC7/ALbfcwsmTJ9nZ2WF7exuA/f199vf32d/f584772R/fx+Au+66i38NSfxHkcR/FEk8t+3tbQC2tra44YYbALjhhhvY2tpie3sbgP39ffb393na054GwKu/+quzv7/P3Xffzf7+PnfffTd33303z8/29jaPeMQjAHi5l3s5APb39/mbv/kbbrvtNt7iLd6CJz/5yfzlX/4l99va2uKRj3wk119/Pddffz37+/v89V//NQ9/+MO5++67+cu//Eu2trZ45CMfycu+7Muyv7/PX//1X/N7v/d7vPRLvzQAr/marwnA1tYWT37yk9na2mJ7e5uf/umf5t3f/d15xjOewYMe9CB+93d/l9ba93z913/9e3PVVVddddVVV1313wM96EEP4qqrrrrqqquuuuq/y5kzZx70zd/8zbf+7d/+Lb/7u7/Le7zHe3Ds2DEALl26hCSe8IQncOONN/K0pz2N13iN1+DOO+/k13/917nxxht50pOexEu8xEvwUi/1UgA84QlP4PGPfzz7+/tsb2/zSq/0Svzmb/4mL/ESL8FLv/RLA3DnnXdy55138oQnPIH7bW9vc+ONN3LjjTdy44038ru/+7vccsstnDx5khtvvJH9/X3uvPNO7rrrLvb29rjrrrt4fra3twG48cYbueGGG9je3mZnZ4ft7W1+4Rd+gWPHjnHs2DFOnTrF9vY229vbAOzv7wOwv7/P/v4+AHfeeScA+/v7AOzv73NwcMB/FEn8W21vbwOwvb3N9vY229vbAGxvb7O1tQXADTfcwP329/cBuPXWW7l06RKXLl3izd7szdjf32d/f5+7774bgLvuuou7774bSTw/29vbPOIRjwDg5V7u5QDY39/nb/7mb7jtttt4i7d4C570pCdxcHDAk570JCRxv+uvv55HPOIRPPKRj2R/f5+//uu/5u/+7u945Vd+ZZ70pCdxcHDA1tYWj3zkI3nZl31Z9vf3+eu//mt+//d/n1d91Vflnnvu4TVf8zW5/vrrATg4OOBJT3oSL/uyL8ulS5c4duwYAM94xjP4/u//ft793d+dBz3oQXzIh3zIQ+67775bueqqq6666qqrrvrvgR70oAdx1VVXXXXVVVdd9d/pwz/8w7/roQ996HsDPOhBD+IZz3gGD3rQg/iGb/gGXvIlX5LXeI3X4PGPfzz7+/v82Z/9GW/+5m/OiRMneMITnsDjH/94brzxRh7zmMdw4403cuedd7K9vc2dd97JE5/4RO688062t7e58cYbefSjH82NN97I7/3e7/Ear/Ea7O/vc+edd3LnnXfyhCc8gQfa3t7mxhtv5MYbb+TRj340v/ALv8Att9zCyZMnufHGG9nf32dvb4/9/X3uuusu7rzzTvb393l+JLG9vQ3ADTfcAMCNN97I9vY2P/uzPwvAsWPHOHbsGAA333wzAKdOnWJ7e5vt7W0eaH9/n/vt7+8DsL+/zwPt7+/zb7W9vc39tre3kcTW1hYA29vbPND+/j4A+/v7TNPEbbfdBsClS5e4dOkSly5d4tKlS7zne74nd999NwB33XUXAHfffTfPjyQAtre32dra4vrrr+eGG27g+uuvB2B/f5+/+Zu/AeClXuqlODg44K677uLJT34y+/v73G97e5tHPvKRALzsy74s+/v7/PVf/zWv8Rqvwf7+Pk9+8pP5y7/8SwC2trZ45CMfycu+7Muyv7/P7/zO7/B3f/d3vOqrvip33303j3zkI3nZl31ZnvGMZ/DzP//zvMqrvAoAL/uyL8vv/d7v8Xu/93t86qd+Ks94xjN40IMexDOe8QwAnva0p33313/9178PV1111VVXXXXVVf990IMe9CCuuuqqq6666qqr/jtdc801D36xF3uxp3/4h384e3t77Ozs8Hu/93u8xmu8BgDf8A3fwHu8x3sA8Kd/+qfs7Ozw5Cc/mdd+7ddme3ubJzzhCfzpn/4p29vbvOIrviKPecxj+Lu/+zte4iVegv39ff70T/+UJzzhCQBsb29z44038uhHP5obb7yRv/u7v+MlXuIl2N/fZ39/nzvuuIO77rqLO++8E0ncb3t7mxtvvJEbbriB3/qt3+LYsWMcO3aMl3iJl+DEiRNsb2+zv7/P3t4e+/v73HXXXezt7XH33Xfzotje3gZge3ub7e1ttre32dnZAeBv/uZvOHbsGNvb22xvb3Ps2DEAjh07BsCxY8f4z3bp0iUuXboEwKVLl9jf32dvb4/9/X1e6qVeiv39fQD29/fZ398H4O677+ZFtb29zfXXX8/29jY33HAD119/PQD7+/tcvHiR2267jdtuu43bbruNt33bt2V/f5+7776bu+++mwfa3t7mEY94BDfccAPXX389+/v7/PVf/zUv/dIvDcCTn/xk/vIv/xKAra0tHvnIR/KIRzyC7e1tbrvtNm655Rbuvvtufud3fgeARz7ykbzsy74sBwcH/PRP/zSPfexjefKTn8ybvdmbAfDTP/3TvN7rvR7XX389z3jGM3jQgx7EwcEBW1tbfN/3fR9/+Id/+JD77rvvVq666qqrrrrqqqv++6AHPehBXHXVVVddddVVV/13+/AP//DvKqW892u+5muyt7fHzs4Ov/d7v8drvMZr8PjHP54bb7yRv/mbv+E1XuM1+NM//VMe//jHc9ddd/ESL/ESvMzLvAzb29s84QlP4E//9E/Z3t7mMY95DK/4iq/I7/3e7/HSL/3SANx555084QlP4M477wRge3ubG2+8kUc/+tH87M/+LC/xEi/BQx7yEG688Ub29/e58847ueuuu3jCE57Ac9ve3ubGG29ke3ubG264gRtvvJH7/d3f/R0nT57kxhtvBGB/f5/9/X329/e588472d/fZ39/n/39fV5Ukrjf9vY299ve3gZge3ubB9re3ubf6uDggPvt7+9jm4ODAwD29/d5IEm8qLa3t9na2uKGG24A4Prrr+eGG27gfvv7+1y8eJFbbrkFgP39fQ4ODrjrrru4++67ufvuu3lu29vbXH/99WxtbfFyL/dyAOzv7/M3f/M33HbbbbzO67wOd999N3/5l3/J/ba2tnjkIx/Jy77sy7K/v89f//Vf89Iv/dI8+clP5klPehIAj3zkI3nZl31ZDg4O+O3f/m3+9m//lpd+6Zfmuuuu42Vf9mX527/9Wx760Ieyv7/P9ddfz+/+7u/ymq/5mhwcHLC1tcXv/u7vcvfdd3/2j/7oj34OV1111VVXXXXVVf+90IMe9CCuuuqqq6666qqr/rtdc801D/6mb/qmp//u7/4uf/u3f8t7vud7srOzwwM9/vGP5zd/8zd5j/d4DwCe8IQn8PjHP57Dw0NuueUWXuZlXoadnR0e//jH84QnPAGAnZ0dXuEVXoHf/u3f5iVf8iV5iZd4Cfb393nCE57AnXfeyZ133gnA9vY2N954IzfeeCOPfvSj+YVf+AVuueUWXuIlXgKA/f197rzzTu666y6e8IQn8Pxsb29z4403AnDDDTewvb3NjTfeCMDv//7vc+zYMU6dOsUNN9zA/fb399nf32d/fx+AO++8k/39fQD29/fZ398HQBL/USTxH0USANvb2wBsbW1xww03ALC9vc329jZbW1tsb28DsL+/D8Ctt97KpUuXePVXf3UA9vf3ufvuu9nf3+fuu+/m7rvv5vnZ3t7m+uuvZ2trixtuuIHrr7+e/f19br31Vi5dusRLvdRL8eQnPxmAv/zLv+R+W1tbPPKRj+RlX/ZlAfi7v/s7nvGMZ/Bar/VaPPnJT+Yv//Iv2dra4pGPfCQv+7Ivy/7+Pn/913/N7//+7/NSL/VSXHfddbzsy74sBwcHbG1t8eQnP5mtrS2uv/567ndwcMDXfM3X8O7v/u486EEP4kM+5EMect99993KVVddddVVV1111X8v9KAHPYirrrrqqquuuuqq/wk+/MM//Lse+tCHvvfx48c5duwYe3t77Ozs8A3f8A28+7u/O5K48847+c3f/E1e8iVfktd4jddgb2+P3/iN32Bvb49XfMVX5DGPeQx33nknOzs73HnnnTzhCU/gzjvvZHt7m0c/+tHceOON/NVf/RUv8zIvw4033sj+/j6Pf/zjueuuu7jzzju5387ODjfeeCOPetSjuPHGG/mFX/gFbrnlFl7iJV4CgP39fe68807uuusu9vb2uOuuu3huktje3gbghhtuAODGG29ke3ub7e1ttre3+cVf/EVsc8sttwBw6tQptre32d7e5n77+/sA7O/vA7C/vw/A/v4+APv7+9xvf3+fB9rf3+eBJPGCbG9v80Db29sAbG1tcb/t7W22t7eRxNbWFtvb2zzQ/v4++/v7nD9/nkuXLgFw6dIl3uzN3oz9/X329/c5ODhgf3+fu+66i4ODA/b395HE87O9vc0jHvEIAF7u5V4OgP39fW699VYuXbrEq7/6q7O/v8+TnvQk7r77bu6++24kAbC1tcUjH/lIHvGIR7C9vc3+/j5//dd/zUu/9Evzl3/5l9x9990cHBywtbXFy77sy/LIRz6S/f19fud3foeXe7mX46/+6q8AeM3XfE0A/uqv/orf+73f49Vf/dV5zdd8TZ7xjGfw8z//83zYh30Yly5d4tixYzzjGc/g2LFj/NVf/dV3f/3Xf/37cNVVV1111VVXXfXfDz3oQQ/iqquuuuqqq6666n+Ca6655sHf9E3f9HSAvb09dnZ2+Nu//Vte8iVfkr29Pf7mb/6G13iN1+Dxj388d955J0960pN4iZd4CV7jNV6Dvb09fuM3foO9vT1e8RVfkcc85jH83d/9HS/xEi/B/v4+j3/84/mzP/szALa3t3n0ox/NK77iKwJw5513cuONN7K/v8+dd97JXXfdxROe8ATut729zfb2Njs7OzzqUY/iZ3/2Z7nlllu45ZZbOHnyJDfeeCP7+/sA3Hnnndx1113s7+9z11138cJsb28DsL29zfb2Ntvb2+zs7LC9vQ3A9vY229vb/OIv/iI7OzsAHDt2jGPHjgFw7NgxIgKA7e1t/jPs7+8DkJlcunQJgEuXLgFw6dIl9vb2eNM3fVP29/cB2N/f5+DggP39ffb399nf3+fg4ID9/X1eEElsb2+ztbXF9ddfD8ANN9zA9ddfD8D+/j5/8zd/A8Dv//7v817v9V7cdddd3H333dx9993cb3t7m+3tba6//npe9mVfFoD9/X22t7fZ39/nyU9+MnfffTd33303W1tbPPKRj+SRj3wkW1tb/N7v/R6v8RqvwV/+5V/ypCc9CUm85mu+Jtdffz2/93u/x+/93u/xxm/8xlx//fVcf/31/N7v/R6v8RqvAcAznvEMHvSgB3FwcMDW1hYAH/IhH/KQ++6771auuuqqq6666qqr/vuhBz3oQVx11VVXXXXVVVf9T/HhH/7h33VwcPDeb/EWb8He3h47Ozv83u/9Hi/90i/N9vY2AJcuXUISd955J/v7+/z5n/85L/ESL8FrvMZrsL+/z2/8xm+wt7fHox/9aB7zmMfw13/917z0S780AHfeeSdPeMITuPPOO9ne3mZnZ4dHP/rR3Hjjjfzu7/4ut9xyCy/xEi/B/v4+e3t73HXXXdx5553cddddPND29jY33ngjN9xwA7/1W78FwC233MItt9zCqVOnuOGGGwDY399nf3+f/f197rzzTvb399nf32d/f58XhSS2t7cB2N7eBmB7exuA7e1ttre3eaDt7W0eaHt7mxfV/v4+D7S/vw/A/v4+9zs4OGB/fx+Ag4MD9vf3+dfY3t5ma2uLG264AYAbbriB66+/HoD9/X0A/uZv/gaAZzzjGdx+++28wRu8AQB33303d999Nw+0vb3NIx7xCG644Qauv/569vf3ufXWW9nd3eWlX/qlefKTn8zdd9/N3XffDcDW1haPfOQjedmXfVn29/f567/+a176pV+aJz/5yfzlX/4lW1tbvNZrvRbXX389v/d7v8ff/u3f8iqv8ioAvOzLviyXLl2ilMLW1hYAf/u3f8tLvuRLcnBwwNbWFj/3cz/H1tbWd3/913/9+3DVVVddddVVV131PwN60IMexFVXXXXVVVddddX/FNdcc82Dv+mbvunpP/dzP8cznvEM3vM935OdnR3ut7e3x/d93/fxki/5krzGa7wGe3t7/Omf/ik7Ozv8+Z//OS/xEi/Ba7zGa7C/v8+f/umfcuedd3LjjTfy6Ec/mp/5mZ/hNV7jNXiJl3gJ9vf3ufPOO3nCE57AnXfeCcD29jaPfvSjufHGG7nxxhv5/d//fR7ykIdw4403sr+/z5133sldd93F3t4ed911Fw+0vb0NwI033sgNN9zAzs4ON9xwA/f7u7/7O06dOsUNN9zA/fb399nf32d/f5+9vT329/fZ399nf3+f/f19JPEfRRL/USTx/GxvbwOwtbXF9vY229vbAFx//fVsb2+zvb0NwP7+PgC33norL/ESLwHA/v4+AE960pMAuPvuu7n77rt5btvb2zziEY/ghhtu4Prrrwdgf3+fv/mbv+HVX/3V2d/f58lPfjJ33303d999NwBbW1s88pGP5GVf9mUB+L3f+z1uu+023vIt35K//Mu/5MlPfjLXX389r/mar8n29ja/93u/x9/93d/xyq/8yjz5yU/mzd7szdja2gLg4OCA/f19rr/+eu53cHDAT//0T/Mar/EaPOhBD+JDPuRDHnLffffdylVXXXXVVVddddX/DOhBD3oQV1111VVXXXXVVf+TvOM7vuNnvfIrv/JnAzzoQQ9ib2+PnZ0dvuEbvoH3eI/34H7f933fx0u+5EvyGq/xGjz+8Y/nCU94AjfeeCOPecxj2N7eBmB/f58nPOEJ/Omf/inb29s8+tGP5sYbb+Sv/uqveJmXeRluvPFG9vf3ufPOO3nCE57AXXfdBcD29jY33ngjN9xwA9vb2/z1X/81t9xyCydPnuTGG29kf3+fvb099vf3ueuuu3jCE57A/SRxv+3tbba3t9ne3ubGG29ke3ub7e1ttre3AfjFX/xFbr75Zk6dOgXADTfcwP329/cB2N/fZ39/n/vt7++zv78PwP7+Pvfb39/nfvv7+9xPEi+q7e1tHmh7exuA7e1tALa3twHY3t5ma2sLgO3tbba3t7nf/v4+APv7+zztaU8D4NVf/dUB2N/fZ39/n7vvvhuAu+++m7vvvpvnZ3t7m62tLa6//npuuOEGrr/+egD29/f5m7/5G2677Tbe4i3egic/+ckA/OVf/iX329ra4pGPfCSPeMQj2N7e5tKlS/ze7/0er/Var8WTn/xk/vIv/5KtrS0e+chH8ohHPILt7W1+7/d+j7/7u7/jlV/5lXnyk5/My77sy/KIRzyC3/u93+P3fu/3eOM3fmNe9mVfloODA376p3+ad3/3d+fSpUscO3aMZzzjGQD8yZ/8yef8yI/8yGdz1VVXXXXVVVdd9T8HetCDHsRVV1111VVXXXXV/yRnzpx50Dd/8zff+vVf//W8xVu8BT//8z/Pa7zGa/CSL/mSAPze7/0er/Ear8HjH/94AH7rt36LN3/zN+f48ePcddddPOEJT2B7e5tXfMVX5K//+q956Zd+aQDuvPNOnvCEJ3DnnXeyvb3NjTfeyCu+4iuyvb3Nbbfdxi233ML+/j533nknd911F094whO43/b2NjfeeCM33HAD29vb/M7v/A633HILx44d4yVe4iUA2N/f56677gLgzjvvZH9/n7vuuovnZ3t7G4Dt7W22t7fZ3t5mZ2eH7e1ttre32d7e5n6/+Iu/yM7ODseOHQPg1KlTAGxvbwOwvb3Nf5b9/X0eaH9/n/Pnz3Pp0iXu9+qv/urcb39/n/39fQ4ODtjf3wfgrrvu4uDggP39fe4niQfa3t5ma2uL66+/nhtuuIHrr78egP39fS5evMhtt93Gbbfdxlu8xVvwpCc9CYC//Mu/BEASW1tbbG9vc/311/OyL/uyAFy6dIljx46xv7/Pk5/8ZJ70pCdxcHDA1tYWj3zkI3nZl31Z9vf3+eu//mte+qVfmic/+ck8+clP5hGPeAQv+7IvyzOe8Qx+7/d+j1d6pVdif3+fl33Zl+X3fu/3eI3XeA0AnvGMZ/D93//9fPiHfzhf//Vfz6d92qfxIR/yIQ+57777buWqq6666qqrrrrqfw70oAc9iKuuuuqqq6666qr/aT78wz/8uw4ODt77Ld7iLXjGM57Bgx70IH7v936Pl3qpl2JnZ4e9vT3ud+edd7K/v8+f//mf8+Zv/uacOHGCO++8kz/90z/lxhtv5NGPfjR/9Vd/xYMe9CBe4iVegv39fZ7whCfw+Mc/nv39fba3t3n0ox/NjTfeyF//9V9zyy238BIv8RLs7++zv7/PnXfeyZ133sldd93F/ba3t7nxxhu54YYb2N7e5md/9me55ZZbuOWWWzh16hTb29tsb2+zv78PwF133cWdd94JwP7+PnfddRcvjCS2t7cB2N7eZnt7m/ttb2+zvb0NwPb2Nvfb3t7mftvb2/xb7O/v80D7+/sA7O/vI4n9/X0A9vf32d/fB+Dg4ID9/X1eFNvb22xtbXHDDTcAcMMNN3D99dcDsL+/z8HBAU996lO57bbbuHTpEm/91m/NXXfdxd13383dd9/NA21vb/PIRz6S66+/nuuvv579/X3++q//GoCXfumX5slPfjJ33303d999N1tbWzzykY/kEY94BNvb21y6dInf+73f47Ve67X4y7/8S+655x4e8YhH8LIv+7JcunSJn/u5n+Oxj30sAC/7si/LwcEBW1tb3O93f/d3ec3XfE0uXbrEsWPH+L7v+z5uuumm7/76r//69+Gqq6666qqrrrrqfxb0oAc9iKuuuuqqq6666qr/aa655poHf9M3fdPTf/d3f5fXfM3X5NKlSxw7doyf//mf583f/M0B+IZv+AZe8iVfktd4jddgb2+PP/3TP2VnZ4cnP/nJvMZrvAa33HILT3jCE3jCE57A3t4ej370o3nMYx7D9vY2d955JzfeeCN33nknT3jCE3jCE56AJLa3t3n0ox/NDTfcwI033sjv//7v85CHPIQbb7yR/f197rzzTu666y729va46667eKDt7W1uvPFGbrzxRra3t9ne3mZ7e5v73XXXXdxwww3cb39/n/39ffb399nb22N/f5/9/X0kcdddd/EfQRL/ESTxL9ne3gZga2uL7e1ttre32d7eZmtrixtuuIH77e/vc3BwwPXXX8/99vf3OTg44K677uLg4IC7776b/f19Hmh7e5tHPOIR3HDDDVx//fUA7O/v8zd/8ze8+qu/Ovv7+zz5yU/mSU96EgcHB2xtbfHIRz6S66+/nuuvv579/X22t7fZ39/nyU9+Mk96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v/1bXvIlX5K//du/BeDxj3/8Z//oj/7o53DVVVddddVVV131Pxd60IMexFVXXXXVVVddddX/ZNdcc82DP/mTP/npAM94xjN4zdd8TX7v936P13iN1+B+e3t77OzscOedd/IzP/MzvMRLvASv8Rqvwf7+Pn/6p3/K9vY2j3nMY/jrv/5rXvqlXxqAO++8kyc84Qns7+9z44038qhHPYobb7yRv/u7v+PBD34w29vb7O/v84QnPIE777yTu+66C4Dt7W1uvPFGbrjhBh796EcD8Hd/93ecOnWKG264AYD9/X3uuusuAO6880729/e56667eG7b29tsb2+zs7MDwA033ADA9vY229vbbG9vA/D7v//7ABw7doxjx44BcOLECQC2t7f5z7S/vw/AxYsXuXTpEve7dOkSr/7qrw7A/v4+APv7+9x9993s7+8DsL+/zz333MPzs729zfXXX8/W1hY33HAD119/PQD7+/scHBzw1Kc+lVd/9Vdnf3+fg4MD7r77bu6++27uvvtuALa2tnjkIx/J9ddfz/XXX8/+/j5//dd/zWu8xmuwv7/Pk5/8ZP7yL/+Sra0tHvnIR/KyL/uy7O/v89d//de8zMu8DE960pN48pOfzGu+5mty/fXX83u/93v83u/9Hu/zPu/D9vY2AFtbWxwcHLC1tcXv/u7v8pqv+Zr87d/+LbfccguXLl3ii7/4ix9y33333cpVV1111VVXXXXV/1zoQQ96EFddddVVV1111VX/0334h3/4d73O67zOewP87u/+Lq/5mq8JwN7eHjs7O3zDN3wDL/mSL8lrvMZrcOedd7K/v89v/uZv8hIv8RK8xmu8Bvv7+zz+8Y9nf3+fRz/60fz2b/82L/mSL8lLvMRLsL+/zxOe8ATuvPNO9vf3ufHGG7nhhht49KMfze///u/zkIc8hBtvvJH9/X3uvPNO7rrrLvb29rjrrruQxPb2NjfccAM33ngj29vb3HDDDQD83d/9HadOneKGG24AYH9/H4C77roLgDvvvJP9/X0ODg7Y39/nBdne3gZge3ub7e1t7re9vc329jb3297e5n7b29v8W+3v73O/g4MD9vf3ud/+/j4A+/v7HBwcsL+/zwuzs7PD1tYW29vbbG1tccMNNwBw/fXXA7C/v8/Fixe57bbbePVXf3X29/cBeNKTnsTBwQFPetKTAJDE1tYWj3zkI9na2uKRj3wkAPv7+/z1X/81r/Ear8Hdd9/N3XffzV/+5V+ytbXFIx/5SB7xiEewvb3N3/3d3/GMZzyD137t1+Yv//IvOTg44DVf8zXZ2tri937v9/jbv/1b3vAN3xCARzziEfze7/0er/EarwHAwcEBW1tbAPzt3/4tL/mSL8nu7i5/9Vd/9T1f//Vf/95cddVVV1111VVX/c+GHvSgB3HVVVddddVVV131P92LvdiLvdbLv/zL//ZbvuVb8tz+9m//lpd8yZcE4Bu+4Rt48zd/c06ePMmdd97J3t4ej3nMY/jrv/5rXuM1XoP9/X0e//jH84QnPIFHP/rRPOYxj+Gv//qveehDH8qNN97I/v4+T3jCE7jzzjvZ399ne3ubRz/60Wxvb3PjjTfyd3/3d5w8eZIbb7yR/f197rrrLu6880729/e56667uN/29jY33HADN954IwDb29vccMMN/MIv/AK33HILAKdOneKGG24AYH9/H4D9/X329/cBuOuuuwDY399nf3+f/f19XhhJ/EeQxL9ke3sbgK2tLQBuuOEGALa3t9na2mJ7e5vt7W0A9vf3Abj11lu5dOkSly5d4s3e7M3Y39/n4OCAu+66i4ODA+6++2729/e53/b2No94xCO44YYbuP766wHY39/nb/7mb3j1V3919vf3efKTn8zdd9/N3XffzdbWFo985CN5xCMewfb2Nvv7+/z1X/81L/3SL82Tn/xk7rnnHq677joe+chHAvBXf/VX/O3f/i1v+IZvyP7+Pi/7si/LpUuX+Lmf+zne+q3fmq2tLZ7xjGfwoAc9iOf2fd/3fTz5yU9+nX/4h3/4ba666qqrrrrqqqv+Z0MPetCDuOqqq6666qqrrvrf4HM/93N/6/z5868N8Jqv+Zr87u/+Lq/5mq8JwO/93u/xGq/xGgA84QlP4ClPeQqv9VqvBcCdd97J3t4ej3nMY/jrv/5rXvqlXxqAO++8kyc84QkAPPrRj+bRj340AHfeeSc33ngj+/v7POEJT+DOO+/krrvuYnt7mxtvvJEbbriBRz/60QD83d/9HadOneKGG25gf38fgLvuuos777yT/f197rrrLu63vb0NwA033ADAjTfeyPb2Ntvb2/zcz/0cx44dA+CWW24B4NSpU2xvb7O9vc399vf3ud/+/j4A+/v73G9/fx+Ag4MD/rW2traQxP22t7cB2N7exjYA29vbbG9v80D7+/sAXLx4kUuXLnHp0iUuXbrEpUuXeIu3eAsA7r77bvb39zk4OGB/f5+7776bB9re3uYRj3gEADfccAPXX389APv7+/zN3/wNr/7qr87+/j533303BwcH/OVf/iUAW1tbPPKRj+QRj3gE29vb7O/vs729zf7+Pk9+8pO5++672d/f55GPfCQv+7Ivy8HBAX/1V3/Fy7zMy/CkJz0JgJd92Zfl4OCA3/7t3+a1X/u12d/f5/rrr+f3fu/3eI3XeA0Afu7nfo63eIu34Od+7ud4yZd8SQ4ODn77Mz/zM1+Hq6666qqrrrrqqv/50IMe9CCuuuqqq6666qqr/jd4sRd7sdd+v/d7v986fvw4f/M3f8NrvuZr8tz+9m//loc85CHceeedbG9v87SnPY2XfumXBuDOO+/kzjvv5NGPfjR/9Vd/xUu+5Etyyy23sL+/zxOe8ASe8IQncOONN3LDDTfw6Ec/ml/4hV/gpV/6pbnxxhvZ39/nzjvv5K677uIJT3gCADs7O9xwww3ceOONbG9v89u//dscO3aMW265hVOnTnHDDTewv78PwF133cWdd97J/v4+AHfddRcAkgDY3t4GYHt7m+3tbba3t9ne3gZge3ubv/mbv2F7e5tjx45x7Ngx7nfs2DEAjh07xn+GS5cucb9Lly4BcOnSJS5dusQdd9zBm73Zm7G/v8/BwQH7+/vs7++zv7/P4eEh+/v7PLft7W22tra4/vrrAbjhhhu4/vrrAdjf3+fixYvcdttt3HbbbbzFW7wFT37ykwH4y7/8SwC2trZ45CMfCcDLvuzLArC/v89f//Vf89Iv/dI8+clPZn9/n7vvvptHPvKRPOIRj2B7e5tLly7xt3/7t7zMy7wMT3rSkwB42Zd9WQ4ODvirv/orXuZlXob9/X2uv/56Ll26xLFjxwA4ODhga2sLgN/93d/lJV/yJbl06RI/93M/9z6/9Vu/9d1cddVVV1111VVX/c+HHvSgB3HVVVddddVVV131v8E111zz4G/6pm96Os/0u7/7u7zma74m3/AN38C7v/u7c+zYMQB+7/d+j5d+6ZcG4M477+Q3f/M3eYmXeAle+qVfGoDHP/7x3HXXXdxwww284iu+IgD7+/sA3Hnnndx1113ceeedALzCK7wC29vb/PVf/zW33HILD37wg9ne3mZ/f5+77rqLO++8kyc+8YkAbG9vs729zfb2NjfeeCPb29v89m//NseOHeOWW27h1KlT3HDDDQDs7+8DcNdddwFw1113sb+/D8Bdd93FC7K9vc39tre3AdjZ2eF+W1tbAGxvb/OvdXBwwAPt7+8DsL+/z/0ODg7Y39/nBdne3kYSW1tbXH/99QDccMMNAFx//fUA7O/vc3BwwFOf+lQAbrvtNt7iLd6Cu+++m/39fe6++27uvvtuJLG1tcX111/P9vY2j3jEI9je3mZ/f5+//uu/BuClX/qlefKTn8zdd9/N3Xffzcu+7MuytbXFIx/5SPb399ne3ubg4IAnPelJ3HPPPVx33XW87Mu+LAcHB/zVX/0Vv/d7v8cbv/Eb88hHPhKA3/7t3+a1X/u12dra4tKlS3zf930fH/7hH87P/dzP8RZv8Rbc7+3e7u3EVVddddVVV1111f8O6EEPehBXXXXVVVddddVV/1t8+Id/+HeVUt77NV/zNXluv/d7v8drvMZr8IQnPIHf+I3f4CVf8iV5jdd4Dfb393n84x/PjTfeyI033sidd97Jzs4Od955J3fddRcAN9xwA49+9KP5u7/7O17iJV6C/f197rzzTu666y6e8IQnsL29zY033sijHvUobrzxRn7hF36BW265hZd4iZcAYH9/n7vuuos777yT/f197rrrLgC2t7cBuOGGG7jxxhvZ3t5me3ubn/u5n+PYsWPccsstAJw6dYobbriB++3v7wOwv7/P/v4+AHfddRcA+/v73O/g4ID9/X3+vSTxgmxvbwOwtbUFwPb2Ntvb2wBsb2+ztbXF9vY229vb3G9/fx+AixcvcttttwFw22238RZv8RYcHBxw1113AXD33Xdz9913c7/t7W0e8YhHIIlHPvKRbG1tsb+/z8WLF7ntttt4qZd6KQ4ODrj77rt50pOeBMAjH/lItra2eOQjH8n+/j5//dd/zUu/9EsD8OQnP5knP/nJPOIRj+BlX/ZlOTg4YGtri4ODA570pCdx/fXXc/311/N7v/d7/N7v/R7v8z7vw/XXX8/v/d7v8Rqv8Ro8t5/92Z9le3v7u7/+67/+fbjqqquuuuqqq6763wE96EEP4qqrrrrqqquuuup/i2uuuebB3/RN3/T0ZzzjGfzt3/4tb/EWbwHA3t4eOzs7AOzv77O9vQ3AN3zDN/CSL/mSvMZrvAZPeMITuPPOO7nxxht59KMfzd/93d/xEi/xEuzv7/OEJzyBJzzhCdx444086lGP4sYbb+Tv/u7veImXeAn29/fZ29vjiU98Int7e+zv77Ozs8P29jaPfvSj+Zmf+RluueUWbrnlFk6dOsUNN9zA/v4+AHfddRd33nkn+/v73HXXXdxvZ2cHgBtuuAGAG264ge3tbQBuuOEGntvf/d3fcerUKQBuuOEGnp/9/X0eaH9/n/tJwjYPJAnb3G97e5v7bW9v8/zs7+8DsL+/zzRN3HLLLTzQ/v4+AAcHB9x1110AHBwcsL+/z9133839tre3AXjEIx4BwA033MD1118PwP7+Pn/zN38DwG233cbrvM7rcPfdd3P33Xdz9913s7W1xSMf+Uiuv/56rr/+evb39/nrv/5rXuM1XoP9/X2e/OQn86QnPYlHPvKRPPKRj2Rra4u/+7u/4yVe4iV48pOfzJOf/GQe8YhH8IhHPIK//du/5fd+7/d4wzd8Qx7xiEdwcHDA1tYWAAcHB2xtbQHwcz/3c7zkS74kD3rQg/iQD/mQh9x33323ctVVV1111VVXXfW/A3rQgx7EVVddddVVV1111f8mn/u5n/tbN95442sfP36c3/3d3+U1X/M1Abh06RLHjh3jG77hG3jJl3xJXuM1XoP9/X3uvPNOfvM3f5PXeI3X4CVe4iV4whOewJ133snOzg5/9md/xku8xEvw0i/90gDceeed3HXXXdx5553ceOON3HDDDfzFX/wFt9xyCw996EO58cYb2d/f56677uLOO+/kiU98Itvb2wDccMMN3HjjjWxvb3PDDTcA8Hd/93ecOnWKG264AYD9/X329/fZ39/nrrvuYn9/n/39ffb393mg7e1tALa3t9ne3gZgmiYAtre3AbjpppsA2N7e5tixY/xnueOOO7h06RL7+/sAHBwcsL+/zy233ML+/j77+/sA3HPPPTy37e1ttra2uP766wG44YYbuP7667nf/v4+t956Ky/xEi8BwP7+PnfffTcHBwfcfffd3H333WxtbXH99dezvb3Ny77sywKwv7/PX//1X3Pbbbfxlm/5ljz5yU/mL//yL7n++uu5/vrredmXfVkODg74q7/6K/7u7/6OV37lV+bJT34yL/uyL8sjHvEInvGMZ/DzP//zvOEbviFbW1tcf/31PNDBwQFbW1sAfP/3fz9v/dZvzdbWFvfdd9+tH/IhH/IQrrrqqquuuuqqq/73oHLVVVddddVVV131v8zf//3f//aLvdiLvfb3f//38+7v/u7c79ixY/ze7/0e7/me78n29jbf8A3fwJu/+Ztz44038rqv+7rs7e0BMI4jr/d6r8f+/j4Ad955J3t7e+zs7DCOI6/7uq/L/v4+d955J094whPITMZxZH9/H4Dt7W2GYeB1X/d1ed3XfV329/e56667uPPOO3nCE57AXXfdxfb2Ntvb22xvb9P3PXfddRc33HAD29vb/M3f/A3Hjh3jUY96FDfccAMA+/v7AOzv77O/v8/+/j77+/vs7++zv7/PXXfdxXP7m7/5Gx5oe3ubB9re3uZ+tpHEA9lGEvc7ODjgfvv7+/xLVqsVAFtbW+zs7HDDDTcAcMMNN7C1tcX29jb329/f5+LFizz1qU/l+uuvB2B/f5+7776bYRj4+Z//ee6++24ksbW1xfXXX8/111/Pa77ma7K9vc3+/j633norAPv7+zz5yU9mc3OT5XLJL/zCL/DIRz6S93//92d/f5+//uu/5n62eeVXfmUe+chH8rIv+7L87d/+Ld/wDd/AG77hG/Iqr/IqPOIRj+AZz3gG3/AN38CHfdiHAfC3f/u3vORLviT3e/d3f3e+7/u+j/d4j/fgH/7hH36bq6666qqrrrrqqv9d0IMe9CCuuuqqq6666qqr/jd5sRd7sdf+3M/93N96xjOewd/+7d/yFm/xFnz/938/7/7u78799vf32d7e5glPeAJPfvKTee3Xfm0A7rzzTvb29njMYx7DX//1X/Mar/Ea7O/v84QnPIE777yTG2+8kRtuuIEbb7yRv/u7v+MlXuIl2N/f58477+Suu+7iCU94Ajs7O9xwww08+tGP5oYbbuAXfuEXuOWWWzh16hQ33HAD+/v73HXXXezv73PnnXdy1113cb/t7W1uvPFGAG644Qa2t7e54YYbAPiFX/gFjh07xrFjxzh16hQAN9xwAw+0v78PwP7+Pvv7+0jCNvv7+wAcHBxwv/39ff41tre3ud/29jb3297eBmBrawuA7e1ttre3ud/+/j4ABwcHnDt3jkuXLgHw6q/+6uzv7wNw9913s7+/z913383+/j4HBwcAbG9vs7W1xfXXX88NN9zA9ddfD8D+/j633norly5d4tVf/dW5++67ufvuu7n77rvZ399ne3ub66+/npd92ZcF4O/+7u94iZd4Cfb393nyk5/Mk5/8ZB7xiEfwsi/7shwcHPBXf/VXvMzLvAx33303+/v7vOzLviwHBwf81m/9Fo9+9KPZ2tpie3ubra0t7vf93//9vPu7vzvf//3fz2u8xmvwoAc9iA/5kA95yH333XcrV1111VVXXXXVVf97oAc96EFcddVVV1111VVX/W9yzTXXPPiTP/mTn/6gBz0IgN/93d/lNV/zNQHY399ne3sbgN/7vd/jpV/6pbnzzjvZ3t7mr/7qr3it13otAO68807uuusuHvWoR/FXf/VXvMzLvAw7Ozvs7e3xxCc+kTvvvJNHP/rR3HDDDfzVX/0VD3rQg3iJl3gJ9vf32d/f58477+Suu+5if38fgBtuuIEbb7yRRz3qUfzCL/wCt9xyC6dOneKGG24AYH9/n/39ffb397nrrrvY39/nrrvu4n7b29sAbG9vs729zQ033ADA9vY229vbbG9v83u/93scP36c+91yyy3c79ixY/xnuHTpEgCXLl0C4NKlSwDs7u7y0i/90gAcHBywv7/P/v4+AHfffTcAd999N/fb3t4G4Prrr2dra4sbbriB66+/HoD9/X0A/uZv/oZLly7xmq/5mhwcHPDkJz+Z/f197r77bra2tnjkIx/J9ddfz/XXX8/+/j633norz3jGM3it13otnvzkJ/OkJz2JG264geuvv55HPOIRHBwc8Fd/9Ve8zMu8DHfffTf7+/u87Mu+LAcHB/zVX/0VD3/4wzk4OOARj3gEf/u3f8tLvuRLAnBwcMDW1hYAP/dzP8dbvMVbAPA3f/M3fO7nfq646qqrrrrqqquu+t8FPehBD+Kqq6666qqrrrrqf5sP//AP/67XeZ3XeW+e6Xd/93d5zdd8TQB+7/d+j9d4jdcA4Od//ud5rdd6LQDuvPNOfvM3f5NbbrmF13qt1wLgCU94AnfeeSePfvSjefSjH83v/d7v8Rqv8Rrs7+9z55138oQnPIH9/X1uvPFGbrjhBh796Efze7/3ezzsYQ/jhhtuYH9/n7vuuos777yT/f197rrrLra3t7nhhhu48cYb2d7e5oYbbuAXfuEXOHbsGMeOHePUqVPccMMNAOzv77O/v8/+/j77+/vs7++zv7/P/v4++/v7PLft7W0ksb29zfb2NraRxNbWFgDb29vcb3t7m3+Ng4MD7re/v8/99vf3Adjf3wfg4OCA/f197icJgO3tbba2ttje3mZrawuAG264geuvv5777e/vc/HiRW677TZuu+023uIt3oKDgwPuvvtuAP7yL/8SgK2tLR75yEcC8LIv+7IA7O/v89d//de8xmu8Bvv7+zz5yU/mSU96EgCPfOQjedmXfVkODg74q7/6K17jNV6Dv/zLv+Tg4ICtrS1e9mVfloODA/7qr/6K3/u93+N93ud9uP766zk4OOCnf/qneeu3fmu2trZ4xjOewYMe9CAAfu7nfo63eIu34H5/8Ad/8Ntf+ZVf+TpcddVVV1111VVX/e+CHvSgB3HVVVddddVVV131v807vuM7ftYrv/Irf/axY8c4fvw4z+33fu/3eI3XeA3uvPNOdnZ2+Ou//mte4zVeg/39ff70T/+URz/60dx4443ceeed7OzscOedd3LXXXcB8KhHPYq/+qu/4kEPehAv8RIvwf7+PnfeeSdPeMITODg44IYbbuDGG2/khhtu4Hd/93e55ZZbOHXqFDfccAP7+/vcdddd7O3tcdddd3HXXXcBsL29zQ033IAkbrjhBra3t/mZn/kZbrnlFgBuueUWTp06xfb2Ntvb29xvf3+f/f199vf3Adjf3+fg4ACA/f19APb39wHY39/nRSWJf8n29jYAW1tbAGxvb7O9vc39rr/+eiSxtbXF9vY299vf3+fg4IBz585x6dIlLl26xKVLl3iLt3gL7r77bvb397n77ru5++67Adje3mZ7e5vrr7+e66+/nuuvvx6A/f19/vqv/xqAl37pl+bJT34yAH/5l3/J1tYWj3zkI3nZl31ZAG677Tb+9m//ltd+7dfmSU96Ek9+8pN5xCMewcu+7MtycHDA1tYWBwcH/OVf/iUv+7Ivy9bWFr/3e7/Ha7zGa3C/3/3d3+U1X/M1eW67u7sAfP/3f//7/NZv/dZ3c9VVV1111VVXXfW/C3rQgx7EVVddddVVV1111f82L/ZiL/ban/u5n/tbPNPv/u7v8pqv+Zp8//d/P+/+7u/O/fb397nf937v9/KSL/mSvMZrvAb7+/v82Z/9GTfccAOPfvSj+bu/+zte4iVegv39fZ7whCfwhCc8gUc/+tHccMMN/NVf/RUPetCDeImXeAn29/e56667uPPOO3niE5/I9vY2N9xwAzfeeCM33HAD29vb/N3f/R2nTp3ihhtuAGB/f5+77rqLu+66i/39ffb399nf3wdge3ub7e1ttre3ueGGG9jf3+eGG25ge3ub7e1tHujv/u7vOHbsGLVWtre32d7e5gXZ39/nX2t7e5sXZH9/H4D9/X2maeLSpUu8xEu8BA+0v78PwN13383+/j4Ad999N3fffTf3297eZmtri+uvv57t7W0e+chHArC/vw/A3/zN3/Dqr/7q7O/vc/fdd3NwcMCTnvQkAB75yEcC8LIv+7Ls7+9z8eJFnvGMZ/DSL/3SPPnJT+aee+7huuuu45GPfCRbW1vcdtttnDx5krvvvpsnP/nJvMzLvAzXX389v/d7v8fv/d7v8ZEf+ZFsbW1xcHDA1tYW9/v+7/9+3v3d352//du/5SVf8iW534d8yIc85L777ruVq6666qqrrrrqqv9d0IMe9CCuuuqqq6666qqr/re55pprHvzJn/zJTwd4xjOewWu+5mvyu7/7u7zma74mAPv7+2xvb/MN3/ANvORLviSv8RqvAcATnvAEfuM3foPXeI3X4CVf8iXZ39/nz/7sz9je3ubP/uzPeImXeAle+qVfGoA777yTu+66izvvvJNHP/rR3HDDDdx444383d/9HQ9+8IPZ3t5mf3+fu+66iyc84QncddddbG9vc8MNN3DjjTeyvb3NDTfcAMDf/d3fcerUKW644QYA9vf3Abjrrru46667ANjf3+euu+7iftvb2wBsb2+zvb0NwPb2NpkJwPb2NgDb29scO3aM7e1t/iPt7+9z6dIlDg4OsM3BwQH7+/scO3YMgIODA/b39zk4OGB/f5/7bW9vA3D99deztbXF9vY229vbXH/99QDs7+9zcHDAU5/6VF791V8dgP39fZ785CcD8Jd/+ZdsbW2xvb3N9ddfz/XXX8/111/P/v4+f/3Xf81rvMZrcPfdd3P33XfzpCc9CYBHPvKRvOzLviwHBwf81V/9FX/3d3/HK7/yK/PkJz+Z13zN1+T666/nb//2b/m93/s93vAN35CtrS2uv/56AO6++26uv/56Dg4O2NraAuBv//ZvecmXfEl+93d/lwc96EHs7u7yuZ/7ueKqq6666qqrrrrqfx/0oAc9iKuuuuqqq6666qr/jb7jO77Dx48fB+AZz3gGD3rQg/jd3/1dXvM1XxOA3/u93+OlX/ql2d7e5hu+4Rt4jdd4DR7ykIdw5513sr+/zyu8wivwe7/3e7zGa7wG+/v73Hnnndx111086lGP4sYbb+Tv/u7veImXeAn29/e58847eeITn8j+/j433HADj370o7nhhhv4+Z//eV7yJV+SW265hf39fQDuuusu7rzzTp74xCeyvb0NwA033MCNN97I9vY2N9xwAwC/8Au/wC233MKpU6e44YYbuN/+/j4Ad911FwD7+/vs7+9zcHAAwP7+Pvv7+7ww29vbPD+SeEH29/f5l2xvbwOwvb3N9vY2W1tbANxwww0AXH/99dxvf3+fg4MDnvrUpwLw6q/+6uzv73NwcMBdd90FwD333MPdd9/N1tYW29vbXH/99Vx//fVcf/317O/vk5n87d/+LS/90i/NwcEBT3rSk3jyk5/M1tYWj3zkI3nZl31ZAH7v936P13iN1+Dg4IDf/d3f5brrruORj3wkW1tb/N7v/R5/+7d/yxu+4Ruyv7/Py77sy3Lp0iW+//u/nw/7sA8D4BnPeAYPetCDAPjbv/1bXvIlX5JnPOMZPOhBD+J+b/d2byeuuuqqq6666qqr/vdBD3rQg7jqqquuuuqqq6763+hzPudzfmt7e/u1n/GMZ/Car/maXLp0iWPHjvG7v/u7vOZrviYAv/d7v8drvMZrsL+/z5133slTnvIUXuu1XguAO++8k/39fW644Qae9rSn8Rqv8Rrs7+/zhCc8gTvvvJMbb7yRG264gRtvvJG/+7u/4yVe4iXY39/nrrvu4s477+Suu+5ie3ubG264gRtvvJEbbriBX/iFX+AlXuIluOWWWwDY39/nrrvuYn9/n7vuuou77roLgO3tbba3t9ne3uaGG24AYHt7m5/5mZ/h2LFjHDt2jGPHjnHs2DFOnTrF9vY2ANvb29xvf3+f++3v7wOwv7+PJGwDsL+/zwNJ4gXZ3t7mfltbWwBsb28DsL29zQPt7+8DcHBwwLlz57h06RIAt912GwCv8zqvA8Bdd90FwN13383dd98NwPb2NltbW9xwww1cf/31XH/99QDs7+9z8eJFnvGMZ/Aar/Ea7O/v8+QnP5m7776b/f19rr/+era3t3nZl31ZAG677TZuueUWDg4OeNKTnsSTn/xkHvGIR/CyL/uyHBwc8Fd/9Ve8zMu8DE960pMAeNmXfVkODg746Z/+aV7plV6Jra0trr/+en7u536O13md12Fra4u//du/5SVf8iV5xjOewYMe9CD+5m/+huPHj3NwcPA7n/mZn/naXHXVVVddddVVV/3vgx70oAdx1VVXXXXVVVdd9b/R53zO5/zWi7/4i782wO7uLsePH2d/f5/t7W1+93d/l9d8zdfkzjvvZGdnhwsXLnDy5EnuvPNOAM6ePctLv/RLA3DnnXdy11138ahHPYq/+qu/4mVe5mW48cYbufPOO3niE5/InXfeyaMf/WhuvPFG/vIv/5IHPehBvMRLvAT7+/vs7+9z5513ctddd7G/v8/29jY33HADN954Iz/zMz/DLbfcwi233MKpU6e44YYbANjf32d/f5/9/X3uuusu9vf32d/fZ39/H4Dt7W0AbrjhBgBuuOEGALa3t/m7v/s7tre32d7e5tixYxw7doz7HTt2jH/J/v4+29vbvKguXboEwKVLl7h06RL7+/tcunSJl37pl2Z/f5/9/X0A7r77bgDuvvtu7re9vc3W1hbXX389ADfccAPXX389APv7+xwcHPDUpz6VS5cucdttt/HWb/3W3H333dx9993cfffdbG1t8chHPpLrr7+e66+/nv39fW699VZ2d3d56Zd+aZ785Cfz5Cc/mUc84hFcf/31XH/99RwcHPBXf/VXvMzLvAx33303+/v7vOzLviwHBwf81V/9FQ9/+MM5ODjgEY94BJcuXaKUAsDW1hY/93M/x1u8xVtwcHDA1tYWu7u7HD9+HIDf+q3f+p6v//qvf2+uuuqqq6666qqr/vehctVVV1111VVXXfW/1NmzZ28FeMYznsGDHvQg9vf3+Z7v+R7e673ei9d8zdcEYGdnh+3tbe68807++q//mtd4jddgf3+fu+66i6/7uq/jNV7jNXjpl35pbrzxRp7whCcwTRP7+/sAPO1pT+N1X/d12d/f56677uLP/uzP2N/fZ2Njg7vuuouf/umf5iVe4iV42MMexiu8wiuwv7/PXXfdxZ133smf/dmfAXDx4kU2Njbo+5677rqL7e1ttre32d7e5u/+7u941KMexQ033ADA/v4+AHfddRcAd911FwBPetKT2N/fZ39/nwfa3t7mftvb2wBsb29jG0kAbG1tcT9JvDD7+/vcb39/H4CDgwMA9vf3AZAEwB133MH29jZbW1tsb29z/fXXA/ByL/dyAFx//fXcb39/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Ndjf3+cJT3gCAK/wCq/AM57xDB70oAdx55138sQnPhGARz3qUdx444383d/9HS/xEi/B/v4+d911F094whPY39/nhhtu4MYbb+RRj3oUP//zP8+DHvQgXuIlXgKA/f197rrrLu666y729/e566672N7eZnt7m+3tbW644Qa2t7e54YYbuN/f/d3fcerUKba3t9ne3uZ++/v7HBwcYJv9/X329/c5ODgAYH9/n/vt7+8DsL+/D4AkXlTb29s80NbWFgDb29tsb28DsL29zfb2NgBbW1tsb29zv/39fQ4ODnjqU5/Kq7/6q7O/v8/97r77bg4ODrj77ru5++67Adja2uKRj3wkAC/7si8LwP7+Prfeeiu7u7u89Eu/NHfffTcHBwf85V/+JVtbWzzykY/kZV/2ZQH4u7/7Ox7ykIcA8KQnPYknP/nJvOzLviyPeMQjuHTpEj/3cz/HYx/7WA4ODnjZl31ZAP7qr/6K6667DoBHPOIR/O7v/i6PeMQjuP7663nGM57Bgx70IJ7bz/7sz7K9vf09X//1X//eXHXVVVddddVVV/3vgx70oAdx1VVXXXXVVVdd9b/RT/zET3h3d5fjx49zv/39fba3t7nf/v4+29vbAOzv7wPwZ3/2Z7zCK7wCf/3Xf81rvMZrsL+/z5/92Z+xvb3NK7zCK/B7v/d7vMZrvAb7+/s84QlP4IlPfCKPetSjuPHGG7nhhhv4u7/7O17iJV6C/f197rrrLu68806e+MQnsr29zQ033MCjH/1obrjhBgD+7u/+jlOnTnHDDTewv78PwF133cVdd93F/v4+d911FwDb29tsb2+zvb3NDTfcAMD29jYAN9xwA/f7/d//fY4dO8axY8eotbK9vQ3A9vY2/xn29/e538WLF7l06RKXLl3i1V/91bnf/v4+AHfffTf7+/sA3H333dx9990AbG9vA/DIRz4SgOuvv57rr78egP39ff76r/+a13iN12B/f5+DgwPuvvtu7r77bvb393nkIx8JwMu+7MsCcNttt3HLLbdwcHDAk570JJ785CfziEc8gkc+8pFsbW3xt3/7t7zkS74kf/mXf8mTn/xkXvM1X5Prr7+e3/u93+NlXuZlePKTn8wjHvEIALa2trjnnnu47rrr+JecPXv2GR/8wR/8YK666qqrrrrqqqv+90EPetCDuOqqq6666qqrrvrf6Cd+4icM8Dd/8ze81Eu9FM94xjN40IMexO/+7u/ymq/5mgD87u/+Lq/5mq/JE57wBG688Ub++q//mtd4jdfgCU94Avv7+/zpn/4pL/mSL8lrvMZr8IQnPIG77rqL7e1tHv3oR/PXf/3XvPRLvzQAd911F094whPY39/nUY96FDfeeCM33HADf/d3f8dLvMRLsL+/D8ATnvAE7rrrLu666y52dna44YYbuOGGG9je3uaGG24A4O/+7u84deoUN9xwAwD7+/vs7++zv7/PXXfdxf7+PgB3330399ve3mZra4udnR0Atra22N7eBmB7e5v7bW9vA7C9vc2/1v7+Pg+0v78PwMHBAfv7+9zv7rvvBuDg4ID9/X3ut729zdbWFtdffz0AN9xwA9dffz3329/f59Zbb+UlXuIlANjf3+fuu+/m4OCAu+++m7vvvputrS0e+chHcv3113P99dezv7/PX//1X/Mar/EaHBwc8KQnPYknP/nJADziEY/gZV/2ZTk4OOCv/uqveJmXeRme9KQn8eQnP5mXfdmX5RGPeATPeMYz+Pmf/3ne8A3fkP39fV72ZV+Wv/3bv+WhD30od999N494xCP43d/9XR7xiEdw/fXX83M/93O8xVu8Bc94xjN40IMexN/8zd/wUi/1UgB85md+5uv8wz/8w29z1VVXXXXVVVdd9b8LetCDHsRVV1111VVXXXXV/zav8zqv894f/uEf/l3PeMYzeNCDHgTA/v4+29vbAPzu7/4uL/MyL8P29jb3u/POO9nf3+fP//zPeau3eisA7rzzTvb39/nTP/1TXuM1XoOXfMmXZH9/nz/7sz8D4FGPehQ33ngjf/d3f8dLvMRLsL+/z1133cUTnvAE9vf3ueGGG3j0ox/NDTfcwM///M/zsi/7stxwww3s7++zv7/PXXfdxV133cVdd93F9vY229vbbG9vc8MNN7C9vc0NN9zAL/zCL3Ds2DGOHTvGqVOnuOGGG7jf/v4++/v77O/vI4m9vT0ODg7Y398HYH9/n/39fZ4fSfx77ezsALC1tQXA9vY2W1tbAGxvb7O9vc3111/P/fb39wG49dZbuXTpEpcuXeLN3uzN2N/f5+677+bg4IC7776bu+++m62tLba3t7n++uu5/vrruf766wHY39/nr//6r3mN13gN9vf3efKTn8yTn/xkAB7xiEfwsi/7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e5sbbriBG264ge3tbW644QYAbrvtNmqt3HDDDQDs7+9z1113AXD33Xezv7/P/v4++/v73G97exuA7e1ttre3sY0ktre32d7e5n5bW1s80Pb2Ni/I/v4+AJIA2N/fB2B/fx+Ag4MD7r77bra2tjg4OGB/f58H2t7eZmtri+3tbba3t7n++uvZ2tpie3sbgP39fS5evMgtt9wCwP7+PnfffTcHBwfcfffd3H333WxtbXH99dezvb3Ny77sywJwcHDAX/3VX/EyL/MyPOlJT+LJT34yBwcHvMzLvAzXX389119/PZcuXeLYsWPcfffd/O7v/i4Ar/mar8n111/P7/3e7/EyL/My/O7v/i4Ab/qmb8qlS5copfC7v/u7vMzLvAzb29sAPPnJT+ZlXuZleMYznsGFCxd4mZd5GZ7bM57xDB70oAcBcN999936Dd/wDe/z93//97/NVVddddVVV1111f9s6EEPehBXXXXVVVddddVV/9N9xVd8hR/84Afzgtx5551M08TJkyd5/OMfz7XXXsvJkyf5jd/4De644w7e673eC4Df+I3f4MYbb+QVXuEVAHjCE57AE57wBG688Ub+9E//lDd/8zfn5MmT3HXXXTzhCU9gf3+fRz3qUfzpn/4pL/mSL8lrvMZrsL+/z1133cUTnvAE9vf3AXjUox7FjTfeyF/+5V/yoAc9iJd4iZcAYH9/n7vuuou77rqLJz7xiQBsb2+zvb3N9vY2N9xwA9vb29xwww38/M//PA960IMAOHXqFDfccAMA+/v7ABwcHLC3twfA3XffDcD+/j4ABwcHAOzv7/NvIYkH2t7eBmBrawuA7e1ttra2ANje3mZ7e5utrS22t7e53/7+PhcvXuQZz3gGAK/xGq/B/v4+d999NwcHB9x9993cfffdAGxtbbG9vc3111/P9ddfz/XXX8/BwQF/9Vd/BcDLvMzL8KQnPYl77rmHu+++m62tLR7xiEfwsi/7sgD83u/9Hn/7t3/Lq7zKq/DkJz8ZgEc84hG87Mu+LJcuXeL7v//7edVXfVWe/OQn8zIv8zI84hGPAODuu+/m937v93iN13gNtre3+emf/mke9KAH8Rqv8Ro84xnPYBgGrr/+eqZpYrVacd111/GC7O7u8n7v937iqquuuuqqq6666n829KAHPYirrrrqqquuuuqq/8ne8R3f8bPe6Z3e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ox7F/v4+f/3Xf83DHvYwXv7lX579/X2e+MQn8sQnPpH9/X329/e56667kMT29jY33HADfd9zww038Du/8zs86EEP4oYbbuDlX/7lAdjf3+euu+7i7rvvBmB/f5+7774bgP39ffb397n77rt5Qba3t7nf9vY2ANvb2/xr7O/vIwmA/f19Dg4OeKDHPe5xvDBbW1vs7Oxw3XXXsb29zSMe8Qjud3BwwF/91V/xlKc8hZd5mZfh7rvvZnNzk+/4ju/gfpIA2Nra4hGPeATXX3891113HQcHB/zVX/0VL/MyL8OFCxf4jd/4DR7ouuuu4zVf8zXZ2tri937v9/i93/s9XuZlXoZf+qVfAmBra4uHP/zhvMzLvAwAy+WSX/qlX+J+b/Imb8LW1hbf//3fz+nTp7nnnnvY2trijd/4jXnGM56Bbe655x62trZ4+MMfzt/8zd9w9913A3Ddddexu7vLU5/6VB7+8IcD8JSnPIXn55577uHhD384BwcHbG1tcb/d3V2uueaaB7/xG7/x07/3e79XXHXVVVddddVVV/3HonLVVVddddVVV131H+xzP/dzf2uaJp6fnZ0dHmhvb49Lly6xs7PDzs4OT33qU7nxxhu58cYb+dM//VNe8RVfke3tbR796EfzhCc8gdlsRmbyeq/3enzv934vT3jCE7jxxhu5cOECb/3Wb81P//RPs7+/z7Fjx9jf3wfgPd7jPfjpn/5p9vf3+bM/+zNe4RVege///u/nrd7qrXj0ox/NE57wBP78z/+cu+66i2PHjjGOI/v7+/z1X/81r/u6r8srvMIr8MQnPpE///M/Z39/nz//8z/nz//8z7nhhhvY398H4K//+q956Zd+aV7+5V+e/f19nvjEJ3L33Xdz1113sb+/zxOf+ESe+MQnArC9vc358+fp+5677rqLG264ge3tbR71qEexvb3NDTfcAMD+/j4Ad999NwB33XUXAPv7+xwcHLC/v8/99vf3AZDEwcEBAHfffTf/WpJ4Qba2tgDY3t7m+uuvB+D6668H4Prrrwfg4OAAgK2tLe53cHDAk570JDY3N/mrv/ornvSkJ/Hctra2eOQjH8l1113H9ddfz8HBAX/1V3/Fddddx5Of/GT29/f50R/9UR7oZV7mZXjEIx7B1tYWv/d7v8fLvMzLsLW1xfXXX88999wDwHXXXcebvMmbcHBwwPd///fzYi/2Yvz1X/81AFtbW7zGa7wGW1tbAJw+fZp77rkHgFd/9Vfn0qVLzGYz/vqv/xqAV3/1Vwdgc3OTe+65h4c//OFsbW3xlKc8hXvuuYdXe7VXA+DSpUtsbW0BsLu7y8HBAQBbW1s8P8ePH2d3d5fjx4/z4R/+4d/19V//9e/DVVddddVVV1111X8cKlddddVVV1111VX/gV7ndV7nvV/sxV7stXd3d3lud955J9vb2+zs7PBABwcHAGxvb3P+/HkAHv3oR/Onf/qnPOEJT2Bzc5NXfMVX5AlPeAJ/+qd/ytu8zduwvb3NK77iK/Knf/qn/MZv/AZ7e3u813u9F2/91m/N933f97G/v89P//RPc+nSJd7jPd6Dt37rt+bP/uzPeMITnsCf//mfs729zf7+Pk996lN5jdd4DW688UZ+8zd/k/39fZ74xCdy1113ccMNN7C/v89f//Vf8xqv8Ro86lGP4olPfCJPfOIT2d/f56677uKuu+7iz//8z7nhhhu46667eNSjHsVf//Vf87CHPYyXf/mXZ39/n7vuuou7776bJz7xiQDs7+/zxCc+kSc+8YkAbG9vA3DDDTdw/fXXc9ddd7G9vQ3A7/zO7/CgBz0IgEc+8pHccMMNPND+/j4A+/v7HBwccL/9/X0ADg4O+JdsbW0BIAmAra0tALa3twG4/vrreaD9/X0ALl68yFOe8hQArr/+eg4ODtjf3+fuu+8G4J577uHuu+/m+dna2mJ7e5vrrruORz7ykWxtbXFwcMBf/dVfcf3117O/v8/W1hbf+Z3fyQNtbW3xiEc8gpd5mZcB4Pd+7/d4mZd5Gba2tvixH/sx7re1tcVrvMZrcN111/F7v/d7vMzLvAyz2Yy//uu/BuC6667jTd7kTbh06RJf8zVfw4033sj93viN35itrS2++7u/m62tLQBe+qVfmuuuu46DgwN+//d/H4CHP/zh7O7u8tSnPhWA6667DoDVasXW1hYAq9WK+x0cHHBwcMDW1hYHBwdsbW1xv+PHj/NSL/VSHD9+/L3vu+++W3/0R3/0c7jqqquuuuqqq676j0Hlqquuuuqqq6666j/INddc8+A3f/M3/y6A48ePc7+9vT12dnbY3t5mZ2eHO++8k729PQB2dnbY398HYGdnhzvvvJNnPOMZPOhBD+Kmm27izjvv5NGPfjQ33ngjj370o3nCE57Ab/zGb3Dy5Ele5mVehjvvvJO77rqLY8eOsbe3x87ODu/xHu/B933f97G/v8+xY8d40pOexGq14hVe4RXY3t7mz//8z9nf3+dnfuZnePmXf3m+4Ru+gTd/8zfnrd7qrXjCE57An//5n7O/v88Tn/hE7rrrLnZ2drjrrrv4y7/8S17rtV6LRz3qUdx111088YlP5K677mJ/f58nPvGJPPGJT+TP//zPueGGG9jf3wfgd37nd3jJl3xJXvu1X5vXfu3XZn9/n7vuuou7776bJz7xiQDs7+8D8MQnPpEnPvGJSAJge3sbgPPnzwMwm8246667ANje3ubv/u7vuOmmmwA4duwYN9xwA/9RLl26BMClS5e47bbbuHTpEg9+8IMBODg44O677wYgMzk4OOA7vuM7eGG2trbY3t7muuuu44YbbuC6664D4LbbbuOv/uqveJmXeRme/OQns7W1xXd+53fy3La2tniZl3kZHvGIR3BwcMDv/d7v8TIv8zJsbW3xYz/2Y9xva2uLhz/84bzMy7wMly5d4vu///t5sRd7MX7sx36M+730S780L/MyL8MznvEMZrMZN954I/d74zd+Y7a2tgDY2toC4LrrruOlX/ql+Zu/+RvuvvtuAB7+8Idz3XXXcXBwwD333MN1113H1tYWz3jGM7jnnnt4tVd7NQDuvfdeHujg4ACAg4MDtra2eH7e6I3e6LP/4R/+4Xf+4R/+4be56qqrrrrqqquu+vejctVVV1111VVXXfUf5MM//MO/68EPfjAvyN7eHjs7O+zt7fFAd955JwA33ngjf/qnf8rR0REAj370o/mN3/gNnvCEJzBNE6/4iq/IE57wBO68805uuOEGLly4wOu93uvx0z/90+zv7/Obv/mbvPVbvzUA7/Ee78FP//RPs7+/z5/92Z/xCq/wCmxvb/MKr/AKPPrRj+ZnfuZn2N/f58///M85duwY9913H3/7t3/La7/2a/PoRz+aJzzhCfz5n/85BwcHHBwc8LM/+7Nsb29z11138ahHPYphGHjLt3xL9vf3eeITn8hdd93FXXfdxf7+Pk984hN50pOexG//9m+zvb3NfffdR62VG264gd/5nd/hJV/yJXnt135tXvu1X5v9/X3uvvtu9vb2uPvuuzk4OGB/fx+A/f19APb39wF40pOexHN7xjOeAcDW1hY7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v/d7v8eDHvQgXvu1X5vXfu3XZn9/n7vvvpu77rqL/f197r77bl6Q/f199vf3ueeee/iXbG1tIQmAra0t7ieJF2R/fx+Ag4MDnpsk7nf+/HleFFtbW2xvb3P99deztbXFIx7xCAAODg64cOECT3nKU7j++uu5++67ueeee7j77ru55557eCBJ3G9ra4uHP/zhvMzLvAwHBwf81V/9FS/zMi9Da43v+q7v4rltb2/z8Ic/nJd+6ZfmGc94Bt/wDd/Aq73aq/HjP/7jPNB1113HG7/xG3Pp0iUODg74/d//fe69917u9/CHP5xXe7VX43d/93cppXDPPfdwv1d7tVfj0qVLzGYznvKUpyCJa6+9loc97GH87u/+Ltdccw333nsv1157LVtbWwA89alPBeDaa69la2uLe++9l83NTQBWqxXz+RyAS5cucb97772Xa6+9lgc6fvw47/iO7/jZX/d1X/c5XHXVVVddddVVV71wVK666qqrrrrqqqv+BS/2Yi/22i/90i/N8ePHeW533HEHN910E89tf38fgO3tbe68807uvPNObrzxRm688UbuvPNOfuqnfooP//AP5xVf8RX56Z/+afb391mtVmQmr/AKr8Cdd94JwJ/+6Z/yNm/zNmxvb/O6r/u6/OZv/iYAf/Znf8YrvMIrAPAKr/AKAPzZn/0ZAPv7+/zMz/wMly5d4iVf8iV5jdd4DWzz53/+5wDs7+/z53/+5xw7doz77ruPBz3oQcznc97yLd+SJz7xiTzxiU9kf38fgP39ff78z/+c7e1ttre3ueuuu3jUox7FMAy89mu/Ni/3ci/HXXfdxZOe9CTuuusuHmh/f5+/+Iu/4C/+4i/Y3t5me3ubxWJBrZUbbriB3/md3+FBD3oQj3zkI7nhhhsA2N/fZ39/n4ODA+666y729/c5ODhgf38fSbwoDg4OuN/+/j4AkvjPsLW1xfb2Ntdddx0A119/Pddffz33Ozg44K/+6q+45557eJmXeRn29/c5f/48+/v7fOd3ficvzNbWFg9/+MN5mZd5GQBuu+02HujHfuzHeG5bW1s84hGP4KVf+qW5dOkS3//938+Lv/iLs7m5yV//9V9zv62tLR7+8Ifz0i/90gCcPXuW3//930cS93upl3opXvqlXxqAUgpPecpTuN8bvdEbcd1113FwcMCv/MqvIAmAl3qplwLgxhtv5A/+4A8AePjDHw7A13/917Ozs8PDHvYwtra2ADg4OOC6664D4ODggPsdO3aMZzzjGbwwr/3ar81v/uZvvvY//MM//DZXXXXVVVddddVVLxiVq6666qqrrrrqqn/B+77v+/7W8ePHeX4kAbC3t8fFixfZ2dlhe3ubvb09AHZ2dgC48847ufHGG3n0ox/NnXfeyfb2NgA7OzvceOON3HnnnTzhCU/gxhtv5MYbb+QVXuEV+LM/+zP29/f5qZ/6KU6cOMFbvMVbsL+/z5/92Z8B8Gd/9mfs7+/TdR2v8Rqvwfb2Nr/5m78JwP7+PhHBfD7nG77hG3jP93xPHv3oR/OEJzyBP//zPwdgf3+fP//zP+eJT3wij370o3nQgx7EDTfcwKMe9Sjuuusu/vzP/5z9/X0A9vf32d/f56677uLP//zPedSjHsVdd93FX/7lX/KSL/mSvMVbvAX7+/vcdddd3H333TzxiU/kgfb399nf3+euu+7iL//yLwHY3t7m/PnzzGYz7rrrLm644QZ+53d+hwc96EEcO3aMRz7ykdxwww3c7+DggP39ffb39wG4++67Adjf3wfg4OCA/f19npsk/jW2tra4387ODltbW2xtbQGwvb3N1tYW29vbbG1tcb+DgwMuXLjAU57yFJ7ylKfwMi/zMgA8+clPZmtri7vvvpsf/dEf5V9y3XXXcf311/MyL/MyAFy6dInf+73f42Ve5mU4f/48v/Ebv8Hzs7W1xcMf/nBe5mVehoODAwCe/vSnM5/P+eu//mse6LrrruON3/iNOTg44Pu///t58Rd/cf76r/8aSdzvjd7ojbjuuuv4uZ/7Ofq+55577uF+r/Zqr8Z1113H93//93PmzBnu97CHPYzrrruOg4MD/uAP/gCAra0tHvawhwFwww03cHBwwHXXXQfAU5/6VCRx7bXXAnDvvffyQAcHB9zv4OCAra0tntvHfuzH/tb7vd/7iauuuuqqq6666qoXjMpVV1111VVXXXXVC/Hqr/7q3/XgBz+Y5+fOO+/kBbnzzjsBuPHGGwG48847AbjxxhsB2N/f50//9E95xVd8RR796Edz5513sr+/z5/92Z/x1Kc+lZd5mZfhrrvu4s4772R/f5+dnR1+7ud+jrd4i7cA4M/+7M8AeMITnsD29jZ/+7d/y3u+53vyHu/xHvzMz/wM+/v7APz5n/85x44d43u/93t5yZd8SV7jNV6DnZ0d/uzP/oz9/X0ADg4O+PM//3Oe+MQn8qhHPYp77rmHl3zJl+Td3u3deOITn8gTn/hE7rrrLu63v7/PX/zFX/AXf/EXbG9vc99991Fr5S//8i95yZd8SV77tV+bl3u5l+Pg4IAnPvGJ7O/vc9dddwEgifvt7++zv7/Pk570JO63vb3NrbfeCsCjHvUo7rrrLra3t9ne3mZra4utrS2uv/56brvtNh75yEdy/fXX84Ls7+9zP0nY5oEkYRuA7e1tXpCDgwMALly4wC233MIDHRwcsL+/z9133w3A/v4+d999N0960pOQxL9ka2uLRzziEVx//fVcd911AFy6dInf+73f42Ve5mV42tOexj333MOP/diP8fxsbW3xMi/zMjz84Q/n0qVL/PzP/zw33XQTT3nKUzg4OOCBtra2ePVXf3Wuu+46fu/3fo/f+73f45GPfCR//dd/zf22trZ4tVd7Nba2tvj+7/9+zpw5wz333MP9XuqlXoqHP/zh/NzP/RxnzpzhnnvuQRJbW1u82qu9Gs94xjN4whOewP1e9VVfFYC/+Zu/4eDgAIBrr70WgKc85SkAXHvttdxvc3MTgPPnz/NAh4eHbG1t8dyOHz/O677u6/7Wb/7mb74OV1111VVXXXXVVc8flauuuuqqq6666qoX4m3e5m3emxdgb2+PnZ0d7nd0dATAzs4Od9xxB894xjM4ceIEAHfeeSd33nknN954IzfeeCN33nknj3/845nP57zkS74kT3jCE7jzzju58847ueGGG8hMXu/1Xo/v/d7vBeCuu+7i0Y9+NL/7u7/La77mawLwZ3/2ZwDs7++zs7MDQGbyVm/1VjzhCU/gz//8zwHY39/n2LFjzOdzvuEbvoF3f/d3563e6q14whOewJ//+Z9zv/39ff78z/+c7e1t7rvvPm655RaGYeAt3/It2d/f54lPfCJ//ud/zgPt7+/zF3/xF/zFX/wF29vb3HfffdRaueGGG7j11lt5uZd7Oba3t9nf3+fuu+/mrrvuYn9/n7vvvpvnZ39/n/39fQDuvvtu7rezs4Nttre32d7eBmBjY4M77riD7e1tIoLrr7+e7e1t7re9vc2/ZH9/n+3tbR5of38fgL29Pfb39zk4OGB/f59jx45x6623cnBwwP7+PgcHB7wgknh+tra2eMQjHgHAy7zMywBwcHDAX/3VX3HddddxcHDA3/7t33LPPffwYz/2Yzw/W1tbPPzhD+cRj3gEW1tb/N3f/R0AT3/601mtVvz1X/81z+2lX/qleemXfmkuXbrE93//9/PiL/7i3HDDDRwcHAAgieuuu443eqM34tKlSwCcOXOGe+65h/s9/OEP56Vf+qX527/9W/q+55577kESAK/6qq/KpUuXmKaJe++9F4Brr72W6667jt/93d/l3LlzADzsYQ9ja2uLg4MD7rvvPgC2trYAeOpTn8rDHvYwAKZp4vk5ODhga2uLB3qzN3uz1/7N3/xNrrrqqquuuuqqq14AKlddddVVV1111VUvwOu8zuu814Mf/GCe2x133MFNN93Ec9vb2wNge3ubg4MDaq3s7Oxw4403cuedd/L4xz+eG2+8kVd8xVfkp37qpzg4OGC1WnHp0iVe7/Vej+/93u8F4AlPeAJ/+qd/yod/+Ifzeq/3evzmb/4mAE94whN49KMfze/93u/xGq/xGgD82Z/9GQD7+/v89E//NI9+9KNZrVa8xmu8BgB//ud/DsD+/j5//ud/zrFjx3jSk57EarXiNV7jNXj0ox/NE5/4RP78z/+c++3v7/Pnf/7nPPGJT+RRj3oU+/v7/PVf/zUv/dIvzaMe9SjuvvtunvjEJ3LXXXfxQPv7+/zFX/wFf/EXf8H29jbXX389fd9zww038Du/8zs86EEP4pGPfCQ33HAD+/v77O/vc3BwwF133cX+/j533303z48k9vf3ATg4OODuu+/mRbG9vc2L6uDggOcmiX8LSQBsbW1x/fXXs7W1xXXXXcf1118PwMHBAU9/+tP5vd/7PV7mZV6GJz/5yWxtbfGd3/mdSOIF2dra4uEPfzgv8zIvw8HBAX/1V3/Fy7zMyzBNE9/1Xd+FJJ7bS7/0S/PSL/3SHBwc8Hu/93s84hGPYJom/vqv/5r7SeKlXuqleOmXfmme8YxnMJvN+JVf+RUe6KVe6qV46Zd+aX7u536Ovu+55557kATAG77hG3Ldddfx/d///WQm93upl3opdnd3OXbsGLfeeisAD3vYwwD427/9WwAe9rCHAfDUpz4VgM3NTQAODg7Y2toCYHd3l1or1157Lc/Pgx/8YF78xV/8tf/+7//+t7nqqquuuuqqq656XlSuuuqqq6666qqrXoA3f/M3/27+BRcuXODGG29kZ2eHO++8E4CbbrqJP/uzP+POO+/kxhtv5BVf8RX5qZ/6KZ7whCfw+q//+tx4443cdNNN3HnnnTzhCU/g3nvv5S3e4i14hVd4Bf7sz/6M/f19dnZ2+Lmf+zne4i3egv39ff7sz/4MgCc84Qk8+tGPBuAVXuEVAPizP/szAPb393niE5/IbbfdBsBrvMZr8OhHP5qf+ZmfYX9/H4D9/X3+/M//nO3tbR72sIdxww038PIv//I86lGP4olPfCJ//ud/zv329/f58z//c574xCdyww03sL+/zw033MCtt97KW7zFW7C/v89dd93Fk570JO666y4eaH9/n/39fZ70pCcBsL29zfnz55nNZtx1113ccMMN/PVf/zUPetCDeO3Xfm0A9vf3Abj77ru56667ADg4OODuu+/m3+Lg4IB/K0m8KLa2tgC4/vrr2draYnt7m62tLa6//noADg4OuHDhAk95ylO4/vrrOTg44MlPfjIAd999N09+8pN5Yba2tnj4wx/Oy7zMywBw2223AXBwcADAj/3YjwEgiQd66Zd+aR7+8IeztbXF7/3e7/F7v/d7vOzLviy//Mu/zANtbW3x6q/+6lx33XUAXLx4kb/5m7/hgV7t1V6Nhz/84QD0fc8999zD/V7qpV6K6667ju///u/nzJkz3HvvvQA87GEP47rrruP7vu/7sA3Atddey3XXXQfAU5/6VACuvfZaAO69914Atra2ADg8POR+0zSxWq0AODw8ZGtri+f2MR/zMb/1fu/3fuKqq6666qqrrrrqeVG56qqrrrrqqquuej5e53Ve570f/OAH8/zceeed3HTTTezt7bFardjb22N7e5s777wTgO3tbQAe//jH84qv+Ipsb29zv8c//vE85jGP4RVe4RW488472d/fZ2dnh2c84xk85jGP4QlPeAL7+/vs7++zs7PD7/7u7/Kar/maAPzZn/0ZAE94whMAODo64rVe67W44YYb+Jmf+Rkksb+/z4kTJ3jGM57B3/7t3/Lmb/7mvNVbvRVPeMIT+PM//3Put7+/z8/8zM/w6Ec/mpd/+Zfnr//6r3mN13gNHvWoR/HEJz6RP//zP+d++/v7PPGJT+SJT3wi29vbPOpRj+Kuu+7iL//yL3nJl3xJ3uIt3oL9/X3uuusunvSkJ3HXXXfx3A4ODnjSk57Ek570JAC2t7fZ2tqitcZqteL666/nZ3/2Zzl27BgPetCDeOQjH8kNN9zA/fb39zk4OGB/fx+Au+++G4D9/X0ADg4O2N/f5z+CJLa2trjf9vY2W1tbbG1tAbC9vc329jbXXXcd9zs4OADg6U9/Ovfccw+/+Zu/yVu91Vuxv7/P+fPn2d/f5zu/8zt5YSQBsLW1xcMf/nBe5mVeBoCDgwN+7/d+j5d5mZfh/Pnz/Mmf/AkHBwfcTxL3e+mXfmke/vCHs7W1xe/93u/xMi/zMkjihhtu4J577uGBXvqlX5qXfumX5hnPeAbf8A3fwHXXXcfBwQEP9EZv9EZcd911fP/3fz9nzpzhnnvuAUAS1157LS/1Ui/F7/7u73LmzBnuvfdeALa2tni1V3s1nvGMZ3DNNddw7733AvBSL/VSADz1qU/lftdeey0A9957LwDXXnstAPfeey/XXnstBwcHTNPE/Q4ODrj22mt5bsePH+eVXumVPutP/uRPPoerrrrqqquuuuqq50Tlqquuuuqqq6666vl4ndd5nffiBdjZ2eF+8/mcnZ0dAPb29gDY2dnhxhtv5M477+TOO+/kxhtv5MYbb+TOO+/kT//0Tzl79iyv+ZqvyY033sidd97JnXfeyaMf/WguXLjA27zN2/C93/u9ANx5553s7OwA8OhHPxqAP/uzPwPgCU94Atvb23zv934vH/ZhH8Z7vMd78DM/8zPs7+8DsL+/z7Fjx7jvvvu47bbbeI3XeA0e/ehH85u/+ZvcddddAEjiiU98InfddRc33HAD+/v7/PVf/zWv8RqvwaMe9Sie+MQn8ud//uc80MHBAX/xF3/BX/zFX7C9vc19993HiRMn+J3f+R1e8iVfkrd4i7dgf3+fu+66i7vvvpv9/X3uvvtuntv+/j77+/vcfffdPOlJTwJge3sb25w/f57ZbMZdd92FJK6//nq2t7fZ3t7m+uuv5+/+7u945CMfydbWFtvb2zy3g4MDbHO/g4MDXpitrS3ut729zfNzcHAAwNOf/nQe8YhH8EAHBwfs7+9z9913I4n9/X3W6zU/+qM/yotia2uLRzziEQC8zMu8DACXLl3i937v93iZl3kZnvzkJ3NwcMCP/diP8fxsbW3x8Ic/nJd+6Zfm4OCAv/qrv+JlXuZl2N7e5sd//Md5bltbW7zxG78xW1tb/N7v/R7b29tsbW1xcHDA/ba2tni1V3s1tra2+P7v/37OnDnDPffcA4Akrr32Wt7ojd4IgFIK9957L/d71Vd9VS5dusQ0Tdx7770AXHvttVx33XX8zd/8DU972tMAeNjDHsbW1hb33nsvBwcHAGxtbQFwcHDAS77kS7K1tQWAJP4lb/Zmb/baf/Inf/I5XHXVVVddddVVVz0nKlddddVVV1111VXP5eabb/6uF3uxF3ttXoC9vT3ud+eddwJw00038ad/+qfceeed3Hjjjdx4443ceeedPP7xj+fGG2/kFV/xFfmpn/op9vf3mc/nALzCK7wCd955JwB/+qd/SkTw7u/+7rze670ev/EbvwHAE57wBAC6ruOlX/qlAfizP/szAPb399nZ2WF/f5/M5K3e6q144hOfyJ/92Z8BsL+/z5//+Z+zvb3N3/7t3/KSL/mSvNVbvRVPfOIT+fM//3P29/cB2N/f54lPfCJ33XUXN9xwA3fddRc33HADj3rUo3jUox7FXXfdxROf+ETuvvtuHmh/f5+/+Iu/4C/+4i/Y3t7mvvvuY7lc8qhHPYphGHi5l3s5tre32d/f5+677+auu+5if3+fu+++m+dnf3+f/f197r77bp70pCchifttb2+ztbXF9vY2APfeey8A29vbHDt2jK2tLba3tzl27BhbW1vs7++zvb0NwPb2Nv8Wd955J5cuXeLg4IC77roLgFtuuYXf/d3fZX9/n3vuuYcHksSLYmtri+uvv56trS0e8YhHsLW1xcHBAX/1V3/FwcEBAE972tM4ODjgx37sx3hBtra2eMQjHsFLv/RLc3BwwP22t7f58R//cZ7b1tYWD3/4w3npl35pnvGMZ/A93/M9PPzhD+dpT3saD3TdddfxRm/0Rly6dAmAxWLBPffcw/2uvfZa3uiN3ohnPOMZ3HHHHTz1qU/lfi/1Ui/Fddddx/d///eTmdzvpV7qpbjfwcEBAA972MPY3d3lqU99KgAPe9jDAHjqU5/KAx0eHnLttdcCcOedd/Kwhz2M5+fGG2987Vd6pVf6rD/5kz/5HK666qqrrrrqqquejcpVV1111VVXXXXVc3m3d3u31+a53HHHHdx0000AXLx4EYCdnR2e8IQnALC9vQ3A4x//eG688UZuvPFGAO68806e8Yxn8KAHPYgbb7yRO++8kyc84Qnce++9vMVbvAWPfvSjecITnsD+/j7b29v83M/9HG/xFm/B3t4ef/7nfw7AE57wBB796Efz13/917z0S780AH/2Z38GwP7+Pj/90z/Nox/9aFarFa/xGq+Bbf78z/+c++3v7xMRzOdzvuEbvoE3f/M35y3f8i154hOfyJ//+Z9zv/39fZ74xCfyxCc+ke3tbV7+5V+eRz3qUSwWC97yLd+S/f19nvjEJ/IXf/EXPLf9/X3+4i/+AoC/+Iu/4IYbbqDvex71qEfxO7/zOzzoQQ/itV/7tQHY39/n7rvv5q677mJ/f5+7776bf8n+/j77+/vcfffd/Eu2t7d5oO3tbV6Y/f197nd4eMgLc/78eZ4fSTw/W1tbbG1tcf3113Pddddx/fXXA3BwcMDTn/50/uqv/oqXeZmX4eDggK2tLX7sx36MF2Zra4uHP/zhPOIRj2Bra4tLly5xcHAAwO///u/zlKc8hee2tbXFwx/+cF76pV+aS5cu8f3f//28+Iu/OFtbW9xzzz080Eu91Evx0i/90vze7/0ej3jEI/iVX/kVHui6667jjd7ojfjbv/1bbPPUpz6V+1177bW81Eu9FL/7u7/LmTNnuPfeewF42MMexnXXXcfv/u7v8oxnPAOAa6+9lmuvvZa/+Zu/4alPfSoA1157LQD33nsvANdeey0A9957L9deey0Aq9WK+917771ce+213O/48eO8zuu8znv/yZ/8yedw1VVXXXXVVVdd9WxUrrrqqquuuuqqq57LK7zCKzyYF2B/f59z586xu7vLzs4O99vZ2UESd955J7u7u+zs7ACwv7/P0dERAI9+9KO566672N/f58Ybb+QZz3gGr/iKr8idd97J/v4++/v73Hjjjfzt3/4tj3nMY7jrrru46667AHjCE57AK7zCK7C9vc0rvMIrAPBnf/ZnAOzv7/Pnf/7nXLx4EYDXeI3X4NGPfjQ/8zM/w/7+Pvf78z//c44dO8Z9993Hgx70IF7+5V+eRz3qUTzxiU/kz//8z3mg/f19fuu3fos///M/51GPehS33HIL29vbvPzLvzyPetSjuOuuu7j77rt54hOfyHPb39/niU98Ik984hP5y7/8SwDOnz/Pk570JB75yEeyvb3NrbfeyiMf+UhuuOEGAPb399nf3+fg4IC77rqLg4MD7r77bv4tDg4OeKCDgwNeFJL4t9ra2gLg+uuvZ2tri+uuu47rr7+e+x0cHPBXf/VXXH/99RwcHLC/v880Tezv7/NjP/ZjvDBbW1s8/OEPZ3t7m4c//OEcHBywtbXFwcEBT3/603nKU57CwcEBz89Lv/RL89Iv/dIcHBzwe7/3e/ze7/0ej3rUo/ibv/kbHmhra4tXe7VX47rrrgNge3ubX/mVX+GBHv7wh/Nqr/ZqANjmb/7mb7jftddeyxu90RvxjGc8g+Vyyb333sv9Xu3VXo1nPOMZrFYr7vewhz0MgK2tLe73sIc9DIB7770XgK2tLQAODw+53zRNHBwcME0Tm5ubPLcHPehBXHXVVVddddVVVz0XKlddddVVV1111VUP8OZv/ubfxb9gY2OD48ePExHs7e3xjGc8gwc96EHceOON3HnnnRweHnLjjTfy6Ec/mic84Qn86Z/+KRsbG9x0003ceOON3HnnnTzhCU/g8Y9/PB/+4R/OK77iK/Ibv/EbADzhCU9ge3ubCxcu8Hqv93r89E//NPv7+wD82Z/9GQCr1YrXeI3XAODP/uzPkATAiRMneMYznsHf/u3f8hqv8Rq81Vu9FU94whP48z//c+63v7/Pn//5n/OkJz2J13md1+GpT30qr/Ear8GjHvUonvjEJ/Lnf/7nPND+/j5//ud/zhOf+ERuvPFGrr/+ep785CfzoAc9iNd+7dfm5V7u5bjrrru4++67eeITn8hz29/fB2B/f58nPelJ/PZv/zbb29tcf/31zGYz7rrrLm644QZ+93d/l1tuuYVjx47x2q/92txvf3+fg4MD9vf3Abj77rsB2N/f5+DggP39fR5IEv8Ztra2ANje3ua6664DYHt7m62tLa6//nrud3BwQGuNv/3bv+UpT3kKL/MyLwPAk5/8ZLa2tvjRH/1RDg4OuJ8knp+trS0e/vCHs729zcMf/nAAfu/3fo8nPOEJvPZrvza///u/z1Oe8hSen62tLR7+8Ifz0i/90hwcHPB7v/d7vMzLvAyHh4fccMMNHBwc8EAv9VIvxUu/9EvzjGc8g2/4hm/g4Q9/OPfccw8P9Gqv9mo8/OEP5/d+7/eICJ761Kdyv62tLd7ojd6IZzzjGUzTxL333sv93vAN3xCA3/u938M2ANdeey0Pe9jD+Ju/+Rue9rSnAfCwhz0MgKc+9akcHBzwsIc9DIC//du/BeDaa68FYL1eA3D8+HHuvfdetra2eKBrrrnmwW/7tm/7Wz/5kz/5Olx11VVXXXXVVVddQeWqq6666qqrrrrqAV7t1V7ttXk+Ll26xNbWFqUU9vf3eaB77rmHBz3oQdx4443ceeedPP7xj+fGG2/kMY95DE94whPY39/n6OiIBz3oQbzCK7wCd955JwA7OzsAPPrRj2Zvb48/+7M/A+AJT3gCkjh+/Dhv/dZvzU//9E+zv78PwJ/92Z/x6Ec/mt/7vd/jNV7jNbjhhhv42Z/9We63v7/PsWPHWK/X/PVf/zWv8RqvwaMf/Wh+8zd/k7vuugsASezv7/OzP/uzbG9vc9ddd/HUpz6Vl37pl+ZRj3oUT3ziE3niE5/I/v4+9zs4OOCJT3wiT3ziE9ne3ub8+fPcdddd/OVf/iUPetCDeO3Xfm1e7uVejv39fe666y7uvvtu7r77bp6f/f199vf3edKTnsT9tre3OX/+POfPn2e1WrG9vc1v/dZvcezYMY4dO8axY8c4duwYL/uyL8v29jYPtL+/z/0ODg4A2N/f54EODg54Qba2tpAEwPb2NrYB2N7eZmtri+d2cHDAhQsXuHTpEvfeey9PfepTue2223jLt3xL7r77bg4ODgC4++67efKTn8wLIokH2tra4uEPfzjXX3891113HQcHB/zVX/0Vd999Ny/zMi/D1tYWT3nKU/ixH/sxJPHctra2ePjDH85Lv/RLc3BwwO/93u/xMi/zMhweHvLjP/7jAEjifltbW7zRG70RW1tb/N7v/R7b29tsbW1xzz33cL+trS1e7dVejeuuu46f//mfp+s67r33Xu63tbXF277t23Lp0iVmsxm/8zu/w/0e9rCHcd1113FwcMDm5iYHBwcAvNRLvRQAW1tbHBwcAPCwhz0MgHvvvReAa6+9FoCtrS0Atra2uN/W1hYAz3jGM7j22mt5bm/wBm/w4J/8yZ/kqquuuuqqq6666pmoXHXVVVddddVVVz3Ti73Yi732Ix/5yAfzfFy4cIEXe7EXA2Bvb4/d3V2OHz/Ozs4OT3jCE3ilV3olHv3oR/Onf/qn3HnnnTzjGc/gQQ96EDfeeCN33nknf/qnf8rZs2d5zdd8TW688UbuvPNO9vf3+Y3f+A26ruNlXuZluOuuu7jzzjvZ39/nCU94An/6p3/Km7/5m/PWb/3W/PRP/zT7+/sAPOEJT2B7e5uXfumXZmdnh3d/93fnZ37mZ9jf3wdgf3+fP//zP2d7e5u//du/5SVf8iV5q7d6K574xCfy53/+5+zv73O//f19fvZnf5bt7W0e9rCH8Zd/+Ze81mu9Fo961KO46667eOITn8jdd9/NA+3v7/PEJz6RJz7xiWxvb3P+/Hnuuusufuu3fouXfMmX5IYbbuDlX/7l2d/f5+677+auu+5if3+fu+++mxdkf3+f/f19AJ785Cdzv4jANq01Lly4wGq14pd/+Zc5duwYW1tb3HTTTRw7dgyAY8eOsb29DcD111/Pv9elS5e4dOkSly5d4s477+TSpUvs7+/zsIc9DICDgwMODg645557APjRH/1R/jW2trZ4+MMfDsDLvMzLAHBwcMBf/dVf8Ru/8Ru81Vu9FVtbW/z1X/81T3nKU7ifJB5oa2uLl37pl+bhD384BwcH/N7v/R4v8zIvw+HhIT/+4z/O/SQBsLW1xcMe9jBe+qVfmmc84xl8z/d8Dw9/+MN52tOexgNtbW3xRm/0RgAcHBzQdR333nsv99va2uJt3/ZtecYznsH3f//3c/PNN3O/a6+9lld7tVfjGc94Bk984hM5ODgA4Nprr+Xaa6/lb//2b3nqU58KwLXXXsu1117L3/7t3/LUpz4VSVx77bUAPPWpT+WBDg8Pud9yueT5ueaaax78Yi/2Yq/9D//wD7/NVVddddVVV111FVC56qqrrrrqqquueqYXe7EXey2ey97eHjs7O1y8eJHd3V2OHz/Ozs4Oly5d4vjx42xvb7O3t8cznvEMHvSgB3HjjTdy5513cu+99/KgBz2IRz/60dx5553s7+8zjiPPeMYzeL3Xez2+93u/F4AnPOEJvMIrvAKZyeu93uvxUz/1UxwcHLC/v8/Ozg61VjKTt37rt+anf/qn2d/fB2B/f5+f/umf5q3f+q15+tOfzlu91VvxhCc8gT//8z/nfvv7+xw7doz5fM43fuM38h7v8R685Vu+JU984hP58z//cx5of3+fn/3Zn2V7e5u77rqLRz3qUSwWC97yLd+S/f19nvjEJ/IXf/EXPLf9/X2e+MQn8sQnPpHt7W3Onz9P3/cAbG9vc+utt/Lar/3aAOzv73P33Xdz1113sb+/z913381zk8QD7e/vs7+/z9133w3Ak570JAB2d3cB+Id/+Ae2t7e53/b2NgBbW1s80Pb2Ni/IwcEB99vf30cSAPv7+xwcHPDc/uqv/or7SeJFtbW1xSMe8QgAXuZlXgaAg4MDnv70pwNwcHDAk5/8ZLa2thiGgR/7sR/jBdna2uLhD384D3/4w9na2uLSpUsAPOUpT+Hee+/lx3/8x3l+XuqlXoqXfumX5uDggO///u/nxV/8xdna2uKee+7hgR7+8Ifzaq/2ajzjGc/g1KlT/Oqv/ioHBwfcb2tri7d927fl0qVLzGYzbr75Zu63tbXFq73aq3Hp0iV2d3e59957ud+rvuqr8oxnPAOAg4MDAB72sIcBsLm5iSQAtra2ALj33nt56EMfCsDf/M3f8EDPeMYzADg4OGBra4sHerEXe7HX+od/+Iff5qqrrrrqqquuugoox48f56qrrrrqqquuugrgwz/8w797c3PzOA+wXC6Zz+fs7u6yWCzY2dnhaU97GuM4cuzYMYZh4NZbb+XFXuzF2NnZYX9/nzvvvJO9vT1OnDjBNddcw7lz59jf32cYBh7+8Idz+vRpdnZ2ePrTnw7AXXfdxd/8zd/wki/5kjz2sY/lb//2bwEYhoG77rqLG2+8ka7reMxjHsPTn/50hmEAYBgGbr31Vv7sz/6M2WzGq7zKq3DjjTdy1113MQwDAMMwcNddd7GzswPA6dOnOX36NC/5ki/JbDbjrrvu4oGGYeDWW2/liU98IovFgu3tbba3t9ne3uYlXuIlOHXqFLPZjPPnz/PchmHg/Pnz3HrrrfzlX/4lT3rSkyilMAwDp06dYjabcdddd/HYxz6Wl3iJl+CRj3wkL/ESL8Hp06fp+56+75HEMAz8awzDwDiODMPAwcEBBwcHXLhwgQsXLnDhwgUuXLjA3Xffzd13383dd9/N3Xffzd13383dd9/N3XffzYULF7hw4QIXLlzg4OCAg4MDDg4OGIaBF0YSz8/W1hYnT57kEY94BNdffz0v8zIvw2u+5mvyYi/2Ymxvb7O3t8e1117LwcEBBwcH7O3t8fu///v89V//Nffccw/33HMPL8j111/PS7/0S/Pqr/7qbG1tsbW1xT333MMdd9zBL//yL3PPPfcwDAPP7aVf+qV54zd+Y7a2tviTP/kTfuzHfozrrruO22+/nQfa2tridV7ndXjsYx/L7/3e77G5ucmv/uqvMgwD97v22mt5i7d4Cy5dusRyueRXf/VXeaDXfu3Xpu97fvZnf5Z7772X+73kS74kt9xyC+v1mj/8wz8EYGtri1d91Vflb/7mb3jCE57AOI489KEP5eabb+apT30qd9xxB49+9KM5efIk9957L5J42MMexsHBAbPZjGuvvZaLFy+ytbXFA11zzTUP/oVf+IWv4aqrrrrqqquuugoox48f56qrrrrqqquuuurFXuzFXvvN3/zNP5rncvbsWY4dO8add97Jzs4OOzs7PP7xj+fo6IiXeZmXQRJPeMIT2N/f5zGPeQzb29v8zd/8DcMw8KQnPYnXeI3XAODWW29lGAbuvPNOLl26xCMf+UjOnTvH/v4+ADs7Ozz2sY9le3ub7e1tnv70pwMwDAN33XUXf/Znf8ZLvMRL8JjHPIbZbMZdd92FJIZhYLFYcOLECX7xF3+RV3zFV+TRj340fd9z1113cb9hGLjrrru49dZbueGGG3j84x/Pq7zKq/CoRz2K2WzGXXfdxQMNw8Bdd93FM57xDM6fPw/AX/7lX7K9vc0rvdIr8ahHPYpTp04xm804f/48DyQJgGEYOH/+PLfeeit/8Rd/wZOe9CRKKUhivV5z+vRpZrMZd911FzfffDMv//Ivz4u/+IvzyEc+kgc/+MFcf/31nDp1iu3tbfq+RxLDMPDcJPFvJYl/i+3tbU6ePMn111/Pgx70IB7xiEfw4i/+4rzGa7wGL/ZiL8YjHvEItre3kcRNN90EwMHBAU9+8pPJTP76r/+aP/3TP+UpT3kK99xzD8Mw8IJcd911PPzhD+dN3uRNePjDH84//MM/8Hd/93c8+MEP5k//9E/50z/9U+655x6en5d+6Zfm1V/91bnlllv4vd/7Pa6//nqe9rSnEREMw8ADXXfddbzFW7wFrTV+/Md/nL7vefzjH88DXXvttbzRG70Rz3jGM/iO7/gOzp49ywO94Ru+Iddddx3DMPD4xz+e+1177bW82qu9Gn/7t3/LU5/6VA4PDwF47dd+bba2tvjxH/9xSikAvNZrvRZ93/MXf/EXHB4e8vIv//L0fc/TnvY0+r7n5ptv5vbbb2ccR6699lrOnz/P8ePHeaDNzc3jj3vc437nvvvuu5Wrrrrqqquuuur/OypXXXXVVVddddVVwOu8zuu8F8/HhQsXuPnmmwG44447uPHGG7nxxht5whOeAMD29jYAd955J3/zN3/DS73US3HjjTdy5513sr29ze/+7u/ymq/5mjzxiU/kzjvvZH9/n/l8zoULF3i913s9vvd7vxeA/f19fuqnfor3fM/35NGPfjQAv/mbvwnA/v4+Ozs7POlJT2K1WvHSL/3SAPz5n/8593viE5/IsWPH+N7v/V5e8iVfktd4jdfgxhtv5Dd/8zfZ398HQBL7+/v87M/+LDfccAN33XUXT33qU3mN13gNHvWoR/HEJz6RP//zP+eB9vf3eeITn8gTn/hEtre3OX/+PHfddRd/+Zd/yUu+5Evy2q/92rzcy70cd999N3fddRdPfOITeUH29/fZ39/nSU96EgDb29tsbW2xvb3NbDbj7rvv5vrrr+d3f/d3Abjllls4c+YMj3zkI9ne3uZ++/v7ABwcHLC/vw/AwcEB+/v7ABwcHPBA+/v7PD+SuN/29jb329raAmBrawuA7e1ttra2ALj++ut5oIODAwCe/vSnc++99/IXf/EXvNZrvRYAT37ykwH4+7//e+655x4AJPEv2dra4uEPfzgAL/MyLwPApUuX+L3f+z1e5mVehu3tbZ761Kfy4z/+4zw/W1tbPPzhD+elX/qlOTg44K/+6q94mZd5GSTxEz/xEzy3ra0tXu3VXo3rrruO3/u93+P3fu/3uPHGG7n33nt5oJd6qZfipV7qpfjbv/1bNjc3uemmm3igN3zDN+S6664D4A//8A95oFd91VflGc94Bra59957Abj22mu59tpr+Zu/+RtuvPFGDg8PeehDH8rW1ha/+7u/y7333gvA1tYWu7u7PO1pT+MlX/Ilud/m5iYAu7u7POhBD+K5Pfaxj32tv//7v/9trrrqqquuuuqq/++oXHXVVVddddVVVwEv9mIv9to8H33fA7Czs8Of//mf80qv9ErcdNNN/Omf/inPeMYzeNCDHsSNN97InXfeydmzZwF4xVd8RX7qp36K/f19/vZv/5aXeqmX4vVe7/X43u/9XgCe8IQncOONN7K9vc3rvd7r8Ru/8RsA7O/v833f932cOHGCN3/zN2d/f58/+7M/A2B/f58/+7M/4xVe4RX467/+a17jNV4DSfzZn/0Z99vf3ycimM/nfOM3fiPv9m7vxlu91VvxxCc+kT//8z/nge666y5+9md/lkc96lF84zd+Iy/xEi/BS7/0S/OoRz2KJz7xiTzxiU/k4OCAB9rf3+eJT3wiT3ziE9ne3ua+++6j1soNN9zArbfeymu/9mvz2q/92uzv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93I88pGP5MVf/MU5deoUD37wg5nNZpw6dYrZbAZA3/cMw8C/hiT+Nba2tuj7nlOnTnH99dfzoAc9iOuvv55HPOIRvNiLvRiv+ZqvyYu92IvxYi/2Ypw6dQpJ3HXXXdxzzz383u/9Hg996EO555572N3d5cKFC1y6dInHPe5x3HPPPRwcHPDCbG9v89jHPpaXfumX5hVf8RXZ2trir/7qr/iFX/gFNjc3uXjxIn/6p3/KPffcwwNJAmBra4tXeIVX4NVf/dUppTBNE3feeSe/9Vu/xb333stze+mXfmle53Veh9YaP/7jP07f95RSeKCtrS1e9VVfla2tLX70R3+Ua665hnvvvZf7XXvttbzhG74hf/u3f8vm5iZ/+7d/y/1e8iVfkoc97GF8//d/P0972tO436u+6quytbXFpUuXuOOOOwB4rdd6Lfq+50lPehKHh4c8+tGP5uTJk/ze7/0eJ06c4KEPfSjPeMYz2N/f5+abb0YSW1tbPLdf+IVf+Bquuuqqq6666qr/z6hcddVVV1111VX/r73O67zOe/MAz3jGM3jQgx7E/v4+ANvb2+zu7vKgBz2IG2+8kcc//vEAbG9vA7C3t8fjH/94HvOYx3DjjTdy55138vjHP557772Xt3iLt+DRj340T3jCE9jf32dnZ4ff/d3f5WVe5mW46667uPPOOwH4sz/7M17xFV+RCxcu8Hqv93r85m/+JnfeeScA+/v77OzsAHDhwgXe+q3fmic84Qn8+Z//Ofe766672NnZ4Qd+4Ad4iZd4CV7jNV6DRz/60fzmb/4md999N/fb39/nz//8z3niE5/Iox71KH7+53+e13iN1+At3/It2d/f58///M954hOfyHPb39/nt3/7tzl+/DitNe666y4e9ahHsb29zaMe9She/uVfnv39fe6++26e+MQncvfdd/OC7O/vA7C/v8+TnvQkJLG1tcX+/j4XLlxgGAZWqxXf//3fD8Att9wCwC233ALAy77sy7K9vc1z29/f534HBwcA7O/vcz9J2EYSL8jW1haSsM329jZbW1s8t4ODAwAuXLjAbbfdxr333stf/uVfcunSJW677Tbe7u3ejoODA2yzv7/Per3mx37sx/jX2Nra4uEPfziPeMQj2Nra4uDggK2tLQ4ODrjnnnuQxMbGBn/913/N8yOJhz/84bzUS70UW1tb3Hbb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rd6KJzzhCfz5n/8599vf3+f48ePs7u5y11138ahHPYqXf/mX51GPehRPfOIT+fM//3MeaH9/nyc+8Yk88YlP5NGPfjRPfOITedSjHsViseAt3uIt2N/f54lPfCJ33303d911F8/t4OCAg4MD7r77bgC2t7e5/vrrmc1m3HXXXdxwww3ceuutnDp1ird4i7cAYH9/n7vvvpv9/X0ODg64++672d/f518iiefn4OCA+x0cHPD8SOLfQhL/Ftvb22xtbXHddddx/fXXc91113G/g4MD/vqv/5rrrruOg4MDnvzkJ7O5ucl3fdd3IYl/ydbWFg9/+MN5+MMfztbWFpcuXeJ+EcFP/MRP8IK81Eu9FC/90i/NwcEBv/d7v8fv//7v86hHPYobb7yR5/awhz2MV3u1V+PSpUt8wzd8A9dffz0HBwc80MMe9jBe9VVflWc84xn8wA/8ADfffDMP9IZv+IZsbm4C8Gu/9mvc79prr+Xaa6/l537u55imifs97GEPA6DWCsDm5ibXXnstz3jGM3ja057GQx/6UDY3NwE4PDxkc3MTgIODAwBOnz4NwO7uLsePH+fMmTMP5qqrrrrqqquu+v+MylVXXXXVVVdd9f/Wi73Yi702z/SMZzyDBz3oQezt7bGzswPAM57xDB70oAdx4403cs899/CgBz2Im266iT/90z/l6OgIgEc/+tHceeed3Hnnnfzcz/0cb/EWb8FjHvMYnvCEJ7C/v884jjzjGc/gFV/xFbnzzjvZ399nf3+f3/iN32B/f58P+7AP43Vf93X5zd/8TQD29/eRxHw+56//+q95jdd4DQD+7M/+jPvt7++zs7PDz//8z/MSL/ESvMZrvAY33ngjv/mbv8n+/j73Ozg44Ld+67f48z//c17ndV6Hpz71qbzGa7wGj3rUo3jiE5/In//5n/NAknjiE5/IE5/4RP7iL/6CRz7ykZw4cYK//uu/5mEPexgv//Ivz/7+Pk960pO46667uOuuu5DEc9vf32d/f58nPelJAGxvb3P99dczm8246667uOGGG9je3ubWW2/lhhtu4Prrrwdgf38fgLvvvpv9/X0ODg7Y39/n4OCA/f19/j0k8W8hiRdma2sLgOuvv56trS22trbY2tri+uuvB+Dg4ACAv/7rv+a6667j4OAAgCc/+cns7+/zXd/1Xbyotra2ePjDH87DH/5wtra2ODg44K/+6q94mZd5GZ7+9KfzN3/zN7wwL/VSL8XDH/5wtra2+L3f+z1e5mVehqOjI2688UYODg54oK2tLV71VV+V6667jt/7vd/j937v97jppps4ODgAQBIAL/mSL8lLvdRL8Xu/93vs7Oxw880380Bv+IZvyObmJj/90z/NA21ubvIGb/AGPOMZz2A+n3PvvfcC8NCHPpRrr72Wn/u5n+PSpUsAvNRLvRQArTUArr32WgCe9rSnsbm5yQty6dIljh8/DsCLvdiLvfY//MM//DZXXXXVVVddddX/R1Suuuqqq6666qr/t6655poH80y33norD3rQg7jfzs4OpRQAbrzxRu68804AHvOYx/Cnf/qn/Omf/ikbGxvceOONbG9vs7+/z87ODs94xjN4xVd8Re6880729/d5whOewI033khm8jZv8zZ87/d+LwD7+/tsb2/z8z//87z5m785AL/5m7/J/f7sz/6MV3iFV+D3fu/3eI3XeA1uvPFGfuZnfob77e/vI4kLFy7wjd/4jbzbu70bb/VWb8UTn/hE/uzP/gxJ3G9/f5+f/dmf5VGPehR33XUXT33qU3mN13gNHvWoR/HEJz6RP//zP+e57e/v8xd/8Rf8xV/8Bdvb21xzzTUA/M3f/A0PfehDebmXezn29/d50pOexF133cXdd9/NC7K/v8/+/j5PetKTuN/Ozg7XX389s9kMgK2tLba3t/mFX/gFbrnlFs6cOcPLvdzLcb/9/X0ksb+/z/7+PgAHBwfs7+8DcHBwAMD+/j4ABwcH3E8SL6qtrS3ut729zfb2NgBbW1sAbG1tsbW1xfb2NltbW9zv4OAAgKc//ence++9XH/99RwcHHBwcMDdd9/N5uYmv/RLv8Q999zDCyOJB9ra2uLhD384D3/4w9na2uLg4IC/+qu/4mVe5mV4ylOewuHhIT/+4z+OJJ6fra0tHvawh/HSL/3SHBwc8Fd/9Ve8zMu8DBHBT/zETyCJ5/ZSL/VSvNRLvRSXLl3i+7//+zlz5gw33XQT95MEwBu+4Rty7bXX8nu/93uUUvjbv/1bHugN3/ANufbaa/n+7/9+rrnmGu677z7u96qv+qpcunSJ+XzOvffey/1e9VVflWc84xnM53MuXboEwEMf+lB2d3f527/9WwCuueYaAJ72tKdx7bXXAvC3f/u3bG1t8UC33norD3rQg7jmmmsezFVXXXXVVVdd9f8Zlauuuuqqq6666v+tF3uxF3stnsve3h47Ozvs7Ozw+Mc/nptuuombbrqJP/3TP+UZz3gGD3rQg7jxxhu58847+du//Vve4i3egld8xVfkN37jN7jzzju58847+fAP/3Be8RVfkd/4jd8A4E//9E/Z39/nwz7sw3i913s9fuM3fgOAg4MDJAHw6Ec/GoDf/M3f5H5/9md/xvb2Ni/90i/N9vY27/7u787P/MzPsL+/z/3uuusudnZ2+IEf+AFe4iVegtd4jdfgUY96FL/1W7/FXXfdxQM98YlP5IlPfCKPetSj+MZv/EZe4iVegtd4jdfgUY96FE984hN50pOexP7+Ps9tf3+f3/7t3+Yv/uIvuOGGG9jf3wfgb/7mb3joQx/Ky73cy7G/v8/dd9/NXXfdxZOe9CReGEns7++zv7/Pk570JO63vb3N1tYWFy5cYDab8aQnPYnt7W2uv/56tre3Afjrv/5rjh07BsD111/PIx7xCAC2t7d5QQ4ODnhBtra2eGEODg4A2N/fZxxHLl26xL333surv/qrA3BwcADA3XffzcHBAQB7e3t813d9F/8WW1tbXHfddWxtbfHSL/3SABwcHPBXf/VXPOIRj+Cee+5BEj/+4z/OC7O1tcXDHvYwXvqlX5qDgwN+7/d+j9///d/nNV/zNfmJn/gJACTxQFtbW7zhG74hW1tb/N7v/R6///u/z4033si9997LA21tbfEGb/AGABwcHLBcLrn33nt5oDd8wzfk2muvBeCaa67hvvvu435v8AZvwLXXXsv3f//380Bv8AZvAMDv/d7vcb9XfdVXBeDnfu7niAge+tCHsrW1xTOe8QzuvfdeXuVVXgWAw8NDHvawhwFwcHDA5uYmD/RiL/Zir/UP//APv81VV1111VVXXfX/EeX48eNcddVVV1111VX/P73iK77iW0fESx8/fpwHP/jBAHzv934vr/iKrwjAn/zJn/DSL/3SAPzN3/wN6/WaRz3qUQA8/elPJzM5ceIE1157LU972tMYhoHt7W1e+qVfmtOnT7O/v8+5c+cYhoHt7W1uv/12XvVVXxWAu+++G4BhGHjCE57A3/3d3/G6r/u63HDDDTzxiU/kfsMw8PSnP50//dM/5eabb+ZlXuZl6Pueu+66i/sNw4Akaq385m/+JseO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/j4Ad911F3fffTdPfOITuZ8knp/t7W2uv/56brjhBra2tvirv/orbrnlFl7iJV4CgP39fe6++27uvvtu9vf3ufvuu/mXSOJfY2trC4Dt7W22t7d5oK2tLba3t3luW1tbPNDBwQEABwcHbG1tAXBwcMD9Dg4OANjf3wfg8PCQg4MD/rUk8cJsbW3x8Ic/HICXfumXBuDg4IALFy5w22238dIv/dI85SlP4d577+Wee+7hhZEEwNbWFi/1Ui/Fwx72MA4ODtja2uLg4ICnPvWp/M3f/A3PTRIAW1tbvOqrvirXXnstt912GydPnuQP//APuffee3luW1tbvMEbvAEAP/MzP8NLvMRL8Ld/+7c80LXXXssbvMEbcOnSJVarFb/+67/OA73+678+1157LYeHh/z0T/8093v91399rr32Wr7/+7+fiADgJV7iJXiJl3gJDg8P+Zmf+RmuueYaXv/1X5+//du/5e///u95vdd7Pa699lr++I//mFd+5Vfmgd7u7d5OXHXVVVddddVV/1+hBz3oQVx11VVXXXXVVf9/feVXfqUf9KAH8bu/+7u85mu+Jo9//OMZx5GXfMmX5Kd+6qfY3t7m9V//9dnb2+N7v/d72dvb483f/M15yEMewm/8xm9w5513sr29zXu+53sC8Kd/+qf82Z/9GQDb29u8zdu8Ddvb2+zv7/N93/d93G97e5tHP/rRrFYrXvqlX5onPOEJ/Pmf/zkPtL29zd7eHm/+5m/OiRMneMITnsCf//mfAyCJ+21vb/OoRz2KP/uzP+PN3uzNuOWWW3jiE5/IE5/4RO666y4AJPHcbrjhBh75yEfylKc8hVtuuYWXeImXYH9/nyc+8Yncfffd3H333bwotre3uf7667nhhht45CMfCcDf/d3f8eAHP5jt7W329/cBuPvuu7n77rvZ39/n7rvv5n6S+LeQxL+FJP4tJPFvIYn7bW1tcd1117G1tcV1113HddddB8DBwQEXLlzglltu4eDggHvuuYeDgwOe+tSncnBwwItia2uLhz/84bzUS70UAJcuXeL3f//3ebmXezme+tSn8tSnPpXnRxJbW1u85Eu+JA972MO4dOkSP/ADP8Crvdqr8bd/+7c8Py/1Ui/FS77kS3LbbbfxAz/wA7z8y7889957Lw/00Ic+lFd91VflGc94BvP5nF//9V/ngV7/9V+f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9loAfv3Xf517772X+73+678+1157LT//8z/PfD7nvvvuA+D1Xu/1uPbaa/n+7/9+IgKA13u91+Paa6/l67/+6zl16hSv93qvxzXXXMPf//3fc80113DNNdfw9V//9fzWb/2WuOqqq6666qqrrroCPehBD+Kqq6666qqrrrrqftdcc82DP+dzPue3rrnmmgf/+q//Osvlkrd4i7fg8Y9/PH/2Z39GRPDu7/7uPOEJT+A3fuM32N7eJiJ493d/d57whCfwm7/5mwBsb28TEbzlW74lAN/3fd/H/ba3t9nf3+fd3u3diAie8IQn8Od//uc80O7uLi/xEi/Ba7zGaxARPPGJT+TP//zPeW7b29vs7e1xyy238Jqv+ZoAPPGJT+RJT3oS+/v7PD/b29tcf/31POEJT+CWW27hJV7iJbjlllvY39/nSU96EnfddRd33303/xJJbG9vc/3113P99dfzyEc+kl/8xV/k5ptv5vTp01x//fXs7+8DcPfdd3P33XdzcHDA3Xffzb+GJP4tJPFvIYl/LUm8KLa2tgB4+MMfDsB1113HddddB8DBwQF//dd/DcBLv/RLc88993BwcMBTn/pUDg4OuJ8kXpCtrS0e9rCH8bCHPYytrS0uXbrE3/3d3/H7v//7vMmbvAl/+7d/ywuytbXFQx/6UF7qpV6Kg4MD/vqv/5rf//3f51GPehSHh4c8t5d8yZfkJV/yJTk4OOBnfuZnuO2227jlllt4oGuvvZbXf/3X59KlS/z8z/88t912G7fccgv3e/3Xf32uvfZavv/7v5/rrruO++67D4DXe73X49prr+X7v//7ue6667jvvvt4vdd7Pa699lq+//u/n1IKL/7iL85LvMRL8P3f//08/OEP55Vf+ZUBeLu3eztx1VVXXXXVVVdd9WyU48ePc9VVV1111VVXXXW/w8PD3aOjo0vXXnvtWz/iEY/gL//yLzlx4gTXXnstd911F6vVipd6qZfi9OnTADz96U+n73te6qVeitOnTwNw1113MQwDfd/zZ3/2Z7zUS70UL/VSL8XTn/50hmFgGAZ2dnb48z//c2zzKq/yKgDcdddd3G8+n2MbSTzkIQ/hhhtu4FGPehTnz59nf3+f+w3DgCRss729zQ033MD29jaPetSjOHXqFMMwsL+/zwMNw8D58+eRhG3m8zk/8zM/g21e7MVejJd4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GQDb29vs7+/zEi/xErzGa7wGf/Znf8af//mfc7/t7W329vZ4iZd4CV7jNV6D/f19fuZnfoaDgwMeaHt7m0c96lGsVite6qVeCoAnPvGJ/Pmf/zkAknig7e1tHvnIR/KoRz2Kv/mbv+HVX/3V2d/f5+677+aJT3wid999Ny/M9vY2W1tb3HDDDVx//fX89V//NS/+4i/OLbfcAsD+/j533303d999N0960pN4QSTxotja2gLg+uuvB+Av/uIvADh27BhbW1vceOONHDt2DIBjx44BcOzYMQCOHTvGf6RLly4BcOnSJQAuXboEwKVLl7jzzjvZ29vj4OAAgNd5ndfh4OCAg4MD7rnnHv4lknhhtra2uO6669jc3OThD384W1tbHBwccOHCBW677TZe+qVfmqc+9ancc8893HvvvbwgkgDY2trioQ99KC/1Ui/FwcEBf/3Xf81Lv/RL89SnPpW//du/5YEkcb+XfMmX5CVf8iU5ODjgr//6r3nEIx7BH/7hH3J4eMgDbW1t8Sqv8ipce+21/N7v/R6///u/zy233MIDvcRLvAQv+ZIvyd/93d+xubnJH//xH3O/V37lV+ahD30oP//zP898Pue+++5jc3OTV37lV2Y+n7Ner/mN3/gNrrnmGl7v9V6P3/3d32UcR17iJV6Ca665hu///u/np37qp8RVV1111VVXXXXV80IPetCDuOqqq6666qqrrnp+zpw586A3f/M3v/XN3/zN+dM//VP29/c5c+YMD3nIQ/iN3/gN9vb2eL3Xez1uvPFG9vf3+emf/mn29/fZ3t7mxIkTvPmbvzlPeMIT+M3f/E3ud+nSJV791V+d13iN12B/f5+f+ZmfYX9/n/ttb2+zv7/Pm73Zm3HixAme+MQn8ud//uc8t+3tbfb29niJl3gJXv3VX539/X2e+MQn8hd/8Rc8P9vb29xwww08/vGP55ZbbuElXuIluOWWW9jf3+dJT3oST3rSk9jf3+dfsr29zQ033MDjH/94AF78xV+cW265hVtuuQWA/f197r77bu6++2729/e5++67AZDEv5Yknp+trS0Atre3sc329jYAW1tbAGxvb/Pctra2eH4ODg4AkATA/v4+9zs4OADg4OAAgIODAw4ODnggSfxrSeK5bW1t8bCHPQyAl37plwbg4OCACxcucNttt3H77bdz22238cZv/MY8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nj3Lq7/6q7O/v88Tn/hE/uIv/oLnZ3t7m0c+8pH82Z/9GS/xEi/Bq7/6q7O/v8/dd9/NE5/4RO6++25emO3tbba2tnjUox7F9vY2f/VXf8XNN9/MS7zESwCwv7/P3Xffzd13383+/j533303DySJf42trS0kcf311wPwl3/5lwDcdNNNbG1tceONNwJw7NgxAI4dO8axY8f4z3Lp0iXud+nSJS5dusTBwQGXLl3irrvu4uDgAIDXfM3X5J577gHgnnvu4fmRxItqa2uL6667jq2tLV7qpV6K+912223cdtttvPRLvzRPfepTueeee7j33nt5IEk8t62tLR760IfyUi/1UhwcHPDXf/3X/N3f/R2v+qqvyt/+7d8iiee2ubnJwx72MF7yJV+Sg4MD/vqv/5pHPOIR/OEf/iGHh4dI4n7XXnstr/Iqr8Lm5ia/93u/x+///u9zyy23cL/NzU1e5VVehWuvvZbf+73f4/d///d50IMeBMDm5iZv9VZvxaVLl6i18jM/8zMAvMqrvAoPechDAPiN3/gNAF7v9V6PZzzjGfzcz/3c+/zWb/3Wd3PVVVddddVVV131L0MPetCDuOqqq6666qqrrnpRve7rvq7f/d3fnYjgp37qp7jjjjt4jdd4DV7jNV6DP/uzP+PP/uzP2N7e5nVf93XZ2toiIvizP/sznvCEJyCJ3d1djh07xnu8x3sA8Od//uc84QlP4H7b29u81Vu9Fbfeeisv8RIvwROf+ET+/M//nP39fR5oe3ubvb09XuIlXoKXeqmXAuCJT3wif/EXf8Hzs729zQ033MATnvAEbrnlFl78xV+cW265hf39fZ70pCdx1113cffdd/OCSAJge3ub66+/nuuvv55HPvKRANx2223ccsstAOzv73P33Xdz9913c3BwwN13382/liRemK2tLe63tbXF9vY2kgDY2toCYGtri+fn4OCAra0t7ieJ++3v7/NABwcHHBwccL+DgwMODg6QxL+WJF6Qra0tAB72sIextbXFwx/+cAAODg64cOECt9xyCwcHBxwcHHDvvffy1Kc+lYODA14QSQBsbW3x0Ic+lIc97GFsbW1x6dIl/u7v/o7f//3f5zVf8zV56lOfCoAkHmhzc5OHPexhvORLviQHBwf89V//Nb//+7/Py73cy3HvvfcCIAmAzc1NHvrQh/KSL/mS3Hbb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+Iff5qqrrrrqqquuuupfBz3oQQ/iqquuuuqqq6666t/immuuefC7vuu7Pv01XuM1eMITnsBv/uZvsr29zXu8x3sAsL+/z/d93/cBsLOzw97eHu/2bu9GRPBnf/ZnPPGJTwRge3ub/f19XuIlXoJXf/VXZ39/n9/6rd/irrvu4n7b29s86lGP4s/+7M949Vd/dV7iJV6C/f19fvu3f5u77rqL57a9vc0jH/lI/uzP/oxXf/VX5yVe4iXY39/n7rvv5olPfCJ33303L8j29jZbW1s87nGP49ixY9xyyy28+Iu/OLfccgv7+/scHBxw1113cffdd3P33Xfz/Ejihdna2mJ7e5utrS2uv/56tre3Abj++uu539/93d9x7NgxTp48ydbWFs/t4OAAgP39fQAODg54oIODA/61tre3ud/W1hYAW1tbbG1t8dwODg4AuHDhArfddhuv/uqvzv0ODg44ODjgnnvuAeDee+/lnnvu4UUhiee2tbXFwx72MK677jquvfZaAC5dusTf/d3f8fd///dcunSJl3mZl+Hee+/lhdna2uKhD30oL/VSL8XBwQF//dd/zd/93d/xaq/2avzt3/4tz8/m5iav+qqvyrXXXsttt93GL/zCL/Bqr/Zq/N3f/R0PtLm5yRu8wRuwubnJ7/3e7/H7v//7POhBD+J+11xzDa//+q/PpUuX+Pmf/3muvfZa7rvvPgBe7/Vej2uvvRaA3/iN3+C+++7j9V7v9bjmmmv4/u//fp70pCe9zj/8wz/8NlddddVVV1111VX/euhBD3oQV1111VVXXXXVVf9W11xzzYPf7M3e7Olv/uZvzhOe8AR+8zd/k+3tbfb393mP93gPAH76p3+ag4MDtre32dvb4yVe4iV4jdd4Df7sz/6MP//zP+d+29vbvNVbvRW33norL/ESL8Gf//mf88QnPpH9/X3ut729ze23386xY8d4szd7M2655Rbuuusu/uIv/oK77rqL57a9vc3111/PE5/4RF78xV+cW265hVtuuYX9/X2e9KQn8Rd/8Rf8S3Z2dnjEIx7Bn/3Zn3Hs2DFe/MVfnNOnT3P99dezv7/PwcEBd999N3fddRd33303kvi3kATA1tYWW1tbSGJra4unPvWpANx4441sb2+ztbXFLbfcwv2OHTvGf7ZLly4BcOedd3Lp0iXuvPNODg4OODg44NVf/dU5ODjg4OCAe+65hweSxL/W9vY2AA972MO49tprue666wA4ODjgr//6r9nb2+Pv/u7veOM3fmPuuece7r33XiTxgmxtbfHQhz6Uhz3sYWxtbXFwcMBf//Vf8/u///u86Zu+KX/7t3/L87O5ucmrvuqrcu2113Lp0iV+4Rd+gdtuu42bb76ZB9rc3OShD30oL/mSL8ltt93Gz//8z3Pp0iVuueUWJAHwEi/xErzES7wEt912Gz/wAz/Agx70IAA2Nzd55Vd+Za699loODw/54z/+Y+677z5e7/Vej2uuuYbv//7v50lPetLr/MM//MNvc9VVV1111VVXXfVvgx70oAdx1VVXXXXVVVdd9e9x5syZB735m7/5rW/+5m/OE57wBH7zN3+T7e1t9vf3ebd3ezcigj/7sz/jiU98Itvb29x+++28+qu/Oq/xGq/B/v4+P/MzP8P+/j4AOzs7POpRj+LlX/7l2d/fB+CJT3wif/7nf84DbW9v86hHPYqXf/mX57bbbuOWW25hf3+fv/iLv+CJT3wiz8/29jaPetSj+LM/+zNe/MVfnFd/9Vdnf3+fu+++m7vuuosnPelJPDdJPND29jbXX389119/Pdvb2/zVX/0VN998M6dPn+b6669nf38fgLvvvpu7776bg4MD7r77bv4lkvjX2t7eBmBrawuA7e1t7re/v8/111/Pv9bBwQH3Ozg4AODg4IDDw0P+tSTxotja2uJhD3sYANdddx3XXXcdAAcHB/z1X/81AC/90i/NU5/6VO655x7uvfdeHkgSz21ra4uHPvShbG1t8bCHPYyDgwP++q//mr/7u7/jVV/1VXna057G4eEhz8+1117LS77kS3Lttddy6dIlSik87WlP4+/+7u94bi/xEi/BS77kS3J4eMjm5iZ/+7d/y9/93d8BIInNzU1e+ZVfmWuvvZbf+73f4/d///d50IMeBMA111zD67/+63Pp0iVqrfzsz/4sAK/3eq/HNddcw/d///fzpCc96XX+4R/+4be56qqrrrrqqquu+rdDD3rQg7jqqquuuuqqq67697rmmmse/GZv9mZPf/M3f3PuvPNOfuZnfobt7W329/d5iZd4CV76pV+aJz7xifzZn/0ZANvb2+zv7/Ou7/quRARPeMIT+PM//3MkAbC9vc3Lv/zLc/bsWV791V+d/f19/vzP/5wnPvGJ3E8S29vbPPKRj+TP/uzPePVXf3Ve4iVegv39fZ74xCfyF3/xFzyQJAC2t7e5/vrreeQjH8kNN9zA3/3d3/ESL/ES7O/vc/fdd3PXXXfxpCc9CUn8S7a3t7n++uvZ3t7m+uuv5/rrrwfgtttu45ZbbgFgf38fgLvvvpu7776bg4MD9vf3OTg4AEAS/xaS+NeSxL+FJP61JPFAW1tbbG1tce211wJw3XXXcd111wFwcHDAhQsXuOWWWwA4ODjgqU99Kvfccw/33nsvL4wkALa2tnjoQx/K1tYWD3vYwwD4u7/7O17iJV6Cg4MDnvrUp/K3f/u3SOL5ecmXfEke+tCHsrW1xaVLl/iFX/gFXvzFX5y//du/BUAS97v22mt5lVd5FTY3N/n93/99HvGIR/BHf/RHHB4ecr+XfMmX5CVe4iW4dOkSP//zP89tt93Ggx70IAAe+tCH8sqv/Mrcdttt/MAP/AAPfvCDAXi913s9rrnmGr7/+7+fJz3pSa/zD//wD7/NVVddddVVV1111b8PetCDHsRVV1111VVXXXXVf4RrrrnmwZ/zOZ/zW9dcc82D9/f3+emf/mkA9vf3eYmXeAle4zVegz/7sz/jz//8zwHY3t5mf3+fl3iJl+DVX/3V2d/f52d/9mfZ39/nfjfccAN33nknL/ESL8Grv/qrs7+/z2/91m9x1113IYn7bW9v88hHPpJHPepRbG9vA7C/v88Tn/hEnvSkJ7G/v48kntv29jbXX389T3jCE7j55pu55ZZbeImXeAn29/c5ODjgSU96Evv7+9x99928KLa3t9ne3mZra4s//uM/5tixY9xyyy3s7Oxwyy230HUd119/PQD7+/sA3HPPPezv73NwcMDBwQH7+/scHBzwwkji30IS/1qSeFFtbW0BcP3117O5ucn29jabm5tcd9113O/g4IALFy5w2223cfvtt3PbbbcB8MZv/Mbcc8893Hvvvbyotre3eehDH8p1113Htddey8HBARcuXOC2227jD/7gD3jjN35j/vZv/5YHksT9Njc3edjDHsZLvuRLcr+DgwOe9rSn8bd/+7fcTxIAm5ubvMqrvArXXnstt912G7/wC7/AIx7xCO69917ut7m5yau8yqtw7bXX8nu/93v8/u//Pg960IO43+u93utx7bXX8nd/93f8/M//PA960IPY2trilV/5ldnc3OTw8PDWr//6r3+ff/iHf/htrrrqqquuuuqqq/790IMe9CCuuuqqq6666qqr/qNcc801D36Jl3iJp7/He7wHAD/90z/NwcEBu7u7vMRLvARv/uZvzv7+Pj/zMz/D/v4+AJcuXeLYsWO867u+KxHBE5/4RP78z/+c+21vb/OoRz2KP/uzP+PVX/3VeYmXeAme+MQn8qQnPYm77rqLB9re3uaGG27gkY98JE972tN4qZd6KQDuvvtu7rrrLp70pCfxgmxvb3P99dfzyEc+kr/+67/m5ptv5iVe4iUA2N/f5+677+ZJT3oSd999Ny+IJJ7b1tYW29vbbG1tcf311/Obv/mbHDt2jGPHjrGzs8OxY8c4ffo0119/Pfc7ODgAYH9/n4ODAwDuvvtuAA4ODgA4ODjg4OCAF5Uk/i22t7e539bWFltbW2xtbQGwtbXF1tYWW1tbbG1tcb+DgwNaa9x2221cunSJvb09Ll26xG233cYbvdEbAXDvvfdyzz33cD9JvCiuvfZarrvuOh72sIextbXFwcEBf/3Xf83e3h6v+ZqvyVOf+lT+9m//lhdEEpubm7zkS74kD3vYwzg4OOCv//qveemXfmme9rSn8bd/+7c8t62tLV7yJV+Shz70odx22238/u//Pi/+4i/O3/3d3/FAL/ESL8FLvuRLcunSJX7+53+e2267jQc96EEAbG5u8sqv/MpsbW3x0z/909x222086EEPYmtri9d7vddjmibW6/WtX//1X/8+//AP//DbXHXVVVddddVVV/3HQA960IO46qqrrrrqqquu+o90zTXXPPglXuIlnv5u7/ZuRAR/9md/xhOf+ES2t7fZ29vjzd/8zTlx4gRPeMIT+PM//3MAtre3efSjH81qteLVX/3V2d/f58///M954hOfyP22t7d51KMexcu//Mtz2223ccstt/DEJz6RJz3pSdx11108t+3tbW6//XZe/MVfnFtuuYWXeImXYH9/nyc96Uncdddd3H333bwg29vb3HDDDVx//fX85m/+Ji/+4i/OLbfcwi233MLBwQH7+/vcdddd3H333dx9990ASOJfY2tri52dHba2trj++usB2Nra4vrrr+cHf/AHOX78ODfffDMAx44do+s6tre32dra4rkdHBxwv4ODA2xzv4ODAwAk8dy2trZ4bltbWwBsbW3x/BwcHABw4cIFLl26xKVLlwC47bbbeMu3fEsA7rnnHg4ODgC49957ueeee3hhJPGCbG1t8bCHPYxrr72W6667DoBLly7xd3/3d9x+++284iu+IgcHB/zt3/4tL8zW1hYPe9jDeMmXfEkALl26xO///u/zd3/3dzzqUY/i8PCQ57a5uclLvdRL8dCHPpRLly5Ra+WpT30qf/d3f8cDXXvttbzKq7wKm5ub/N7v/R6///u/z4Me9CDu9xIv8RK8xEu8BLfddhs///M/z4033sjh4SHXXHMNr//6r8+lS5e44447fvszP/MzX4errrrqqquuuuqq/1joQQ96EFddddVVV1111VX/0c6cOfOgl3zJl7z1NV7jNXjwgx/ME57wBP78z/+c7e1t9vf3eYmXeAle/dVfnf39fX7mZ36G/f19JLG9vc1bvuVbcuutt/ISL/ES3HXXXfzWb/0W+/v73G97e5tHPepRPOlJT+LVX/3VueWWW9jf3+e3f/u3ueuuu3hu29vbPOpRj+L666/naU97Gi/1Ui/F9vY2+/v7POlJT+Iv/uIveG6SuN/29jYAj3jEI7jhhhu4/vrrAbj77ru5/vrr2d/f5+DggP39fe6++26e/OQn86KSxPOztbUFwPb2NltbWwCcP38egGPHjrG1tcXW1hY33ngjAMeOHeM/w6VLlzg4OODSpUsA3HXXXezv73N4eMiLv/iLc3BwwMHBAQcHBxwcHAAgiX8tSQBsbW2xubnJddddx3XXXce1114LwMHBAVtbWwAcHBzw1Kc+lXvvvZd7772XF2Zra4uHPvShPOxhD2Nra4uDgwP++q//mpd+6ZfmaU97Gn/7t3/L87O5uclLvuRL8rCHPYxLly7xC7/wC7z4i784f/d3f8cDbW5u8iqv8ipce+21/P7v/z4v8zIvw6//+q9zeHgIwObmJq/8yq/Mtddey+/93u/x+7//+zzoQQ8C4CVe4iV4iZd4CW677TZ+4Ad+gD//8z8XV1111VVXXXXVVf/x0IMe9CCuuuqqq6666qqr/rO8/Mu/vF/91V+d13iN1+DP//zP+bM/+zMALl26xLFjx3jXd31XIoInPvGJ/Pmf/zkA29vbPOpRj+JJT3oSb/Zmb0ZE8MQnPpEnPvGJ7O/vAyCJ7e1tHvnIR/KkJz2Jl3iJl+AlXuIl2N/f5y/+4i944hOfyANJAmB7e5vbbruNY8eO8Wqv9mq8xEu8BPv7++zv7/OkJz2JJz3pSQBI4gXZ2trihhtu4Prrr+c3f/M3ueWWW9jZ2eGWW27hlltuAWB/f5977rmH/f197r77bvb39zk4OOCBJPFvIYnntrW1xf22trZ4oO3tbV6Qg4MDntvBwQEAh4eH/GtJ4kW1tbXF1tYW1157Lddffz3XXnst97t06RJ/93d/x+23385tt93GG7/xG3PPPfdw7733AiCJF2Rra4uHPvShXHfddVx77bUcHBzw13/919x2223cfvvtvOzLviz33nsvz89LvuRL8rCHPYzNzU0uXbrEL/zCL/DiL/7i/N3f/R0PtLm5yUMf+lBe8iVfkkuXLvELv/ALvPiLvzh///d/z/0e+tCH8sqv/MpcunSJn//5n+e2227jQQ96EACv93qvx7XXXsvv/d7v8fu///v8+Z//ubjqqquuuuqqq676z4Ee9KAHcdVVV1111VVXXfWf6eVf/uX9Ei/xErzWa70WAD/zMz/D/v4+29vb7O/v8xIv8RK8+qu/Ovv7+/zsz/4s+/v7AGxvb/OoRz2K1WrFq7/6q7O/v88Tn/hE/uIv/oIH2t7e5pGPfCSPetSjuPXWW3mJl3gJ9vf3eeITn8iTnvQkDg4OeG7b29tcf/313HDDDfzFX/wFL/7iL85LvMRLsL+/z8HBAXfddRd33303d999N/+S7e1ttre3uf7667n++uu5/vrr+cVf/EVuvvlmTp8+zfXXXw/A/v4+BwcH7O/vc/fdd3N4eMj+/j4HBwe8qCTxryWJfwtJ/GtJ4rltbW2xtbXFtddeC8D111/Ptddey/0ODg7467/+awBe+qVfmoODA+69917uuece7r33Xp4fSTzQ1tYWD33oQ7nuuuu49tprOTg44K//+q+5/fbbed3XfV3uvfde/vZv/5bnZ3Nzk4c97GG85Eu+JAC///u/z0u/9EvztKc9jb/7u7/jub3ES7wEL/mSL8nh4SF/9Vd/xc7ODn/3d3+HJAA2Nzd55Vd+Za699lr+7u/+jp//+Z/nQQ96EACbm5u88iu/Mtdeey0/8AM/wG233caf//mfi6uuuuqqq6666qr/POhBD3oQV1111VVXXXXVVf/Zrrnmmge/xEu8xNPf7d3ejYjgCU94An/+538OwKMe9She4RVegcwkInjiE5/In//5n3O/7e1t9vb2eImXeAle/dVfnf39fZ74xCfyF3/xFzzQ9vY2119/PY961KN42tOexku91EsBcPfdd/PEJz6Ru+++m+dne3ub66+/nkc+8pH89V//NTfffDMv8RIvAcDBwQF33XUXT3rSk7j77rt5QSTxQFtbW1x//fVcf/31bG9vc/311/OLv/iL3HzzzRw7doxbbrmF+x0cHABw9913A3D33XdzcHAAwN13380DSeJfSxL/WpJ4UW1tbQGwvb3NtddeC8DW1hZbW1tcd9113O/g4IALFy5w2223AfDSL/3SHBwccO+99wJwzz33cO+99/IvkQTA1tYWD33oQ3nYwx7G1tYWBwcH/PVf/zW33347r/u6r8s999zD3/7t3wIgiee2ubnJwx72MF7yJV+Sg4MD/vqv/5qXfumX5mlPexp/+7d/iyQe6CVe4iV4yZd8SQ4PD/mrv/orfv/3f59HP/rRHB4eAiCJl3iJl+AlXuIluHTpEj//8z/PbbfdxoMe9CAAXuIlXoKXeImX4NKlS3zjN34jt91220Puu+++W7nqqquuuuqqq676z4Ue9KAHcdVVV1111VVXXfVf4cyZMw96qZd6qVtf4iVegld/9Vfnrrvu4jd/8zfZ399nZ2eHRz3qUaxWK1791V+d/f19/vzP/5wnPvGJ3G97e5vXeZ3X4YYbbgBgf3+fJz7xifzFX/wFz217e5u9vT1uueUWXvzFX5xbbrmF/f19nvSkJ/GkJz2J/f19np/t7W1uuOEGrr/+eh75yEfy+7//+zzsYQ/j+uuvZ39/n4ODA570pCexv7/P3XffDYAkXhRbW1tsb2+ztbXFn/zJn3Ds2DEAbr75ZgBuueUWdnZ2OHnyJFtbW9zv4OAAgIODA2xzcHAAwMHBAQcHBwDs7+9zv4ODA+53cHCAJP4lW1tbPND29jYAW1tbAGxtbQGwtbXF1tYWAFtbW2xtbfFABwcHXLhwgUuXLnHp0iUuXbrE3t4et912GwBv9EZvxD333MO9994LgCReVFtbWzzsYQ/juuuu49prrwXg0qVL/N3f/R0v/dIvzVOf+lQA/vZv/5YHksT9Njc3edjDHsZDH/pQtra2uO222/i7v/s7/u7v/o7XfM3X5GlPexoAkrjfS7zES/CSL/mS3O/ee+/l7/7u77j33nu537XXXsurvMqrsLm5ye///u9zww038Md//McAbG5u8sqv/Mpce+21/N7v/R6///u/z5//+Z+Lq6666qqrrrrqqv8a6EEPehBXXXXVVVddddVV/5Ve4RVewceOHePd3/3dAXjiE5/In//5nwOwvb3NW77lW/I3f/M3vPqrvzpPfOIT+fM//3P29/e536Mf/Wge+chH8rSnPY1Xf/VXZ39/nyc+8Yn8xV/8Bc9tZ2eHRz7ykVx//fU87WlP46Ve6qUAODg44IlPfCJPetKTeCBJ3G97e5utrS3+4R/+gWPHjnHLLbdw88038xIv8RIA7O/vc/fdd3P33XdzcHDA3XffzYtKEvfb2toC4Prrrwfg+uuv5zd+4zeQxM7ODseOHQPg2LFjHDt2jJ2dHQBOnjwJwNbWFv+ZDg4OALhw4QIAt99+O/e7dOkSly5dYm9vj0uXLvGGb/iGABweHnJwcMA999zDCyKJF2Zra4uHPexhXHvttVx33XUAHBwc8Nd//dcA/MEf/AEAL/MyL8O9997LC7K1tcXDHvYwrr32Wq699loODg7467/+a176pV+apz3tafzt3/4tz21ra4uHPvShvORLviSHh4f81V/9FS/zMi/D3/7t3/K0pz2N+21ubvIqr/IqXHvttdx2222cOnWKP/qjP+K+++4D4JprruH1X//1uXTpEj//8z/Pbbfdxp//+Z+Lq6666qqrrrrqqv866EEPehBXXXXVVVddddVV/9WuueaaB7/kS77k01/iJV6CV3/1V+eJT3wif/7nf87+/j7b29s86lGP4s/+7M9413d9VyKCJz7xiTzxiU/k4OCA+z3ykY/kCU94Ai/xEi/Bq7/6q7O/v8+TnvQknvjEJ7K/vw+AJAC2t7fZ2trizjvv5NixY7z4i784L/ESL8H+/j533303d911F0960pOQxAuyvb3N9ddfz/XXX8/29jZ/9Vd/xc0338yDH/xgtre32d/f5+DggP39fe6++24ODg64++67eW6S+NfY2toCYHt7m+3tbe63tbXF1tYWAFtbW9xve3ub+21tbfGiODg44IEODg4AODg4AODg4ACAg4MDDg4OADg4OODg4AAASfxrSeJ+W1tbXHvttWxtbXHttddy3XXXAXBwcMDTn/50Ll26xEu/9Evz1Kc+FYC//du/5V9y7bXXct111/GSL/mSHBwccOHCBf7gD/6A2267jdd4jdfgaU97Gs9tc3OThz3sYbzkS74kh4eH/NVf/RW///u/z2u91mvxtKc9jfttbm7y0Ic+lJd8yZfk0qVL/P7v/z633HILf/d3fwfA5uYmr/zKr8y1117L3/3d3/HzP//z/Pmf/7m46qqrrrrqqquu+q+HHvSgB3HVVVddddVVV1313+Ud3/EdP+ud3umdPvvSpUtEBE984hP58z//c+738i//8qxWK17qpV4KgCc+8Yn8xV/8BQ+0vb3Ny73cy/GoRz2KS5cucezYMZ74xCfypCc9ibvvvpvntr29zfXXX88TnvAEbrnlFl78xV+cW265hYODA+666y7uvvtunvSkJ/Ev2d7e5vrrr+f6669ne3ub66+/nr/7u7/j2LFj3HLLLQDs7+9zcHDA/v4+d999NwcHB9xzzz38a0niX0sS/1qS+LeQxItia2sLgIc97GFI4tprr+W6667jfrfddhu33XYbr/7qr87BwQFPfepTAfibv/kbJPHCbG1t8dCHPpStrS0e9rCHAXDp0iX+7u/+jj/4gz/gTd7kTfjbv/1bnp/NzU1e8iVfkoc97GFcunSJY8eOcXh4yB/90R9x7733cr/NzU0e+tCH8pIv+ZIcHh7yV3/1Vxw7doy/+7u/434v8RIvwUu8xEtweHjIT//0T3Pbbbfx53/+5+Kqq6666qqrrrrqvwd60IMexFVXXXXVVVddddV/p2uuuebBr/3ar/1eN95442e/+qu/Ovv7+/zWb/0Wd911FwDb29vs7e3xEi/xErz6q786+/v7PPGJT+Qv/uIveKDt7W0e+chHct999/HiL/7i3HLLLezv7/OkJz2Jv/iLv+D52d7e5vrrr+eRj3wkf/VXf8Utt9zCS7zES7C/v8/BwQF33303d911F3fffTfPjyTut7W1xfb2NltbWzzhCU/ANrfccgu33HILOzs7nDhxgu3tbQAODg7Y39/n4OCAu+++m4ODAwDuvvtunh9J/GtJ4l9LEv9aknhuW1tbbG1tce211wJw3XXXcd1113G/g4MDLly4wG233cbtt9+ObW6//Xbe+I3fmHvuuYd7772X5yaJ57a1tcVDH/pQrrvuOq699loODg64cOECt912Gy/90i/N0572NP72b/+W52dzc5OHPexhPPShD2Vra4tLly7x+7//+9x888087WlP4/DwkAd6iZd4CV7yJV+Sw8ND/uqv/orf//3f5zGPeQyHh4cAbG5u8sqv/Mpce+21/P7v/z6///u/z5/92Z+Jq6666qqrrrrqqv9e6EEPehBXXXXVVVddddVV/xO8zuu8znu/4zu+42fNZrMHRwRPfOIT+fM//3Put729zeu8zuvwtKc9jVd/9Vdnf3+fJz7xifzFX/wFD7S9vc3tt9/OsWPHePEXf3Fe/dVfnf39fe6++26e+MQncvfdd/P8bG9vc8MNN/DIRz6S66+/nr/7u7/j9OnTXH/99ezv73P33Xdz991386QnPQkASfxLtra22N7eZmtriz/5kz9hZ2eHY8eOcezYMW655RZ2dnY4efIkW1tb3O/g4ACAu+++G4B77rkHgP39fQAODg44ODjghZHEv4UkXpitrS0Atra22NraYmtrC4CtrS22t7e59tpreaCDgwMuXLjAbbfdBsDtt9/ObbfdBsAbv/Ebc88993DvvffyL5EEwNbWFtdeey2bm5u81Eu9FAAHBwf89V//Na/+6q/OwcEBT33qU/nbv/1bJPH8bG5u8rCHPYyXfMmX5ODggL/+67/m7//+79nd3eXmm2/mgTY3N3noQx/KS77kS3J4eMhf/dVf8TIv8zL80R/9Effeey+S2Nzc5KEPfSgv8RIvwaVLl1iv17f+6I/+6Of81m/91ndz1VVXXXXVVVdd9d8PPehBD+Kqq6666qqrrrrqf4prrrnmwa/92q/9XjfeeONnv/qrvzr7+/s88YlP5M///M+RBMD29jav/dqvzdOe9jRe/dVfnf39fZ74xCfypCc9if39fe63s7PD9ddfzw033MBTnvIUXvzFX5xbbrmF/f19nvSkJ3HXXXdx9913cz9J3G97e5vrr7+exz/+8QDccsstvPiLvzi33HILAPv7+9x9993cfffdPPnJT+ZFJQmAra0ttre32dra4vrrr2dra4vt7W22trb4xV/8RY4dO8axY8fY2dmh6zquv/56ntvBwQH329/fB+Dg4AAASdxvf3+ff8n29jYPtLW1BcDW1hYAW1tbPLeDgwMALly4wO233w7ApUuXeNM3fVMODg44ODjgnnvuAeDee+/l4OCAg4MDJPGi2tra4tprr2Vra4vrrruOa6+9FoBLly7xd3/3d9x+++3cdtttvPEbvzF/+7d/y/0k8UCbm5s87GEP4yVf8iUBuHTpEn/3d3/HS7/0S/O3f/u3PO1pT0MS99vc3OShD30oL/mSL8nh4SF/9Vd/xcu8zMvwR3/0R9x7770ASOIlXuIleImXeAkODw/57d/+bQ4ODj77R3/0Rz+Hq6666qqrrrrqqv850IMe9CCuuuqqq6666qqr/qe55pprHvySL/mST3+Jl3gJXv3VX539/X2e+MQn8hd/8Rfcb3t7m729PV78xV+cl3qplwLg7rvv5olPfCJ33303D7S9vc0jH/lIrr/+em644QZuu+02brnlFvb393nSk57E3Xffzd13380Lsr29zfXXX88jH/lIrr/+en7/93+fW265hVtuuQWAg4MD7rrrLu6++24ODg64++67eX4k8S/Z2tpia2uL7e1tAJ72tKcBsLW1RSmF6667jhtvvJFjx45xv2PHjvGf5dKlSwBcunSJu+66i0uXLnFwcMDBwQEHBwe82qu9GoeHh+zv73PvvffyL5HEC7K1tcXDHvYwAF7qpV6K+126dIm/+7u/49Vf/dW59957ueeee7j33nu59957eX4ksbm5ycMe9jAe+tCHsrW1xcHBAVtbWxwcHPC0pz2Nv/3bv+WBJLG5uclDH/pQXvIlX5LDw0P+6q/+it///d/n5V/+5bn33nu530Mf+lBe8iVfks3NTX7/93+f3//93+cZz3jGQ+67775bueqqq6666qqrrvqfBT3oQQ/iqquuuuqqq6666n+qF3uxF3vt66+//rde4iVegld/9Vdnf3+fv/iLv+CJT3wi99ve3ublXu7leOpTn8qLv/iLc8stt7C/v89f/MVf8KQnPYnntr29zSMf+Uj+7M/+jBd/8RfnoQ99KDfccAMHBwc88YlP5O677+buu+/mBdna2mJ7e5sbbriB66+/nuuvvx6A2267jRMnTrC9vc3+/j6SuOuuu7j77rs5ODjgnnvu4V9LEi/I1tYW99va2gJge3ub57a1tcW/5PDwkAc6ODgA4ODgAICDgwOemyT+tSQBsLW1BcDDHvYwAK677jquvfZaAA4ODrhw4QK33HILBwcHHB4ecs8993Dvvfdy77338sJsbW3xsIc9jIc97GFsbm5ycHDAX//1X3P77bfzYi/2Yjz1qU/l8PCQ5/awhz2Ml3zJl2Rzc5NLly7xd3/3d9xwww387d/+LYeHh9zv2muv5VVe5VXY3Nzk93//9/m7v/s77r777tf5h3/4h9/mqquuuuqqq666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OOBfQxLPbWtri83NTa677jquu+46rr32Wu536dIljh07BsDBwQFPfepTAfjbv/1bXhBJXHvttVx77bW85Eu+JACXLl3i7/7u7/j7v/97XvVVX5WnPvWpHB4ecj9JbG5u8pIv+ZI89KEP5fDwkL/6q7/ixIkTv/1bv/Vb3/Nbv/Vb381VV1111VVXXXXV/27oQQ96EFddddVVV1111VX/V5w5c+ZBL/3SL33rLbfcwou/+Itzyy23sL+/z5Oe9CSe9KQnsb+/zwPt7OzwiEc8gj/7sz/jxV/8xbnlllu45ZZb2N/f5+677+buu+9mf3+fu+++GwBJPLetrS2uv/56rr/+en7rt36LnZ0djh07xi233MKpU6e4/vrrATg4OODg4ID9/X3uvvtuDg4OALj77rt5bpL415LEv5Yk/jUk8a+1vb3N5uYm1113HQDXXXcd1157Lfc7ODjg6U9/OpcuXeL222/ntttu443f+I259957uffee3lhtra2eOhDH8p1113HtddeC8ClS5f4u7/7O/7+7/+eV33VV+WpT30qh4eHPNDm5iYPe9jDeNjDHsbm5iaXLl3i7/7u7/iDP/gDnv70pz/47Nmzz+Cqq6666qqrrrrq/wb0oAc9iKuuuuqqq6666qr/a6655poHv/Zrv/Z7vc7rvM57P+lJT3rwS73USwGwv7/Pk570JJ70pCcBIIn7bW1t8chHPpIbbriBv/qrv+Lmm2/mJV7iJQDY39/n7rvv5u677+bJT34y/5KtrS2uv/56rr/+era3t/nZn/1Zbr75Zm655RYATp06xfXXX8/9Dg4O2N/f5+DggIODAw4ODtjf3+fg4ICDgwP+JZL415LEv5YkHmhrawuAra0ttra22NzcBOC6665ja2uLra0t7ndwcMCFCxe4/fbbAbjtttt4ndd5He69914A7rnnHu69914k8YJsbW2xubnJtddey8Me9jC2trY4ODjg6U9/OpcuXeKlX/qledrTnsZTn/pUDg8PeW4v+ZIvyebmJg972MM4PDzkr/7qr3jkIx9562/91m9994/+6I9+DlddddVVV1111VX/96AHPehBXHXVVVddddVVV/1f9mIv9mKvdcMNN/z2Lbfcws0338xLvMRLsL+/z913383dd9/Nk570JJ7b9vY2119/PY9//OMBePEXf3FuueUWbrnlFgD29/e5++67ufvuu3nyk5/MCyKJ+21tbbG1tcX29jbXX389W1tbbG9vs7W1xf3+/u//ngc/+MFsbW3xQAcHBwDs7+8DcHBwAMDBwQEHBwfc7+DggPsdHBzwwkjigba2trjf1tYWAFtbW9xva2uLra0tALa2ttja2uKBDg4OALhw4QK33HIL9zs4OODg4IB7770XgHvuuYd7772XF0QS99va2mJzc5Nrr72W6667jmuvvRaAS5cu8Xd/93fcfvvt3HbbbbzJm7wJf/u3f8vzs7m5ycMe9jBe8iVfEoDbbruNP/iDP+C2225jc3PzvX/rt37re7jqqquuuuqqq676vws96EEP4qqrrrrqqquuuur/g2uuuebBL/ZiL/batdbvuvnmm3mJl3gJbrnlFvb397n77ru5++67edKTnsRz297eBuARj3gEN9xwA3/1V3/FLbfcws7ODrfccgsABwcH3HXXXdx9990cHBxw9913AyCJf8nW1hYA29vbbG1t8ad/+qcAHDt2DIAbb7yRY8eOAXDs2DF2dnYAOHbsGMeOHeO/wqVLl7h06RIAe3t7AFy6dIlLly5x1113cenSJe73eq/3etx7770cHBxweHjIv8bW1hYPe9jDAHipl3op7nfp0iX+7u/+jkuXLvFar/VaPPWpT+Xee+/l3nvvRRLP7dprr+Xaa6/lJV/yJQG4dOkSf/d3f8cf/MEf8OAHP/izf/RHf/RzuOqqq6666qqrrvr/AT3oQQ/iqquuuuqqq6666v+bM2fOPOh1Xud13vvFX/zFX/sZz3jGa7/4i784t9xyC/v7+9x9993cfffdPOlJT+KBJAGwtbXF9vY2119/Pddffz3XX389ALfddhu33HILAPv7+0ji7rvv5u677+bg4IC7776bf4kknp+trS0Atra2ANje3gZga2uL7e1t7re1tcXBwQFbW1tsbW3xr3FwcMD9Dg4OADg4OOB+h4eHHBwcAHBwcMDBwQEvjCRekK2tLQAe9rCHAXDddddx7bXXAnBwcMCFCxe45ZZbODg4AOCpT30q9957L/feey8PJAmAzc1NHvawh7G5ucnDHvYwAC5dusTf/d3f8chHPvLW3/qt3/ru3/qt3/rus2fPPoOrrrrqqquuuuqq/1/Qgx70IK666qqrrrrqqqv+P7vmmmse/OAHP/jpx44d45ZbbuHFX/zFueWWWwA4ODjgiU98InfffTf33HMPz8/W1hYA119/PX/yJ3/CsWPHuPnmmwF48Rd/cU6ePMnW1hYABwcH7O/vc3BwwN13383BwQH7+/scHBwAIIl/LUn8a0jiX0sS/1qS2NraYnNzk+uuuw6Aa6+9luuuu477HRwccOHCBW6//XYuXbrE3//93wPwRm/0Rtx7773ce++9vCBbW1s87GEP49prr+Xaa6/l4OCACxcucNttt/EHf/AHANx6660Pue+++27lqquuuuqqq6666v8v9KAHPYirrrrqqquuuuqqq6645pprHvxiL/Zir11r/a5jx47x4i/+4pw+fZrrr7+e/f197r77bu6++24ODg64++67eUG2trbY3t5me3ub66+/nt/8zd9kZ2eHY8eOccstt7Czs8PJkyfZ2toC4ODgAID9/X0ODg44ODjg4OCA/f19AA4ODjg4OOC5SeJfSxL/WpJ4bltbWwBsbW2xtbXF5uYmW1tbbG1tsbW1xdbWFvc7ODjgwoUL3H777QDcdttt3H777bzRG70RAPfccw/33XcfL8zW1hYPfehDue6667j22msBODg44K//+q/Z29vj7/7u73jwgx/82T/6oz/6OVx11VVXXXXVVVdddT/0oAc9iKuuuuqqq6666qqrntc111zz4Bd7sRd7rRd7sRd77WuuuebBL/ZiL/baf/d3f8dLvMRLALC/v8/dd9/NwcEBd999N3fffTf3k8Tzs7W1xfb2NltbW1x//fVsbW2xvb3N1tYWAH//938PwM7ODrfccgvP7eDgAID9/X0ODg6QBMD+/j4ABwcHPNDBwQHPTRLPz9bWFvfb2triftvb22xubgKwtbXF1tYWz+3g4IDWGpcuXeL222/n1V7t1QA4ODjg4OCAe++9F4B77rmHe++9l+dHEg+0tbXFQx/6UK677jquvfZaAA4ODnj605/OS7zES3Dffffd+lu/9Vvf/Q//8A+//Q//8A+/w1VXXXXVVVddddVVzw960IMexFVXXXXVVVddddVV/7JrrrnmwS/2Yi/22kdHR9917Ngxbr75Zm655RZOnTrF9ddfz/7+PgB3330399xzDwcHB9x99928KLa2tpDE1tYWAE984hMBOHbsGABbW1vccMMNHD9+nJ2dHY4dO8b9jh07xn+mS5cuAXDp0iXud9ttt3F4eMilS5e46667uN9rv/Zrc++993J4eMjBwQEvqu3tbR760IcCcN1113HttdcCcHBwwNOf/nQuXbrE3//933Pp0iU2Nzff57d+67e+m6uuuuqqq6666qqrXhToQQ96EFddddVVV1111VVX/etdc801D36xF3ux136xF3ux17rmmmse/IxnPOO1jx07xs0338wtt9wCwMHBAQB33303d999NwcHB+zv73NwcMADSeJFsbW1BcDW1hbb29vcb2trC4Dt7W0eaGtrixfVwcEB9zs4OOB+BwcHHB4ecr977rmHF0YSL8jW1habm5tcd911AFx77bVcd9113O+2227j9ttv57bbbuP1Xu/1bv2t3/qt7wb40R/90c/hqquuuuqqq6666qp/C/SgBz2Iq6666qqrrrrqqqv+/a655poHnzlz5sHXXHPNg1/sxV7sta655poHv9iLvdhr//3f/z0AD37wg9na2gLg4OAAgLvvvhuAe+65h/39fQ4ODjg4OOBFIYl/DUn8a0niX2t7e5vNzU22trbY2tpia2uLzc1NrrvuOu53cHDArbfeyqVLl3i1V3s17rvvvlv/4R/+4bfvu+++W//hH/7hd/7hH/7ht7nqqquuuuqqq6666j8CetCDHsRVV1111VVXXXXVVf85rrnmmgcDvNiLvdhrHx0dfdfOzg6SuPnmmzl27BjHjh1jZ2eHW265hQc6ODhgf3+fg4MDAA4ODjg4OGB/fx+Aw8NDAA4ODnhRSeJfSxIAW1tbAGxtbQGwtbXF5uYmAFtbW2xtbXHdddfxQAcHB7TWuP3227l06RKXLl3i0qVL3H777QA86EEP+ux/+Id/+J1/+Id/+G2uuuqqq6666qqrrvrPgh70oAdx1VVXXXXVVVddddV/rWuuuebBAC/2Yi/22oBf7MVe7LWvueaaB//+7//+a998880AHDt2jGPHjrGzs0PXdWxvb7O1tcVzOzg44IEODg6438HBAS+Kra0tHmhrawuAra0tnp+DgwMALly4wN7eHpcuXQLgtttuA+AlX/Ilf/u+++679b777rv17Nmzz7jvvvtu/Yd/+Iff5qqrrrrqqquuuuqq/2roQQ96EFddddVVV1111VVX/c9y5syZB11zzTUPueaaax4McO+99z7ommuuefDDH/7wBwNcc801D374wx/+YIBjx47xn+nSpUucPXv21kuXLnHffffdeunSJc6ePXvrfffdd+uLv/iLc/bs2Wfcd999t953331PP3v27DO46qqrrrrqqquuuup/EvSgBz2Iq6666qqrrrrqqqv+97rmmmsezAOcOXPmQYAArrnmmgdzhQHxnAwI4L777ruVKwzo7NmztwLcd999t3LVVVddddVVV1111f9m6EEPehBXXXXVVVddddVVV1111VVXXXXVVVddddX/SVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9V/CN14alPszDNqQAAAABJRU5ErkJggg==) ```kcl -fn transform(i) { +fn transform(@i) { // Transform functions can return multiple transforms. They'll be applied in order. return [ { translate = [30 * i, 0, 0] }, diff --git a/docs/kcl/patternTransform2d.md b/docs/kcl/patternTransform2d.md index 0b4cb79b1..87e03a22d 100644 --- a/docs/kcl/patternTransform2d.md +++ b/docs/kcl/patternTransform2d.md @@ -10,11 +10,11 @@ Just like patternTransform, but works on 2D sketches not 3D solids. ```kcl patternTransform2d( - sketches: [[[Sketch](/docs/kcl/types/Sketch)]](/docs/kcl/types/[Sketch](/docs/kcl/types/Sketch)), - instances: integer, + sketches: [Sketch], + instances: number, transform: FunctionSource, - useOriginal?: [bool](/docs/kcl/types/bool), -): [[[Sketch](/docs/kcl/types/Sketch)]](/docs/kcl/types/[Sketch](/docs/kcl/types/Sketch)) + useOriginal?: bool, +): [Sketch] ``` @@ -22,21 +22,21 @@ patternTransform2d( | Name | Type | Description | Required | |----------|------|-------------|----------| -| `sketches` | [`[Sketch]`](/docs/kcl/types/Sketch) | The sketch(es) to duplicate | Yes | -| `instances` | `integer` | The number of total instances. Must be greater than or equal to 1. This includes the original entity. For example, if instances is 2, there will be two copies -- the original, and one new copy. If instances is 1, this has no effect. | Yes | +| `sketches` | [`[Sketch]`](/docs/kcl/types/std-types-Sketch) | The sketch(es) to duplicate | Yes | +| `instances` | [`number`](/docs/kcl/types/std-types-number) | The number of total instances. Must be greater than or equal to 1. This includes the original entity. For example, if instances is 2, there will be two copies -- the original, and one new copy. If instances is 1, this has no effect. | Yes | | `transform` | `FunctionSource` | How each replica should be transformed. The transform function takes a single parameter: an integer representing which number replication the transform is for. E.g. the first replica to be transformed will be passed the argument `1`. This simplifies your math: the transform function can rely on id `0` being the original instance passed into the `patternTransform`. See the examples. | Yes | -| `useOriginal` | [`bool`](/docs/kcl/types/bool) | If the target was sketched on an extrusion, setting this will use the original sketch as the target, not the entire joined solid. Defaults to false. | No | +| `useOriginal` | [`bool`](/docs/kcl/types/std-types-bool) | If the target was sketched on an extrusion, setting this will use the original sketch as the target, not the entire joined solid. Defaults to false. | No | ### Returns -[`[Sketch]`](/docs/kcl/types/Sketch) +[`[Sketch]`](/docs/kcl/types/std-types-Sketch) ### Examples ```kcl // Each instance will be shifted along the X axis. -fn transform(id) { +fn transform(@id) { return { translate = [4 * id, 0] } } diff --git a/docs/kcl/pi.md b/docs/kcl/pi.md deleted file mode 100644 index 9f96bbd79..000000000 --- a/docs/kcl/pi.md +++ /dev/null @@ -1,41 +0,0 @@ ---- -title: "pi" -excerpt: "Return the value of `pi`. Archimedes’ constant (π)." -layout: manual ---- - -**WARNING:** This function is deprecated. - -Return the value of `pi`. Archimedes’ constant (π). - -**DEPRECATED** use the constant PI - -```js -pi(): number -``` - -### Tags - -* `math` - - - -### Returns - -[`number`](/docs/kcl/types/number) - - -### Examples - -```js -circumference = 70 - -exampleSketch = startSketchOn(XZ) - |> circle(center = [0, 0], radius = circumference / (2 * pi())) - -example = extrude(exampleSketch, length = 5) -``` - -![Rendered example of pi 0](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABQAAAALQCAYAAADPfd1WAAE8jklEQVR4Ae3AA6AkWZbG8f937o3IzKdyS2Oubdu2bdu2bdu2bWmMnpZKr54yMyLu+Xa3anqmhztr1a8+6EEP4qqrrrrqqquuuuqqq6666qqrrrrqqquu+j+JylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXfV/3jXXXPNgno/77rvvVq666qqrrrrqqquu+r+MylVXXXXVVVddddVV/6Ndc801Dz5z5syDAa655poHnzlz5kEA11xzzYOvueaaB/NMZ86ceTDANddc82D+He67775beaazZ8/eCnDffffdCnDffffdevbs2WcA3HfffbeePXv21vvuu+9Wrrrqqquuuuqqq676nwo96EEP4qqrrrrqqquuuuqq/x7XXHPNgwFe7MVe7LXPnDnzIIAXf/EXf22AF3uxF3ttXoDd3V0Adnd32d3d5X4XL17kue3u7vKiOH78OAAnTpzgfsePHwfg+PHjABw/fpzn57777rsV4OzZs7fed999t/7DP/zD7wDcd999t/7DP/zDb3PVVVddddVVV1111X8X9KAHPYirrrrqqquuuuqqq/5zXXPNNQ8+c+bMg1/sxV7stQBe/MVf/LVf7MVe7LV5Lru7u+zu7rK7u8vFixcBuPXWWwHY3d1ld3cXAEn8e9nm3+L48eMAHD9+nOPHjwPw4Ac/GIDjx49z4sQJjh8/zgPdd999t549e/bW++6779Z/+Id/+J377rvv1rNnz95633333cpVV1111VVXXXXVVf+Z0IMe9CCuuuqqq6666qqrrvqPc8011zz4xV7sxV77zJkzD3rxF3/x136xF3ux1+YBdnd32d3d5elPfzoAt956K7u7u+zu7nI/Sfx3s82/lm3ud/z4cY4fP86JEyd48IMfzPHjxzlx4gTHjx/nfvfdd9+tZ8+evfW+++679R/+4R9+57777rv1H/7hH36bq6666qqrrrrqqqv+o6AHPehBXHXVVVddddVVV131b3PNNdc8+MyZMw9+sRd7sdd68Rd/8dd+sRd7sdfmmXZ3d9nd3eXpT386ALfeeiu33norDySJ/01s869hm+d2/PhxAB7ykIfw4Ac/mOPHj/OQhzyE+9133323nj179tb77rvv1n/4h3/4nd/6rd/6bq666qqrrrrqqquu+rdCD3rQg7jqqquuuuqqq6666kVzzTXXPPi1X/u13wvgdV7ndd77mmuueTDA7u4uu7u7PP3pT+fWW2/l1ltv5fmRxH8kSfxr2OY/km1eFLZ5YWxz/PhxHvKQh/CQhzyE48eP85CHPIT73Xfffbf+wz/8w2//wz/8w+/cd999t/7DP/zDb3PVVVddddVVV1111YsCPehBD+Kqq6666qqrrrrqqufvmmuuefCLvdiLvfaZM2ce9E7v9E6fzTPt7u7y9Kc/nd3dXW699VZuvfVWXhBJ/FtI4r+Dbf6tbPMvsc0LY5v7HT9+nIc85CE85CEP4fjx4zzkIQ8B4L777rv1H/7hH377H/7hH37nt37rt76bq6666qqrrrrq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RxLPTRLPjySemySemySemyQeSBIPJInnJokHksQDSeJ+knggSdxPEg8kiftJ4oEkcT9J3E8S95MEgCTuJ4n7SQJAEveTBIAk7icJAEncTxIAkgCQBIAkACRxP0kASAJAEgCSAJCEJAAkASAJAEkASEISAJIAmM/nXHvttdxyyy080I/8yI989m//9m9/z3333XcrV1111VVXXXXVVf+zoAc96EFcddVVV1111VVX/U91zTXXPPi1X/u13+vFX/zFX/vFXuzFXptnuvPOO3n84x/P4x//eB5IEi+IJJ4fSTw/knhuknh+JPHcJPHcJPHcJPFAknggSTw3STyQJB5IEveTxANJ4n6SeCBJ3E8S95PE/SRxP0ncTxL3k8T9JHE/SQBI4n6SAJDE/SQBIAkASdxPEgCSAJAEgCQAJAEgCQBJAEgCQBIAkgCQBIAkACQhCQBJADzoQQ/i+PHjHDt2jPvdd999t/7Wb/3Wd//oj/7o53DVVVddddVVV131Pxd60IMexFVXXXXVVVddddX/Btdcc82D3/Ed3/GzXud1Xue9eaa9vT3uvPNOHv/4x3PnnXciiRdEEs+PJJ4fSTw/knhuknhuknhuknhuknggSTyQJJ6bJB5IEveTxANJ4oEkcT9JPJAk7ieJ+0nifpK4nyTuJ4n7SeJ+kgCQxP0kcT9JAEgCQBL3kwSAJO4nCQBJAEgCQBIAkgCQBIAkACQBIAkASQBIAkASkgCQxHw+57rrruNBD3oQD/QjP/Ijn/0P//APv/MP//APv81VV1111VVXXXXV/3zoQQ96EFddddVVV1111VX/m1xzzTUPfrEXe7HXfrEXe7HXfp3XeZ334pn29vZ4whOewJ133smdd97Jc5PE8yOJ50cSz48knpsknpsknpsknpskHkgSDySJ5yaJB5LE/STxQJJ4IEncTxIPJIn7SeJ+krifJO4niftJ4n6SuJ8kACRxP0kASOJ+kgCQxP0kASAJAEkASOJ+kgCQBIAkACQBIAkASQBIAkASkgCQBMBiseC6667jwQ9+MACr1Yr5fM59991362/91m9994/+6I9+DlddddVVV1111VX/u6AHPehBXHXVVVddddVVV/1vdc011zz4tV/7td/rdV7ndd77mmuueTDPtLe3xxOe8ATuvPNO7rzzTgAk8YJI4rlJ4vmRxHOTxHOTxHOTxHOT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HkgSDySJB5LE/STxQJK4nyQeSBL3k8T9JHE/SdxPEveTxP0kASCJ+0kCYGNjg62tLTY2Ntjc3GRjY4ONjQ3OnDnDC3Lffffd+g//8A+/fd999936D//wD7/zD//wD7/NVVddddVVV1111VX/FuhBD3oQV1111VVXXXXVVVf9x7jmmmseDPBiL/Zir/1iL/Zir3XNNdc8+MyZMw++5pprHswLcHBwgG0ODg7Y398H4J577uHg4ACA/f19Dg8PeSBJPJAk7ieJB5LE/STxQJK4nyTuJ4n7SeJ+krifJDY3NwHY3NzkmmuuAWBzc5PNzU02NjbY3NzkhbnvvvtuPXv27K1///d//9sA//AP//A7//AP//DbXHXVVVddddVVV131HwU96EEP4qqrrrrqqquuuuqq/1zXXHPNgwFe7MVe7LXOnDnz4GuuuebB11xzzYPPnDnz4GuuuebBvAgODg6438HBAQcHB9zv4OAAgIODAyRxv4ODAx5IEveTxP02NzeRBMDm5iaSuN/W1hYAm5ubAGxubrK5ucmL6r777rsV4B/+4R9++7777rv17Nmzt953333P+Id/+Iff5qqrrrrqqquuuuqq/2zoQQ96EFddddVVV1111VVX/fc5c+bMgyTpzJkzD77mmmsefObMmQddc801D77mmmseDHDmzJkHX3PNNQ++7777br3mmmsezP8g9913360AZ8+evfW+++679b777rsV4B/+4R9+5+zZs7fed999t3LVVVddddVVV1111X8n9KAHPYirrrrqqquuuuqqq/7nO3PmzIMkCeDMmTMPvuaaax4MGNCZM2ceBHDNNdc8mAe45pprHswLcd999916zTXXPPi+++67lWe67777buUBzp49eyug++6771aAs2fP3nrffffdylVXXXXVVVddddVV/xugBz3oQVx11VVXXXXVVVddddVVV1111VVXXXXVVf8nUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q/hHGC1SPkIqmNIAAAAASUVORK5CYII=) - - diff --git a/docs/kcl/polygon.md b/docs/kcl/polygon.md index 9db5c25b6..c2fd2d04a 100644 --- a/docs/kcl/polygon.md +++ b/docs/kcl/polygon.md @@ -10,12 +10,12 @@ Create a regular polygon with the specified number of sides that is either inscr ```kcl polygon( - sketchSurfaceOrGroup: [[Sketch](/docs/kcl/types/Sketch)OrSurface](/docs/kcl/types/[Sketch](/docs/kcl/types/Sketch)OrSurface), - radius: [number](/docs/kcl/types/number), + sketchSurfaceOrGroup: Sketch | Plane | Face, + radius: number, numSides: u64, - center: [[[number](/docs/kcl/types/number)]](/docs/kcl/types/[number](/docs/kcl/types/number)), - inscribed?: [bool](/docs/kcl/types/bool), -): [Sketch](/docs/kcl/types/Sketch) + center: Point2d, + inscribed?: bool, +): Sketch ``` @@ -23,15 +23,15 @@ polygon( | Name | Type | Description | Required | |----------|------|-------------|----------| -| `sketchSurfaceOrGroup` | [`SketchOrSurface`](/docs/kcl/types/SketchOrSurface) | Plane or surface to sketch on | Yes | -| `radius` | [`number`](/docs/kcl/types/number) | The radius of the polygon | Yes | +| `sketchSurfaceOrGroup` | [`Sketch`](/docs/kcl/types/std-types-Sketch) or [`Plane`](/docs/kcl/types/std-types-Plane) or [`Face`](/docs/kcl/types/std-types-Face) | Plane or surface to sketch on | Yes | +| `radius` | [`number`](/docs/kcl/types/std-types-number) | The radius of the polygon | Yes | | `numSides` | `u64` | The number of sides in the polygon | Yes | -| `center` | [`[number]`](/docs/kcl/types/number) | The center point of the polygon | Yes | -| `inscribed` | [`bool`](/docs/kcl/types/bool) | Whether the polygon is inscribed (true, the default) or circumscribed (false) about a circle with the specified radius | No | +| `center` | [`Point2d`](/docs/kcl/types/std-types-Point2d) | The center point of the polygon | Yes | +| `inscribed` | [`bool`](/docs/kcl/types/std-types-bool) | Whether the polygon is inscribed (true, the default) or circumscribed (false) about a circle with the specified radius | No | ### Returns -[`Sketch`](/docs/kcl/types/Sketch) +[`Sketch`](/docs/kcl/types/std-types-Sketch) ### Examples diff --git a/docs/kcl/pop.md b/docs/kcl/pop.md index 39e0f83f3..184bf1d39 100644 --- a/docs/kcl/pop.md +++ b/docs/kcl/pop.md @@ -9,7 +9,7 @@ Remove the last element from an array. Returns a new array with the last element removed. ```kcl -pop(array: [[[KclValue](/docs/kcl/types/KclValue)]](/docs/kcl/types/[KclValue](/docs/kcl/types/KclValue))): [KclValue](/docs/kcl/types/KclValue) +pop(array: [any]): any ``` @@ -17,11 +17,11 @@ pop(array: [[[KclValue](/docs/kcl/types/KclValue)]](/docs/kcl/types/[KclValue](/ | Name | Type | Description | Required | |----------|------|-------------|----------| -| `array` | [`[KclValue]`](/docs/kcl/types/KclValue) | The array to pop from. Must not be empty. | Yes | +| `array` | [`[any]`](/docs/kcl/types/std-types-any) | The array to pop from. Must not be empty. | Yes | ### Returns -[`KclValue`](/docs/kcl/types/KclValue) - Any KCL value. +[`any`](/docs/kcl/types/std-types-any) - Any KCL value. ### Examples diff --git a/docs/kcl/profileStart.md b/docs/kcl/profileStart.md index 7d9b17c8e..997d951c8 100644 --- a/docs/kcl/profileStart.md +++ b/docs/kcl/profileStart.md @@ -9,7 +9,7 @@ Extract the provided 2-dimensional sketch's profile's origin value. ```kcl -profileStart(profile: [Sketch](/docs/kcl/types/Sketch)): [[[number](/docs/kcl/types/number)]](/docs/kcl/types/[number](/docs/kcl/types/number)) +profileStart(profile: Sketch): [number] ``` @@ -17,11 +17,11 @@ profileStart(profile: [Sketch](/docs/kcl/types/Sketch)): [[[number](/docs/kcl/ty | Name | Type | Description | Required | |----------|------|-------------|----------| -| `profile` | [`Sketch`](/docs/kcl/types/Sketch) | Profile whose start is being used | Yes | +| `profile` | [`Sketch`](/docs/kcl/types/std-types-Sketch) | Profile whose start is being used | Yes | ### Returns -[`[number]`](/docs/kcl/types/number) +[`[number]`](/docs/kcl/types/std-types-number) ### Examples diff --git a/docs/kcl/profileStartX.md b/docs/kcl/profileStartX.md index a0cf57202..dcff89a53 100644 --- a/docs/kcl/profileStartX.md +++ b/docs/kcl/profileStartX.md @@ -9,7 +9,7 @@ Extract the provided 2-dimensional sketch's profile's origin's 'x' value. ```kcl -profileStartX(profile: [Sketch](/docs/kcl/types/Sketch)): [number](/docs/kcl/types/number) +profileStartX(profile: Sketch): number ``` @@ -17,11 +17,11 @@ profileStartX(profile: [Sketch](/docs/kcl/types/Sketch)): [number](/docs/kcl/typ | Name | Type | Description | Required | |----------|------|-------------|----------| -| `profile` | [`Sketch`](/docs/kcl/types/Sketch) | Profile whose start is being used | Yes | +| `profile` | [`Sketch`](/docs/kcl/types/std-types-Sketch) | Profile whose start is being used | Yes | ### Returns -[`number`](/docs/kcl/types/number) +[`number`](/docs/kcl/types/std-types-number) ### Examples diff --git a/docs/kcl/profileStartY.md b/docs/kcl/profileStartY.md index 86bd57fa8..7c02b8243 100644 --- a/docs/kcl/profileStartY.md +++ b/docs/kcl/profileStartY.md @@ -9,7 +9,7 @@ Extract the provided 2-dimensional sketch's profile's origin's 'y' value. ```kcl -profileStartY(profile: [Sketch](/docs/kcl/types/Sketch)): [number](/docs/kcl/types/number) +profileStartY(profile: Sketch): number ``` @@ -17,11 +17,11 @@ profileStartY(profile: [Sketch](/docs/kcl/types/Sketch)): [number](/docs/kcl/typ | Name | Type | Description | Required | |----------|------|-------------|----------| -| `profile` | [`Sketch`](/docs/kcl/types/Sketch) | Profile whose start is being used | Yes | +| `profile` | [`Sketch`](/docs/kcl/types/std-types-Sketch) | Profile whose start is being used | Yes | ### Returns -[`number`](/docs/kcl/types/number) +[`number`](/docs/kcl/types/std-types-number) ### Examples diff --git a/docs/kcl/push.md b/docs/kcl/push.md index 442a78cc5..19a1c64e0 100644 --- a/docs/kcl/push.md +++ b/docs/kcl/push.md @@ -10,9 +10,9 @@ Returns a new array with the element appended. ```kcl push( - array: [[[KclValue](/docs/kcl/types/KclValue)]](/docs/kcl/types/[KclValue](/docs/kcl/types/KclValue)), - item: [KclValue](/docs/kcl/types/KclValue), -): [KclValue](/docs/kcl/types/KclValue) + array: [any], + item: any, +): any ``` @@ -20,12 +20,12 @@ push( | Name | Type | Description | Required | |----------|------|-------------|----------| -| `array` | [`[KclValue]`](/docs/kcl/types/KclValue) | The array which you're adding a new item to. | Yes | -| `item` | [`KclValue`](/docs/kcl/types/KclValue) | The new item to add to the array | Yes | +| `array` | [`[any]`](/docs/kcl/types/std-types-any) | The array which you're adding a new item to. | Yes | +| `item` | [`any`](/docs/kcl/types/std-types-any) | The new item to add to the array | Yes | ### Returns -[`KclValue`](/docs/kcl/types/KclValue) - Any KCL value. +[`any`](/docs/kcl/types/std-types-any) - Any KCL value. ### Examples diff --git a/docs/kcl/reduce.md b/docs/kcl/reduce.md index 64f131f36..b7dd42e1e 100644 --- a/docs/kcl/reduce.md +++ b/docs/kcl/reduce.md @@ -10,10 +10,10 @@ Take a starting value. Then, for each element of an array, calculate the next va ```kcl reduce( - array: [[[KclValue](/docs/kcl/types/KclValue)]](/docs/kcl/types/[KclValue](/docs/kcl/types/KclValue)), - initial: [KclValue](/docs/kcl/types/KclValue), + array: [any], + initial: any, f: FunctionSource, -): [KclValue](/docs/kcl/types/KclValue) +): any ``` @@ -21,13 +21,13 @@ reduce( | Name | Type | Description | Required | |----------|------|-------------|----------| -| `array` | [`[KclValue]`](/docs/kcl/types/KclValue) | Each element of this array gets run through the function `f`, combined with the previous output from `f`, and then used for the next run. | Yes | -| `initial` | [`KclValue`](/docs/kcl/types/KclValue) | The first time `f` is run, it will be called with the first item of `array` and this initial starting value. | Yes | +| `array` | [`[any]`](/docs/kcl/types/std-types-any) | Each element of this array gets run through the function `f`, combined with the previous output from `f`, and then used for the next run. | Yes | +| `initial` | [`any`](/docs/kcl/types/std-types-any) | The first time `f` is run, it will be called with the first item of `array` and this initial starting value. | Yes | | `f` | `FunctionSource` | Run once per item in the input `array`. This function takes an item from the array, and the previous output from `f` (or `initial` on the very first run). The final time `f` is run, its output is returned as the final output from `reduce`. | Yes | ### Returns -[`KclValue`](/docs/kcl/types/KclValue) - Any KCL value. +[`any`](/docs/kcl/types/std-types-any) - Any KCL value. ### Examples @@ -41,7 +41,7 @@ fn add(a, b) { // This function adds an array of numbers. // It uses the `reduce` function, to call the `add` function on every // element of the `arr` parameter. The starting value is 0. -fn sum(arr) { +fn sum(@arr) { return reduce(arr, initial = 0, f = add) } @@ -91,7 +91,7 @@ assert( ```kcl // Declare a function that sketches a decagon. -fn decagon(radius) { +fn decagon(@radius) { // Each side of the decagon is turned this many radians from the previous angle. stepAngle = (1 / 10 * TAU): number(rad) diff --git a/docs/kcl/rotate.md b/docs/kcl/rotate.md index 922db39bd..e5f7be9a5 100644 --- a/docs/kcl/rotate.md +++ b/docs/kcl/rotate.md @@ -28,14 +28,14 @@ When rotating a part around an axis, you specify the axis of rotation and the an ```kcl rotate( - objects: [[Solid](/docs/kcl/types/Solid)Or[Sketch](/docs/kcl/types/Sketch)OrImportedGeometry](/docs/kcl/types/[Solid](/docs/kcl/types/Solid)Or[Sketch](/docs/kcl/types/Sketch)OrImportedGeometry), - roll?: [number](/docs/kcl/types/number), - pitch?: [number](/docs/kcl/types/number), - yaw?: [number](/docs/kcl/types/number), - axis?: [[[number](/docs/kcl/types/number)]](/docs/kcl/types/[number](/docs/kcl/types/number)), - angle?: [number](/docs/kcl/types/number), - global?: [bool](/docs/kcl/types/bool), -): [[Solid](/docs/kcl/types/Solid)Or[Sketch](/docs/kcl/types/Sketch)OrImportedGeometry](/docs/kcl/types/[Solid](/docs/kcl/types/Solid)Or[Sketch](/docs/kcl/types/Sketch)OrImportedGeometry) + objects: [Solid] | [Sketch] | ImportedGeometry, + roll?: number, + pitch?: number, + yaw?: number, + axis?: [number], + angle?: number, + global?: bool, +): [Solid] | [Sketch] | ImportedGeometry ``` @@ -43,17 +43,17 @@ rotate( | Name | Type | Description | Required | |----------|------|-------------|----------| -| `objects` | [`SolidOrSketchOrImportedGeometry`](/docs/kcl/types/SolidOrSketchOrImportedGeometry) | The solid, sketch, or set of solids or sketches to rotate. | Yes | -| `roll` | [`number`](/docs/kcl/types/number) | The roll angle in degrees. Must be between -360 and 360. Default is 0 if not given. | No | -| `pitch` | [`number`](/docs/kcl/types/number) | The pitch angle in degrees. Must be between -360 and 360. Default is 0 if not given. | No | -| `yaw` | [`number`](/docs/kcl/types/number) | The yaw angle in degrees. Must be between -360 and 360. Default is 0 if not given. | No | -| `axis` | [`[number]`](/docs/kcl/types/number) | The axis to rotate around. Must be used with `angle`. | No | -| `angle` | [`number`](/docs/kcl/types/number) | The angle to rotate in degrees. Must be used with `axis`. Must be between -360 and 360. | No | -| `global` | [`bool`](/docs/kcl/types/bool) | If true, the transform is applied in global space. The origin of the model will move. By default, the transform is applied in local sketch axis, therefore the origin will not move. | No | +| `objects` | [`[Solid]`](/docs/kcl/types/std-types-Solid) or [`[Sketch]`](/docs/kcl/types/std-types-Sketch) or [`ImportedGeometry`](/docs/kcl/types#ImportedGeometry) | The solid, sketch, or set of solids or sketches to rotate. | Yes | +| `roll` | [`number`](/docs/kcl/types/std-types-number) | The roll angle in degrees. Must be between -360 and 360. Default is 0 if not given. | No | +| `pitch` | [`number`](/docs/kcl/types/std-types-number) | The pitch angle in degrees. Must be between -360 and 360. Default is 0 if not given. | No | +| `yaw` | [`number`](/docs/kcl/types/std-types-number) | The yaw angle in degrees. Must be between -360 and 360. Default is 0 if not given. | No | +| `axis` | [`[number]`](/docs/kcl/types/std-types-number) | The axis to rotate around. Must be used with `angle`. | No | +| `angle` | [`number`](/docs/kcl/types/std-types-number) | The angle to rotate in degrees. Must be used with `axis`. Must be between -360 and 360. | No | +| `global` | [`bool`](/docs/kcl/types/std-types-bool) | If true, the transform is applied in global space. The origin of the model will move. By default, the transform is applied in local sketch axis, therefore the origin will not move. | No | ### Returns -[`SolidOrSketchOrImportedGeometry`](/docs/kcl/types/SolidOrSketchOrImportedGeometry) - Data for a solid, sketch, or an imported geometry. +[`[Solid]`](/docs/kcl/types/std-types-Solid) or [`[Sketch]`](/docs/kcl/types/std-types-Sketch) or [`ImportedGeometry`](/docs/kcl/types#ImportedGeometry) - Data for a solid, sketch, or an imported geometry. ### Examples diff --git a/docs/kcl/scale.md b/docs/kcl/scale.md index 70671ef43..901a7424a 100644 --- a/docs/kcl/scale.md +++ b/docs/kcl/scale.md @@ -16,12 +16,12 @@ If you want to apply the transform in global space, set `global` to `true`. The ```kcl scale( - objects: [[Solid](/docs/kcl/types/Solid)Or[Sketch](/docs/kcl/types/Sketch)OrImportedGeometry](/docs/kcl/types/[Solid](/docs/kcl/types/Solid)Or[Sketch](/docs/kcl/types/Sketch)OrImportedGeometry), - x?: [number](/docs/kcl/types/number), - y?: [number](/docs/kcl/types/number), - z?: [number](/docs/kcl/types/number), - global?: [bool](/docs/kcl/types/bool), -): [[Solid](/docs/kcl/types/Solid)Or[Sketch](/docs/kcl/types/Sketch)OrImportedGeometry](/docs/kcl/types/[Solid](/docs/kcl/types/Solid)Or[Sketch](/docs/kcl/types/Sketch)OrImportedGeometry) + objects: [Solid] | [Sketch] | ImportedGeometry, + x?: number, + y?: number, + z?: number, + global?: bool, +): [Solid] | [Sketch] | ImportedGeometry ``` @@ -29,15 +29,15 @@ scale( | Name | Type | Description | Required | |----------|------|-------------|----------| -| `objects` | [`SolidOrSketchOrImportedGeometry`](/docs/kcl/types/SolidOrSketchOrImportedGeometry) | The solid, sketch, or set of solids or sketches to scale. | Yes | -| `x` | [`number`](/docs/kcl/types/number) | The scale factor for the x axis. Default is 1 if not provided. | No | -| `y` | [`number`](/docs/kcl/types/number) | The scale factor for the y axis. Default is 1 if not provided. | No | -| `z` | [`number`](/docs/kcl/types/number) | The scale factor for the z axis. Default is 1 if not provided. | No | -| `global` | [`bool`](/docs/kcl/types/bool) | If true, the transform is applied in global space. The origin of the model will move. By default, the transform is applied in local sketch axis, therefore the origin will not move. | No | +| `objects` | [`[Solid]`](/docs/kcl/types/std-types-Solid) or [`[Sketch]`](/docs/kcl/types/std-types-Sketch) or [`ImportedGeometry`](/docs/kcl/types#ImportedGeometry) | The solid, sketch, or set of solids or sketches to scale. | Yes | +| `x` | [`number`](/docs/kcl/types/std-types-number) | The scale factor for the x axis. Default is 1 if not provided. | No | +| `y` | [`number`](/docs/kcl/types/std-types-number) | The scale factor for the y axis. Default is 1 if not provided. | No | +| `z` | [`number`](/docs/kcl/types/std-types-number) | The scale factor for the z axis. Default is 1 if not provided. | No | +| `global` | [`bool`](/docs/kcl/types/std-types-bool) | If true, the transform is applied in global space. The origin of the model will move. By default, the transform is applied in local sketch axis, therefore the origin will not move. | No | ### Returns -[`SolidOrSketchOrImportedGeometry`](/docs/kcl/types/SolidOrSketchOrImportedGeometry) - Data for a solid, sketch, or an imported geometry. +[`[Solid]`](/docs/kcl/types/std-types-Solid) or [`[Sketch]`](/docs/kcl/types/std-types-Sketch) or [`ImportedGeometry`](/docs/kcl/types#ImportedGeometry) - Data for a solid, sketch, or an imported geometry. ### Examples diff --git a/docs/kcl/segAng.md b/docs/kcl/segAng.md index c70a1a886..e9aef8b9b 100644 --- a/docs/kcl/segAng.md +++ b/docs/kcl/segAng.md @@ -9,7 +9,7 @@ Compute the angle (in degrees) of the provided line segment. ```kcl -segAng(tag: [TagIdentifier](/docs/kcl/types#tag-identifier)): [number](/docs/kcl/types/number) +segAng(tag: TagIdentifier): number ``` @@ -17,11 +17,11 @@ segAng(tag: [TagIdentifier](/docs/kcl/types#tag-identifier)): [number](/docs/kcl | Name | Type | Description | Required | |----------|------|-------------|----------| -| `tag` | [`TagIdentifier`](/docs/kcl/types#tag-identifier) | The line segment being queried by its tag | Yes | +| [`tag`](/docs/kcl/types/std-types-tag) | [`TagIdentifier`](/docs/kcl/types#TagIdentifier) | The line segment being queried by its tag | Yes | ### Returns -[`number`](/docs/kcl/types/number) +[`number`](/docs/kcl/types/std-types-number) ### Examples diff --git a/docs/kcl/segEnd.md b/docs/kcl/segEnd.md index f4c396042..29323fccd 100644 --- a/docs/kcl/segEnd.md +++ b/docs/kcl/segEnd.md @@ -9,7 +9,7 @@ Compute the ending point of the provided line segment. ```kcl -segEnd(tag: [TagIdentifier](/docs/kcl/types#tag-identifier)): [[[number](/docs/kcl/types/number)]](/docs/kcl/types/[number](/docs/kcl/types/number)) +segEnd(tag: TagIdentifier): Point2d ``` @@ -17,11 +17,11 @@ segEnd(tag: [TagIdentifier](/docs/kcl/types#tag-identifier)): [[[number](/docs/k | Name | Type | Description | Required | |----------|------|-------------|----------| -| `tag` | [`TagIdentifier`](/docs/kcl/types#tag-identifier) | The line segment being queried by its tag | Yes | +| [`tag`](/docs/kcl/types/std-types-tag) | [`TagIdentifier`](/docs/kcl/types#TagIdentifier) | The line segment being queried by its tag | Yes | ### Returns -[`[number]`](/docs/kcl/types/number) +[`Point2d`](/docs/kcl/types/std-types-Point2d) ### Examples @@ -44,10 +44,10 @@ fn cylinder(radius, tag) { |> extrude(length = radius) } -cylinder(1, line1) -cylinder(2, line2) -cylinder(3, line3) -cylinder(4, line4) +cylinder(radius = 1, tag = line1) +cylinder(radius = 2, tag = line2) +cylinder(radius = 3, tag = line3) +cylinder(radius = 4, tag = line4) ``` ![Rendered example of segEnd 0](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABQAAAALQCAYAAADPfd1WAAEJnElEQVR4Ae3AA6AkWZbG8f937o3IzKdyS2Oubdu2bdu2bdu2bWmMnpZKr54yMyLu+Xa3anqmhztr1a8+6EEP4qqrrrrqqquuuuqqq6666qqrrrrqqquu+j+JylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVf8G11xzzYNf7MVe7LW56qqrrnqAf/iHf/jt++6771auuuqqq6666qr/KahcddVVV1111VVX/Su92Iu92Gu/0zu9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gCQkIQlJAEhCEpKQhCQkIQlJSEISkpCEJCICSUQEkogIIoKIICKICCKCiKCUQimFiKCUQimFWiulFGqt1FoppVBrpdZKrZVaK7VWaq2UUqi1UkqhlEIphYggIogIJBERAEhib2+PYRhYr9fc77777rv1R3/0Rz/7t37rt76Hq6666qqrrrrqqquuuuo/A3rQgx7EVVddddVVV/1Pcs011zz4tV/7td/rdV7ndd77mmuueTDA7u4uP/MzP8MznvEMACQhCQBJ3E8SAJIAkMT9JAEgiftJ4n6SuJ8kJCEJSUhCEpKQhCQkIQlJAEhCEpKQhCQAJCEJSQBIQhKSkASAJCQhCUkASEISkpCEJCQhCUlIQhKSkIQkIgJJRASSiAgiAklEBKUUIoKIoJRCRFBKoZRCKYVaK6UUaq3UWimlUGul1kqtlVortVZqrZRSqLVSSqGUQimFiCAiiAgigszk6OiI/f197nfffffd+lu/9Vvf/du//dvfc999993KVVddddVVV1111VVXXfWfCT3oQQ/iqquuuuqqq/4nuuaaax782q/92u/1Tu/0Tp/NM+3u7vI7v/M7/O3f/i0AkgCQBIAkACQBIIn7SeJ+kgCQxP0kcT9JSEISkpCEJCQhCUlIQhIAkpCEJCQhCQBJSEISkgCQhCQkIQkASUhCEgCSkIQkJCEJSUhCEpKQhCQkIQlJRASSiAgkERFEBJKICCKCUgoRQSmFiKCUQimFUgq1Vkop1FoppVBrpdZKrZVaK7VWaq3UWimlUGullEIphVIKEQHAarVitVrRWuN+9913362/9Vu/9d0/+qM/+jlcddVVV1111VVXXXXVVf9V0IMe9CCuuuqqq6666n+yM2fOPOh1Xud13vt1Xud13vuaa655MMClS5f467/+a2677Tae8YxnIAkASQBI4n6SAJDE/SRxP0ncTxIAkpCEJCQhCUlIQhKSAJCEJCQhCUlIAkASkpCEJAAkIQlJSAJAEpKQhCQAJCEJSUhCEpKQhCQkIQlJSEISkogIJCGJiCAikEREEBFEBKUUIoKIoJRCKYVSCqUUSinUWqm1Ukqh1kqtlVortVZqrdRaqbVSa6WUQikFSUzTxDAMZCb3u++++279rd/6re/+7d/+7e+57777buWqq6666qqrrrrqqquu+q+GHvSgB3HVVVddddVV/xtcc801D36xF3ux136d13md93qxF3ux1+aZdnd3+b3f+z3+9m//FkncTxIAkrifJAAkcT9J3E8SAJKQhCQkIQlJSEISAJKQhCQkIQlJSAJAEpKQhCQAJCEJSUgCQBKSkASAJCQhCUlIQhKSAJCEJCICSUhCEpKICCQhiYggIpBERBARRAQRQSmFiKCUQimFUgqlFEop1FqptVJKodZKrZVaK7VWaq3UWqm1UkoBoLWGbe5333333fpbv/Vb3/0P//APv/0P//APv8NVV1111VVXXXXVVVdd9d8JPehBD+Kqq6666qqr/rc5c+bMg17ndV7nvd/pnd7ps3mmS5cu8YxnPIPbbruNv/3bv0USAJK4nyTuJ4n7SeJ+kgCQhCQkIQlJSEISkpCEJCQhCUlIAkASkpCEJAAkIQlJSAJAEpKQhCQAJCEJSUhCEpIAkIQkJCGJiEASkpCEJCICSUQEkogIIoKIICKICEopRASlFEoplFIopVBKodZKKYVaK7VWaq3UWum6jr7viQgigge67777bv2t3/qt7z579uwzfuu3fuu7ueqqq6666qqrrrrqqqv+p0APetCDuOqqq6666qr/ra655poHv9iLvdhrv9iLvdhrvc7rvM5780yXLl3i0qVL3HbbbTzjGc/g9ttvB0AS95PE/SRxP0kASEISkpCEJCQhCUlIQhKSkIQkACQhCUlIQhIAkpCEJCQBIAlJSAJAEpKQhCQkIQkASUhCEpKQhCQiAklIQhIRgSQiAklEBBFBRBARRASlFCKCUgqlFEoplFIopVBrpZTCbDZjY2ODWivz+ZyI4IHuu+++W3/rt37ru//hH/7hd/7hH/7ht7nqqquuuuqqq6666qqr/idCD3rQg7jqqquuuuqq/wvOnDnzoBd/8Rd/ndd5ndd5rxd7sRd7bR7g0qVL3Hbbbdx2223s7e1x2223IYn7SeJ+kgCQhCQkIQlJSEISkpCEJCQhCQBJSEISkpAEgCQkIQlJAEhCEpKQBIAkJCEJSUgCQBKSkIQkJCEJSUQEkpCEJCICSUQEkogIIoKIICKICEopRASlFEoplFKYz+ecOHGCiGB7e5taKw9033333Xr27Nlb//7v//63f/u3f/t77rvvvlu56qqrrrrqqquuuuqqq/6nQw960IO46qqrrrrqqv9rrrnmmge/2Iu92Gu/2Iu92Gu9zuu8znvzXC5dusRtt93G7bffzqVLl7j99tuRxP0kIQlJSEISkpCEJCQhCUlIAkASkpCEJCQhCQBJSEISkgCQhCQkIQkASUhCEpKQBIAkJCEJSUhCEpKICCQhCUlEBJKICCQREUQEEUFEEBEsFguOHz/OfD5ne3ubra0tnts//MM//DbA3//93//2P/zDP/zOP/zDP/w2V1111VVXXXXVVVddddX/NuhBD3oQV1111VVXXfV/3TXXXPPgF3uxF3vtF3uxF3ut13md13lvgPvuu+/Wa6655sE806VLl7j99tu5/fbb2dvbY29vj/39fSQhCUlIQhKSkASAJCQhCUlIQhKSAJCEJCQhCQBJSEISkgCQhCQkIQlJAEhCEpKQhCQkIQlJSCIikIQkIgJJbG5uAnDq1CkWiwWLxYL5fM6xY8d4fu67775b/+Ef/uG377vvvlv/4R/+4Xf+4R/+4be56qqrrrrqqquuuuqqq/63Qw960IO46qqrrrrqqv9vrrnmmge/2Iu92Gu/2Iu92Gtdc801D36xF3ux1+b52NvbA+COO+4A4M4770QS+/v77O3tcXBwgCQkIQlJSEISAJKQhCQkIQkASUhCEpIAkIQkJCEJSQBIQhKSkIQkJLG5uYkkNjY2OH36NJLY2NhgY2ODkydP8sLcd999t/7DP/zDb9933323/sM//MPv/MM//MNvc9VVV1111VVXXXXVVVf9X4Qe9KAHcdVVV1111VX/3505c+ZBkvRiL/Zir/1iL/Zir3XNNdc8+MyZMw++5pprHsy/YH9/H4D9/X329/eRBMD+/j6SODg4QBL3k4QkACRxP0lIYnNzE0ncb2tri83NTQA2NzfZ2NjgRXXffffdevbs2Vv//u///rcB/uEf/uF3/uEf/uG3ueqqq6666qqrrrrqqqv+v0APetCDuOqqq6666qqrnr9rrrnmwQAv9mIv9toAL/ZiL/Za11xzzYMBzpw58+Brrrnmwfw3ue+++24FOHv27K333Xffrffdd9+tZ8+evfW+++57xj/8wz/8NlddddVVV1111VVXXXXVVYAe9KAHcdVVV1111VVX/dudOXPmQZJ05syZB19zzTUP5gqfOXPmwQDXXHPNg/lXuO+++27lAc6ePfuM++677+mAzp49e+t99913K1ddddVVV1111VVXXXXVVS8a9KAHPYirrrrqqquuuuqqq6666qqrrrrqqquuuur/JCpXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9V/CPjE+ru3OrUigAAAABJRU5ErkJggg==) diff --git a/docs/kcl/segEndX.md b/docs/kcl/segEndX.md index 8ae1ed0a4..c150680dd 100644 --- a/docs/kcl/segEndX.md +++ b/docs/kcl/segEndX.md @@ -9,7 +9,7 @@ Compute the ending point of the provided line segment along the 'x' axis. ```kcl -segEndX(tag: [TagIdentifier](/docs/kcl/types#tag-identifier)): [number](/docs/kcl/types/number) +segEndX(tag: TagIdentifier): number ``` @@ -17,11 +17,11 @@ segEndX(tag: [TagIdentifier](/docs/kcl/types#tag-identifier)): [number](/docs/kc | Name | Type | Description | Required | |----------|------|-------------|----------| -| `tag` | [`TagIdentifier`](/docs/kcl/types#tag-identifier) | The line segment being queried by its tag | Yes | +| [`tag`](/docs/kcl/types/std-types-tag) | [`TagIdentifier`](/docs/kcl/types#TagIdentifier) | The line segment being queried by its tag | Yes | ### Returns -[`number`](/docs/kcl/types/number) +[`number`](/docs/kcl/types/std-types-number) ### Examples diff --git a/docs/kcl/segEndY.md b/docs/kcl/segEndY.md index d02209c00..14b828d93 100644 --- a/docs/kcl/segEndY.md +++ b/docs/kcl/segEndY.md @@ -9,7 +9,7 @@ Compute the ending point of the provided line segment along the 'y' axis. ```kcl -segEndY(tag: [TagIdentifier](/docs/kcl/types#tag-identifier)): [number](/docs/kcl/types/number) +segEndY(tag: TagIdentifier): number ``` @@ -17,11 +17,11 @@ segEndY(tag: [TagIdentifier](/docs/kcl/types#tag-identifier)): [number](/docs/kc | Name | Type | Description | Required | |----------|------|-------------|----------| -| `tag` | [`TagIdentifier`](/docs/kcl/types#tag-identifier) | The line segment being queried by its tag | Yes | +| [`tag`](/docs/kcl/types/std-types-tag) | [`TagIdentifier`](/docs/kcl/types#TagIdentifier) | The line segment being queried by its tag | Yes | ### Returns -[`number`](/docs/kcl/types/number) +[`number`](/docs/kcl/types/std-types-number) ### Examples diff --git a/docs/kcl/segLen.md b/docs/kcl/segLen.md index fc3736075..da9fcb62a 100644 --- a/docs/kcl/segLen.md +++ b/docs/kcl/segLen.md @@ -9,7 +9,7 @@ Compute the length of the provided line segment. ```kcl -segLen(tag: [TagIdentifier](/docs/kcl/types#tag-identifier)): [number](/docs/kcl/types/number) +segLen(tag: TagIdentifier): number ``` @@ -17,11 +17,11 @@ segLen(tag: [TagIdentifier](/docs/kcl/types#tag-identifier)): [number](/docs/kcl | Name | Type | Description | Required | |----------|------|-------------|----------| -| `tag` | [`TagIdentifier`](/docs/kcl/types#tag-identifier) | The line segment being queried by its tag | Yes | +| [`tag`](/docs/kcl/types/std-types-tag) | [`TagIdentifier`](/docs/kcl/types#TagIdentifier) | The line segment being queried by its tag | Yes | ### Returns -[`number`](/docs/kcl/types/number) +[`number`](/docs/kcl/types/std-types-number) ### Examples diff --git a/docs/kcl/segStart.md b/docs/kcl/segStart.md index f981f7c2c..86e1e50d5 100644 --- a/docs/kcl/segStart.md +++ b/docs/kcl/segStart.md @@ -9,7 +9,7 @@ Compute the starting point of the provided line segment. ```kcl -segStart(tag: [TagIdentifier](/docs/kcl/types#tag-identifier)): [[[number](/docs/kcl/types/number)]](/docs/kcl/types/[number](/docs/kcl/types/number)) +segStart(tag: TagIdentifier): Point2d ``` @@ -17,11 +17,11 @@ segStart(tag: [TagIdentifier](/docs/kcl/types#tag-identifier)): [[[number](/docs | Name | Type | Description | Required | |----------|------|-------------|----------| -| `tag` | [`TagIdentifier`](/docs/kcl/types#tag-identifier) | The line segment being queried by its tag | Yes | +| [`tag`](/docs/kcl/types/std-types-tag) | [`TagIdentifier`](/docs/kcl/types#TagIdentifier) | The line segment being queried by its tag | Yes | ### Returns -[`[number]`](/docs/kcl/types/number) +[`Point2d`](/docs/kcl/types/std-types-Point2d) ### Examples @@ -44,10 +44,10 @@ fn cylinder(radius, tag) { |> extrude(length = radius) } -cylinder(1, line1) -cylinder(2, line2) -cylinder(3, line3) -cylinder(4, line4) +cylinder(radius = 1, tag = line1) +cylinder(radius = 2, tag = line2) +cylinder(radius = 3, tag = line3) +cylinder(radius = 4, tag = line4) ``` ![Rendered example of segStart 0](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABQAAAALQCAYAAADPfd1WAAD5r0lEQVR4Ae3AA6AkWZbG8f937o3IzKdyS2Oubdu2bdu2bdu2bWmMnpZKr54yMyLu+Xa3anqmhztr1a8+6EEP4qqrrrrqqquuuuqqq6666qqrrrrqqquu+j+JylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXfVcrrnmmgfzL7jvvvtu5aqrrrrqqquuuuqqq676n47KVVddddVVV131f84111zz4DNnzjwY4JprrnnwmTNnHgRwzTXXPPiaa655MM905syZBwNcc801D+bf6b777ruVZzp79uytAPfdd9+tAPfdd9+tZ8+efQbAfffdd+vZs2dvve+++27lqquuuuqqq6666qqrrvrPhh70oAdx1VVXXXXVVVf973HNNdc8GODFXuzFXvvMmTMPAnjxF3/x1wZ4sRd7sdfmP8CFCxf4l5w8eZJ/r/vuu+/Ws2fP3nrffffdCvAP//APv3Pffffd+g//8A+/zVVXXXXVVVddddVVV131HwE96EEP4qqrrrrqqquu+p/nmmuuefCZM2ce/GIv9mKvBfDiL/7ir/1iL/Zir82L4MKFC1y4cAGACxcucOHCBQAuXrwIwIULFwC4cOECABcuXODf6+TJk9zv5MmTAJw8eRKAEydOcPLkSU6ePAnAyZMnOXnyJC/Mfffdd+vZs2dvve+++279h3/4h9+57777bv2Hf/iH3+aqq6666qqrrrrqqquu+tdAD3rQg7jqqquuuuqqq/57XXPNNQ9+7dd+7fcCePEXf/HXfrEXe7HX5gW4cOECAE95ylO4cOECAE996lMBeMpTnsJ/BUn8Rzh58iQnTpzg5MmTnDx5kpMnT3LixAke/vCH8/zcd999twL8wz/8w2//wz/8w+/81m/91ndz1VVXXXXVVVddddVVV70w6EEPehBXXXXVVVddddV/nWuuuebBZ86cefCLvdiLvdaLv/iLv/aLvdiLvTbPx4ULF7hw4QJPfepTAXjKU57CU5/6VP6/OHnyJCdOnODkyZM8/OEP58SJEzz84Q/nud133323/tZv/dZ3nz179hm/9Vu/9d1cddVVV1111VVXXXXVVQ+EHvSgB3HVVVddddVVV/3nueaaax78Yi/2Yq995syZB73O67zOe19zzTUP5rlcuHCBpz71qVy4cIGnPOUpPPWpT+W/ysmTJ/nf4sSJE5w8eZKTJ0/yCq/wCpw8eZIHuu+++249e/bsrX//93//2//wD//wO2fPnr2Vq6666j/FfffddytXXXXVVVddddX/BuhBD3oQV1111VVXXXXVf6xrrrnm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uupFQ3DVVVddddVV/4/dd999t/7Wb/3Wd7/SK70Sb/iGb4htnh/b2MY2tgGwzQtjG9s8N9vYxja2AbDN/SQhiYggIogIIoLrr7+eF3uxFwPgH/7hH377Mz/zM1+Hq6666qr/Jj/6oz/6Offdd9+tD33oQ3nd131dACQhiX+JJO4niecmCQBJ3E8Sz48k7icJSQBIAkASkpCEJCRxP0ncTxIAkvifwjYAtrmfbWzz2q/92g/iqquuuuqqq140BFddddVVV131/9yP/uiPfg7AG77hG/L6r//6ANjmRWEb29jGNraxjW3uZxvb2MY2trGNbWxjm/tJQhKSkEREUErhhhtu4NprrwXgR37kRz77Mz/zM1+Hq6666qr/Rvfdd9+tX//1X//eAC/zMi/Dgx/8YB5IEgCSeH4kcT9JAEjiuUnifpKQhCQkIQkASUhCEgCSkIQkJAEgCUkASEISkpCEJB5IEpK4nyT+u9gGwDa2sU1mcs0113DVVVddddVVLyKCq6666qqrrvp/7r777rv167/+698H4OVe7uV4ndd5HR7INgC2sY1tbPOisA2AbWxjG9tkJraxjW0eSBIRAUBEcPz4cebzOffdd9+tn/mZn/k6P/qjP/o5XHXVVVf9D/AP//APv/P1X//173P8+HHe4i3egmPHjgEgCQBJ3E8SknggSTw3SQBI4n6SeEEkASAJAElIAkASAJK4nyQAJPFAkpCEJO4niQeSxH8W27wobAPwD//wD7/NVVddddVVV71oKMePH+eqq6666qqr/r+79dZb/xrg5V/+5V/7oQ99KA9+8IO59dZbWa/XSEISkiilEBFEBJKICCKCiCAiiAgigohAEhFBKYVSCrVWaq10XUff98xmM2azGX3f03UdpRQkMU0T+/v7HBwccL/f+q3f+u7P+qzPep2zZ8/eylVXXXXV/yBHR0e7D3nIQ176lltuefAjH/lInvrUpzKOIxFBRCCJiEASkogIIgJJSCIikEREIAlJSEISEYEkJBERRAQRQUQQEUQEkogIJBERSCIiiAgigoggIogIIoKIQBKSkIQkJPFAtrGNbWxjG9vYxja2sY1tbGMb29jGNraxjW0AbANgGwDbANgGwDa2AbCNbTIT29jGNq01WmtM08RjH/tYzp49+z3/8A//8NtcddVVV1111b+Mcvz4ca666qqrrrrqKviHf/iH3/mHf/iH33mxF3ux177pppuOP/rRj2Y+n7O3t8d6vQYgIogIIoKIQBIRQUQgCUlIIiKICCKCiCAiKKVQa6XrOvq+p+97ZrMZs9mMrusYx5FLly5x7tw5hmEA4L777rv1S77kS97mF37hF76Gq6666qr/gQ4PD3f/4R/+4Xce8pCHvPTNN9/84Ec84hE87WlPYxxHJBERSEISkpCEJCICSUhCEpKICCQREUhCEhGBJCQhCUlIQhKSiAgkERFIIiKICCQREUQEkogIIgJJRASSAJAEgCQAbGMb29gGwDa2sY1tbGMb29jGNraxjW1sYxvbANgGwDYAtgGwDYBtbANgG9vYxja2yUwyk9Ya0zTxBm/wBkzT9Iw//dM//Wmuuuqqq6666l9GOX78OFddddVVV1111RVnz5699c/+7M9+5vDwcPflX/7lX/vBD34wj3zkI7n22muZz+ecO3eOiCAiiAgiAklIIiKICCICSUQEkiilUEqhlEKtla7r6PuexWJB3/cA7O7ucnh4yDAMAPzWb/3Wd3/pl37p2/zoj/7o55w9e/ZWrrrqqqv+Bzs8PNz9h3/4h995xVd8xbc+efLk8Yc97GE87WlPY5omJCEJSUhCEpKQhCQkERFIQhKSkEREIAlJRASSkIQkJBERRASSiAgkERFEBJKICCKCiCAikIQkIgJJSEISAJJ4fmxjG9vYxja2sY1tbGMb29jGNraxjW1sA2AbANsA2AbANgC2sQ2AbWxjG9tkJrZprZGZbG5u8iZv8iZ813d918ecPXv2Vq666qqrrrrqX4Ye9KAHcdVVV1111VVXPa8zZ8486J3e6Z0++3Ve53XemwfY29vjzjvv5O677+bo6IijoyOWyyWlFEoplFIopVBKodbK9vY229vbbG1tsbW1xbFjx9jc3OS53Xfffbf+1m/91nf/6I/+6Odw1VVXXfW/0DXXXPPgd3zHd/ys13md13nvvb09fuu3fot77rmHUgoRQUQQEUgiIogIJBERRASSiAgkERFEBJKICCKCiCAiiAgigoiglEJEUEqhlEJEUEqhlEIphYiglEJEEBFEBJKQhCQAbAOQmdgmM8lMMpPWGq01MpPWGq01MpPWGq01MpPMJDPJTDKTzCQzsU1mkpnYJjOxTWZim8zENplJZmKbzKS1RmbSWqO1xjRNTNPEMAy84zu+Iw9+8IN5u7d7O3HVVVddddVVLxr0oAc9iKuuuuqqq6666gW75pprHvxiL/Zir/06r/M67/ViL/Zirw1w33333XrNNdc8mH+H++6779azZ8/e+vd///e//du//dvfc999993KVVddddX/cmfOnHnQ67zO67z3O73TO332/v4+T3rSk/irv/orIoKIICKICCQREUQEkogIJBERRASSiAgiAklEBBFBRBARlFKICCKCUgoRQSmFUgqlFEopRASlFCKCUgoRgSQiAkk8kG1sk5lkJplJZtJao7VGZtJao7VGZtJaIzNprZGZZCaZSWaSmWQmtslMMhPbZCa2yUxsk5nYJjPJTDIT27TWyExaa7TWmKaJcRy57rrreJd3eRd+5Ed+5LN/9Ed/9HO46qqrrrrqqhcNetCDHsRVV1111VVXXfWiOXPmzIOuueaah1xzzTUPfrEXe7HXuuaaax585syZB19zzTUP5gW47777bgX4rd/6re8GOHv27DP+4R/+4bfvu+++W7nqqquu+j/ommuuefBrv/Zrv9c7vdM7fTbAk5/8ZH7v936PiCAiiAgiAklEBBGBJCICSUQEEYEkIoKIICKICCKCiCAiiAhKKUQEpRRKKZRSiAhKKZRSKKUQEZRSkEREIAlJSALANraxjW0yk9YamUlrjcyktUZrjdYamUlrjcyktUZmkplkJplJZpKZ2CYzyUxsk5nYJjOxTWZim8wkM8lMMpPMJDNprdFaY5omFosF7/d+7wfA273d24mrrrrqqquuetGhBz3oQVx11VVXXXXVVVddddVVV/1He8d3fMfPeqd3eqfPBjg4OOApT3kKf/u3f0tEEBFEBJKICCICSUQEkogIIgJJRAQRQUQQEUQEEUEphYiglEIphYiglEIphVIKpRQiglIKEUFEEBFIQhIPZBvbZCaZSWbSWqO1RmbSWqO1RmuNzKS1RmbSWiMzyUwyk8wkM8lMbJOZZCa2yUxsk5nYJjOxTWaSmWQmmUlmkpm01pimiY2NDV73dV+X2Wx269d//de/zz/8wz/8NlddddVVV131oiO46qqrrrrqqquuuuqqq676T/CjP/qjn/MhH/IhD/mHf/iH397a2uKlX/qlebVXezW2tra4nySemyTuJwlJ3E8SkpAEgCQkASAJSUhCEpKQhCQkIQlJSEISkpDECyOJ/w62sQ3A67/+63PzzTdz9uzZW//hH/7ht7nqqquuuuqqfx3K8ePHueqqq6666qqrrrrqqquu+s9weHi4+/d///e/fXh4uPviL/7ir33y5EluvvlmZrMZ9913H5KICCQREUhCEhGBJCQhiYggIpCEJCQREUgiIogIIoKIICKQREQQEUgiIogIJCEJSUgCQBIAtrmfbQBsYxvb2AbANraxjW1sYxvb2MY2tgGwDYBtAGxjGwDbANjGNraxjW1sY5u3fMu35MYbb+S+++679eM//uNfhquuuuqqq67616McP36cq6666qqrrrrqqquuuuqq/yxHR0eX/uEf/uF3fvu3f/t7Dg8Pd1/mZV7mta+55hoe8pCH0Pc9586dQxKSiAgkIYmIQBKSkIQkJBERRASSiAgigohAEhFBRBARRAQRQUQgCUlEBJKQBIAkHsg2trGNbWxjG9vYxja2sY1tbGMb29jGNraxDYBtAGwDYBsA29gGwDa2sY1tbLO5uckbvMEbcMMNN3Dffffd+iEf8iEP4aqrrrrqqqv+bSjHjx/nqquuuuqqq6666qqrrrrqP9vh4eHuP/zDP/zOP/zDP/zOi73Yi732iRMnjl9zzTU86EEPou97zp07hyQiAklIIiKICCKCiCAikIQkIoKIQBIRQUQQEUQEEUFEIImIICKICCICSQBIAkASALaxjW0AbGMb29gGwDa2sY1tbGMb29jGNraxDYBtAGwDYBsA29gGwDa2sY1trr32Wt76rd+a7e1t7rvvvls/5EM+5CFcddVVV1111b8d5fjx41x11VVXXXXVVVddddVVV/1XOXv27K1/+qd/+tO33nrr3zz4wQ9+6RMnThw/c+YMD3rQg+i6jgsXLhARSEISkpCEJCQREUQEEYEkIoKIICKICCKCiCAiiAgigoggIpCEJCQBIIn72QbANraxjW1sYxvb2MY2trGNbWxjG9vYxjYAtrENgG0AbANgG9sA2MY2tnnJl3xJXv3VXx2Af/iHf/jtj//4j38ZrrrqqquuuurfBz3oQQ/iqquuuuqqq6666qqrrrrqv8M111zz4Bd7sRd77Xd8x3f8rGuuuebBAEdHR1y4cIE777yT3d1dIoKIICKICCKCiKCUQimFUgoRQSmFUgqlFEoplFIopRARlFKICCQhCUnczzaZiW0yk8yktUZrjdYarTUyk9YarTVaa7TWyExaa2QmmUlmkplkJrbJTDIT22QmtslMbJOZZCa2yUwe/OAH88qv/MoA3Hfffbf+1m/91nf/6I/+6Odw1VVXXXXVVf9+6EEPehBXXXXVVVddddVVV1111VX/3V7ndV7nvV7ndV7nvV/sxV7stXmm5XLJXXfdxT333MMwDEQEpRQiglIKEUEphVIKpRRKKZRSKKVQSqGUQkQQEUQEEYEkHsg2tslMMpPMpLVGa43MpLVGa43WGq01Wmu01shMWmtkJplJZpKZZCa2yUwyE9tkJrbJTGyTmWQmp0+f5hVf8RXZ3NwE4L777rv167/+69/nH/7hH36bq6666qqrrvqPgR70oAdx1VVXXXXVVVddddVVV131P8U111zz4Nd+7dd+r3d6p3f6bJ5ptVqxWq2499572dvbY5omIoJSCqUUSimUUiilUEqhlEIphVIKEUFEEBFIQhKSuJ9tMhPbtNbITFprZCatNVprtNZordFao7VGa43MJDNprZGZZCaZSWZim8wkM7FNZmKbzGSxWHDzzTfzoAc9iM3NTQDuu+++W3/rt37ru3/0R3/0c7jqqquuuuqq/1joQQ96EFddddVVV1111VVXXXXVVf/TXHPNNQ9+sRd7sdd6sRd7sdd+ndd5nffmAdbrNfv7+1y4cIHDw0NKKZRSqLVSSqGUQimFiKCUQkQQEUhCEpIAsI1tbJOZZCatNTKT1hqtNVprtNZordFao7VGZtJaIzNprZGZZCaZSWZim8wkM7HNfD5nPp9z8803c8stt3C/++6779bf+q3f+u4f/dEf/Ryuuuqqq6666j8HetCDHsRVV1111VVXXXXVVVddddX/ZNdcc82DX+zFXuy1X+zFXuy1Xud1Xue9eYBhGBjHkXEcWa1WrFYrACKCUgqlFCICSUQEkngg22QmmUlmkpm01mit0VqjtUZrjdYarTVaa2QmrTUyk9YamUlmkplkJraZzWbccMMNnDx5klOnTvFA9913360/+qM/+tm/9Vu/9T1cddVVV1111X8u9KAHPYirrrrqqquuuuqqq6666qr/Lc6cOfOga6655iEv9mIv9lov/uIv/tov9mIv9to8l2maaK3RWmMcRzIT29xPEgC2sY1tMpPWGplJa43WGq01Wmu01mit0VqjtUZm0lojM+m6jsxkZ2eH2WzGiRMnOHHiBM/tvvvuu/W3fuu3vvtHf/RHP4errrrqqquu+q+DHvSgB3HVVVddddVVV1111VVXXfW/1TXXXPPgM2fOPOjFXuzFXvvFX/zFX/vFXuzFXpsXIDMByEwyE4BpmgCYpgnbZCaZSWaSmdgmMymlYJuu6+j7Htvs7Ozwgtx33323/uiP/ujnnDlz5kE/+qM/+jlcddVVV1111X8P9KAHPYirrrrqqquuuuqqq6666qr/S6655poHv9iLvdhrAXqxF3ux17rmmmse/GIv9mKvzQPcd999t15zzTUP5j/Afffdd+s//MM//PZ999136z/8wz/89j/8wz/8DlddddVVV131PwN60IMexFVXXXXVVVddddVVV1111f8HZ86ceZAknTlz5sHXXHPNgwHOnDnzoGuuuebBvBD33XffrTzT2bNnn3HffffdCvAP//APv81VV1111VVX/c+GHvSgB3HVVVddddVVV1111VVXXXXVVVddddVVV/2fROWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9V/CN59xkLxTcq7wAAAABJRU5ErkJggg==) diff --git a/docs/kcl/segStartX.md b/docs/kcl/segStartX.md index 15373381a..ccc7ff055 100644 --- a/docs/kcl/segStartX.md +++ b/docs/kcl/segStartX.md @@ -9,7 +9,7 @@ Compute the starting point of the provided line segment along the 'x' axis. ```kcl -segStartX(tag: [TagIdentifier](/docs/kcl/types#tag-identifier)): [number](/docs/kcl/types/number) +segStartX(tag: TagIdentifier): number ``` @@ -17,11 +17,11 @@ segStartX(tag: [TagIdentifier](/docs/kcl/types#tag-identifier)): [number](/docs/ | Name | Type | Description | Required | |----------|------|-------------|----------| -| `tag` | [`TagIdentifier`](/docs/kcl/types#tag-identifier) | The line segment being queried by its tag | Yes | +| [`tag`](/docs/kcl/types/std-types-tag) | [`TagIdentifier`](/docs/kcl/types#TagIdentifier) | The line segment being queried by its tag | Yes | ### Returns -[`number`](/docs/kcl/types/number) +[`number`](/docs/kcl/types/std-types-number) ### Examples diff --git a/docs/kcl/segStartY.md b/docs/kcl/segStartY.md index 579eec013..7cf9b259f 100644 --- a/docs/kcl/segStartY.md +++ b/docs/kcl/segStartY.md @@ -9,7 +9,7 @@ Compute the starting point of the provided line segment along the 'y' axis. ```kcl -segStartY(tag: [TagIdentifier](/docs/kcl/types#tag-identifier)): [number](/docs/kcl/types/number) +segStartY(tag: TagIdentifier): number ``` @@ -17,11 +17,11 @@ segStartY(tag: [TagIdentifier](/docs/kcl/types#tag-identifier)): [number](/docs/ | Name | Type | Description | Required | |----------|------|-------------|----------| -| `tag` | [`TagIdentifier`](/docs/kcl/types#tag-identifier) | The line segment being queried by its tag | Yes | +| [`tag`](/docs/kcl/types/std-types-tag) | [`TagIdentifier`](/docs/kcl/types#TagIdentifier) | The line segment being queried by its tag | Yes | ### Returns -[`number`](/docs/kcl/types/number) +[`number`](/docs/kcl/types/std-types-number) ### Examples diff --git a/docs/kcl/settings/project.md b/docs/kcl/settings-project.md similarity index 100% rename from docs/kcl/settings/project.md rename to docs/kcl/settings-project.md diff --git a/docs/kcl/settings/user.md b/docs/kcl/settings-user.md similarity index 100% rename from docs/kcl/settings/user.md rename to docs/kcl/settings-user.md diff --git a/docs/kcl/settings.md b/docs/kcl/settings.md index 4aaaeb783..fef877621 100644 --- a/docs/kcl/settings.md +++ b/docs/kcl/settings.md @@ -8,16 +8,16 @@ layout: manual There are three levels of settings available in Zoo Design Studio: -1. [User Settings](/docs/kcl/settings/user): Global settings that apply to all projects, stored in `user.toml` -2. [Project Settings](/docs/kcl/settings/project): Settings specific to a project, stored in `project.toml` +1. [User Settings](/docs/kcl/settings-user): Global settings that apply to all projects, stored in `user.toml` +2. [Project Settings](/docs/kcl/settings-project): Settings specific to a project, stored in `project.toml` 3. Per-file Settings: Settings that apply to a single KCL file, specified using the `@settings` attribute ## Configuration Files Zoo Design Studio uses TOML files for configuration: -* **User Settings**: `user.toml` - See [complete documentation](/docs/kcl/settings/user) -* **Project Settings**: `project.toml` - See [complete documentation](/docs/kcl/settings/project) +* **User Settings**: `user.toml` - See [complete documentation](/docs/kcl/settings-user) +* **Project Settings**: `project.toml` - See [complete documentation](/docs/kcl/settings-project) ## Per-file settings @@ -25,7 +25,7 @@ Settings which affect a single file are configured using the settings attribute. This must be at the top of the KCL file (comments before the attribute are permitted). For example: -```js +```kcl // The settings attribute. @settings(defaultLengthUnit = in) diff --git a/docs/kcl/startProfile.md b/docs/kcl/startProfile.md index fbf1aa4f4..41fb9074e 100644 --- a/docs/kcl/startProfile.md +++ b/docs/kcl/startProfile.md @@ -10,10 +10,10 @@ Start a new profile at a given point. ```kcl startProfile( - sketchSurface: [[Sketch](/docs/kcl/types/Sketch)Surface](/docs/kcl/types/[Sketch](/docs/kcl/types/Sketch)Surface), - at: [[[number](/docs/kcl/types/number)]](/docs/kcl/types/[number](/docs/kcl/types/number)), - tag?: [TagDeclarator](/docs/kcl/types#tag-declaration), -): [Sketch](/docs/kcl/types/Sketch) + sketchSurface: Plane | Face, + at: Point2d, + tag?: TagDeclarator, +): Sketch ``` @@ -21,13 +21,13 @@ startProfile( | Name | Type | Description | Required | |----------|------|-------------|----------| -| `sketchSurface` | [`SketchSurface`](/docs/kcl/types/SketchSurface) | What to start the profile on | Yes | -| `at` | [`[number]`](/docs/kcl/types/number) | Where to start the profile. An absolute point. | Yes | -| `tag` | [`TagDeclarator`](/docs/kcl/types#tag-declaration) | Tag this first starting point | No | +| `sketchSurface` | [`Plane`](/docs/kcl/types/std-types-Plane) or [`Face`](/docs/kcl/types/std-types-Face) | What to start the profile on | Yes | +| `at` | [`Point2d`](/docs/kcl/types/std-types-Point2d) | Where to start the profile. An absolute point. | Yes | +| [`tag`](/docs/kcl/types/std-types-tag) | [`TagDeclarator`](/docs/kcl/types#TagDeclarator) | Tag this first starting point | No | ### Returns -[`Sketch`](/docs/kcl/types/Sketch) +[`Sketch`](/docs/kcl/types/std-types-Sketch) ### Examples diff --git a/docs/kcl/startSketchOn.md b/docs/kcl/startSketchOn.md index caf341b63..7069fabc2 100644 --- a/docs/kcl/startSketchOn.md +++ b/docs/kcl/startSketchOn.md @@ -17,10 +17,10 @@ This is important to understand because if you were to then sketch on the result The point is if you want to export the result of a sketch on a face, you only need to export the final Solid that was created from the sketch on the face, since it will include all the parent faces and Solids. ```kcl -start[Sketch](/docs/kcl/types/Sketch)On( - planeOr[Solid](/docs/kcl/types/Solid): [[Sketch](/docs/kcl/types/Sketch)Data](/docs/kcl/types/[Sketch](/docs/kcl/types/Sketch)Data), - face?: [[Face](/docs/kcl/types/Face)Tag](/docs/kcl/types/[Face](/docs/kcl/types/Face)Tag), -): [[Sketch](/docs/kcl/types/Sketch)Surface](/docs/kcl/types/[Sketch](/docs/kcl/types/Sketch)Surface) +startSketchOn( + planeOrSolid: Plane | Solid, + face?: TagIdentifier | Start | End, +): Plane | Face ``` @@ -28,12 +28,12 @@ start[Sketch](/docs/kcl/types/Sketch)On( | Name | Type | Description | Required | |----------|------|-------------|----------| -| `planeOrSolid` | [`SketchData`](/docs/kcl/types/SketchData) | The plane or solid to sketch on | Yes | -| `face` | [`FaceTag`](/docs/kcl/types/FaceTag) | Identify a face of a solid if a solid is specified as the input argument (`plane_or_solid`) | No | +| `planeOrSolid` | [`Plane`](/docs/kcl/types/std-types-Plane) or [`Solid`](/docs/kcl/types/std-types-Solid) | The plane or solid to sketch on | Yes | +| `face` | [`TagIdentifier`](/docs/kcl/types#TagIdentifier) or [`Start`](/docs/kcl/types#Start) or [`End`](/docs/kcl/types#End) | Identify a face of a solid if a solid is specified as the input argument (`plane_or_solid`) | No | ### Returns -[`SketchSurface`](/docs/kcl/types/SketchSurface) - A sketch type. +[`Plane`](/docs/kcl/types/std-types-Plane) or [`Face`](/docs/kcl/types/std-types-Face) - A sketch type. ### Examples diff --git a/docs/kcl/std.json b/docs/kcl/std.json index 79f357358..b33ee21e4 100644 --- a/docs/kcl/std.json +++ b/docs/kcl/std.json @@ -26035,7 +26035,7 @@ }, { "name": "color", - "type": "String", + "type": "string", "schema": { "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", "title": "String", @@ -32507,7 +32507,7 @@ "examples": [ "// Add color to an extruded solid.\nexampleSketch = startSketchOn(XZ)\n |> startProfile(at = [0, 0])\n |> line(endAbsolute = [10, 0])\n |> line(endAbsolute = [0, 10])\n |> line(endAbsolute = [-10, 0])\n |> close()\n\nexample = extrude(exampleSketch, length = 5)\n // There are other options besides 'color', but they're optional.\n |> appearance(color = '#ff0000')", "// Add color to a revolved solid.\nsketch001 = startSketchOn(XY)\n |> circle(center = [15, 0], radius = 5)\n |> revolve(angle = 360, axis = Y)\n |> appearance(color = '#ff0000', metalness = 90, roughness = 90)", - "// Add color to different solids.\nfn cube(center) {\n return startSketchOn(XY)\n |> startProfile(at = [center[0] - 10, center[1] - 10])\n |> line(endAbsolute = [center[0] + 10, center[1] - 10])\n |> line(endAbsolute = [center[0] + 10, center[1] + 10])\n |> line(endAbsolute = [center[0] - 10, center[1] + 10])\n |> close()\n |> extrude(length = 10)\n}\n\nexample0 = cube([0, 0])\nexample1 = cube([20, 0])\nexample2 = cube([40, 0])\n\nappearance(\n [example0, example1],\n color = '#ff0000',\n metalness = 50,\n roughness = 50,\n)\nappearance(\n example2,\n color = '#00ff00',\n metalness = 50,\n roughness = 50,\n)", + "// Add color to different solids.\nfn cube(center) {\n return startSketchOn(XY)\n |> startProfile(at = [center[0] - 10, center[1] - 10])\n |> line(endAbsolute = [center[0] + 10, center[1] - 10])\n |> line(endAbsolute = [center[0] + 10, center[1] + 10])\n |> line(endAbsolute = [center[0] - 10, center[1] + 10])\n |> close()\n |> extrude(length = 10)\n}\n\nexample0 = cube(center = [0, 0])\nexample1 = cube(center = [20, 0])\nexample2 = cube(center = [40, 0])\n\nappearance(\n [example0, example1],\n color = '#ff0000',\n metalness = 50,\n roughness = 50,\n)\nappearance(\n example2,\n color = '#00ff00',\n metalness = 50,\n roughness = 50,\n)", "// You can set the appearance before or after you shell it will yield the same result.\n// This example shows setting the appearance _after_ the shell.\nfirstSketch = startSketchOn(XY)\n |> startProfile(at = [-12, 12])\n |> line(end = [24, 0])\n |> line(end = [0, -24])\n |> line(end = [-24, 0])\n |> close()\n |> extrude(length = 6)\n\nshell(firstSketch, faces = [END], thickness = 0.25)\n |> appearance(color = '#ff0000', metalness = 90, roughness = 90)", "// You can set the appearance before or after you shell it will yield the same result.\n// This example shows setting the appearance _before_ the shell.\nfirstSketch = startSketchOn(XY)\n |> startProfile(at = [-12, 12])\n |> line(end = [24, 0])\n |> line(end = [0, -24])\n |> line(end = [-24, 0])\n |> close()\n |> extrude(length = 6)\n |> appearance(color = '#ff0000', metalness = 90, roughness = 90)\n\nshell(firstSketch, faces = [END], thickness = 0.25)", "// Setting the appearance of a 3D pattern can be done _before_ or _after_ the pattern.\n// This example shows _before_ the pattern.\nexampleSketch = startSketchOn(XZ)\n |> startProfile(at = [0, 0])\n |> line(end = [0, 2])\n |> line(end = [3, 1])\n |> line(end = [0, -4])\n |> close()\n\nexample = extrude(exampleSketch, length = 1)\n |> appearance(color = '#ff0000', metalness = 90, roughness = 90)\n |> patternLinear3d(axis = [1, 0, 1], instances = 7, distance = 6)", @@ -39018,7 +39018,7 @@ }, { "name": "interiorAbsolute", - "type": "[number]", + "type": "Point2d", "schema": { "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", "title": "Nullable_Array_size_2_of_TyF64", @@ -40627,7 +40627,7 @@ }, { "name": "endAbsolute", - "type": "[number]", + "type": "Point2d", "schema": { "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", "title": "Nullable_Array_size_2_of_TyF64", @@ -45676,7 +45676,7 @@ }, { "name": "error", - "type": "String", + "type": "string", "schema": { "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", "title": "Nullable_String", @@ -45734,7 +45734,7 @@ }, { "name": "error", - "type": "String", + "type": "string", "schema": { "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", "title": "Nullable_String", @@ -47438,7 +47438,7 @@ }, { "name": "control1", - "type": "[number]", + "type": "Point2d", "schema": { "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", "title": "Array_size_2_of_TyF64", @@ -49047,7 +49047,7 @@ }, { "name": "control2", - "type": "[number]", + "type": "Point2d", "schema": { "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", "title": "Array_size_2_of_TyF64", @@ -50656,7 +50656,7 @@ }, { "name": "end", - "type": "[number]", + "type": "Point2d", "schema": { "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", "title": "Array_size_2_of_TyF64", @@ -57163,7 +57163,7 @@ }, { "name": "p1", - "type": "[number]", + "type": "Point2d", "schema": { "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", "title": "Array_size_2_of_TyF64", @@ -58772,7 +58772,7 @@ }, { "name": "p2", - "type": "[number]", + "type": "Point2d", "schema": { "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", "title": "Array_size_2_of_TyF64", @@ -60381,7 +60381,7 @@ }, { "name": "p3", - "type": "[number]", + "type": "Point2d", "schema": { "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", "title": "Array_size_2_of_TyF64", @@ -90118,8 +90118,8 @@ "unpublished": false, "deprecated": false, "examples": [ - "// Intersect two cubes using the stdlib functions.\n\n\nfn cube(center, size) {\n return startSketchOn(XY)\n |> startProfile(at = [center[0] - size, center[1] - size])\n |> line(endAbsolute = [center[0] + size, center[1] - size])\n |> line(endAbsolute = [center[0] + size, center[1] + size])\n |> line(endAbsolute = [center[0] - size, center[1] + size])\n |> close()\n |> extrude(length = 10)\n}\n\npart001 = cube([0, 0], 10)\npart002 = cube([7, 3], 5)\n |> translate(z = 1)\n\nintersectedPart = intersect([part001, part002])", - "// Intersect two cubes using operators.\n// NOTE: This will not work when using codemods through the UI.\n// Codemods will generate the stdlib function call instead.\n\n\nfn cube(center, size) {\n return startSketchOn(XY)\n |> startProfile(at = [center[0] - size, center[1] - size])\n |> line(endAbsolute = [center[0] + size, center[1] - size])\n |> line(endAbsolute = [center[0] + size, center[1] + size])\n |> line(endAbsolute = [center[0] - size, center[1] + size])\n |> close()\n |> extrude(length = 10)\n}\n\npart001 = cube([0, 0], 10)\npart002 = cube([7, 3], 5)\n |> translate(z = 1)\n\n// This is the equivalent of: intersect([part001, part002])\nintersectedPart = part001 & part002" + "// Intersect two cubes using the stdlib functions.\n\n\nfn cube(center, size) {\n return startSketchOn(XY)\n |> startProfile(at = [center[0] - size, center[1] - size])\n |> line(endAbsolute = [center[0] + size, center[1] - size])\n |> line(endAbsolute = [center[0] + size, center[1] + size])\n |> line(endAbsolute = [center[0] - size, center[1] + size])\n |> close()\n |> extrude(length = 10)\n}\n\npart001 = cube(center = [0, 0], size = 10)\npart002 = cube(center = [7, 3], size = 5)\n |> translate(z = 1)\n\nintersectedPart = intersect([part001, part002])", + "// Intersect two cubes using operators.\n// NOTE: This will not work when using codemods through the UI.\n// Codemods will generate the stdlib function call instead.\n\n\nfn cube(center, size) {\n return startSketchOn(XY)\n |> startProfile(at = [center[0] - size, center[1] - size])\n |> line(endAbsolute = [center[0] + size, center[1] - size])\n |> line(endAbsolute = [center[0] + size, center[1] + size])\n |> line(endAbsolute = [center[0] - size, center[1] + size])\n |> close()\n |> extrude(length = 10)\n}\n\npart001 = cube(center = [0, 0], size = 10)\npart002 = cube(center = [7, 3], size = 5)\n |> translate(z = 1)\n\n// This is the equivalent of: intersect([part001, part002])\nintersectedPart = part001 & part002" ] }, { @@ -106721,7 +106721,7 @@ }, { "name": "endAbsolute", - "type": "[number]", + "type": "Point2d", "schema": { "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", "title": "Nullable_Array_size_2_of_TyF64", @@ -108330,7 +108330,7 @@ }, { "name": "end", - "type": "[number]", + "type": "Point2d", "schema": { "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", "title": "Nullable_Array_size_2_of_TyF64", @@ -114833,7 +114833,7 @@ }, { "name": "vDegree", - "type": "NonZeroU32", + "type": "number", "schema": { "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", "title": "NonZeroU32", @@ -118043,7 +118043,7 @@ }, { "name": "baseCurveIndex", - "type": "integer", + "type": "number", "schema": { "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", "title": "Nullable_uint32", @@ -133614,7 +133614,7 @@ "unpublished": false, "deprecated": false, "examples": [ - "r = 10 // radius\nfn drawCircle(id) {\n return startSketchOn(XY)\n |> circle(center = [id * 2 * r, 0], radius = r)\n}\n\n// Call `drawCircle`, passing in each element of the array.\n// The outputs from each `drawCircle` form a new array,\n// which is the return value from `map`.\ncircles = map([1..3], f = drawCircle)", + "r = 10 // radius\nfn drawCircle(@id) {\n return startSketchOn(XY)\n |> circle(center = [id * 2 * r, 0], radius = r)\n}\n\n// Call `drawCircle`, passing in each element of the array.\n// The outputs from each `drawCircle` form a new array,\n// which is the return value from `map`.\ncircles = map([1..3], f = drawCircle)", "r = 10 // radius\n// Call `map`, using an anonymous function instead of a named one.\ncircles = map(\n [1..3],\n f = fn(id) {\n return startSketchOn(XY)\n |> circle(center = [id * 2 * r, 0], radius = r)\n },\n)" ] }, @@ -135234,7 +135234,7 @@ }, { "name": "instances", - "type": "integer", + "type": "number", "schema": { "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", "title": "uint32", @@ -136840,7 +136840,7 @@ }, { "name": "center", - "type": "[number]", + "type": "Point2d", "schema": { "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", "title": "Array_size_2_of_TyF64", @@ -146489,7 +146489,7 @@ }, { "name": "instances", - "type": "integer", + "type": "number", "schema": { "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", "title": "uint32", @@ -149705,7 +149705,7 @@ }, { "name": "center", - "type": "[number]", + "type": "Point3d", "schema": { "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", "title": "Array_size_3_of_TyF64", @@ -159354,7 +159354,7 @@ }, { "name": "instances", - "type": "integer", + "type": "number", "schema": { "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", "title": "uint32", @@ -162565,7 +162565,7 @@ }, { "name": "axis", - "type": "[number]", + "type": "Point2d", "schema": { "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", "title": "Array_size_2_of_TyF64", @@ -169005,7 +169005,7 @@ }, { "name": "instances", - "type": "integer", + "type": "number", "schema": { "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", "title": "uint32", @@ -172216,7 +172216,7 @@ }, { "name": "axis", - "type": "[number]", + "type": "Point3d", "schema": { "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", "title": "Array_size_3_of_TyF64", @@ -178658,7 +178658,7 @@ }, { "name": "instances", - "type": "integer", + "type": "number", "schema": { "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", "title": "uint32", @@ -185080,12 +185080,12 @@ "unpublished": false, "deprecated": false, "examples": [ - "// Each instance will be shifted along the X axis.\nfn transform(id) {\n return { translate = [4 * id, 0, 0] }\n}\n\n// Sketch 4 cylinders.\nsketch001 = startSketchOn(XZ)\n |> circle(center = [0, 0], radius = 2)\n |> extrude(length = 5)\n |> patternTransform(instances = 4, transform = transform)", - "// Each instance will be shifted along the X axis,\n// with a gap between the original (at x = 0) and the first replica\n// (at x = 8). This is because `id` starts at 1.\nfn transform(id) {\n return { translate = [4 * (1 + id), 0, 0] }\n}\n\nsketch001 = startSketchOn(XZ)\n |> circle(center = [0, 0], radius = 2)\n |> extrude(length = 5)\n |> patternTransform(instances = 4, transform = transform)", - "fn cube(length, center) {\n l = length / 2\n x = center[0]\n y = center[1]\n p0 = [-l + x, -l + y]\n p1 = [-l + x, l + y]\n p2 = [l + x, l + y]\n p3 = [l + x, -l + y]\n\n return startSketchOn(XY)\n |> startProfile(at = p0)\n |> line(endAbsolute = p1)\n |> line(endAbsolute = p2)\n |> line(endAbsolute = p3)\n |> line(endAbsolute = p0)\n |> close()\n |> extrude(length = length)\n}\n\nwidth = 20\nfn transform(i) {\n return {\n // Move down each time.\n translate = [0, 0, -i * width],\n // Make the cube longer, wider and flatter each time.\n scale = [\n pow(1.1, exp = i),\n pow(1.1, exp = i),\n pow(0.9, exp = i)\n ],\n // Turn by 15 degrees each time.\n rotation = { angle = 15 * i, origin = \"local\" }\n }\n}\n\nmyCubes = cube(width, [100, 0])\n |> patternTransform(instances = 25, transform = transform)", - "fn cube(length, center) {\n l = length / 2\n x = center[0]\n y = center[1]\n p0 = [-l + x, -l + y]\n p1 = [-l + x, l + y]\n p2 = [l + x, l + y]\n p3 = [l + x, -l + y]\n\n return startSketchOn(XY)\n |> startProfile(at = p0)\n |> line(endAbsolute = p1)\n |> line(endAbsolute = p2)\n |> line(endAbsolute = p3)\n |> line(endAbsolute = p0)\n |> close()\n |> extrude(length = length)\n}\n\nwidth = 20\nfn transform(i) {\n return {\n translate = [0, 0, -i * width],\n rotation = {\n angle = 90 * i,\n // Rotate around the overall scene's origin.\n origin = \"global\"\n }\n }\n}\nmyCubes = cube(width, [100, 100])\n |> patternTransform(instances = 4, transform = transform)", - "// Parameters\nr = 50 // base radius\nh = 10 // layer height\nt = 0.005 // taper factor [0-1)\n// Defines how to modify each layer of the vase.\n// Each replica is shifted up the Z axis, and has a smoothly-varying radius\nfn transform(replicaId) {\n scale = r * abs(1 - (t * replicaId)) * (5 + cos((replicaId / 8): number(rad)))\n return {\n translate = [0, 0, replicaId * 10],\n scale = [scale, scale, 0]\n }\n}\n// Each layer is just a pretty thin cylinder.\nfn layer() {\n return startSketchOn(XY)\n // or some other plane idk\n |> circle(center = [0, 0], radius = 1, tag = $tag1)\n |> extrude(length = h)\n}\n// The vase is 100 layers tall.\n// The 100 layers are replica of each other, with a slight transformation applied to each.\nvase = layer()\n |> patternTransform(instances = 100, transform = transform)", - "fn transform(i) {\n // Transform functions can return multiple transforms. They'll be applied in order.\n return [\n { translate = [30 * i, 0, 0] },\n { rotation = { angle = 45 * i } }\n ]\n}\nstartSketchOn(XY)\n |> startProfile(at = [0, 0])\n |> polygon(\n radius = 10,\n numSides = 4,\n center = [0, 0],\n inscribed = false,\n )\n |> extrude(length = 4)\n |> patternTransform(instances = 3, transform = transform)" + "// Each instance will be shifted along the X axis.\nfn transform(@id) {\n return { translate = [4 * id, 0, 0] }\n}\n\n// Sketch 4 cylinders.\nsketch001 = startSketchOn(XZ)\n |> circle(center = [0, 0], radius = 2)\n |> extrude(length = 5)\n |> patternTransform(instances = 4, transform = transform)", + "// Each instance will be shifted along the X axis,\n// with a gap between the original (at x = 0) and the first replica\n// (at x = 8). This is because `id` starts at 1.\nfn transform(@id) {\n return { translate = [4 * (1 + id), 0, 0] }\n}\n\nsketch001 = startSketchOn(XZ)\n |> circle(center = [0, 0], radius = 2)\n |> extrude(length = 5)\n |> patternTransform(instances = 4, transform = transform)", + "fn cube(length, center) {\n l = length / 2\n x = center[0]\n y = center[1]\n p0 = [-l + x, -l + y]\n p1 = [-l + x, l + y]\n p2 = [l + x, l + y]\n p3 = [l + x, -l + y]\n\n return startSketchOn(XY)\n |> startProfile(at = p0)\n |> line(endAbsolute = p1)\n |> line(endAbsolute = p2)\n |> line(endAbsolute = p3)\n |> line(endAbsolute = p0)\n |> close()\n |> extrude(length = length)\n}\n\nwidth = 20\nfn transform(@i) {\n return {\n // Move down each time.\n translate = [0, 0, -i * width],\n // Make the cube longer, wider and flatter each time.\n scale = [\n pow(1.1, exp = i),\n pow(1.1, exp = i),\n pow(0.9, exp = i)\n ],\n // Turn by 15 degrees each time.\n rotation = { angle = 15 * i, origin = \"local\" }\n }\n}\n\nmyCubes = cube(length = width, center = [100, 0])\n |> patternTransform(instances = 25, transform = transform)", + "fn cube(length, center) {\n l = length / 2\n x = center[0]\n y = center[1]\n p0 = [-l + x, -l + y]\n p1 = [-l + x, l + y]\n p2 = [l + x, l + y]\n p3 = [l + x, -l + y]\n\n return startSketchOn(XY)\n |> startProfile(at = p0)\n |> line(endAbsolute = p1)\n |> line(endAbsolute = p2)\n |> line(endAbsolute = p3)\n |> line(endAbsolute = p0)\n |> close()\n |> extrude(length = length)\n}\n\nwidth = 20\nfn transform(@i) {\n return {\n translate = [0, 0, -i * width],\n rotation = {\n angle = 90 * i,\n // Rotate around the overall scene's origin.\n origin = \"global\"\n }\n }\n}\nmyCubes = cube(length = width, center = [100, 100])\n |> patternTransform(instances = 4, transform = transform)", + "// Parameters\nr = 50 // base radius\nh = 10 // layer height\nt = 0.005 // taper factor [0-1)\n// Defines how to modify each layer of the vase.\n// Each replica is shifted up the Z axis, and has a smoothly-varying radius\nfn transform(@replicaId) {\n scale = r * abs(1 - (t * replicaId)) * (5 + cos((replicaId / 8): number(rad)))\n return {\n translate = [0, 0, replicaId * 10],\n scale = [scale, scale, 0]\n }\n}\n// Each layer is just a pretty thin cylinder.\nfn layer() {\n return startSketchOn(XY)\n // or some other plane idk\n |> circle(center = [0, 0], radius = 1, tag = $tag1)\n |> extrude(length = h)\n}\n// The vase is 100 layers tall.\n// The 100 layers are replica of each other, with a slight transformation applied to each.\nvase = layer()\n |> patternTransform(instances = 100, transform = transform)", + "fn transform(@i) {\n // Transform functions can return multiple transforms. They'll be applied in order.\n return [\n { translate = [30 * i, 0, 0] },\n { rotation = { angle = 45 * i } }\n ]\n}\nstartSketchOn(XY)\n |> startProfile(at = [0, 0])\n |> polygon(\n radius = 10,\n numSides = 4,\n center = [0, 0],\n inscribed = false,\n )\n |> extrude(length = 4)\n |> patternTransform(instances = 3, transform = transform)" ] }, { @@ -186704,7 +186704,7 @@ }, { "name": "instances", - "type": "integer", + "type": "number", "schema": { "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", "title": "uint32", @@ -193126,7 +193126,7 @@ "unpublished": false, "deprecated": false, "examples": [ - "// Each instance will be shifted along the X axis.\nfn transform(id) {\n return { translate = [4 * id, 0] }\n}\n\n// Sketch 4 circles.\nsketch001 = startSketchOn(XZ)\n |> circle(center = [0, 0], radius = 2)\n |> patternTransform2d(instances = 4, transform = transform)" + "// Each instance will be shifted along the X axis.\nfn transform(@id) {\n return { translate = [4 * id, 0] }\n}\n\n// Sketch 4 circles.\nsketch001 = startSketchOn(XZ)\n |> circle(center = [0, 0], radius = 2)\n |> patternTransform2d(instances = 4, transform = transform)" ] }, { @@ -197961,7 +197961,7 @@ }, { "name": "center", - "type": "[number]", + "type": "Point2d", "schema": { "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", "title": "Array_size_2_of_TyF64", @@ -232205,9 +232205,9 @@ "unpublished": false, "deprecated": false, "examples": [ - "// This function adds two numbers.\nfn add(a, b) {\n return a + b\n}\n\n// This function adds an array of numbers.\n// It uses the `reduce` function, to call the `add` function on every\n// element of the `arr` parameter. The starting value is 0.\nfn sum(arr) {\n return reduce(arr, initial = 0, f = add)\n}\n\n/* The above is basically like this pseudo-code:\nfn sum(arr):\n sumSoFar = 0\n for i in arr:\n sumSoFar = add(sumSoFar, i)\n return sumSoFar */\n\n// We use `assert` to check that our `sum` function gives the\n// expected result. It's good to check your work!\nassert(\n sum([1, 2, 3]),\n isEqualTo = 6,\n tolerance = 0.1,\n error = \"1 + 2 + 3 summed is 6\",\n)", + "// This function adds two numbers.\nfn add(a, b) {\n return a + b\n}\n\n// This function adds an array of numbers.\n// It uses the `reduce` function, to call the `add` function on every\n// element of the `arr` parameter. The starting value is 0.\nfn sum(@arr) {\n return reduce(arr, initial = 0, f = add)\n}\n\n/* The above is basically like this pseudo-code:\nfn sum(arr):\n sumSoFar = 0\n for i in arr:\n sumSoFar = add(sumSoFar, i)\n return sumSoFar */\n\n// We use `assert` to check that our `sum` function gives the\n// expected result. It's good to check your work!\nassert(\n sum([1, 2, 3]),\n isEqualTo = 6,\n tolerance = 0.1,\n error = \"1 + 2 + 3 summed is 6\",\n)", "// This example works just like the previous example above, but it uses\n// an anonymous `add` function as its parameter, instead of declaring a\n// named function outside.\narr = [1, 2, 3]\nsum = reduce(\n arr,\n initial = 0,\n f = fn(i, result_so_far) {\n return i + result_so_far\n },\n)\n\n// We use `assert` to check that our `sum` function gives the\n// expected result. It's good to check your work!\nassert(\n sum,\n isEqualTo = 6,\n tolerance = 0.1,\n error = \"1 + 2 + 3 summed is 6\",\n)", - "// Declare a function that sketches a decagon.\nfn decagon(radius) {\n // Each side of the decagon is turned this many radians from the previous angle.\n stepAngle = (1 / 10 * TAU): number(rad)\n\n // Start the decagon sketch at this point.\n startOfDecagonSketch = startSketchOn(XY)\n |> startProfile(at = [cos(0) * radius, sin(0) * radius])\n\n // Use a `reduce` to draw the remaining decagon sides.\n // For each number in the array 1..10, run the given function,\n // which takes a partially-sketched decagon and adds one more edge to it.\n fullDecagon = reduce(\n [1..10],\n initial = startOfDecagonSketch,\n f = fn(i, partialDecagon) {\n // Draw one edge of the decagon.\n x = cos(stepAngle * i) * radius\n y = sin(stepAngle * i) * radius\n return line(partialDecagon, end = [x, y])\n },\n )\n\n return fullDecagon\n}\n\n/* The `decagon` above is basically like this pseudo-code:\nfn decagon(radius):\n stepAngle = ((1/10) * TAU): number(rad)\n plane = startSketchOn(XY)\n startOfDecagonSketch = startProfile(plane, at = [(cos(0)*radius), (sin(0) * radius)])\n\n // Here's the reduce part.\n partialDecagon = startOfDecagonSketch\n for i in [1..10]:\n x = cos(stepAngle * i) * radius\n y = sin(stepAngle * i) * radius\n partialDecagon = line(partialDecagon, end = [x, y])\n fullDecagon = partialDecagon // it's now full\n return fullDecagon */\n\n// Use the `decagon` function declared above, to sketch a decagon with radius 5.\ndecagon(5.0)\n |> close()" + "// Declare a function that sketches a decagon.\nfn decagon(@radius) {\n // Each side of the decagon is turned this many radians from the previous angle.\n stepAngle = (1 / 10 * TAU): number(rad)\n\n // Start the decagon sketch at this point.\n startOfDecagonSketch = startSketchOn(XY)\n |> startProfile(at = [cos(0) * radius, sin(0) * radius])\n\n // Use a `reduce` to draw the remaining decagon sides.\n // For each number in the array 1..10, run the given function,\n // which takes a partially-sketched decagon and adds one more edge to it.\n fullDecagon = reduce(\n [1..10],\n initial = startOfDecagonSketch,\n f = fn(i, partialDecagon) {\n // Draw one edge of the decagon.\n x = cos(stepAngle * i) * radius\n y = sin(stepAngle * i) * radius\n return line(partialDecagon, end = [x, y])\n },\n )\n\n return fullDecagon\n}\n\n/* The `decagon` above is basically like this pseudo-code:\nfn decagon(radius):\n stepAngle = ((1/10) * TAU): number(rad)\n plane = startSketchOn(XY)\n startOfDecagonSketch = startProfile(plane, at = [(cos(0)*radius), (sin(0) * radius)])\n\n // Here's the reduce part.\n partialDecagon = startOfDecagonSketch\n for i in [1..10]:\n x = cos(stepAngle * i) * radius\n y = sin(stepAngle * i) * radius\n partialDecagon = line(partialDecagon, end = [x, y])\n fullDecagon = partialDecagon // it's now full\n return fullDecagon */\n\n// Use the `decagon` function declared above, to sketch a decagon with radius 5.\ndecagon(5.0)\n |> close()" ] }, { @@ -255081,7 +255081,7 @@ ], "returnValue": { "name": "", - "type": "[number]", + "type": "Point2d", "schema": { "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", "title": "Array_size_2_of_TyF64", @@ -255105,7 +255105,7 @@ "unpublished": false, "deprecated": false, "examples": [ - "w = 15\ncube = startSketchOn(XY)\n |> startProfile(at = [0, 0])\n |> line(end = [w, 0], tag = $line1)\n |> line(end = [0, w], tag = $line2)\n |> line(end = [-w, 0], tag = $line3)\n |> line(end = [0, -w], tag = $line4)\n |> close()\n |> extrude(length = 5)\n\nfn cylinder(radius, tag) {\n return startSketchOn(XY)\n |> startProfile(at = [0, 0])\n |> circle(radius = radius, center = segEnd(tag))\n |> extrude(length = radius)\n}\n\ncylinder(1, line1)\ncylinder(2, line2)\ncylinder(3, line3)\ncylinder(4, line4)" + "w = 15\ncube = startSketchOn(XY)\n |> startProfile(at = [0, 0])\n |> line(end = [w, 0], tag = $line1)\n |> line(end = [0, w], tag = $line2)\n |> line(end = [-w, 0], tag = $line3)\n |> line(end = [0, -w], tag = $line4)\n |> close()\n |> extrude(length = 5)\n\nfn cylinder(radius, tag) {\n return startSketchOn(XY)\n |> startProfile(at = [0, 0])\n |> circle(radius = radius, center = segEnd(tag))\n |> extrude(length = radius)\n}\n\ncylinder(radius = 1, tag = line1)\ncylinder(radius = 2, tag = line2)\ncylinder(radius = 3, tag = line3)\ncylinder(radius = 4, tag = line4)" ] }, { @@ -255283,7 +255283,7 @@ ], "returnValue": { "name": "", - "type": "[number]", + "type": "Point2d", "schema": { "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", "title": "Array_size_2_of_TyF64", @@ -255307,7 +255307,7 @@ "unpublished": false, "deprecated": false, "examples": [ - "w = 15\ncube = startSketchOn(XY)\n |> startProfile(at = [0, 0])\n |> line(end = [w, 0], tag = $line1)\n |> line(end = [0, w], tag = $line2)\n |> line(end = [-w, 0], tag = $line3)\n |> line(end = [0, -w], tag = $line4)\n |> close()\n |> extrude(length = 5)\n\nfn cylinder(radius, tag) {\n return startSketchOn(XY)\n |> startProfile(at = [0, 0])\n |> circle(radius = radius, center = segStart(tag))\n |> extrude(length = radius)\n}\n\ncylinder(1, line1)\ncylinder(2, line2)\ncylinder(3, line3)\ncylinder(4, line4)" + "w = 15\ncube = startSketchOn(XY)\n |> startProfile(at = [0, 0])\n |> line(end = [w, 0], tag = $line1)\n |> line(end = [0, w], tag = $line2)\n |> line(end = [-w, 0], tag = $line3)\n |> line(end = [0, -w], tag = $line4)\n |> close()\n |> extrude(length = 5)\n\nfn cylinder(radius, tag) {\n return startSketchOn(XY)\n |> startProfile(at = [0, 0])\n |> circle(radius = radius, center = segStart(tag))\n |> extrude(length = radius)\n}\n\ncylinder(radius = 1, tag = line1)\ncylinder(radius = 2, tag = line2)\ncylinder(radius = 3, tag = line3)\ncylinder(radius = 4, tag = line4)" ] }, { @@ -257147,7 +257147,7 @@ }, { "name": "at", - "type": "[number]", + "type": "Point2d", "schema": { "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", "title": "Array_size_2_of_TyF64", @@ -273775,8 +273775,8 @@ "unpublished": false, "deprecated": false, "examples": [ - "// Subtract a cylinder from a cube using the stdlib functions.\n\n\nfn cube(center, size) {\n return startSketchOn(XY)\n |> startProfile(at = [center[0] - size, center[1] - size])\n |> line(endAbsolute = [center[0] + size, center[1] - size])\n |> line(endAbsolute = [center[0] + size, center[1] + size])\n |> line(endAbsolute = [center[0] - size, center[1] + size])\n |> close()\n |> extrude(length = 10)\n}\n\npart001 = cube([0, 0], 10)\npart002 = cube([7, 3], 5)\n |> translate(z = 1)\n\nsubtractedPart = subtract([part001], tools = [part002])", - "// Subtract a cylinder from a cube using operators.\n// NOTE: This will not work when using codemods through the UI.\n// Codemods will generate the stdlib function call instead.\n\n\nfn cube(center, size) {\n return startSketchOn(XY)\n |> startProfile(at = [center[0] - size, center[1] - size])\n |> line(endAbsolute = [center[0] + size, center[1] - size])\n |> line(endAbsolute = [center[0] + size, center[1] + size])\n |> line(endAbsolute = [center[0] - size, center[1] + size])\n |> close()\n |> extrude(length = 10)\n}\n\npart001 = cube([0, 0], 10)\npart002 = cube([7, 3], 5)\n |> translate(z = 1)\n\n// This is the equivalent of: subtract([part001], tools=[part002])\nsubtractedPart = part001 - part002" + "// Subtract a cylinder from a cube using the stdlib functions.\n\n\nfn cube(center, size) {\n return startSketchOn(XY)\n |> startProfile(at = [center[0] - size, center[1] - size])\n |> line(endAbsolute = [center[0] + size, center[1] - size])\n |> line(endAbsolute = [center[0] + size, center[1] + size])\n |> line(endAbsolute = [center[0] - size, center[1] + size])\n |> close()\n |> extrude(length = 10)\n}\n\npart001 = cube(center = [0, 0], size = 10)\npart002 = cube(center = [7, 3], size = 5)\n |> translate(z = 1)\n\nsubtractedPart = subtract([part001], tools = [part002])", + "// Subtract a cylinder from a cube using operators.\n// NOTE: This will not work when using codemods through the UI.\n// Codemods will generate the stdlib function call instead.\n\n\nfn cube(center, size) {\n return startSketchOn(XY)\n |> startProfile(at = [center[0] - size, center[1] - size])\n |> line(endAbsolute = [center[0] + size, center[1] - size])\n |> line(endAbsolute = [center[0] + size, center[1] + size])\n |> line(endAbsolute = [center[0] - size, center[1] + size])\n |> close()\n |> extrude(length = 10)\n}\n\npart001 = cube(center = [0, 0], size = 10)\npart002 = cube(center = [7, 3], size = 5)\n |> translate(z = 1)\n\n// This is the equivalent of: subtract([part001], tools=[part002])\nsubtractedPart = part001 - part002" ] }, { @@ -291976,7 +291976,7 @@ }, { "name": "endAbsolute", - "type": "[number]", + "type": "Point2d", "schema": { "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", "title": "Nullable_Array_size_2_of_TyF64", @@ -293585,7 +293585,7 @@ }, { "name": "end", - "type": "[number]", + "type": "Point2d", "schema": { "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", "title": "Nullable_Array_size_2_of_TyF64", @@ -311484,7 +311484,7 @@ "// Move a pipe.\n\n// Create a path for the sweep.\nsweepPath = startSketchOn(XZ)\n |> startProfile(at = [0.05, 0.05])\n |> line(end = [0, 7])\n |> tangentialArc(angle = 90, radius = 5)\n |> line(end = [-3, 0])\n |> tangentialArc(angle = -90, radius = 5)\n |> line(end = [0, 7])\n\n// Create a hole for the pipe.\npipeHole = startSketchOn(XY)\n |> circle(center = [0, 0], radius = 1.5)\n\nsweepSketch = startSketchOn(XY)\n |> circle(center = [0, 0], radius = 2)\n |> subtract2d(tool = pipeHole)\n |> sweep(path = sweepPath)\n |> translate(x = 1.0, y = 1.0, z = 2.5)", "// Move an imported model.\n\n\nimport \"tests/inputs/cube.sldprt\" as cube\n\n// Circle so you actually see the move.\nstartSketchOn(XY)\n |> circle(center = [-10, -10], radius = 10)\n |> extrude(length = 10)\n\ncube\n |> translate(x = 10.0, y = 10.0, z = 2.5)", "// Sweep two sketches along the same path.\n\n\nsketch001 = startSketchOn(XY)\nrectangleSketch = startProfile(sketch001, at = [-200, 23.86])\n |> angledLine(angle = 0, length = 73.47, tag = $rectangleSegmentA001)\n |> angledLine(angle = segAng(rectangleSegmentA001) - 90, length = 50.61)\n |> angledLine(angle = segAng(rectangleSegmentA001), length = -segLen(rectangleSegmentA001))\n |> line(endAbsolute = [profileStartX(%), profileStartY(%)])\n |> close()\n\ncircleSketch = circle(sketch001, center = [200, -30.29], radius = 32.63)\n\nsketch002 = startSketchOn(YZ)\nsweepPath = startProfile(sketch002, at = [0, 0])\n |> yLine(length = 231.81)\n |> tangentialArc(radius = 80, angle = -90)\n |> xLine(length = 384.93)\n\nparts = sweep([rectangleSketch, circleSketch], path = sweepPath)\n\n// Move the sweeps.\ntranslate(\n parts,\n x = 1.0,\n y = 1.0,\n z = 2.5,\n)", - "// Move a sketch.\n\n\nfn square(length) {\n l = length / 2\n p0 = [-l, -l]\n p1 = [-l, l]\n p2 = [l, l]\n p3 = [l, -l]\n\n return startSketchOn(XY)\n |> startProfile(at = p0)\n |> line(endAbsolute = p1)\n |> line(endAbsolute = p2)\n |> line(endAbsolute = p3)\n |> close()\n}\n\nsquare(10)\n |> translate(x = 5, y = 5)\n |> extrude(length = 10)", + "// Move a sketch.\n\n\nfn square(@length) {\n l = length / 2\n p0 = [-l, -l]\n p1 = [-l, l]\n p2 = [l, l]\n p3 = [l, -l]\n\n return startSketchOn(XY)\n |> startProfile(at = p0)\n |> line(endAbsolute = p1)\n |> line(endAbsolute = p2)\n |> line(endAbsolute = p3)\n |> close()\n}\n\nsquare(10)\n |> translate(x = 5, y = 5)\n |> extrude(length = 10)", "// Translate and rotate a sketch to create a loft.\nsketch001 = startSketchOn(XY)\n\nfn square() {\n return startProfile(sketch001, at = [-10, 10])\n |> xLine(length = 20)\n |> yLine(length = -20)\n |> xLine(length = -20)\n |> line(endAbsolute = [profileStartX(%), profileStartY(%)])\n |> close()\n}\n\nprofile001 = square()\n\nprofile002 = square()\n |> translate(z = 20)\n |> rotate(axis = [0, 0, 1.0], angle = 45)\n\nloft([profile001, profile002])" ] }, @@ -316320,9 +316320,9 @@ "unpublished": false, "deprecated": false, "examples": [ - "// Union two cubes using the stdlib functions.\n\n\nfn cube(center, size) {\n return startSketchOn(XY)\n |> startProfile(at = [center[0] - size, center[1] - size])\n |> line(endAbsolute = [center[0] + size, center[1] - size])\n |> line(endAbsolute = [center[0] + size, center[1] + size])\n |> line(endAbsolute = [center[0] - size, center[1] + size])\n |> close()\n |> extrude(length = 10)\n}\n\npart001 = cube([0, 0], 10)\npart002 = cube([7, 3], 5)\n |> translate(z = 1)\n\nunionedPart = union([part001, part002])", - "// Union two cubes using operators.\n// NOTE: This will not work when using codemods through the UI.\n// Codemods will generate the stdlib function call instead.\n\n\nfn cube(center, size) {\n return startSketchOn(XY)\n |> startProfile(at = [center[0] - size, center[1] - size])\n |> line(endAbsolute = [center[0] + size, center[1] - size])\n |> line(endAbsolute = [center[0] + size, center[1] + size])\n |> line(endAbsolute = [center[0] - size, center[1] + size])\n |> close()\n |> extrude(length = 10)\n}\n\npart001 = cube([0, 0], 10)\npart002 = cube([7, 3], 5)\n |> translate(z = 1)\n\n// This is the equivalent of: union([part001, part002])\nunionedPart = part001 + part002", - "// Union two cubes using the more programmer-friendly operator.\n// NOTE: This will not work when using codemods through the UI.\n// Codemods will generate the stdlib function call instead.\n\n\nfn cube(center, size) {\n return startSketchOn(XY)\n |> startProfile(at = [center[0] - size, center[1] - size])\n |> line(endAbsolute = [center[0] + size, center[1] - size])\n |> line(endAbsolute = [center[0] + size, center[1] + size])\n |> line(endAbsolute = [center[0] - size, center[1] + size])\n |> close()\n |> extrude(length = 10)\n}\n\npart001 = cube([0, 0], 10)\npart002 = cube([7, 3], 5)\n |> translate(z = 1)\n\n // This is the equivalent of: union([part001, part002])\n // Programmers will understand `|` as a union operation, but mechanical engineers\n// will understand `+`, we made both work.\nunionedPart = part001 | part002" + "// Union two cubes using the stdlib functions.\n\n\nfn cube(center, size) {\n return startSketchOn(XY)\n |> startProfile(at = [center[0] - size, center[1] - size])\n |> line(endAbsolute = [center[0] + size, center[1] - size])\n |> line(endAbsolute = [center[0] + size, center[1] + size])\n |> line(endAbsolute = [center[0] - size, center[1] + size])\n |> close()\n |> extrude(length = 10)\n}\n\npart001 = cube(center = [0, 0], size = 10)\npart002 = cube(center = [7, 3], size = 5)\n |> translate(z = 1)\n\nunionedPart = union([part001, part002])", + "// Union two cubes using operators.\n// NOTE: This will not work when using codemods through the UI.\n// Codemods will generate the stdlib function call instead.\n\n\nfn cube(center, size) {\n return startSketchOn(XY)\n |> startProfile(at = [center[0] - size, center[1] - size])\n |> line(endAbsolute = [center[0] + size, center[1] - size])\n |> line(endAbsolute = [center[0] + size, center[1] + size])\n |> line(endAbsolute = [center[0] - size, center[1] + size])\n |> close()\n |> extrude(length = 10)\n}\n\npart001 = cube(center = [0, 0], size = 10)\npart002 = cube(center = [7, 3], size = 5)\n |> translate(z = 1)\n\n// This is the equivalent of: union([part001, part002])\nunionedPart = part001 + part002", + "// Union two cubes using the more programmer-friendly operator.\n// NOTE: This will not work when using codemods through the UI.\n// Codemods will generate the stdlib function call instead.\n\n\nfn cube(center, size) {\n return startSketchOn(XY)\n |> startProfile(at = [center[0] - size, center[1] - size])\n |> line(endAbsolute = [center[0] + size, center[1] - size])\n |> line(endAbsolute = [center[0] + size, center[1] + size])\n |> line(endAbsolute = [center[0] - size, center[1] + size])\n |> close()\n |> extrude(length = 10)\n}\n\npart001 = cube(center = [0, 0], size = 10)\npart002 = cube(center = [7, 3], size = 5)\n |> translate(z = 1)\n\n // This is the equivalent of: union([part001, part002])\n // Programmers will understand `|` as a union operation, but mechanical engineers\n// will understand `+`, we made both work.\nunionedPart = part001 | part002" ] }, { diff --git a/docs/kcl/subtract.md b/docs/kcl/subtract.md index aa1125b3a..e569afba5 100644 --- a/docs/kcl/subtract.md +++ b/docs/kcl/subtract.md @@ -10,10 +10,10 @@ Performs a boolean subtraction operation, removing the volume of one or more too ```kcl subtract( - solids: [[[Solid](/docs/kcl/types/Solid)]](/docs/kcl/types/[Solid](/docs/kcl/types/Solid)), - tools: [[[Solid](/docs/kcl/types/Solid)]](/docs/kcl/types/[Solid](/docs/kcl/types/Solid)), - tolerance?: [number](/docs/kcl/types/number), -): [[[Solid](/docs/kcl/types/Solid)]](/docs/kcl/types/[Solid](/docs/kcl/types/Solid)) + solids: [Solid], + tools: [Solid], + tolerance?: number, +): [Solid] ``` @@ -21,13 +21,13 @@ subtract( | Name | Type | Description | Required | |----------|------|-------------|----------| -| `solids` | [`[Solid]`](/docs/kcl/types/Solid) | The solids to use as the base to subtract from. | Yes | -| `tools` | [`[Solid]`](/docs/kcl/types/Solid) | The solids to subtract. | Yes | -| `tolerance` | [`number`](/docs/kcl/types/number) | The tolerance to use for the subtraction operation. | No | +| `solids` | [`[Solid]`](/docs/kcl/types/std-types-Solid) | The solids to use as the base to subtract from. | Yes | +| `tools` | [`[Solid]`](/docs/kcl/types/std-types-Solid) | The solids to subtract. | Yes | +| `tolerance` | [`number`](/docs/kcl/types/std-types-number) | The tolerance to use for the subtraction operation. | No | ### Returns -[`[Solid]`](/docs/kcl/types/Solid) +[`[Solid]`](/docs/kcl/types/std-types-Solid) ### Examples @@ -46,8 +46,8 @@ fn cube(center, size) { |> extrude(length = 10) } -part001 = cube([0, 0], 10) -part002 = cube([7, 3], 5) +part001 = cube(center = [0, 0], size = 10) +part002 = cube(center = [7, 3], size = 5) |> translate(z = 1) subtractedPart = subtract([part001], tools = [part002]) @@ -71,8 +71,8 @@ fn cube(center, size) { |> extrude(length = 10) } -part001 = cube([0, 0], 10) -part002 = cube([7, 3], 5) +part001 = cube(center = [0, 0], size = 10) +part002 = cube(center = [7, 3], size = 5) |> translate(z = 1) // This is the equivalent of: subtract([part001], tools=[part002]) diff --git a/docs/kcl/subtract2d.md b/docs/kcl/subtract2d.md index 50d014889..aa3f33f0e 100644 --- a/docs/kcl/subtract2d.md +++ b/docs/kcl/subtract2d.md @@ -10,9 +10,9 @@ Use a 2-dimensional sketch to cut a hole in another 2-dimensional sketch. ```kcl subtract2d( - sketch: [Sketch](/docs/kcl/types/Sketch), - tool: [[[Sketch](/docs/kcl/types/Sketch)]](/docs/kcl/types/[Sketch](/docs/kcl/types/Sketch)), -): [Sketch](/docs/kcl/types/Sketch) + sketch: Sketch, + tool: [Sketch], +): Sketch ``` @@ -20,12 +20,12 @@ subtract2d( | Name | Type | Description | Required | |----------|------|-------------|----------| -| `sketch` | [`Sketch`](/docs/kcl/types/Sketch) | Which sketch should this path be added to? | Yes | -| `tool` | [`[Sketch]`](/docs/kcl/types/Sketch) | The shape(s) which should be cut out of the sketch. | Yes | +| `sketch` | [`Sketch`](/docs/kcl/types/std-types-Sketch) | Which sketch should this path be added to? | Yes | +| `tool` | [`[Sketch]`](/docs/kcl/types/std-types-Sketch) | The shape(s) which should be cut out of the sketch. | Yes | ### Returns -[`Sketch`](/docs/kcl/types/Sketch) +[`Sketch`](/docs/kcl/types/std-types-Sketch) ### Examples diff --git a/docs/kcl/sweep.md b/docs/kcl/sweep.md index 701e986c9..dc2a9b13a 100644 --- a/docs/kcl/sweep.md +++ b/docs/kcl/sweep.md @@ -12,13 +12,13 @@ You can provide more than one sketch to sweep, and they will all be swept along ```kcl sweep( - sketches: [[[Sketch](/docs/kcl/types/Sketch)]](/docs/kcl/types/[Sketch](/docs/kcl/types/Sketch)), - path: Sweep[Path](/docs/kcl/types/Path), - sectional?: [bool](/docs/kcl/types/bool), - tolerance?: [number](/docs/kcl/types/number), - tagStart?: [TagDeclarator](/docs/kcl/types#tag-declaration), - tagEnd?: [TagDeclarator](/docs/kcl/types#tag-declaration), -): [[[Solid](/docs/kcl/types/Solid)]](/docs/kcl/types/[Solid](/docs/kcl/types/Solid)) + sketches: [Sketch], + path: Sketch | Helix, + sectional?: bool, + tolerance?: number, + tagStart?: TagDeclarator, + tagEnd?: TagDeclarator, +): [Solid] ``` @@ -26,16 +26,16 @@ sweep( | Name | Type | Description | Required | |----------|------|-------------|----------| -| `sketches` | [`[Sketch]`](/docs/kcl/types/Sketch) | The sketch or set of sketches that should be swept in space | Yes | -| `path` | [`SweepPath`](/docs/kcl/types/SweepPath) | The path to sweep the sketch along | Yes | -| `sectional` | [`bool`](/docs/kcl/types/bool) | If true, the sweep will be broken up into sub-sweeps (extrusions, revolves, sweeps) based on the trajectory path components. | No | -| `tolerance` | [`number`](/docs/kcl/types/number) | Tolerance for this operation | No | -| `tagStart` | [`TagDeclarator`](/docs/kcl/types#tag-declaration) | A named tag for the face at the start of the sweep, i.e. the original sketch | No | -| `tagEnd` | [`TagDeclarator`](/docs/kcl/types#tag-declaration) | A named tag for the face at the end of the sweep | No | +| `sketches` | [`[Sketch]`](/docs/kcl/types/std-types-Sketch) | The sketch or set of sketches that should be swept in space | Yes | +| `path` | [`Sketch`](/docs/kcl/types/std-types-Sketch) or [`Helix`](/docs/kcl/types/std-types-Helix) | The path to sweep the sketch along | Yes | +| `sectional` | [`bool`](/docs/kcl/types/std-types-bool) | If true, the sweep will be broken up into sub-sweeps (extrusions, revolves, sweeps) based on the trajectory path components. | No | +| `tolerance` | [`number`](/docs/kcl/types/std-types-number) | Tolerance for this operation | No | +| `tagStart` | [`TagDeclarator`](/docs/kcl/types#TagDeclarator) | A named tag for the face at the start of the sweep, i.e. the original sketch | No | +| `tagEnd` | [`TagDeclarator`](/docs/kcl/types#TagDeclarator) | A named tag for the face at the end of the sweep | No | ### Returns -[`[Solid]`](/docs/kcl/types/Solid) +[`[Solid]`](/docs/kcl/types/std-types-Solid) ### Examples diff --git a/docs/kcl/tangentToEnd.md b/docs/kcl/tangentToEnd.md index f480ea1e4..e8aa077e6 100644 --- a/docs/kcl/tangentToEnd.md +++ b/docs/kcl/tangentToEnd.md @@ -9,7 +9,7 @@ Returns the angle coming out of the end of the segment in degrees. ```kcl -tangentToEnd(tag: [TagIdentifier](/docs/kcl/types#tag-identifier)): [number](/docs/kcl/types/number) +tangentToEnd(tag: TagIdentifier): number ``` @@ -17,11 +17,11 @@ tangentToEnd(tag: [TagIdentifier](/docs/kcl/types#tag-identifier)): [number](/do | Name | Type | Description | Required | |----------|------|-------------|----------| -| `tag` | [`TagIdentifier`](/docs/kcl/types#tag-identifier) | The line segment being queried by its tag | Yes | +| [`tag`](/docs/kcl/types/std-types-tag) | [`TagIdentifier`](/docs/kcl/types#TagIdentifier) | The line segment being queried by its tag | Yes | ### Returns -[`number`](/docs/kcl/types/number) +[`number`](/docs/kcl/types/std-types-number) ### Examples diff --git a/docs/kcl/tangentialArc.md b/docs/kcl/tangentialArc.md index 7e36393ed..f11113ef9 100644 --- a/docs/kcl/tangentialArc.md +++ b/docs/kcl/tangentialArc.md @@ -10,13 +10,13 @@ When using radius and angle, draw a curved line segment along part of an imagina ```kcl tangentialArc( - sketch: [Sketch](/docs/kcl/types/Sketch), - endAbsolute?: [[[number](/docs/kcl/types/number)]](/docs/kcl/types/[number](/docs/kcl/types/number)), - end?: [[[number](/docs/kcl/types/number)]](/docs/kcl/types/[number](/docs/kcl/types/number)), - radius?: [number](/docs/kcl/types/number), - angle?: [number](/docs/kcl/types/number), - tag?: [TagDeclarator](/docs/kcl/types#tag-declaration), -): [Sketch](/docs/kcl/types/Sketch) + sketch: Sketch, + endAbsolute?: Point2d, + end?: Point2d, + radius?: number, + angle?: number, + tag?: TagDeclarator, +): Sketch ``` @@ -24,16 +24,16 @@ tangentialArc( | Name | Type | Description | Required | |----------|------|-------------|----------| -| `sketch` | [`Sketch`](/docs/kcl/types/Sketch) | Which sketch should this path be added to? | Yes | -| `endAbsolute` | [`[number]`](/docs/kcl/types/number) | Which absolute point should this arc go to? Incompatible with `end`, `radius`, and `offset`. | No | -| `end` | [`[number]`](/docs/kcl/types/number) | How far away (along the X and Y axes) should this arc go? Incompatible with `endAbsolute`, `radius`, and `offset`. | No | -| `radius` | [`number`](/docs/kcl/types/number) | Radius of the imaginary circle. `angle` must be given. Incompatible with `end` and `endAbsolute`. | No | -| `angle` | [`number`](/docs/kcl/types/number) | Offset of the arc in degrees. `radius` must be given. Incompatible with `end` and `endAbsolute`. | No | -| `tag` | [`TagDeclarator`](/docs/kcl/types#tag-declaration) | Create a new tag which refers to this arc | No | +| `sketch` | [`Sketch`](/docs/kcl/types/std-types-Sketch) | Which sketch should this path be added to? | Yes | +| `endAbsolute` | [`Point2d`](/docs/kcl/types/std-types-Point2d) | Which absolute point should this arc go to? Incompatible with `end`, `radius`, and `offset`. | No | +| `end` | [`Point2d`](/docs/kcl/types/std-types-Point2d) | How far away (along the X and Y axes) should this arc go? Incompatible with `endAbsolute`, `radius`, and `offset`. | No | +| `radius` | [`number`](/docs/kcl/types/std-types-number) | Radius of the imaginary circle. `angle` must be given. Incompatible with `end` and `endAbsolute`. | No | +| `angle` | [`number`](/docs/kcl/types/std-types-number) | Offset of the arc in degrees. `radius` must be given. Incompatible with `end` and `endAbsolute`. | No | +| [`tag`](/docs/kcl/types/std-types-tag) | [`TagDeclarator`](/docs/kcl/types#TagDeclarator) | Create a new tag which refers to this arc | No | ### Returns -[`Sketch`](/docs/kcl/types/Sketch) +[`Sketch`](/docs/kcl/types/std-types-Sketch) ### Examples diff --git a/docs/kcl/tau.md b/docs/kcl/tau.md deleted file mode 100644 index 60a25f16d..000000000 --- a/docs/kcl/tau.md +++ /dev/null @@ -1,42 +0,0 @@ ---- -title: "tau" -excerpt: "Return the value of `tau`. The full circle constant (τ). Equal to 2π." -layout: manual ---- - -**WARNING:** This function is deprecated. - -Return the value of `tau`. The full circle constant (τ). Equal to 2π. - -**DEPRECATED** use the constant TAU - -```js -tau(): number -``` - -### Tags - -* `math` - - - -### Returns - -[`number`](/docs/kcl/types/number) - - -### Examples - -```js -exampleSketch = startSketchOn(XZ) - |> startProfile(at = [0, 0]) - |> angledLine(angle = 50, length = 10 * tau()) - |> yLine(endAbsolute = 0) - |> close() - -example = extrude(exampleSketch, length = 5) -``` - -![Rendered example of tau 0](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABQAAAALQCAYAAADPfd1WAAD0XUlEQVR4Ae3AA6AkWZbG8f937o3IzKdyS2Oubdu2bdu2bdu2bWmMnpZKr54yMyLu+Xa3anqmhztr1a8+6EEP4qqrrrrqqquuuuqqq6666qqrrrrqqquu+j+JylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666v+oF3uxF3vtF3uxF3uta6655sFf//Vf/z5cddVVV1111f8/6EEPehBXXXXVVVddddVVV1111VX/11xzzTUP/qZv+qan80z33XffrR/yIR/yEK666qqrrrrq/xeCq6666qqrrrrqqquuuuqq/2OuueaaB3/TN33T05/+9KfzlV/5lezu7nLNNdc8+Ju+6ZuezlVXXXXVVVf9/0Jw1VVXXXXVVVddddVVV131f8g111zz4A//8A//rqc//el813d9F7u7u3znd34nu7u7XHPNNQ/+pm/6pqdz1VVXXXXVVf9/EFx11VVXXXXVVVddddVVV/0f8uEf/uHftbGx8drf9V3fxf12d3f5ru/6LnZ3d7nmmmse/E3f9E1P56qrrrrqqqv+fyC46qqrrrrqqquuuuqqq676P+JzP/dzf+vGG2987e/6ru/igSSxu7vLd33Xd7G7u8s111zz4G/6pm96OlddddVVV131fx/BVVddddVVV1111VVXXXXV/wGf+7mf+1s33njja3/lV34l95OEJO63u7vLd3/3d7O7u8s111zz4G/6pm96OlddddVVV131fxvBVVddddVVV1111VVXXXXV/3Kf+7mf+1s33njja//kT/4k95PEc5PE7u4u3/3d383u7i7XXHPNg7/pm77p6Vx11VVXXXXV/10EV1111VVXXXXVVVddddVV/4t9+Id/+He92Iu92Gv/5E/+JLfeeisAknhukrjf7u4u3/M938Pu7i7XXHPNg7/pm77p6Vx11VVXXXXV/00EV1111VVXXXXVVVddddVV/0u9zuu8znu/zuu8znt/53d+J7feeisAknggSUjigSSxu7vL93zP97C7u8s111zz4G/6pm96OlddddVVV131fw/BVVddddVVV1111VVXXXXV/0Iv9mIv9tof/uEf/l3f+Z3fya233gqAJB5IEs9NEvfb3d3le77ne7jfNddc82Cuuuqqq6666v8Wgquuuuqqq6666qqrrrrqqv9lXuzFXuy1P/dzP/e3vvM7v5Nbb70VSUjigSTx3CTxQJJ47dd+bQCuueaaB7/2a7/2e3HVVVddddVV/7dQueqqq6666qqrrrrqqquu+l/kxV7sxV77cz/3c3/rp37qp7j11luRxHOTxANJ4rlJ4rVe67V4qZd6Ke539uzZZ3DVVVddddVV/7cQXHXVVVddddVVV1111VVX/S/xYi/2Yq/9uZ/7ub/1W7/1W/zVX/0VknggSUjigSTx3CTxUi/1UrzWa70WAEdHR1x11VVXXXXV/1EEV1111VVXXXXVVVddddVV/wtcc801D/7cz/3c3/qrv/orfuu3fgtJPJAknpsknpskHvSgB/FWb/VWAPzBH/wB9/uHf/iH3+aqq6666qqr/m+hctVVV1111VVXXXXVVVdd9T/cNddc8+DP+ZzP+a2nP/3p/NRP/RSSeCBJPDdJPJAkAB70oAfxXu/1XgD81V/9FefPn+eqq6666qqr/g+jctVVV1111VVXXXXVVVdd9T/ch3/4h3/X4eHhg7/7u78bSTyQJB5IEs9NEgAPetCDeK/3ei8AnvjEJ3L77bdjm42NDQDuu+++W7nqqquuuuqq/1uoXHXVVVddddVVV1111VVX/Q/2uZ/7ub+1sbHx2t/93d/Nc5PEA0niuUkC4EEPehDv9V7vBcDtt9/OE5/4RGxz1VVXXXXVVf/HEVx11VVXXXXVVVddddVVV/0P9bmf+7m/deONN772d3/3d/NAkpDEA0niuUkC4Pjx47zXe70XAOfOneOv/uqvsA3AxsYGAPfdd9+tXHXVVVddddX/PVSuuuqqq6666qqrrrrqqqv+B/rcz/3c37rxxhtf+6u+6qt4IEk8N0k8kCTud/z4cT7yIz8SgHPnzvGHf/iH2OZ+p0+fBuDs2bO3ctVVV1111VX/91C56qqrrrrqqquuuuqqq676H+bDP/zDv+vGG2987Z/6qZ/igSTxQJJ4bpK43/Hjx3nLt3xLAM6dO8cf/uEfYpsHsg3AfffddytXXXXVVVdd9X8PwVVXXXXVVVddddVVV1111f8g7/iO7/hZr/M6r/PeP/VTP8Wtt97K/STxQJJ4bpJ4oLd8y7fkwQ9+MOfOneMP//APsc0D2WZjYwOA++6771auuuqqq6666v8eKlddddVVV1111VVXXXXVVf9DvM7rvM57v9M7vdNnf9d3fRe33norAJJ4bpJ4IEk8t/d6r/fiQQ96EEdHR/zhH/4htnkg2wBsbGwAcPbs2Wdw1VVXXXXVVf/3ULnqqquuuuqqq6666qqrrvof4MVe7MVe+8M//MO/67u+67u49dZbAZDEc5PEA0niub3Xe70XD3rQgzg6OuLXf/3Xsc0D2eaqq6666qqr/p+gctVVV1111VVXXXXVVVdd9d/sxV7sxV77cz/3c3/rp37qp7j11lsBkMQDSeK5SeK5vdd7vRcPetCDODo64q/+6q+wzQPZ5oE2NjYAuO+++27lqquuuuqqq/7voXLVVVddddVVV1111VVXXfXf6MVe7MVe+3M/93N/67d+67f467/+awAk8UCSeG6SeCBJvOVbviUPetCDAPirv/orzp07xwPZ5rltbGwAcPbs2Vu56qqrrrrqqv97qFx11VVXXXXVVVddddVVV/03ueaaax78uZ/7ub/113/91/z2b/82AJJ4IEk8N0k8kCTe8i3fkpd6qZcC4A/+4A84d+4cD2Sb52abjY0Nrrrqqquuuur/MCpXXXXVVVddddVVV1111VX/Da655poHf9M3fdPTb731Vn7qp34KAEk8kCQeSBLPTRIv9VIvxUu91EsB8Ad/8AecO3eOB7LNc7PNA9133323ctVVV1111VX/91C56qqrrrrqqquuuuqqq676L3bNNdc8+MM//MO/69Zbb+W7vuu7kMRzk8QDSeK5SeJBD3oQb/mWbwnAH/zBH3Du3DkeyDbPzTYAGxsbANx33323ctVVV1111VX/N1G56qqrrrrqqquuuuqqq676L/bhH/7h37W5ufna3/Vd34UkHkgSz00SDyQJgAc96EG853u+JwB/9Vd/xblz5/iX2OZ+GxsbAJw9e/ZWrrrqqquuuur/JoKrrrrqqquuuuqqq6666qr/Qp/7uZ/7WzfeeONrf9d3fReSeCBJPDdJPJAkAB70oAfxnu/5ngA88YlP5LbbbuOBbGObB7LNA21sbABw33333cpVV1111VVX/d9E5aqrrrrqqquuuuqqq6666r/I537u5/7WjTfe+Npf9VVfhSQeSBIPJInnJgmABz3oQbzne74nALfffjtPeMITeCDbPDfbPJBtrrrqqquuuur/ASpXXXXVVVddddVVV1111VX/BT73cz/3t2688cbX/qmf+ikk8UCSeCBJPDdJABw/fpz3fM/3BODcuXP85V/+JQ9km+dmmweyDcDGxgYA9913361cddVVV1111f9NBFddddVVV1111VVXXXXVVf/JPvzDP/y7XuzFXuy1f/qnf5pnPOMZPJAkHkgSDyQJSQAcP36cj/iIjwDg3Llz/MEf/AEPZJvnZpsHss39NjY2ADh79uwzuOqqq6666qr/m6hcddVVV1111VVXXXXVVVf9J3rHd3zHz3qd13md9/7u7/5ubr31Vu4niecmiQeSxP2OHz/OW77lWwJw7tw5/uAP/oAHss1zs80D2eaqq6666qqr/p+hctVVV1111VVXXXXVVVdd9Z/kxV7sxV77nd7pnT77u7/7u7n11lu5nySemyQeSBIP9JZv+ZY86EEP4ty5c/zBH/wBD2Sb52abB7LNcztz5gwA//AP//DbXHXVVVddddX/TVSuuuqqq6666qqrrrrqqqv+E7zYi73Ya3/u537ub333d383t956K/eTxANJ4rlJ4oHe8z3fkwc96EEcHR3xB3/wBzyQbZ6bbR7INs/NNlddddVVV131/wCVq6666qqrrrrqqquuuuqq/2Av9mIv9tqf+7mf+1s//dM/za233sr9JPFAknhuknig93zP9+RBD3oQR0dH/Nqv/RoPZJvnZpsHss1zsw3AxsYGAPfdd9+tXHXVVVddddX/TVSuuuqqq6666qqrrrrqqqv+A73Yi73Ya3/u537ub/32b/82f/3Xf839JPFAknggSTy393zP9+RBD3oQR0dH/NVf/RUPZJvnZpsHss1zs81VV1111VVX/T9C5aqrrrrqqquuuuqqq6666j/INddc8+DP/dzP/a2//uu/5rd/+7e5nyQeSBIPJInn9p7v+Z486EEPAuCv/uqvOHfuHPezzXOzzQPZ5rnZ5n5nzpwB4B/+4R9+m6uuuuqqq676v4vKVVddddVVV1111VVXXXXVf4BrrrnmwZ/zOZ/zW7feeis//dM/DYAknpskHkgSDySJt3iLt+BBD3oQAH/wB3/AuXPnuJ9tnpttHsg2z802D7RYLAC47777buWqq6666qqr/u+ictVVV1111VVXXXXVVVdd9e90zTXXPPjDP/zDv+vo6OjB3/3d3w2AJB5IEs9NEg8kidd8zdfkpV7qpQD4gz/4A86dO8f9bPNAtnlutnlutnkg21x11VVXXXXV/xNUrrrqqquuuuqqq6666qqr/p0+/MM//Ls2Nzdf+7u/+7sBkMQDSeKBJPHcJPGSL/mSvOZrviYAf/AHf8C5c+e4n20eyDbPzTbPzTYPZBuAzc1NAO67775bueqqq6666qr/uwiuuuqqq6666qqrrrrqqqv+HT73cz/3t2688cbX/u7v/m4AJPFAknggSTw3STzoQQ/iLd/yLQH4q7/6K86dO8f9bPNAtnlutnlutnkg29xvY2MDgLNnzz6Dq6666qqrrvq/i8pVV1111VVXXXXVVVddddW/0ed+7uf+1o033vjaX/3VXw2AJB5IEg8kiQeSBMCDHvQg3uM93gOAv/qrv+K2227jfrZ5INs8N9s8N9s8kG2uuuqqq6666v8hKlddddVVV1111VVXXXXVVf8GH/7hH/5dN95442v/9E//NACSeCBJPJAkHkgSAA960IN4j/d4DwBuu+02brvtNgBs89xs89xs80C2eW62eW6bm5sA3Hfffbdy1VVXXXXVVf93EVx11VVXXXXVVVddddVVV/0rveM7vuNnvc7rvM57//RP/zTPeMYzkMT9JCGJB5LEA0kC4Pjx47zHe7wHALfddht/9Vd/BYBtnpttnpttHsg2z802z802GxsbAJw9e/ZWrrrqqquuuur/LipXXXXVVVddddVVV1111VX/Cq/zOq/z3u/0Tu/02d/93d/NM57xDB5IEg8kiecmCYDjx4/z4R/+4QCcO3eOv/qrvwLANs/NNs/NNg9km+dmm+dmG4DNzU0A7rvvvlu56qqrrrrqqv+7qFx11VVXXXXVVVddddVVV72IXuzFXuy1P/zDP/y7vvu7v5tnPOMZPJAkHkgSz00SAMePH+fd3/3dATh37hx/8Ad/AIBtnpttHsg2z802z802z802V1111VVXXfX/DJWrrrrqqquuuuqqq6666qoXwYu92Iu99ud+7uf+1nd/93fzjGc8gweSxANJ4oEkcb/jx4/zFm/xFhw/fpxz587xB3/wBwDY5rnZ5oFs89xs89xs89xsc7/NzU0A7rvvvlu56qqrrrrqqv/bqFx11VVXXXXVVVddddVVV/0LXuzFXuy1P/dzP/e3fvqnf5pnPOMZPJAkHkgSDySJB3qLt3gLHvSgB3F0dMQf/MEfAGCbB7LNc7PNc7PNc7PNc7PNA21sbABw9uzZW7nqqquuuuqq/9uoXHXVVVddddVVV1111VVXvRDXXHPNgz/3cz/3t/76r/+av/mbv+GBJPFAknggSTzQe7zHe/CgBz2Io6Mjfu3Xfg3bPDfbPDfbPDfbPDfbPDfbPLeNjQ0A7rvvvlu56qqrrrrqqv/bqFx11VVXXXXVVVddddVVV70A11xzzYO/6Zu+6em33norP/MzP8MDSeKBJPFAknig93iP9+BBD3oQR0dH/NVf/RW2eW62eW62eW62eW62eW62eW62ueqqq6666qr/R6hcddVVV1111VVXXXXVVVc9H9dcc82DP/zDP/y7br31Vr7ne76H+0nigSTx3CTxQO/xHu/Bgx70IAD+6q/+irNnz/LcbPPcbPPcbPPcbPPcbPPcbAOwubkJwH333XcrV1111VVXXfV/G5Wrrrrqqquuuuqqq6666qrn48M//MO/a3Nz87W/53u+h/tJ4oEk8UCSeG5v+ZZvyYMe9CAA/uAP/oCzZ8/y3Gzz3GzzQLZ5brZ5brZ5brZ5oM3NTQDOnj37DK666qqrrrrq/zYqV1111VVXXXXVVVddddVVz+VzP/dzf2tzc/O1v+d7vof7SeKBJPFAknhur/mar8lLvuRLAvD7v//7nDt3jgeyzXOzzXOzzXOzzXOzzXOzzXPb2NgA4L777ruVq6666qqrrvq/jeCqq6666qqrrrrqqquuuuoBPvdzP/e3brzxxtf+nu/5Hu4niQeSxANJ4rm91Eu9FK/5mq8JwO///u9z7tw5Hsg2z802z802z802z802z802z802m5ubAJw9e/ZWrrrqqquuuur/NipXXXXVVVddddVVV1111VXP9Lmf+7m/deONN77293zP93A/STyQJB5IEg8kiQc96EG8xVu8BQC///u/z7lz53gg2zw32zw32zw32zw32zw32zw321x11VVXXXXV/zMEV1111VVXXXXVVVddddVVwId/+Id/14u92Iu99s/8zM+wu7sLgCQeSBIPJIkHksSDHvQg3v3d3x2Av/zLv+TcuXM8kG2em22em22em22em22em22em23ut7m5CcB99913K1ddddVVV131fxuVq6666qqrrrrqqquuuur/vXd8x3f8rNd5ndd57+/5nu/h1ltvBUAS95PEA0niuUniQQ96EO/+7u8OwBOe8ARuu+027meb52ab58c2z802z802z802z80299vc3ATgvvvuu5Wrrrrqqquu+r+PylVXXXXVVVddddVVV131/9rrvM7rvPc7vdM7ffb3fM/3cOuttyKJB5LEA0niuUniQQ96EO/+7u8OwG233cYTnvAE7meb52ab52ab52ab58c2z802z802D7S5uQnA2bNnb+Wqq6666qqr/u+jctVVV1111VVXXXXVVVf9v/ViL/Zir/3hH/7h3/U93/M93HrrrUjigSTxQJJ4bpI4duwY7/7u7w7AuXPn+Mu//EvuZ5vnZpvnZpvnZpvnZpvnxzbPzTbPbWNjA4D77rvvVq666qqrrrrq/z4qV1111VVXXXXVVVddddX/Sy/2Yi/22p/7uZ/7Wz/zMz/DrbfeiiQeSBIPJIkHkgTAsWPHeI/3eA8Azp07x+///u9zP9s8N9s8N9s8N9s8N9s8P7Z5brZ5bra56qqrrrrqqv9nqFx11VVXXXXVVVddddVV/++82Iu92Gt/7ud+7m/99m//Nn/913+NJB5IEg8kiQeSBMCxY8d4i7d4C44dO8a5c+f4/d//fQBs89xs8/zY5rnZ5rnZ5rnZ5vmxzXOzDcDm5iYA9913361cddVVV1111f99VK666qqrrrrqqquuuuqq/1euueaaB3/u537ub/31X/81v/M7v4MkHkgSDySJB5LE/d7iLd6CBz3oQRwdHfH7v//7ANjmudnmudnm+bHNc7PNc7PNc7PN82Ob+21ubgJw9uzZZ3DVVVddddVV//dRueqqq6666qqrrrrqqqv+37jmmmse/E3f9E1Pv/XWW/mZn/kZJPFAknggSTyQJO737u/+7jzoQQ/i6OiIX/3VXwXANs/NNs/NNs/NNs+PbZ6bbZ6bbZ4f21x11VVXXXXV/2NUrrrqqquuuuqqq6666qr/F6655poHf/iHf/h33XrrrXzP93wPkrifJB5IEs9NEvd793d/dx70oAdxdHTE7//+72Ob58c2z802z802z802z49tnpttnh/bPLdrrrkGgPvuu+9Wrrrqqquuuur/PipXXXXVVVddddVVV1111f8LH/7hH/5dm5ubr/093/M9SOJ+knggSTyQJB7o3d/93XnQgx7E0dERf/mXf8nh4SHPzTbPj22em22em22eH9s8N9s8N9s8P7a539mzZ2/lqquuuuqqq/7vI7jqqquuuuqqq6666qqr/s/73M/93N+68cYbX/t7v/d7kcT9JPFAknggSTzQW7zFW/CgBz0IgL/8y7/k7NmzPDfbPDfb2Oa52ea52ea52cY2z802z802z49tADY3NwG47777buWqq6666qqr/u+jctVVV1111VVXXXXVVVf9n/a5n/u5v3XjjTe+9td+7dfyQJJ4IEk8kCQe6DVf8zV5yZd8SQB+7/d+j3PnzvHcbPPcbPPcbPP82Oa52eb5sc1zs83zY5urrrrqqquu+n+KylVXXXXVVVddddVVV131f9bnfu7n/taNN9742j/zMz/DA0nigSTxQJJ4oJd6qZfiNV7jNQD4vd/7Pc6dO8cD2eb5sc1zs83zY5vnZpvnZpvnxzbPzTYPtLm5CcB99913K1ddddVVV131/wPBVVddddVVV1111VVXXfV/0od/+Id/14u92Iu99s/8zM/wjGc8g/tJ4oEk8UCSeKAHPehBvPmbvzkAv/d7v8e5c+d4INs8N9vY5rnZ5rnZxjbPzTbPzTbPj22em22e2+bmJgBnz569lauuuuqqq676/4HKVVddddVVV1111VVXXfV/zuu8zuu89+u8zuu89/d8z/fwjGc8g/tJ4oEk8UCSeKAHPehBvPu7vzsAf/EXf8G5c+d4INs8N9s8P7Z5brZ5fmzz3Gzz/Njmudnm+dnc3ATgvvvuu5Wrrrrqqquu+v+BylVXXXXVVVddddVVV131f8qLvdiLvfaHf/iHf9f3fM/38IxnPIP7SeJ+knhuknigBz3oQbz7u787AI9//OO57bbbuJ9tnh/bPDfbPD+2eW62eX5s89xs8/zY5vmxzebmJlddddVVV131/wyVq6666qqrrrrqqquuuur/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BsA2ALaxDYBtAGxjm/vZxjYAtgGwDYBtbHM/2wDYBsA297MNgG0AbPNAtgGwDYBtnpttAGwDYJvnxzb3s839bPP82OZ+tnkg27wwtnkg2zyQbf4ltnlutnl+bPOvYZvnxzYviG3+PWzzL7ENwPHjx7nqqquuuuqqq/7LULnqqquuuuqqq/5LnD179tZrrrnmwQCv9EqvxCu90itx1VVXXfX/1X333XfrfffddytXXXXVVVddddV/NvSgBz2Iq6666qqrrrrqP9+LvdiLvdY7vdM7fTZXXXXVVVfx9V//9e9z33333cpVV1111VVXXfWfDT3oQQ/iqquuuuqqq6666qqrrrrqqquuuuqqq676P4nKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q/iHwFexKM0GIBbJQAAAABJRU5ErkJggg==) - - diff --git a/docs/kcl/translate.md b/docs/kcl/translate.md index cb8b5bcdf..870d5c69c 100644 --- a/docs/kcl/translate.md +++ b/docs/kcl/translate.md @@ -12,12 +12,12 @@ Translate is really useful for sketches if you want to move a sketch and then ro ```kcl translate( - objects: [[Solid](/docs/kcl/types/Solid)Or[Sketch](/docs/kcl/types/Sketch)OrImportedGeometry](/docs/kcl/types/[Solid](/docs/kcl/types/Solid)Or[Sketch](/docs/kcl/types/Sketch)OrImportedGeometry), - x?: [number](/docs/kcl/types/number), - y?: [number](/docs/kcl/types/number), - z?: [number](/docs/kcl/types/number), - global?: [bool](/docs/kcl/types/bool), -): [[Solid](/docs/kcl/types/Solid)Or[Sketch](/docs/kcl/types/Sketch)OrImportedGeometry](/docs/kcl/types/[Solid](/docs/kcl/types/Solid)Or[Sketch](/docs/kcl/types/Sketch)OrImportedGeometry) + objects: [Solid] | [Sketch] | ImportedGeometry, + x?: number, + y?: number, + z?: number, + global?: bool, +): [Solid] | [Sketch] | ImportedGeometry ``` @@ -25,15 +25,15 @@ translate( | Name | Type | Description | Required | |----------|------|-------------|----------| -| `objects` | [`SolidOrSketchOrImportedGeometry`](/docs/kcl/types/SolidOrSketchOrImportedGeometry) | The solid, sketch, or set of solids or sketches to move. | Yes | -| `x` | [`number`](/docs/kcl/types/number) | The amount to move the solid or sketch along the x axis. Defaults to 0 if not provided. | No | -| `y` | [`number`](/docs/kcl/types/number) | The amount to move the solid or sketch along the y axis. Defaults to 0 if not provided. | No | -| `z` | [`number`](/docs/kcl/types/number) | The amount to move the solid or sketch along the z axis. Defaults to 0 if not provided. | No | -| `global` | [`bool`](/docs/kcl/types/bool) | If true, the transform is applied in global space. The origin of the model will move. By default, the transform is applied in local sketch axis, therefore the origin will not move. | No | +| `objects` | [`[Solid]`](/docs/kcl/types/std-types-Solid) or [`[Sketch]`](/docs/kcl/types/std-types-Sketch) or [`ImportedGeometry`](/docs/kcl/types#ImportedGeometry) | The solid, sketch, or set of solids or sketches to move. | Yes | +| `x` | [`number`](/docs/kcl/types/std-types-number) | The amount to move the solid or sketch along the x axis. Defaults to 0 if not provided. | No | +| `y` | [`number`](/docs/kcl/types/std-types-number) | The amount to move the solid or sketch along the y axis. Defaults to 0 if not provided. | No | +| `z` | [`number`](/docs/kcl/types/std-types-number) | The amount to move the solid or sketch along the z axis. Defaults to 0 if not provided. | No | +| `global` | [`bool`](/docs/kcl/types/std-types-bool) | If true, the transform is applied in global space. The origin of the model will move. By default, the transform is applied in local sketch axis, therefore the origin will not move. | No | ### Returns -[`SolidOrSketchOrImportedGeometry`](/docs/kcl/types/SolidOrSketchOrImportedGeometry) - Data for a solid, sketch, or an imported geometry. +[`[Solid]`](/docs/kcl/types/std-types-Solid) or [`[Sketch]`](/docs/kcl/types/std-types-Sketch) or [`ImportedGeometry`](/docs/kcl/types#ImportedGeometry) - Data for a solid, sketch, or an imported geometry. ### Examples @@ -117,7 +117,7 @@ translate( // Move a sketch. -fn square(length) { +fn square(@length) { l = length / 2 p0 = [-l, -l] p1 = [-l, l] diff --git a/docs/kcl/types.md b/docs/kcl/types.md index cf454d512..7cea7be5a 100644 --- a/docs/kcl/types.md +++ b/docs/kcl/types.md @@ -9,10 +9,6 @@ layout: manual All these types can be nested in various forms where nesting applies. Like arrays can hold objects and vice versa. -## Boolean - -`true` or `false` work when defining values. - ## Constant declaration Constants are defined with a name and a value, like so: @@ -23,7 +19,7 @@ myBool = false Currently you cannot redeclare a constant. -## Array +## Arrays An array is defined with `[]` braces. What is inside the brackets can be of any type. For example, the following is completely valid: @@ -36,7 +32,7 @@ If you want to get a value from an array you can use the index like so: `myArray[0]`. -## Object +## Objects An object is defined with `{}` braces. Here is an example object: @@ -47,6 +43,15 @@ myObj = { a = 0, b = "thing" } We support two different ways of getting properties from objects, you can call `myObj.a` or `myObj["a"]` both work. +## `ImportedGeometry` + +Using `import` you can import geometry defined using other CAD software. In KCL, +these objects have type `ImportedGeometry` and can mostly be treated like any +other solid (they can be rotated, scaled, etc.), although there is no access to +their internal components. See the [modules and imports docs](modules) for more +detail on importing geometry. + + ## Binary expressions You can also do math! Let's show an example below: @@ -176,7 +181,7 @@ Check the docs page for each function and look at its examples to see. Tags are used to give a name (tag) to a specific path. -### Tag Declaration +### `TagDeclarator` The syntax for declaring a tag is `$myTag` you would use it in the following way: @@ -199,7 +204,7 @@ startSketchOn(XZ) |> close() ``` -### Tag Identifier +### `TagIdentifier` As per the example above you can use the tag identifier to get a reference to the tagged object. The syntax for this is `myTag`. @@ -207,6 +212,16 @@ tagged object. The syntax for this is `myTag`. In the example above we use the tag identifier to get the angle of the segment `segAng(rectangleSegmentA001, %)`. +### `Start` + +There is a special tag, `START` (with type `Start`, although under the cover, it's a string) +for identifying the face of a solid which was the start of an extrusion (i.e., the surface which +is extruded). + +### `End` + +There is a special tag, `END` (with type `End`, although under the cover, it's a string) +for identifying the face of a solid which was finishes an extrusion. ### Tag Scope @@ -234,8 +249,8 @@ fn rect(origin) { |> close() } -rect([0, 0]) -rect([20, 0]) +rect(origin = [0, 0]) +rect(origin = [20, 0]) ``` Those tags would only be available in the `rect` function and not globally. @@ -264,8 +279,8 @@ fn rect(origin) { |> close() } -rect([0, 0]) -myRect = rect([20, 0]) +rect(origin = [0, 0]) +myRect = rect(origin = [20, 0]) myRect |> extrude(length = 10) diff --git a/docs/kcl/types/ArtifactId.md b/docs/kcl/types/ArtifactId.md deleted file mode 100644 index 6447248f1..000000000 --- a/docs/kcl/types/ArtifactId.md +++ /dev/null @@ -1,15 +0,0 @@ ---- -title: "ArtifactId" -excerpt: "" -layout: manual ---- - - -**Type:** [`string`](/docs/kcl/types/string) (`uuid`) - - - - - - - diff --git a/docs/kcl/types/BasePath.md b/docs/kcl/types/BasePath.md deleted file mode 100644 index 9d616b105..000000000 --- a/docs/kcl/types/BasePath.md +++ /dev/null @@ -1,25 +0,0 @@ ---- -title: "BasePath" -excerpt: "A base path." -layout: manual ---- - -A base path. - -**Type:** `object` - - - - - -## Properties - -| Property | Type | Description | Required | -|----------|------|-------------|----------| -| `from` |`[number, number]`| The from point. | No | -| `to` |`[number, number]`| The to point. | No | -| `units` |[`UnitLen`](/docs/kcl/types/UnitLen)| A unit of length. | No | -| `tag` |[`TagDeclarator`](/docs/kcl/types#tag-declaration)| The tag of the path. | No | -| `__geoMeta` |[`GeoMeta`](/docs/kcl/types/GeoMeta)| Metadata. | No | - - diff --git a/docs/kcl/types/EdgeCut.md b/docs/kcl/types/EdgeCut.md deleted file mode 100644 index 8046401eb..000000000 --- a/docs/kcl/types/EdgeCut.md +++ /dev/null @@ -1,58 +0,0 @@ ---- -title: "EdgeCut" -excerpt: "A fillet or a chamfer." -layout: manual ---- - -A fillet or a chamfer. - - - - - -**This schema accepts exactly one of the following:** - -A fillet. - -**Type:** `object` - - - - - -## Properties - -| Property | Type | Description | Required | -|----------|------|-------------|----------| -| `type` |enum: `fillet`| | No | -| `id` |[`string`](/docs/kcl/types/string)| The id of the engine command that called this fillet. | No | -| `radius` |`TyF64`| | No | -| `edgeId` |[`string`](/docs/kcl/types/string)| The engine id of the edge to fillet. | No | -| `tag` |[`TagDeclarator`](/docs/kcl/types#tag-declaration)| | No | - - ----- -A chamfer. - -**Type:** `object` - - - - - -## Properties - -| Property | Type | Description | Required | -|----------|------|-------------|----------| -| `type` |enum: `chamfer`| | No | -| `id` |[`string`](/docs/kcl/types/string)| The id of the engine command that called this chamfer. | No | -| `length` |`TyF64`| | No | -| `edgeId` |[`string`](/docs/kcl/types/string)| The engine id of the edge to chamfer. | No | -| `tag` |[`TagDeclarator`](/docs/kcl/types#tag-declaration)| | No | - - ----- - - - - diff --git a/docs/kcl/types/ExtrudeSurface.md b/docs/kcl/types/ExtrudeSurface.md deleted file mode 100644 index 991ec8e8a..000000000 --- a/docs/kcl/types/ExtrudeSurface.md +++ /dev/null @@ -1,98 +0,0 @@ ---- -title: "ExtrudeSurface" -excerpt: "An extrude surface." -layout: manual ---- - -An extrude surface. - - - - - -**This schema accepts exactly one of the following:** - -An extrude plane. - -**Type:** `object` - - - - - -## Properties - -| Property | Type | Description | Required | -|----------|------|-------------|----------| -| `type` |enum: `extrudePlane`| | No | -| `faceId` |[`string`](/docs/kcl/types/string)| The face id for the extrude plane. | No | -| `tag` |[`TagDeclarator`](/docs/kcl/types#tag-declaration)| The tag. | No | -| `id` |[`string`](/docs/kcl/types/string)| The id of the geometry. | No | -| `sourceRange` |`[, `integer`, `integer`, `integer`]`| The source range. | No | - - ----- -An extruded arc. - -**Type:** `object` - - - - - -## Properties - -| Property | Type | Description | Required | -|----------|------|-------------|----------| -| `type` |enum: `extrudeArc`| | No | -| `faceId` |[`string`](/docs/kcl/types/string)| The face id for the extrude plane. | No | -| `tag` |[`TagDeclarator`](/docs/kcl/types#tag-declaration)| The tag. | No | -| `id` |[`string`](/docs/kcl/types/string)| The id of the geometry. | No | -| `sourceRange` |`[, `integer`, `integer`, `integer`]`| The source range. | No | - - ----- -Geometry metadata. - -**Type:** `object` - - - - - -## Properties - -| Property | Type | Description | Required | -|----------|------|-------------|----------| -| `type` |enum: `chamfer`| | No | -| `faceId` |[`string`](/docs/kcl/types/string)| The id for the chamfer surface. | No | -| `tag` |[`TagDeclarator`](/docs/kcl/types#tag-declaration)| The tag. | No | -| `id` |[`string`](/docs/kcl/types/string)| The id of the geometry. | No | -| `sourceRange` |`[, `integer`, `integer`, `integer`]`| The source range. | No | - - ----- -Geometry metadata. - -**Type:** `object` - - - - - -## Properties - -| Property | Type | Description | Required | -|----------|------|-------------|----------| -| `type` |enum: `fillet`| | No | -| `faceId` |[`string`](/docs/kcl/types/string)| The id for the fillet surface. | No | -| `tag` |[`TagDeclarator`](/docs/kcl/types#tag-declaration)| The tag. | No | -| `id` |[`string`](/docs/kcl/types/string)| The id of the geometry. | No | -| `sourceRange` |`[, `integer`, `integer`, `integer`]`| The source range. | No | - - ----- - - - - diff --git a/docs/kcl/types/FaceTag.md b/docs/kcl/types/FaceTag.md deleted file mode 100644 index e9dad7cdd..000000000 --- a/docs/kcl/types/FaceTag.md +++ /dev/null @@ -1,41 +0,0 @@ ---- -title: "FaceTag" -excerpt: "A tag for a face." -layout: manual ---- - -A tag for a face. - - - - -**This schema accepts any of the following:** - - -[`StartOrEnd`](/docs/kcl/types/StartOrEnd) - - - - - - - - ----- -A tag for the face. - -[`TagIdentifier`](/docs/kcl/types#tag-identifier) - - - - - - - - ----- - - - - - diff --git a/docs/kcl/types/GeoMeta.md b/docs/kcl/types/GeoMeta.md deleted file mode 100644 index 35b8f4c9e..000000000 --- a/docs/kcl/types/GeoMeta.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -title: "GeoMeta" -excerpt: "Geometry metadata." -layout: manual ---- - -Geometry metadata. - -**Type:** `object` - - - - - -## Properties - -| Property | Type | Description | Required | -|----------|------|-------------|----------| -| `id` |[`string`](/docs/kcl/types/string)| The id of the geometry. | No | -| `sourceRange` |`[, `integer`, `integer`, `integer`]`| The source range. | No | - - diff --git a/docs/kcl/types/GeometryWithImportedGeometry.md b/docs/kcl/types/GeometryWithImportedGeometry.md deleted file mode 100644 index 3e73a32c8..000000000 --- a/docs/kcl/types/GeometryWithImportedGeometry.md +++ /dev/null @@ -1,84 +0,0 @@ ---- -title: "GeometryWithImportedGeometry" -excerpt: "A geometry including an imported geometry." -layout: manual ---- - -A geometry including an imported geometry. - - - - - -**This schema accepts exactly one of the following:** - - -**Type:** `object` - - - - - -## Properties - -| Property | Type | Description | Required | -|----------|------|-------------|----------| -| `type` |enum: [`Sketch`](/docs/kcl/types/Sketch)| | No | -| `id` |[`string`](/docs/kcl/types/string)| The id of the sketch (this will change when the engine's reference to it changes). | No | -| `paths` |`[` [`Path`](/docs/kcl/types/Path) `]`| The paths in the sketch. | No | -| `on` |[`SketchSurface`](/docs/kcl/types/SketchSurface)| What the sketch is on (can be a plane or a face). | No | -| `start` |[`BasePath`](/docs/kcl/types/BasePath)| The starting path. | No | -| `tags` |`object`| Tag identifiers that have been declared in this sketch. | No | -| `artifactId` |[`string`](/docs/kcl/types/string)| The original id of the sketch. This stays the same even if the sketch is is sketched on face etc. | No | -| `originalId` |[`string`](/docs/kcl/types/string)| | No | -| `units` |[`UnitLen`](/docs/kcl/types/UnitLen)| A unit of length. | No | - - ----- - -**Type:** `object` - - - - - -## Properties - -| Property | Type | Description | Required | -|----------|------|-------------|----------| -| `type` |enum: [`Solid`](/docs/kcl/types/Solid)| | No | -| `id` |[`string`](/docs/kcl/types/string)| The id of the solid. | No | -| `artifactId` |[`string`](/docs/kcl/types/string)| The artifact ID of the solid. Unlike `id`, this doesn't change. | No | -| `value` |`[` [`ExtrudeSurface`](/docs/kcl/types/ExtrudeSurface) `]`| The extrude surfaces. | No | -| `sketch` |[`Sketch`](/docs/kcl/types/Sketch)| The sketch. | No | -| `height` |[`number`](/docs/kcl/types/number)| The height of the solid. | No | -| `startCapId` |[`string`](/docs/kcl/types/string)| The id of the extrusion start cap | No | -| `endCapId` |[`string`](/docs/kcl/types/string)| The id of the extrusion end cap | No | -| `edgeCuts` |`[` [`EdgeCut`](/docs/kcl/types/EdgeCut) `]`| Chamfers or fillets on this solid. | No | -| `units` |[`UnitLen`](/docs/kcl/types/UnitLen)| The units of the solid. | No | -| `sectional` |`boolean`| Is this a sectional solid? | No | - - ----- -Data for an imported geometry. - -**Type:** `object` - - - - - -## Properties - -| Property | Type | Description | Required | -|----------|------|-------------|----------| -| `type` |enum: `ImportedGeometry`| | No | -| `id` |[`string`](/docs/kcl/types/string)| The ID of the imported geometry. | No | -| `value` |`[` [`string`](/docs/kcl/types/string) `]`| The original file paths. | No | - - ----- - - - - diff --git a/docs/kcl/types/KclNone.md b/docs/kcl/types/KclNone.md deleted file mode 100644 index 1e7c7f8a4..000000000 --- a/docs/kcl/types/KclNone.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -title: "KclNone" -excerpt: "KCL value for an optional parameter which was not given an argument. (remember, parameters are in the function declaration, arguments are in the function call/application)." -layout: manual ---- - -KCL value for an optional parameter which was not given an argument. (remember, parameters are in the function declaration, arguments are in the function call/application). - -**Type:** `object` - - - - - -## Properties - -| Property | Type | Description | Required | -|----------|------|-------------|----------| -| `digest` |`[, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`]`| | No | - - diff --git a/docs/kcl/types/KclValue.md b/docs/kcl/types/KclValue.md deleted file mode 100644 index d999068a5..000000000 --- a/docs/kcl/types/KclValue.md +++ /dev/null @@ -1,326 +0,0 @@ ---- -title: "KclValue" -excerpt: "Any KCL value." -layout: manual ---- - -Any KCL value. - - - - - -**This schema accepts exactly one of the following:** - - -**Type:** `object` - - - - - -## Properties - -| Property | Type | Description | Required | -|----------|------|-------------|----------| -| `type` |enum: `Uuid`| | No | -| `value` |[`string`](/docs/kcl/types/string)| | No | - - ----- - -**Type:** `object` - - - - - -## Properties - -| Property | Type | Description | Required | -|----------|------|-------------|----------| -| `type` |enum: `Bool`| | No | -| `value` |`boolean`| | No | - - ----- - -**Type:** `object` - - - - - -## Properties - -| Property | Type | Description | Required | -|----------|------|-------------|----------| -| `type` |enum: `Number`| | No | -| `value` |[`number`](/docs/kcl/types/number)| | No | -| `ty` |[`NumericType`](/docs/kcl/types/NumericType)| | No | - - ----- - -**Type:** `object` - - - - - -## Properties - -| Property | Type | Description | Required | -|----------|------|-------------|----------| -| `type` |enum: `String`| | No | -| `value` |[`string`](/docs/kcl/types/string)| | No | - - ----- - -**Type:** `object` - - - - - -## Properties - -| Property | Type | Description | Required | -|----------|------|-------------|----------| -| `type` |enum: `MixedArray`| | No | -| `value` |`[` [`KclValue`](/docs/kcl/types/KclValue) `]`| | No | - - ----- - -**Type:** `object` - - - - - -## Properties - -| Property | Type | Description | Required | -|----------|------|-------------|----------| -| `type` |enum: `HomArray`| | No | -| `value` |`[` [`KclValue`](/docs/kcl/types/KclValue) `]`| | No | - - ----- - -**Type:** `object` - - - - - -## Properties - -| Property | Type | Description | Required | -|----------|------|-------------|----------| -| `type` |enum: `Object`| | No | -| `value` |`object`| | No | - - ----- - -**Type:** `object` - - - - - -## Properties - -| Property | Type | Description | Required | -|----------|------|-------------|----------| -| `type` |enum: [`TagIdentifier`](/docs/kcl/types#tag-identifier)| | No | -| `value` |[`string`](/docs/kcl/types/string)| | No | - - ----- - -**Type:** `object` - - - - - -## Properties - -| Property | Type | Description | Required | -|----------|------|-------------|----------| -| `type` |enum: [`TagDeclarator`](/docs/kcl/types#tag-declaration)| | No | -| `value` |[`string`](/docs/kcl/types/string)| | No | -| `digest` |`[, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`]`| | No | -| `start` |`integer`| | No | -| `end` |`integer`| | No | - - ----- - -**Type:** `object` - - - - - -## Properties - -| Property | Type | Description | Required | -|----------|------|-------------|----------| -| `type` |enum: [`Plane`](/docs/kcl/types/Plane)| | No | -| `value` |[`Plane`](/docs/kcl/types/Plane)| | No | - - ----- - -**Type:** `object` - - - - - -## Properties - -| Property | Type | Description | Required | -|----------|------|-------------|----------| -| `type` |enum: [`Face`](/docs/kcl/types/Face)| | No | -| `value` |[`Face`](/docs/kcl/types/Face)| | No | - - ----- - -**Type:** `object` - - - - - -## Properties - -| Property | Type | Description | Required | -|----------|------|-------------|----------| -| `type` |enum: [`Sketch`](/docs/kcl/types/Sketch)| | No | -| `value` |[`Sketch`](/docs/kcl/types/Sketch)| | No | - - ----- - -**Type:** `object` - - - - - -## Properties - -| Property | Type | Description | Required | -|----------|------|-------------|----------| -| `type` |enum: [`Solid`](/docs/kcl/types/Solid)| | No | -| `value` |[`Solid`](/docs/kcl/types/Solid)| | No | - - ----- - -**Type:** `object` - - - - - -## Properties - -| Property | Type | Description | Required | -|----------|------|-------------|----------| -| `type` |enum: [`Helix`](/docs/kcl/types/Helix)| | No | -| `value` |[`Helix`](/docs/kcl/types/Helix)| | No | - - ----- -Data for an imported geometry. - -**Type:** `object` - - - - - -## Properties - -| Property | Type | Description | Required | -|----------|------|-------------|----------| -| `type` |enum: `ImportedGeometry`| | No | -| `id` |[`string`](/docs/kcl/types/string)| The ID of the imported geometry. | No | -| `value` |`[` [`string`](/docs/kcl/types/string) `]`| The original file paths. | No | - - ----- - -**Type:** `object` - - - - - -## Properties - -| Property | Type | Description | Required | -|----------|------|-------------|----------| -| `type` |enum: `Function`| | No | - - ----- - -**Type:** `object` - - - - - -## Properties - -| Property | Type | Description | Required | -|----------|------|-------------|----------| -| `type` |enum: `Module`| | No | -| `value` |`integer`| Identifier of a source file. Uses a u32 to keep the size small. | No | - - ----- - -**Type:** `object` - - - - - -## Properties - -| Property | Type | Description | Required | -|----------|------|-------------|----------| -| `type` |enum: `Type`| | No | - - ----- - -**Type:** `object` - - - - - -## Properties - -| Property | Type | Description | Required | -|----------|------|-------------|----------| -| `type` |enum: [`KclNone`](/docs/kcl/types/KclNone)| | No | -| `value` |[`KclNone`](/docs/kcl/types/KclNone)| KCL value for an optional parameter which was not given an argument. (remember, parameters are in the function declaration, arguments are in the function call/application). | No | - - ----- - - - - diff --git a/docs/kcl/types/ModuleId.md b/docs/kcl/types/ModuleId.md deleted file mode 100644 index 9ed25fcfe..000000000 --- a/docs/kcl/types/ModuleId.md +++ /dev/null @@ -1,16 +0,0 @@ ---- -title: "ModuleId" -excerpt: "Identifier of a source file. Uses a u32 to keep the size small." -layout: manual ---- - -Identifier of a source file. Uses a u32 to keep the size small. - -**Type:** `integer` (`uint32`) - - - - - - - diff --git a/docs/kcl/types/NumericType.md b/docs/kcl/types/NumericType.md deleted file mode 100644 index ad7be7a57..000000000 --- a/docs/kcl/types/NumericType.md +++ /dev/null @@ -1,282 +0,0 @@ ---- -title: "NumericType" -excerpt: "" -layout: manual ---- - - - - - - -**This schema accepts exactly one of the following:** - - -**Type:** `object` - - - -**This schema accepts exactly one of the following:** - - -**Type:** `object` - - - - - -## Properties - -| Property | Type | Description | Required | -|----------|------|-------------|----------| -| `type` |enum: `Count`| | No | - - ----- -A unit of length. - -**Type:** `object` - - - -**This schema accepts exactly one of the following:** - - -**Type:** `object` - - - - - -## Properties - -| Property | Type | Description | Required | -|----------|------|-------------|----------| -| `type` |enum: `Mm`| | No | - - ----- - -**Type:** `object` - - - - - -## Properties - -| Property | Type | Description | Required | -|----------|------|-------------|----------| -| `type` |enum: `Cm`| | No | - - ----- - -**Type:** `object` - - - - - -## Properties - -| Property | Type | Description | Required | -|----------|------|-------------|----------| -| `type` |enum: `M`| | No | - - ----- - -**Type:** `object` - - - - - -## Properties - -| Property | Type | Description | Required | -|----------|------|-------------|----------| -| `type` |enum: `Inches`| | No | - - ----- - -**Type:** `object` - - - - - -## Properties - -| Property | Type | Description | Required | -|----------|------|-------------|----------| -| `type` |enum: `Feet`| | No | - - ----- - -**Type:** `object` - - - - - -## Properties - -| Property | Type | Description | Required | -|----------|------|-------------|----------| -| `type` |enum: `Yards`| | No | - - ----- - -**Type:** `object` - - - - - -## Properties - -| Property | Type | Description | Required | -|----------|------|-------------|----------| -| `type` |enum: `Unknown`| | No | - - ----- - - -## Properties - -| Property | Type | Description | Required | -|----------|------|-------------|----------| -| `type` |enum: `Length`| | No | - - ----- -A unit of angle. - -**Type:** `object` - - - -**This schema accepts exactly one of the following:** - - -**Type:** `object` - - - - - -## Properties - -| Property | Type | Description | Required | -|----------|------|-------------|----------| -| `type` |enum: `Degrees`| | No | - - ----- - -**Type:** `object` - - - - - -## Properties - -| Property | Type | Description | Required | -|----------|------|-------------|----------| -| `type` |enum: `Radians`| | No | - - ----- - -**Type:** `object` - - - - - -## Properties - -| Property | Type | Description | Required | -|----------|------|-------------|----------| -| `type` |enum: `Unknown`| | No | - - ----- - - -## Properties - -| Property | Type | Description | Required | -|----------|------|-------------|----------| -| `type` |enum: `Angle`| | No | - - ----- - - -## Properties - -| Property | Type | Description | Required | -|----------|------|-------------|----------| -| `type` |enum: `Known`| | No | - - ----- - -**Type:** `object` - - - - - -## Properties - -| Property | Type | Description | Required | -|----------|------|-------------|----------| -| `type` |enum: `Default`| | No | -| `len` |[`UnitLen`](/docs/kcl/types/UnitLen)| A unit of length. | No | -| `angle` |[`UnitAngle`](/docs/kcl/types/UnitAngle)| A unit of angle. | No | - - ----- - -**Type:** `object` - - - - - -## Properties - -| Property | Type | Description | Required | -|----------|------|-------------|----------| -| `type` |enum: `Unknown`| | No | - - ----- - -**Type:** `object` - - - - - -## Properties - -| Property | Type | Description | Required | -|----------|------|-------------|----------| -| `type` |enum: `Any`| | No | - - ----- - - - - diff --git a/docs/kcl/types/Path.md b/docs/kcl/types/Path.md deleted file mode 100644 index 859c07fad..000000000 --- a/docs/kcl/types/Path.md +++ /dev/null @@ -1,247 +0,0 @@ ---- -title: "Path" -excerpt: "A path." -layout: manual ---- - -A path. - - - - - -**This schema accepts exactly one of the following:** - -A path that goes to a point. - -**Type:** `object` - - - - - -## Properties - -| Property | Type | Description | Required | -|----------|------|-------------|----------| -| `type` |enum: `ToPoint`| | No | -| `from` |`[number, number]`| The from point. | No | -| `to` |`[number, number]`| The to point. | No | -| `units` |[`UnitLen`](/docs/kcl/types/UnitLen)| A unit of length. | No | -| `tag` |[`TagDeclarator`](/docs/kcl/types#tag-declaration)| The tag of the path. | No | -| `__geoMeta` |[`GeoMeta`](/docs/kcl/types/GeoMeta)| Metadata. | No | - - ----- -A arc that is tangential to the last path segment that goes to a point - -**Type:** `object` - - - - - -## Properties - -| Property | Type | Description | Required | -|----------|------|-------------|----------| -| `type` |enum: `TangentialArcTo`| | No | -| `center` |`[number, number]`| the arc's center | No | -| `ccw` |`boolean`| arc's direction | No | -| `from` |`[number, number]`| The from point. | No | -| `to` |`[number, number]`| The to point. | No | -| `units` |[`UnitLen`](/docs/kcl/types/UnitLen)| A unit of length. | No | -| `tag` |[`TagDeclarator`](/docs/kcl/types#tag-declaration)| The tag of the path. | No | -| `__geoMeta` |[`GeoMeta`](/docs/kcl/types/GeoMeta)| Metadata. | No | - - ----- -A arc that is tangential to the last path segment - -**Type:** `object` - - - - - -## Properties - -| Property | Type | Description | Required | -|----------|------|-------------|----------| -| `type` |enum: `TangentialArc`| | No | -| `center` |`[number, number]`| the arc's center | No | -| `ccw` |`boolean`| arc's direction | No | -| `from` |`[number, number]`| The from point. | No | -| `to` |`[number, number]`| The to point. | No | -| `units` |[`UnitLen`](/docs/kcl/types/UnitLen)| A unit of length. | No | -| `tag` |[`TagDeclarator`](/docs/kcl/types#tag-declaration)| The tag of the path. | No | -| `__geoMeta` |[`GeoMeta`](/docs/kcl/types/GeoMeta)| Metadata. | No | - - ----- -a complete arc - -**Type:** `object` - - - - - -## Properties - -| Property | Type | Description | Required | -|----------|------|-------------|----------| -| `type` |enum: `Circle`| | No | -| `center` |`[number, number]`| the arc's center | No | -| `radius` |[`number`](/docs/kcl/types/number)| the arc's radius | No | -| `ccw` |`boolean`| arc's direction This is used to compute the tangential angle. | No | -| `from` |`[number, number]`| The from point. | No | -| `to` |`[number, number]`| The to point. | No | -| `units` |[`UnitLen`](/docs/kcl/types/UnitLen)| A unit of length. | No | -| `tag` |[`TagDeclarator`](/docs/kcl/types#tag-declaration)| The tag of the path. | No | -| `__geoMeta` |[`GeoMeta`](/docs/kcl/types/GeoMeta)| Metadata. | No | - - ----- -A base path. - -**Type:** `object` - - - - - -## Properties - -| Property | Type | Description | Required | -|----------|------|-------------|----------| -| `type` |enum: `CircleThreePoint`| | No | -| `p1` |`[number, number]`| Point 1 of the circle | No | -| `p2` |`[number, number]`| Point 2 of the circle | No | -| `p3` |`[number, number]`| Point 3 of the circle | No | -| `from` |`[number, number]`| The from point. | No | -| `to` |`[number, number]`| The to point. | No | -| `units` |[`UnitLen`](/docs/kcl/types/UnitLen)| A unit of length. | No | -| `tag` |[`TagDeclarator`](/docs/kcl/types#tag-declaration)| The tag of the path. | No | -| `__geoMeta` |[`GeoMeta`](/docs/kcl/types/GeoMeta)| Metadata. | No | - - ----- -A base path. - -**Type:** `object` - - - - - -## Properties - -| Property | Type | Description | Required | -|----------|------|-------------|----------| -| `type` |enum: `ArcThreePoint`| | No | -| `p1` |`[number, number]`| Point 1 of the arc (base on the end of previous segment) | No | -| `p2` |`[number, number]`| Point 2 of the arc (interiorAbsolute kwarg) | No | -| `p3` |`[number, number]`| Point 3 of the arc (endAbsolute kwarg) | No | -| `from` |`[number, number]`| The from point. | No | -| `to` |`[number, number]`| The to point. | No | -| `units` |[`UnitLen`](/docs/kcl/types/UnitLen)| A unit of length. | No | -| `tag` |[`TagDeclarator`](/docs/kcl/types#tag-declaration)| The tag of the path. | No | -| `__geoMeta` |[`GeoMeta`](/docs/kcl/types/GeoMeta)| Metadata. | No | - - ----- -A path that is horizontal. - -**Type:** `object` - - - - - -## Properties - -| Property | Type | Description | Required | -|----------|------|-------------|----------| -| `type` |enum: `Horizontal`| | No | -| `x` |[`number`](/docs/kcl/types/number)| The x coordinate. | No | -| `from` |`[number, number]`| The from point. | No | -| `to` |`[number, number]`| The to point. | No | -| `units` |[`UnitLen`](/docs/kcl/types/UnitLen)| A unit of length. | No | -| `tag` |[`TagDeclarator`](/docs/kcl/types#tag-declaration)| The tag of the path. | No | -| `__geoMeta` |[`GeoMeta`](/docs/kcl/types/GeoMeta)| Metadata. | No | - - ----- -An angled line to. - -**Type:** `object` - - - - - -## Properties - -| Property | Type | Description | Required | -|----------|------|-------------|----------| -| `type` |enum: `AngledLineTo`| | No | -| `x` |[`number`](/docs/kcl/types/number)| The x coordinate. | No | -| `y` |[`number`](/docs/kcl/types/number)| The y coordinate. | No | -| `from` |`[number, number]`| The from point. | No | -| `to` |`[number, number]`| The to point. | No | -| `units` |[`UnitLen`](/docs/kcl/types/UnitLen)| A unit of length. | No | -| `tag` |[`TagDeclarator`](/docs/kcl/types#tag-declaration)| The tag of the path. | No | -| `__geoMeta` |[`GeoMeta`](/docs/kcl/types/GeoMeta)| Metadata. | No | - - ----- -A base path. - -**Type:** `object` - - - - - -## Properties - -| Property | Type | Description | Required | -|----------|------|-------------|----------| -| `type` |enum: `Base`| | No | -| `from` |`[number, number]`| The from point. | No | -| `to` |`[number, number]`| The to point. | No | -| `units` |[`UnitLen`](/docs/kcl/types/UnitLen)| A unit of length. | No | -| `tag` |[`TagDeclarator`](/docs/kcl/types#tag-declaration)| The tag of the path. | No | -| `__geoMeta` |[`GeoMeta`](/docs/kcl/types/GeoMeta)| Metadata. | No | - - ----- -A circular arc, not necessarily tangential to the current point. - -**Type:** `object` - - - - - -## Properties - -| Property | Type | Description | Required | -|----------|------|-------------|----------| -| `type` |enum: `Arc`| | No | -| `center` |`[number, number]`| Center of the circle that this arc is drawn on. | No | -| `radius` |[`number`](/docs/kcl/types/number)| Radius of the circle that this arc is drawn on. | No | -| `ccw` |`boolean`| True if the arc is counterclockwise. | No | -| `from` |`[number, number]`| The from point. | No | -| `to` |`[number, number]`| The to point. | No | -| `units` |[`UnitLen`](/docs/kcl/types/UnitLen)| A unit of length. | No | -| `tag` |[`TagDeclarator`](/docs/kcl/types#tag-declaration)| The tag of the path. | No | -| `__geoMeta` |[`GeoMeta`](/docs/kcl/types/GeoMeta)| Metadata. | No | - - ----- - - - - diff --git a/docs/kcl/types/PlaneData.md b/docs/kcl/types/PlaneData.md deleted file mode 100644 index 205ee2865..000000000 --- a/docs/kcl/types/PlaneData.md +++ /dev/null @@ -1,106 +0,0 @@ ---- -title: "PlaneData" -excerpt: "Orientation data that can be used to construct a plane, not a plane in itself." -layout: manual ---- - -Orientation data that can be used to construct a plane, not a plane in itself. - - - - - -**This schema accepts exactly one of the following:** - -The XY plane. - -**enum:** `XY` - - - - - - - - ----- -The opposite side of the XY plane. - -**enum:** `-XY` - - - - - - - - ----- -The XZ plane. - -**enum:** `XZ` - - - - - - - - ----- -The opposite side of the XZ plane. - -**enum:** `-XZ` - - - - - - - - ----- -The YZ plane. - -**enum:** `YZ` - - - - - - - - ----- -The opposite side of the YZ plane. - -**enum:** `-YZ` - - - - - - - - ----- -A defined plane. - -**Type:** `object` - - - - - -## Properties - -| Property | Type | Description | Required | -|----------|------|-------------|----------| -| `plane` |[`PlaneInfo`](/docs/kcl/types/PlaneInfo)| | No | - - ----- - - - - diff --git a/docs/kcl/types/PlaneInfo.md b/docs/kcl/types/PlaneInfo.md deleted file mode 100644 index b71c72ecd..000000000 --- a/docs/kcl/types/PlaneInfo.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -title: "PlaneInfo" -excerpt: "" -layout: manual ---- - - -**Type:** `object` - - - - - -## Properties - -| Property | Type | Description | Required | -|----------|------|-------------|----------| -| `origin` |[`Point3d`](/docs/kcl/types/Point3d)| Origin of the plane. | No | -| `xAxis` |[`Point3d`](/docs/kcl/types/Point3d)| What should the plane's X axis be? | No | -| `yAxis` |[`Point3d`](/docs/kcl/types/Point3d)| What should the plane's Y axis be? | No | - - diff --git a/docs/kcl/types/PlaneType.md b/docs/kcl/types/PlaneType.md deleted file mode 100644 index e2ccc50de..000000000 --- a/docs/kcl/types/PlaneType.md +++ /dev/null @@ -1,53 +0,0 @@ ---- -title: "PlaneType" -excerpt: "Type for a plane." -layout: manual ---- - -Type for a plane. - - - - - -**This schema accepts exactly one of the following:** - - -**enum:** `XY`, `XZ`, `YZ` - - - - - - - - ----- -A custom plane. - -**enum:** `Custom` - - - - - - - - ----- -A custom plane which has not been sent to the engine. It must be sent before it is used. - -**enum:** `Uninit` - - - - - - - - ----- - - - - diff --git a/docs/kcl/types/Point2d.md b/docs/kcl/types/Point2d.md deleted file mode 100644 index 74ca70469..000000000 --- a/docs/kcl/types/Point2d.md +++ /dev/null @@ -1,17 +0,0 @@ ---- -title: "std::types::Point2d" -excerpt: "A point in two dimensional space." -layout: manual ---- - -A point in two dimensional space. - -```kcl -type [Point2d](/docs/kcl/types/Point2d) = [[number](/docs/kcl/types/number)(Length); 2] -``` - -[`Point2d`](/docs/kcl/types/Point2d) is an alias for a two-element array of [number](/docs/kcl/types/number)s. To write a value -with type [`Point2d`](/docs/kcl/types/Point2d), use an array, e.g., `[0, 0]` or `[5.0, 3.14]`. - - - diff --git a/docs/kcl/types/Point3d.md b/docs/kcl/types/Point3d.md deleted file mode 100644 index af4efdcfd..000000000 --- a/docs/kcl/types/Point3d.md +++ /dev/null @@ -1,17 +0,0 @@ ---- -title: "std::types::Point3d" -excerpt: "A point in three dimensional space." -layout: manual ---- - -A point in three dimensional space. - -```kcl -type [Point3d](/docs/kcl/types/Point3d) = [[number](/docs/kcl/types/number)(Length); 3] -``` - -[`Point3d`](/docs/kcl/types/Point3d) is an alias for a three-element array of [number](/docs/kcl/types/number)s. To write a value -with type [`Point3d`](/docs/kcl/types/Point3d), use an array, e.g., `[0, 0, 0]` or `[5.0, 3.14, 6.8]`. - - - diff --git a/docs/kcl/types/SketchData.md b/docs/kcl/types/SketchData.md deleted file mode 100644 index a727c58a9..000000000 --- a/docs/kcl/types/SketchData.md +++ /dev/null @@ -1,52 +0,0 @@ ---- -title: "SketchData" -excerpt: "Data for start sketch on. You can start a sketch on a plane or an solid." -layout: manual ---- - -Data for start sketch on. You can start a sketch on a plane or an solid. - - - - -**This schema accepts any of the following:** - -Orientation data that can be used to construct a plane, not a plane in itself. - -[`PlaneData`](/docs/kcl/types/PlaneData) - - - - - - - - ----- - -[`Plane`](/docs/kcl/types/Plane) - - - - - - - - ----- - -[`Solid`](/docs/kcl/types/Solid) - - - - - - - - ----- - - - - - diff --git a/docs/kcl/types/SketchOrSurface.md b/docs/kcl/types/SketchOrSurface.md deleted file mode 100644 index 1fc748b53..000000000 --- a/docs/kcl/types/SketchOrSurface.md +++ /dev/null @@ -1,41 +0,0 @@ ---- -title: "SketchOrSurface" -excerpt: "A sketch surface or a sketch." -layout: manual ---- - -A sketch surface or a sketch. - - - - -**This schema accepts any of the following:** - -A sketch type. - -[`SketchSurface`](/docs/kcl/types/SketchSurface) - - - - - - - - ----- - -[`Sketch`](/docs/kcl/types/Sketch) - - - - - - - - ----- - - - - - diff --git a/docs/kcl/types/SketchSurface.md b/docs/kcl/types/SketchSurface.md deleted file mode 100644 index 534081971..000000000 --- a/docs/kcl/types/SketchSurface.md +++ /dev/null @@ -1,62 +0,0 @@ ---- -title: "SketchSurface" -excerpt: "A sketch type." -layout: manual ---- - -A sketch type. - - - - - -**This schema accepts exactly one of the following:** - - -**Type:** `object` - - - - - -## Properties - -| Property | Type | Description | Required | -|----------|------|-------------|----------| -| `type` |enum: `plane`| | No | -| `id` |[`string`](/docs/kcl/types/string)| The id of the plane. | No | -| `artifactId` |[`string`](/docs/kcl/types/string)| The artifact ID. | No | -| `value` |[`PlaneType`](/docs/kcl/types/PlaneType)| Type for a plane. | No | -| `origin` |[`Point3d`](/docs/kcl/types/Point3d)| Origin of the plane. | No | -| `xAxis` |[`Point3d`](/docs/kcl/types/Point3d)| What should the plane's X axis be? | No | -| `yAxis` |[`Point3d`](/docs/kcl/types/Point3d)| What should the plane's Y axis be? | No | - - ----- -A face. - -**Type:** `object` - - - - - -## Properties - -| Property | Type | Description | Required | -|----------|------|-------------|----------| -| `type` |enum: `face`| | No | -| `id` |[`string`](/docs/kcl/types/string)| The id of the face. | No | -| `artifactId` |[`string`](/docs/kcl/types/string)| The artifact ID. | No | -| `value` |[`string`](/docs/kcl/types/string)| The tag of the face. | No | -| `xAxis` |[`Point3d`](/docs/kcl/types/Point3d)| What should the face's X axis be? | No | -| `yAxis` |[`Point3d`](/docs/kcl/types/Point3d)| What should the face's Y axis be? | No | -| `solid` |[`Solid`](/docs/kcl/types/Solid)| The solid the face is on. | No | -| `units` |[`UnitLen`](/docs/kcl/types/UnitLen)| A unit of length. | No | - - ----- - - - - diff --git a/docs/kcl/types/SolidOrImportedGeometry.md b/docs/kcl/types/SolidOrImportedGeometry.md deleted file mode 100644 index 5944c7ba5..000000000 --- a/docs/kcl/types/SolidOrImportedGeometry.md +++ /dev/null @@ -1,51 +0,0 @@ ---- -title: "SolidOrImportedGeometry" -excerpt: "Data for a solid or an imported geometry." -layout: manual ---- - -Data for a solid or an imported geometry. - - - - - -**This schema accepts exactly one of the following:** - -Data for an imported geometry. - -**Type:** `object` - - - - - -## Properties - -| Property | Type | Description | Required | -|----------|------|-------------|----------| -| `type` |enum: `importedGeometry`| | No | -| `id` |[`string`](/docs/kcl/types/string)| The ID of the imported geometry. | No | -| `value` |`[` [`string`](/docs/kcl/types/string) `]`| The original file paths. | No | - - ----- - -**Type:** `[object, array]` - -`[` [`Solid`](/docs/kcl/types/Solid) `]` - - - -## Properties - -| Property | Type | Description | Required | -|----------|------|-------------|----------| -| `type` |enum: `solidSet`| | No | - - ----- - - - - diff --git a/docs/kcl/types/SolidOrSketchOrImportedGeometry.md b/docs/kcl/types/SolidOrSketchOrImportedGeometry.md deleted file mode 100644 index 4da6545b1..000000000 --- a/docs/kcl/types/SolidOrSketchOrImportedGeometry.md +++ /dev/null @@ -1,66 +0,0 @@ ---- -title: "SolidOrSketchOrImportedGeometry" -excerpt: "Data for a solid, sketch, or an imported geometry." -layout: manual ---- - -Data for a solid, sketch, or an imported geometry. - - - - - -**This schema accepts exactly one of the following:** - -Data for an imported geometry. - -**Type:** `object` - - - - - -## Properties - -| Property | Type | Description | Required | -|----------|------|-------------|----------| -| `type` |enum: `importedGeometry`| | No | -| `id` |[`string`](/docs/kcl/types/string)| The ID of the imported geometry. | No | -| `value` |`[` [`string`](/docs/kcl/types/string) `]`| The original file paths. | No | - - ----- - -**Type:** `[object, array]` - -`[` [`Solid`](/docs/kcl/types/Solid) `]` - - - -## Properties - -| Property | Type | Description | Required | -|----------|------|-------------|----------| -| `type` |enum: `solidSet`| | No | - - ----- - -**Type:** `[object, array]` - -`[` [`Sketch`](/docs/kcl/types/Sketch) `]` - - - -## Properties - -| Property | Type | Description | Required | -|----------|------|-------------|----------| -| `type` |enum: `sketchSet`| | No | - - ----- - - - - diff --git a/docs/kcl/types/StartOrEnd.md b/docs/kcl/types/StartOrEnd.md deleted file mode 100644 index 6e8ed9329..000000000 --- a/docs/kcl/types/StartOrEnd.md +++ /dev/null @@ -1,41 +0,0 @@ ---- -title: "StartOrEnd" -excerpt: "" -layout: manual ---- - - - - - - -**This schema accepts exactly one of the following:** - -The start face as in before you extruded. This could also be known as the bottom face. But we do not call it bottom because it would be the top face if you extruded it in the opposite direction or flipped the camera. - -**enum:** `start` - - - - - - - - ----- -The end face after you extruded. This could also be known as the top face. But we do not call it top because it would be the bottom face if you extruded it in the opposite direction or flipped the camera. - -**enum:** `end` - - - - - - - - ----- - - - - diff --git a/docs/kcl/types/SweepPath.md b/docs/kcl/types/SweepPath.md deleted file mode 100644 index b8e7e0865..000000000 --- a/docs/kcl/types/SweepPath.md +++ /dev/null @@ -1,40 +0,0 @@ ---- -title: "SweepPath" -excerpt: "A path to sweep along." -layout: manual ---- - -A path to sweep along. - - - - -**This schema accepts any of the following:** - - -[`Sketch`](/docs/kcl/types/Sketch) - - - - - - - - ----- - -[`Helix`](/docs/kcl/types/Helix) - - - - - - - - ----- - - - - - diff --git a/docs/kcl/types/UnitAngle.md b/docs/kcl/types/UnitAngle.md deleted file mode 100644 index 09a6aa892..000000000 --- a/docs/kcl/types/UnitAngle.md +++ /dev/null @@ -1,63 +0,0 @@ ---- -title: "UnitAngle" -excerpt: "A unit of angle." -layout: manual ---- - -A unit of angle. - - - - - -**This schema accepts exactly one of the following:** - - -**Type:** `object` - - - - - -## Properties - -| Property | Type | Description | Required | -|----------|------|-------------|----------| -| `type` |enum: `Degrees`| | No | - - ----- - -**Type:** `object` - - - - - -## Properties - -| Property | Type | Description | Required | -|----------|------|-------------|----------| -| `type` |enum: `Radians`| | No | - - ----- - -**Type:** `object` - - - - - -## Properties - -| Property | Type | Description | Required | -|----------|------|-------------|----------| -| `type` |enum: `Unknown`| | No | - - ----- - - - - diff --git a/docs/kcl/types/UnitLen.md b/docs/kcl/types/UnitLen.md deleted file mode 100644 index 5e00e5c39..000000000 --- a/docs/kcl/types/UnitLen.md +++ /dev/null @@ -1,123 +0,0 @@ ---- -title: "UnitLen" -excerpt: "A unit of length." -layout: manual ---- - -A unit of length. - - - - - -**This schema accepts exactly one of the following:** - - -**Type:** `object` - - - - - -## Properties - -| Property | Type | Description | Required | -|----------|------|-------------|----------| -| `type` |enum: `Mm`| | No | - - ----- - -**Type:** `object` - - - - - -## Properties - -| Property | Type | Description | Required | -|----------|------|-------------|----------| -| `type` |enum: `Cm`| | No | - - ----- - -**Type:** `object` - - - - - -## Properties - -| Property | Type | Description | Required | -|----------|------|-------------|----------| -| `type` |enum: `M`| | No | - - ----- - -**Type:** `object` - - - - - -## Properties - -| Property | Type | Description | Required | -|----------|------|-------------|----------| -| `type` |enum: `Inches`| | No | - - ----- - -**Type:** `object` - - - - - -## Properties - -| Property | Type | Description | Required | -|----------|------|-------------|----------| -| `type` |enum: `Feet`| | No | - - ----- - -**Type:** `object` - - - - - -## Properties - -| Property | Type | Description | Required | -|----------|------|-------------|----------| -| `type` |enum: `Yards`| | No | - - ----- - -**Type:** `object` - - - - - -## Properties - -| Property | Type | Description | Required | -|----------|------|-------------|----------| -| `type` |enum: `Unknown`| | No | - - ----- - - - - diff --git a/docs/kcl/types/Axis2d.md b/docs/kcl/types/std-types-Axis2d.md similarity index 100% rename from docs/kcl/types/Axis2d.md rename to docs/kcl/types/std-types-Axis2d.md diff --git a/docs/kcl/types/Axis3d.md b/docs/kcl/types/std-types-Axis3d.md similarity index 100% rename from docs/kcl/types/Axis3d.md rename to docs/kcl/types/std-types-Axis3d.md diff --git a/docs/kcl/types/Edge.md b/docs/kcl/types/std-types-Edge.md similarity index 100% rename from docs/kcl/types/Edge.md rename to docs/kcl/types/std-types-Edge.md diff --git a/docs/kcl/types/Face.md b/docs/kcl/types/std-types-Face.md similarity index 100% rename from docs/kcl/types/Face.md rename to docs/kcl/types/std-types-Face.md diff --git a/docs/kcl/types/Helix.md b/docs/kcl/types/std-types-Helix.md similarity index 100% rename from docs/kcl/types/Helix.md rename to docs/kcl/types/std-types-Helix.md diff --git a/docs/kcl/types/Plane.md b/docs/kcl/types/std-types-Plane.md similarity index 100% rename from docs/kcl/types/Plane.md rename to docs/kcl/types/std-types-Plane.md diff --git a/docs/kcl/types/std-types-Point2d.md b/docs/kcl/types/std-types-Point2d.md new file mode 100644 index 000000000..ebeb4a3dc --- /dev/null +++ b/docs/kcl/types/std-types-Point2d.md @@ -0,0 +1,17 @@ +--- +title: "std::types::Point2d" +excerpt: "A point in two dimensional space." +layout: manual +--- + +A point in two dimensional space. + +```kcl +type Point2d = [number(Length); 2] +``` + +[`Point2d`](/docs/kcl/types/std-types-Point2d) is an alias for a two-element array of [number](/docs/kcl/types/number)s. To write a value +with type [`Point2d`](/docs/kcl/types/std-types-Point2d), use an array, e.g., `[0, 0]` or `[5.0, 3.14]`. + + + diff --git a/docs/kcl/types/std-types-Point3d.md b/docs/kcl/types/std-types-Point3d.md new file mode 100644 index 000000000..ea23e7c86 --- /dev/null +++ b/docs/kcl/types/std-types-Point3d.md @@ -0,0 +1,17 @@ +--- +title: "std::types::Point3d" +excerpt: "A point in three dimensional space." +layout: manual +--- + +A point in three dimensional space. + +```kcl +type Point3d = [number(Length); 3] +``` + +[`Point3d`](/docs/kcl/types/std-types-Point3d) is an alias for a three-element array of [number](/docs/kcl/types/number)s. To write a value +with type [`Point3d`](/docs/kcl/types/std-types-Point3d), use an array, e.g., `[0, 0, 0]` or `[5.0, 3.14, 6.8]`. + + + diff --git a/docs/kcl/types/Sketch.md b/docs/kcl/types/std-types-Sketch.md similarity index 99% rename from docs/kcl/types/Sketch.md rename to docs/kcl/types/std-types-Sketch.md index c0cd6408d..5f3368955 100644 --- a/docs/kcl/types/Sketch.md +++ b/docs/kcl/types/std-types-Sketch.md @@ -17,7 +17,7 @@ mySketch = startSketchOn(XY) |> close() ``` -The `mySketch` variable will be an executed [`Sketch`](/docs/kcl/types/Sketch) object. Executed being past +The `mySketch` variable will be an executed [`Sketch`](/docs/kcl/types/std-types-Sketch) object. Executed being past tense, because the engine has already executed the commands to create the sketch. The previous sketch commands will never be executed again, in this case. diff --git a/docs/kcl/types/Solid.md b/docs/kcl/types/std-types-Solid.md similarity index 99% rename from docs/kcl/types/Solid.md rename to docs/kcl/types/std-types-Solid.md index 888483e11..c27885419 100644 --- a/docs/kcl/types/Solid.md +++ b/docs/kcl/types/std-types-Solid.md @@ -18,7 +18,7 @@ myPart = startSketchOn(XY) |> extrude(length = 6) ``` -The `myPart` variable will be an executed [`Solid`](/docs/kcl/types/Solid) object. Executed being past +The `myPart` variable will be an executed [`Solid`](/docs/kcl/types/std-types-Solid) object. Executed being past tense, because the engine has already executed the commands to create the solid. The previous solid commands will never be executed again, in this case. diff --git a/docs/kcl/types/std-types-any.md b/docs/kcl/types/std-types-any.md new file mode 100644 index 000000000..6aba5d838 --- /dev/null +++ b/docs/kcl/types/std-types-any.md @@ -0,0 +1,12 @@ +--- +title: "any" +excerpt: "Any value." +layout: manual +--- + +Any value. + + + + + diff --git a/docs/kcl/types/bool.md b/docs/kcl/types/std-types-bool.md similarity index 100% rename from docs/kcl/types/bool.md rename to docs/kcl/types/std-types-bool.md diff --git a/docs/kcl/types/number.md b/docs/kcl/types/std-types-number.md similarity index 100% rename from docs/kcl/types/number.md rename to docs/kcl/types/std-types-number.md diff --git a/docs/kcl/types/string.md b/docs/kcl/types/std-types-string.md similarity index 100% rename from docs/kcl/types/string.md rename to docs/kcl/types/std-types-string.md diff --git a/docs/kcl/types/tag.md b/docs/kcl/types/std-types-tag.md similarity index 96% rename from docs/kcl/types/tag.md rename to docs/kcl/types/std-types-tag.md index 747bf2f5b..ad6efad64 100644 --- a/docs/kcl/types/tag.md +++ b/docs/kcl/types/std-types-tag.md @@ -62,8 +62,8 @@ fn rect(origin) { |> close() } -rect([0, 0]) -rect([20, 0]) +rect(origin = [0, 0]) +rect(origin = [20, 0]) ``` Those tags would only be available in the `rect` function and not globally. @@ -90,8 +90,8 @@ fn rect(origin) { |> close() } -rect([0, 0]) -myRect = rect([20, 0]) +rect(origin = [0, 0]) +myRect = rect(origin = [20, 0]) myRect |> extrude(length = 10) diff --git a/docs/kcl/union.md b/docs/kcl/union.md index f184bbbf0..85920bc9d 100644 --- a/docs/kcl/union.md +++ b/docs/kcl/union.md @@ -10,9 +10,9 @@ Union two or more solids into a single solid. ```kcl union( - solids: [[[Solid](/docs/kcl/types/Solid)]](/docs/kcl/types/[Solid](/docs/kcl/types/Solid)), - tolerance?: [number](/docs/kcl/types/number), -): [[[Solid](/docs/kcl/types/Solid)]](/docs/kcl/types/[Solid](/docs/kcl/types/Solid)) + solids: [Solid], + tolerance?: number, +): [Solid] ``` @@ -20,12 +20,12 @@ union( | Name | Type | Description | Required | |----------|------|-------------|----------| -| `solids` | [`[Solid]`](/docs/kcl/types/Solid) | The solids to union. | Yes | -| `tolerance` | [`number`](/docs/kcl/types/number) | The tolerance to use for the union operation. | No | +| `solids` | [`[Solid]`](/docs/kcl/types/std-types-Solid) | The solids to union. | Yes | +| `tolerance` | [`number`](/docs/kcl/types/std-types-number) | The tolerance to use for the union operation. | No | ### Returns -[`[Solid]`](/docs/kcl/types/Solid) +[`[Solid]`](/docs/kcl/types/std-types-Solid) ### Examples @@ -44,8 +44,8 @@ fn cube(center, size) { |> extrude(length = 10) } -part001 = cube([0, 0], 10) -part002 = cube([7, 3], 5) +part001 = cube(center = [0, 0], size = 10) +part002 = cube(center = [7, 3], size = 5) |> translate(z = 1) unionedPart = union([part001, part002]) @@ -69,8 +69,8 @@ fn cube(center, size) { |> extrude(length = 10) } -part001 = cube([0, 0], 10) -part002 = cube([7, 3], 5) +part001 = cube(center = [0, 0], size = 10) +part002 = cube(center = [7, 3], size = 5) |> translate(z = 1) // This is the equivalent of: union([part001, part002]) @@ -95,8 +95,8 @@ fn cube(center, size) { |> extrude(length = 10) } -part001 = cube([0, 0], 10) -part002 = cube([7, 3], 5) +part001 = cube(center = [0, 0], size = 10) +part002 = cube(center = [7, 3], size = 5) |> translate(z = 1) // This is the equivalent of: union([part001, part002]) diff --git a/docs/kcl/xLine.md b/docs/kcl/xLine.md index fa1f8430f..e927ce01c 100644 --- a/docs/kcl/xLine.md +++ b/docs/kcl/xLine.md @@ -10,11 +10,11 @@ Draw a line relative to the current origin to a specified distance away from the ```kcl xLine( - sketch: [Sketch](/docs/kcl/types/Sketch), - length?: [number](/docs/kcl/types/number), - endAbsolute?: [number](/docs/kcl/types/number), - tag?: [TagDeclarator](/docs/kcl/types#tag-declaration), -): [Sketch](/docs/kcl/types/Sketch) + sketch: Sketch, + length?: number, + endAbsolute?: number, + tag?: TagDeclarator, +): Sketch ``` @@ -22,14 +22,14 @@ xLine( | Name | Type | Description | Required | |----------|------|-------------|----------| -| `sketch` | [`Sketch`](/docs/kcl/types/Sketch) | Which sketch should this path be added to? | Yes | -| `length` | [`number`](/docs/kcl/types/number) | How far away along the X axis should this line go? Incompatible with `endAbsolute`. | No | -| `endAbsolute` | [`number`](/docs/kcl/types/number) | Which absolute X value should this line go to? Incompatible with `length`. | No | -| `tag` | [`TagDeclarator`](/docs/kcl/types#tag-declaration) | Create a new tag which refers to this line | No | +| `sketch` | [`Sketch`](/docs/kcl/types/std-types-Sketch) | Which sketch should this path be added to? | Yes | +| `length` | [`number`](/docs/kcl/types/std-types-number) | How far away along the X axis should this line go? Incompatible with `endAbsolute`. | No | +| `endAbsolute` | [`number`](/docs/kcl/types/std-types-number) | Which absolute X value should this line go to? Incompatible with `length`. | No | +| [`tag`](/docs/kcl/types/std-types-tag) | [`TagDeclarator`](/docs/kcl/types#TagDeclarator) | Create a new tag which refers to this line | No | ### Returns -[`Sketch`](/docs/kcl/types/Sketch) +[`Sketch`](/docs/kcl/types/std-types-Sketch) ### Examples diff --git a/docs/kcl/yLine.md b/docs/kcl/yLine.md index 9ef57fb0f..5a60f5288 100644 --- a/docs/kcl/yLine.md +++ b/docs/kcl/yLine.md @@ -10,11 +10,11 @@ Draw a line relative to the current origin to a specified distance away from the ```kcl yLine( - sketch: [Sketch](/docs/kcl/types/Sketch), - length?: [number](/docs/kcl/types/number), - endAbsolute?: [number](/docs/kcl/types/number), - tag?: [TagDeclarator](/docs/kcl/types#tag-declaration), -): [Sketch](/docs/kcl/types/Sketch) + sketch: Sketch, + length?: number, + endAbsolute?: number, + tag?: TagDeclarator, +): Sketch ``` @@ -22,14 +22,14 @@ yLine( | Name | Type | Description | Required | |----------|------|-------------|----------| -| `sketch` | [`Sketch`](/docs/kcl/types/Sketch) | Which sketch should this path be added to? | Yes | -| `length` | [`number`](/docs/kcl/types/number) | How far away along the Y axis should this line go? Incompatible with `endAbsolute`. | No | -| `endAbsolute` | [`number`](/docs/kcl/types/number) | Which absolute Y value should this line go to? Incompatible with `length`. | No | -| `tag` | [`TagDeclarator`](/docs/kcl/types#tag-declaration) | Create a new tag which refers to this line | No | +| `sketch` | [`Sketch`](/docs/kcl/types/std-types-Sketch) | Which sketch should this path be added to? | Yes | +| `length` | [`number`](/docs/kcl/types/std-types-number) | How far away along the Y axis should this line go? Incompatible with `endAbsolute`. | No | +| `endAbsolute` | [`number`](/docs/kcl/types/std-types-number) | Which absolute Y value should this line go to? Incompatible with `length`. | No | +| [`tag`](/docs/kcl/types/std-types-tag) | [`TagDeclarator`](/docs/kcl/types#TagDeclarator) | Create a new tag which refers to this line | No | ### Returns -[`Sketch`](/docs/kcl/types/Sketch) +[`Sketch`](/docs/kcl/types/std-types-Sketch) ### Examples diff --git a/e2e/playwright/app-header-tests.spec.ts b/e2e/playwright/app-header-tests.spec.ts index 45cfa6614..96f8eb9b9 100644 --- a/e2e/playwright/app-header-tests.spec.ts +++ b/e2e/playwright/app-header-tests.spec.ts @@ -1,4 +1,6 @@ import { expect, test } from '@e2e/playwright/zoo-test' +import { join } from 'path' +import * as fsp from 'fs/promises' test.describe('Electron app header tests', () => { test( @@ -43,4 +45,33 @@ test.describe('Electron app header tests', () => { await expect(userSettingsButton).toHaveText(text) } ) + + test('Share button is disabled when imports are present', async ({ + page, + context, + homePage, + toolbar, + }) => { + const projectName = 'share-disabled-for-imports' + await context.folderSetupFn(async (dir) => { + const testDir = join(dir, projectName) + await fsp.mkdir(testDir, { recursive: true }) + + await fsp.writeFile(join(testDir, 'deps.kcl'), 'export x = 42') + await fsp.writeFile(join(testDir, 'main.kcl'), 'import x from "deps.kcl"') + }) + + await page.setBodyDimensions({ width: 1200, height: 500 }) + await homePage.openProject(projectName) + const shareButton = page.getByTestId('share-button') + + // Open deps.kcl (which has no imports) and verify share button is enabled + await toolbar.fileTreeBtn.click() + await toolbar.openFile('deps.kcl') + await expect(shareButton).not.toBeDisabled() + + // Open main.kcl (which has an import) and verify share button is disabled + await toolbar.openFile('main.kcl') + await expect(shareButton).toBeDisabled() + }) }) diff --git a/e2e/playwright/fixtures/homePageFixture.ts b/e2e/playwright/fixtures/homePageFixture.ts index 437651616..4878e5fbb 100644 --- a/e2e/playwright/fixtures/homePageFixture.ts +++ b/e2e/playwright/fixtures/homePageFixture.ts @@ -24,7 +24,6 @@ export class HomePageFixture { projectTextName!: Locator sortByDateBtn!: Locator sortByNameBtn!: Locator - tutorialBtn!: Locator constructor(page: Page) { this.page = page @@ -44,7 +43,6 @@ export class HomePageFixture { this.sortByDateBtn = this.page.getByTestId('home-sort-by-modified') this.sortByNameBtn = this.page.getByTestId('home-sort-by-name') - this.tutorialBtn = this.page.getByTestId('home-tutorial-button') } private _serialiseSortBy = async (): Promise< diff --git a/e2e/playwright/fixtures/toolbarFixture.ts b/e2e/playwright/fixtures/toolbarFixture.ts index ae51d659a..ed7bffe79 100644 --- a/e2e/playwright/fixtures/toolbarFixture.ts +++ b/e2e/playwright/fixtures/toolbarFixture.ts @@ -17,8 +17,6 @@ type LengthUnitLabel = (typeof baseUnitLabels)[keyof typeof baseUnitLabels] export class ToolbarFixture { public page: Page - projectName!: Locator - fileName!: Locator extrudeButton!: Locator loftButton!: Locator sweepButton!: Locator @@ -55,8 +53,6 @@ export class ToolbarFixture { constructor(page: Page) { this.page = page - this.projectName = page.getByTestId('app-header-project-name') - this.fileName = page.getByTestId('app-header-file-name') this.extrudeButton = page.getByTestId('extrude') this.loftButton = page.getByTestId('loft') this.sweepButton = page.getByTestId('sweep') diff --git a/e2e/playwright/native-file-menu.spec.ts b/e2e/playwright/native-file-menu.spec.ts index 5c6dc4d72..1097f8ecf 100644 --- a/e2e/playwright/native-file-menu.spec.ts +++ b/e2e/playwright/native-file-menu.spec.ts @@ -446,11 +446,11 @@ test.describe( // Core dump and refresh magic number timeout await page.waitForTimeout(7000) const actual = page.getByText( - 'No Projects found, ready to make your first one?' + 'No projects found, ready to make your first one?' ) await expect(actual).toBeVisible() }) - test('Home.Help.Replay onboarding tutorial', async ({ + test('Home.Help.Reset onboarding', async ({ tronApp, cmdBar, page, @@ -464,7 +464,7 @@ test.describe( await tronApp.electron.evaluate(async ({ app }) => { if (!app || !app.applicationMenu) return false const menu = app.applicationMenu.getMenuItemById( - 'Help.Replay onboarding tutorial' + 'Help.Reset onboarding' ) if (!menu) { return false @@ -2339,7 +2339,7 @@ test.describe( await scene.connectionEstablished() await expect(toolbar.startSketchBtn).toBeVisible() }) - test('Modeling.Help.Replay onboarding tutorial', async ({ + test('Modeling.Help.Reset onboarding', async ({ tronApp, cmdBar, page, @@ -2358,7 +2358,7 @@ test.describe( await tronApp.electron.evaluate(async ({ app }) => { if (!app || !app.applicationMenu) fail() const menu = app.applicationMenu.getMenuItemById( - 'Help.Replay onboarding tutorial' + 'Help.Reset onboarding' ) if (!menu) fail() menu.click() diff --git a/e2e/playwright/onboarding-tests.spec.ts b/e2e/playwright/onboarding-tests.spec.ts index 6febaffc8..a2e776c56 100644 --- a/e2e/playwright/onboarding-tests.spec.ts +++ b/e2e/playwright/onboarding-tests.spec.ts @@ -1,175 +1,560 @@ +import { join } from 'path' +import { bracket } from '@e2e/playwright/fixtures/bracket' +import { onboardingPaths } from '@src/routes/Onboarding/paths' +import fsp from 'fs/promises' + +import { expectPixelColor } from '@e2e/playwright/fixtures/sceneFixture' +import { + TEST_SETTINGS_KEY, + TEST_SETTINGS_ONBOARDING_EXPORT, + TEST_SETTINGS_ONBOARDING_START, + TEST_SETTINGS_ONBOARDING_USER_MENU, +} from '@e2e/playwright/storageStates' +import { + createProject, + executorInputPath, + getUtils, + settingsToToml, +} from '@e2e/playwright/test-utils' import { expect, test } from '@e2e/playwright/zoo-test' +// Because our default test settings have the onboardingStatus set to 'dismissed', +// we must set it to empty for the tests where we want to see the onboarding immediately. + test.describe('Onboarding tests', () => { - test('Desktop onboarding flow works', async ({ + test('Onboarding code is shown in the editor', async ({ page, homePage, - toolbar, - editor, - scene, tronApp, }) => { if (!tronApp) { fail() } - - // Because our default test settings have the onboardingStatus set to 'dismissed', - // we must set it to empty for the tests where we want to see the onboarding UI. await tronApp.cleanProjectDir({ app: { onboarding_status: '', }, }) - const bracketComment = '// Shelf Bracket' - const tutorialWelcomHeading = page.getByText( - 'Welcome to Design Studio! This' - ) - const nextButton = page.getByTestId('onboarding-next') - const prevButton = page.getByTestId('onboarding-prev') - const userMenuButton = toolbar.userSidebarButton - const userMenuSettingsButton = page.getByRole('button', { - name: 'User settings', - }) - const settingsHeading = page.getByRole('heading', { - name: 'Settings', - exact: true, - }) - const restartOnboardingSettingsButton = page.getByRole('button', { + const u = await getUtils(page) + await page.setBodyDimensions({ width: 1200, height: 500 }) + await homePage.goToModelingScene() + + // Test that the onboarding pane loaded + await expect(page.getByText('Welcome to Design Studio! This')).toBeVisible() + + // Test that the onboarding pane loaded + await expect(page.getByText('Welcome to Design Studio! This')).toBeVisible() + + // *and* that the code is shown in the editor + await expect(page.locator('.cm-content')).toContainText('// Shelf Bracket') + + // Make sure the model loaded + const XYPlanePoint = { x: 774, y: 116 } as const + const modelColor: [number, number, number] = [45, 45, 45] + await page.mouse.move(XYPlanePoint.x, XYPlanePoint.y) + expect(await u.getGreatestPixDiff(XYPlanePoint, modelColor)).toBeLessThan(8) + }) + + test( + 'Desktop: fresh onboarding executes and loads', + { + tag: '@electron', + }, + async ({ page, tronApp, scene }) => { + if (!tronApp) { + fail() + } + await tronApp.cleanProjectDir({ + app: { + onboarding_status: '', + }, + }) + + const viewportSize = { width: 1200, height: 500 } + await page.setBodyDimensions(viewportSize) + + await test.step(`Create a project and open to the onboarding`, async () => { + await createProject({ name: 'project-link', page }) + await test.step(`Ensure the engine connection works by testing the sketch button`, async () => { + await scene.connectionEstablished() + }) + }) + + await test.step(`Ensure we see the onboarding stuff`, async () => { + // Test that the onboarding pane loaded + await expect( + page.getByText('Welcome to Design Studio! This') + ).toBeVisible() + + // *and* that the code is shown in the editor + await expect(page.locator('.cm-content')).toContainText( + '// Shelf Bracket' + ) + + // TODO: jess make less shit + // Make sure the model loaded + //const XYPlanePoint = { x: 986, y: 522 } as const + //const modelColor: [number, number, number] = [76, 76, 76] + //await page.mouse.move(XYPlanePoint.x, XYPlanePoint.y) + + //await expectPixelColor(page, modelColor, XYPlanePoint, 8) + }) + } + ) + + test('Code resets after confirmation', async ({ + page, + homePage, + tronApp, + scene, + }) => { + if (!tronApp) { + fail() + } + await tronApp.cleanProjectDir() + + const initialCode = `sketch001 = startSketchOn(XZ)` + + // Load the page up with some code so we see the confirmation warning + // when we go to replay onboarding + await page.addInitScript((code) => { + localStorage.setItem('persistCode', code) + }, initialCode) + + await page.setBodyDimensions({ width: 1200, height: 500 }) + await homePage.goToModelingScene() + await scene.connectionEstablished() + + // Replay the onboarding + await page.getByRole('link', { name: 'Settings' }).last().click() + const replayButton = page.getByRole('button', { name: 'Replay onboarding', }) - const helpMenuButton = page.getByRole('button', { - name: 'Help and resources', + await expect(replayButton).toBeVisible() + await replayButton.click() + + // Ensure we see the warning, and that the code has not yet updated + await expect(page.getByText('Would you like to create')).toBeVisible() + await expect(page.locator('.cm-content')).toHaveText(initialCode) + + const nextButton = page.getByTestId('onboarding-next') + await nextButton.hover() + await nextButton.click() + + // Ensure we see the introduction and that the code has been reset + await expect(page.getByText('Welcome to Design Studio!')).toBeVisible() + await expect(page.locator('.cm-content')).toContainText('// Shelf Bracket') + + // There used to be old code here that checked if we stored the reset + // code into localStorage but that isn't the case on desktop. It gets + // saved to the file system, which we have other tests for. + }) + + test('Click through each onboarding step and back', async ({ + context, + page, + homePage, + tronApp, + }) => { + if (!tronApp) { + fail() + } + await tronApp.cleanProjectDir({ + app: { + onboarding_status: '', + }, }) - const helpMenuRestartOnboardingButton = page.getByRole('button', { - name: 'Replay onboarding tutorial', - }) - const postDismissToast = page.getByText( - 'Click the question mark in the lower-right corner if you ever want to redo the tutorial!' + // Override beforeEach test setup + await context.addInitScript( + async ({ settingsKey, settings }) => { + // Give no initial code, so that the onboarding start is shown immediately + localStorage.setItem('persistCode', '') + localStorage.setItem(settingsKey, settings) + }, + { + settingsKey: TEST_SETTINGS_KEY, + settings: settingsToToml({ + settings: TEST_SETTINGS_ONBOARDING_START, + }), + } ) - await test.step('Test initial home page view, showing a tutorial button', async () => { - await expect(homePage.tutorialBtn).toBeVisible() - await homePage.expectState({ - projectCards: [], - sortBy: 'last-modified-desc', - }) + await page.setBodyDimensions({ width: 1200, height: 1080 }) + await homePage.goToModelingScene() + + // Test that the onboarding pane loaded + await expect(page.getByText('Welcome to Design Studio! This')).toBeVisible() + + const nextButton = page.getByTestId('onboarding-next') + const prevButton = page.getByTestId('onboarding-prev') + + while ((await nextButton.innerText()) !== 'Finish') { + await nextButton.hover() + await nextButton.click() + } + + while ((await prevButton.innerText()) !== 'Dismiss') { + await prevButton.hover() + await prevButton.click() + } + + // Dismiss the onboarding + await prevButton.hover() + await prevButton.click() + + // Test that the onboarding pane is gone + await expect(page.getByTestId('onboarding-content')).not.toBeVisible() + await expect.poll(() => page.url()).not.toContain('/onboarding') + }) + + test('Onboarding redirects and code updating', async ({ + context, + page, + homePage, + tronApp, + }) => { + if (!tronApp) { + fail() + } + await tronApp.cleanProjectDir({ + app: { + onboarding_status: '/export', + }, }) - await test.step('Create a blank project and verify no onboarding chrome is shown', async () => { - await homePage.goToModelingScene() - await expect(toolbar.projectName).toContainText('testDefault') - await expect(tutorialWelcomHeading).not.toBeVisible() - await editor.expectEditor.toContain('@settings(defaultLengthUnit = in)', { - shouldNormalise: true, - }) - await scene.connectionEstablished() - await expect(toolbar.startSketchBtn).toBeEnabled({ timeout: 15_000 }) + const originalCode = 'sigmaAllow = 15000' + + // Override beforeEach test setup + await context.addInitScript( + async ({ settingsKey, settings, code }) => { + // Give some initial code, so we can test that it's cleared + localStorage.setItem('persistCode', code) + localStorage.setItem(settingsKey, settings) + }, + { + settingsKey: TEST_SETTINGS_KEY, + settings: settingsToToml({ + settings: TEST_SETTINGS_ONBOARDING_EXPORT, + }), + code: originalCode, + } + ) + + await page.setBodyDimensions({ width: 1200, height: 500 }) + await homePage.goToModelingScene() + + // Test that the redirect happened + await expect.poll(() => page.url()).toContain('/onboarding/export') + + // Test that you come back to this page when you refresh + await page.reload() + await expect.poll(() => page.url()).toContain('/onboarding/export') + + // Test that the code changes when you advance to the next step + await page.getByTestId('onboarding-next').hover() + await page.getByTestId('onboarding-next').click() + + // Test that the onboarding pane loaded + const title = page.locator('[data-testid="onboarding-content"]') + await expect(title).toBeAttached() + + await expect(page.locator('.cm-content')).not.toHaveText(originalCode) + + // Test that the code is not empty when you click on the next step + await page.locator('[data-testid="onboarding-next"]').hover() + await page.locator('[data-testid="onboarding-next"]').click() + await expect(page.locator('.cm-content')).toHaveText(/.+/) + }) + + test('Onboarding code gets reset to demo on Interactive Numbers step', async ({ + page, + homePage, + tronApp, + editor, + toolbar, + }) => { + if (!tronApp) { + fail() + } + await tronApp.cleanProjectDir({ + app: { + onboarding_status: '/parametric-modeling', + }, }) - await test.step('Go home and verify we still see the tutorial button, then begin it.', async () => { - await toolbar.logoLink.click() - await expect(homePage.tutorialBtn).toBeVisible() - await homePage.expectState({ - projectCards: [ - { - title: 'testDefault', - fileCount: 1, - }, - ], - sortBy: 'last-modified-desc', - }) - await homePage.tutorialBtn.click() + const badCode = `// This is bad code we shouldn't see` + + await page.setBodyDimensions({ width: 1200, height: 1080 }) + await homePage.goToModelingScene() + + await expect + .poll(() => page.url()) + .toContain(onboardingPaths.PARAMETRIC_MODELING) + + // Check the code got reset on load + await toolbar.openPane('code') + await editor.expectEditor.toContain(bracket, { + shouldNormalise: true, + timeout: 10_000, }) - // This is web-only. - // TODO: write a new test just for the onboarding in browser - // await test.step('Ensure the onboarding request toast appears', async () => { - // await expect(page.getByTestId('onboarding-toast')).toBeVisible() - // await page.getByTestId('onboarding-next').click() - // }) - - await test.step('Ensure we see the welcome screen in a new project', async () => { - await expect(toolbar.projectName).toContainText('Tutorial Project 00') - await expect(tutorialWelcomHeading).toBeVisible() - await editor.expectEditor.toContain(bracketComment) - await scene.connectionEstablished() - await expect(toolbar.startSketchBtn).toBeEnabled({ timeout: 15_000 }) + // Mess with the code again + await editor.replaceCode('', badCode) + await editor.expectEditor.toContain(badCode, { + shouldNormalise: true, + timeout: 10_000, }) - await test.step('Test the clicking through the onboarding flow', async () => { - await test.step('Going forward', async () => { - while ((await nextButton.innerText()) !== 'Finish') { - await nextButton.hover() - await nextButton.click() - } - }) - - await test.step('Going backward', async () => { - while ((await prevButton.innerText()) !== 'Dismiss') { - await prevButton.hover() - await prevButton.click() - } - }) - - // Dismiss the onboarding - await test.step('Dismiss the onboarding', async () => { - await prevButton.hover() - await prevButton.click() - await expect(page.getByTestId('onboarding-content')).not.toBeVisible() - await expect(postDismissToast).toBeVisible() - await expect.poll(() => page.url()).not.toContain('/onboarding') - }) + // Click to the next step + await page.locator('[data-testid="onboarding-next"]').hover() + await page.locator('[data-testid="onboarding-next"]').click() + await page.waitForURL('**' + onboardingPaths.INTERACTIVE_NUMBERS, { + waitUntil: 'domcontentloaded', }) - await test.step('Resetting onboarding from inside project should always make a new one', async () => { - await test.step('Reset onboarding from settings', async () => { - await userMenuButton.click() - await userMenuSettingsButton.click() - await expect(settingsHeading).toBeVisible() - await expect(restartOnboardingSettingsButton).toBeVisible() - await restartOnboardingSettingsButton.click() - }) - - await test.step('Makes a new project', async () => { - await expect(toolbar.projectName).toContainText('Tutorial Project 01') - await expect(tutorialWelcomHeading).toBeVisible() - await editor.expectEditor.toContain(bracketComment) - await scene.connectionEstablished() - await expect(toolbar.startSketchBtn).toBeEnabled({ timeout: 15_000 }) - }) - - await test.step('Dismiss the onboarding', async () => { - await postDismissToast.waitFor({ state: 'detached' }) - await page.keyboard.press('Escape') - await expect(postDismissToast).toBeVisible() - await expect(page.getByTestId('onboarding-content')).not.toBeVisible() - await expect.poll(() => page.url()).not.toContain('/onboarding') - }) - }) - - await test.step('Resetting onboarding from home help menu makes a new project', async () => { - await test.step('Go home and reset onboarding from lower-right help menu', async () => { - await toolbar.logoLink.click() - await expect(homePage.tutorialBtn).not.toBeVisible() - await expect( - homePage.projectCard.getByText('Tutorial Project 00') - ).toBeVisible() - await expect( - homePage.projectCard.getByText('Tutorial Project 01') - ).toBeVisible() - - await helpMenuButton.click() - await helpMenuRestartOnboardingButton.click() - }) - - await test.step('Makes a new project', async () => { - await expect(toolbar.projectName).toContainText('Tutorial Project 02') - await expect(tutorialWelcomHeading).toBeVisible() - await editor.expectEditor.toContain(bracketComment) - await scene.connectionEstablished() - await expect(toolbar.startSketchBtn).toBeEnabled({ timeout: 15_000 }) - }) + // Check that the code has been reset + await editor.expectEditor.toContain(bracket, { + shouldNormalise: true, + timeout: 10_000, }) }) + + // (lee) The two avatar tests are weird because even on main, we don't have + // anything to do with the avatar inside the onboarding test. Due to the + // low impact of an avatar not showing I'm changing this to fixme. + test('Avatar text updates depending on image load success', async ({ + context, + page, + toolbar, + homePage, + tronApp, + }) => { + if (!tronApp) { + fail() + } + + await tronApp.cleanProjectDir({ + app: { + onboarding_status: '', + }, + }) + + // Override beforeEach test setup + await context.addInitScript( + async ({ settingsKey, settings }) => { + localStorage.setItem(settingsKey, settings) + }, + { + settingsKey: TEST_SETTINGS_KEY, + settings: settingsToToml({ + settings: TEST_SETTINGS_ONBOARDING_USER_MENU, + }), + } + ) + + await page.setBodyDimensions({ width: 1200, height: 500 }) + await homePage.goToModelingScene() + + // Test that the text in this step is correct + const avatarLocator = toolbar.userSidebarButton.locator('img') + const onboardingOverlayLocator = page + .getByTestId('onboarding-content') + .locator('div') + .nth(1) + + // Expect the avatar to be visible and for the text to reference it + await expect(avatarLocator).toBeVisible() + await expect(onboardingOverlayLocator).toBeVisible() + await expect(onboardingOverlayLocator).toContainText('your avatar') + + // This is to force the avatar to 404. + // For our test image (only triggers locally. on CI, it's Kurt's / + // gravatar image ) + await page.route('/cat.jpg', async (route) => { + await route.fulfill({ + status: 404, + contentType: 'text/plain', + body: 'Not Found!', + }) + }) + + // 404 the CI avatar image + await page.route('https://lh3.googleusercontent.com/**', async (route) => { + await route.fulfill({ + status: 404, + contentType: 'text/plain', + body: 'Not Found!', + }) + }) + + await page.reload({ waitUntil: 'domcontentloaded' }) + + // Now expect the text to be different + await expect(avatarLocator).not.toBeVisible() + await expect(onboardingOverlayLocator).toBeVisible() + await expect(onboardingOverlayLocator).toContainText('the menu button') + }) + + test("Avatar text doesn't mention avatar when no avatar", async ({ + context, + page, + toolbar, + homePage, + tronApp, + }) => { + if (!tronApp) { + fail() + } + + await tronApp.cleanProjectDir({ + app: { + onboarding_status: '', + }, + }) + // Override beforeEach test setup + await context.addInitScript( + async ({ settingsKey, settings }) => { + localStorage.setItem(settingsKey, settings) + localStorage.setItem('FORCE_NO_IMAGE', 'FORCE_NO_IMAGE') + }, + { + settingsKey: TEST_SETTINGS_KEY, + settings: settingsToToml({ + settings: TEST_SETTINGS_ONBOARDING_USER_MENU, + }), + } + ) + + await page.setBodyDimensions({ width: 1200, height: 500 }) + await homePage.goToModelingScene() + + // Test that the text in this step is correct + const sidebar = toolbar.userSidebarButton + const avatar = sidebar.locator('img') + const onboardingOverlayLocator = page + .getByTestId('onboarding-content') + .locator('div') + .nth(1) + + // Expect the avatar to be visible and for the text to reference it + await expect(avatar).not.toBeVisible() + await expect(onboardingOverlayLocator).toBeVisible() + await expect(onboardingOverlayLocator).toContainText('the menu button') + + // Test we mention what else is in this menu for https://github.com/KittyCAD/modeling-app/issues/2939 + // which doesn't deserver its own full test spun up + const userMenuFeatures = [ + 'manage your account', + 'report a bug', + 'request a feature', + 'sign out', + ] + for (const feature of userMenuFeatures) { + await expect(onboardingOverlayLocator).toContainText(feature) + } + }) +}) + +test('Restarting onboarding on desktop takes one attempt', async ({ + context, + page, + toolbar, + tronApp, +}) => { + if (!tronApp) { + fail() + } + + await tronApp.cleanProjectDir({ + app: { + onboarding_status: 'dismissed', + }, + }) + + await context.folderSetupFn(async (dir) => { + const routerTemplateDir = join(dir, 'router-template-slate') + await fsp.mkdir(routerTemplateDir, { recursive: true }) + await fsp.copyFile( + executorInputPath('router-template-slate.kcl'), + join(routerTemplateDir, 'main.kcl') + ) + }) + + // Our constants + const u = await getUtils(page) + const projectCard = page.getByText('router-template-slate') + const helpMenuButton = page.getByRole('button', { + name: 'Help and resources', + }) + const restartOnboardingButton = page.getByRole('button', { + name: 'Reset onboarding', + }) + const nextButton = page.getByTestId('onboarding-next') + + const tutorialProjectIndicator = page + .getByTestId('project-sidebar-toggle') + .filter({ hasText: 'Tutorial Project 00' }) + const tutorialModalText = page.getByText('Welcome to Design Studio!') + const tutorialDismissButton = page.getByRole('button', { name: 'Dismiss' }) + const userMenuButton = toolbar.userSidebarButton + const userMenuSettingsButton = page.getByRole('button', { + name: 'User settings', + }) + const settingsHeading = page.getByRole('heading', { + name: 'Settings', + exact: true, + }) + const restartOnboardingSettingsButton = page.getByRole('button', { + name: 'Replay onboarding', + }) + + await test.step('Navigate into project', async () => { + await expect(page.getByRole('heading', { name: 'Projects' })).toBeVisible() + await expect(projectCard).toBeVisible() + await projectCard.click() + await u.waitForPageLoad() + }) + + await test.step('Restart the onboarding from help menu', async () => { + await helpMenuButton.click() + await restartOnboardingButton.click() + + await nextButton.hover() + await nextButton.click() + }) + + await test.step('Confirm that the onboarding has restarted', async () => { + await expect(tutorialProjectIndicator).toBeVisible() + await expect(tutorialModalText).toBeVisible() + // Make sure the model loaded + const XYPlanePoint = { x: 988, y: 523 } as const + const modelColor: [number, number, number] = [76, 76, 76] + + await page.mouse.move(XYPlanePoint.x, XYPlanePoint.y) + await expectPixelColor(page, modelColor, XYPlanePoint, 8) + await tutorialDismissButton.click() + // Make sure model still there. + await expectPixelColor(page, modelColor, XYPlanePoint, 8) + }) + + await test.step('Clear code and restart onboarding from settings', async () => { + await u.openKclCodePanel() + await expect(u.codeLocator).toContainText('// Shelf Bracket') + await u.codeLocator.selectText() + await u.codeLocator.fill('') + + await test.step('Navigate to settings', async () => { + await userMenuButton.click() + await userMenuSettingsButton.click() + await expect(settingsHeading).toBeVisible() + await expect(restartOnboardingSettingsButton).toBeVisible() + }) + + await restartOnboardingSettingsButton.click() + // Since the code is empty, we should not see the confirmation dialog + await expect(nextButton).not.toBeVisible() + await expect(tutorialProjectIndicator).toBeVisible() + await expect(tutorialModalText).toBeVisible() + }) }) diff --git a/e2e/playwright/point-click.spec.ts b/e2e/playwright/point-click.spec.ts index de622bcfc..4b071f155 100644 --- a/e2e/playwright/point-click.spec.ts +++ b/e2e/playwright/point-click.spec.ts @@ -3342,7 +3342,7 @@ profile001 = startProfile(sketch001, at = [-20, 20]) const testPoint = { x: 590, y: 400 } const extrudeColor: [number, number, number] = [100, 100, 100] const sketchColor: [number, number, number] = [140, 140, 140] - const defaultPlaneColor: [number, number, number] = [50, 50, 100] + const defaultPlaneColor: [number, number, number] = [88, 44, 45] const deleteOperation = async (operationButton: Locator) => { if (shouldUseKeyboard) { @@ -3386,7 +3386,11 @@ profile001 = startProfile(sketch001, at = [-20, 20]) ) await deleteOperation(operationButton) await editor.expectEditor.toContain('') - await scene.expectPixelColor(defaultPlaneColor, testPoint, 20) + // Cannot use test point anymore because the camera's position has been + // reset and the rest of the test doesn't need to change just to check + // if the scene is cleared. + // Check that the scene is cleared + await scene.expectPixelColor(defaultPlaneColor, { x: 574, y: 342 }, 20) }) }) }) diff --git a/e2e/playwright/projects.spec.ts b/e2e/playwright/projects.spec.ts index 7e13e459d..4ba3da0a6 100644 --- a/e2e/playwright/projects.spec.ts +++ b/e2e/playwright/projects.spec.ts @@ -837,7 +837,7 @@ test.describe(`Project management commands`, () => { name: 'Submit command', }) const toastMessage = page.getByText(`Successfully deleted`) - const noProjectsMessage = page.getByText('No Projects found') + const noProjectsMessage = page.getByText('No projects found') await test.step(`Setup`, async () => { await page.setBodyDimensions({ width: 1200, height: 500 }) @@ -949,7 +949,7 @@ test.describe(`Project management commands`, () => { name: 'Submit command', }) const toastMessage = page.getByText(`Successfully deleted`) - const noProjectsMessage = page.getByText('No Projects found') + const noProjectsMessage = page.getByText('No projects found') await test.step(`Setup`, async () => { await page.setBodyDimensions({ width: 1200, height: 500 }) @@ -1265,7 +1265,7 @@ test( }) await test.step('Check that the home page is empty', async () => { - await expect(page.getByText('No Projects found')).toBeVisible() + await expect(page.getByText('No projects found')).toBeVisible() }) await test.step('Check we can still create a project', async () => { @@ -1434,8 +1434,8 @@ test( // Constants and locators const projectLinks = page.getByTestId('project-link') - // expect to see text "No Projects found" - await expect(page.getByText('No Projects found')).toBeVisible() + // expect to see text "No projects found" + await expect(page.getByText('No projects found')).toBeVisible() await createProject({ name: 'project-000', page, returnHome: true }) await expect(projectLinks.getByText('project-000')).toBeVisible() @@ -1693,7 +1693,7 @@ test( await homePage.projectsLoaded() - await expect(page.getByText('No Projects found')).toBeVisible() + await expect(page.getByText('No projects found')).toBeVisible() await createProject({ name: 'project-000', page, returnHome: true }) await expect( page.getByTestId('project-link').filter({ hasText: 'project-000' }) diff --git a/e2e/playwright/prompt-to-edit-snapshot-tests.spec.ts b/e2e/playwright/prompt-to-edit-snapshot-tests.spec.ts index a03aa0f60..9d4e328de 100644 --- a/e2e/playwright/prompt-to-edit-snapshot-tests.spec.ts +++ b/e2e/playwright/prompt-to-edit-snapshot-tests.spec.ts @@ -62,7 +62,8 @@ extrude(sketch003, length = 20) test.describe('edit with AI example snapshots', () => { test( `change colour`, - { tag: '@snapshot' }, + // TODO this is more of a snapshot, but atm it needs to be manually run locally to update the files + { tag: ['@electron'] }, async ({ context, homePage, cmdBar, editor, page, scene }) => { const project = 'test-dir' await context.folderSetupFn(async (dir) => { diff --git a/e2e/playwright/prompt-to-edit.spec.ts b/e2e/playwright/prompt-to-edit.spec.ts index 4f38c5652..42276d07c 100644 --- a/e2e/playwright/prompt-to-edit.spec.ts +++ b/e2e/playwright/prompt-to-edit.spec.ts @@ -1,4 +1,6 @@ import { expect, test } from '@e2e/playwright/zoo-test' +import * as fsp from 'fs/promises' +import * as path from 'path' /* eslint-disable jest/no-conditional-expect */ @@ -50,23 +52,20 @@ test.describe('Prompt-to-edit tests', () => { page, scene, }) => { - await context.addInitScript((file) => { - localStorage.setItem('persistCode', file) - }, file) - await homePage.goToModelingScene() + await context.folderSetupFn(async (dir) => { + const projectDir = path.join(dir, 'test-project') + await fsp.mkdir(projectDir, { recursive: true }) + await fsp.writeFile(path.join(projectDir, 'main.kcl'), file) + }) + await homePage.openProject('test-project') await scene.settled(cmdBar) const body1CapCoords = { x: 571, y: 311 } - const greenCheckCoords = { x: 565, y: 305 } - const body2WallCoords = { x: 609, y: 153 } const [clickBody1Cap] = scene.makeMouseHelpers( body1CapCoords.x, body1CapCoords.y ) const yellow: [number, number, number] = [179, 179, 131] - const green: [number, number, number] = [128, 194, 88] - const notGreen: [number, number, number] = [132, 132, 132] - const body2NotGreen: [number, number, number] = [88, 88, 88] const submittingToast = page.getByText( 'Submitting to Text-to-CAD API...' ) @@ -103,32 +102,21 @@ test.describe('Prompt-to-edit tests', () => { }) await test.step('verify initial change', async () => { - await scene.expectPixelColor(green, greenCheckCoords, 20) - await scene.expectPixelColor(body2NotGreen, body2WallCoords, 15) await editor.expectEditor.toContain('appearance(') }) if (!shouldReject) { - await test.step('check accept works and can be "undo"ed', async () => { + await test.step('check accept works', async () => { await acceptBtn.click() await expect(successToast).not.toBeVisible() - await scene.expectPixelColor(green, greenCheckCoords, 15) await editor.expectEditor.toContain('appearance(') - - // ctrl-z works after accepting - await page.keyboard.down('ControlOrMeta') - await page.keyboard.press('KeyZ') - await page.keyboard.up('ControlOrMeta') - await editor.expectEditor.not.toContain('appearance(') - await scene.expectPixelColor(notGreen, greenCheckCoords, 15) }) } else { await test.step('check reject works', async () => { await rejectBtn.click() await expect(successToast).not.toBeVisible() - await scene.expectPixelColor(notGreen, greenCheckCoords, 15) await editor.expectEditor.not.toContain('appearance(') }) } diff --git a/e2e/playwright/snapshots/prompt-to-edit/prompt-to-edit-snapshot-tests-spec-ts--edit-with-ai-example-snapshots--change-colour.snap.json b/e2e/playwright/snapshots/prompt-to-edit/prompt-to-edit-snapshot-tests-spec-ts--edit-with-ai-example-snapshots--change-colour.snap.json index 738afc212..f390db271 100644 --- a/e2e/playwright/snapshots/prompt-to-edit/prompt-to-edit-snapshot-tests-spec-ts--edit-with-ai-example-snapshots--change-colour.snap.json +++ b/e2e/playwright/snapshots/prompt-to-edit/prompt-to-edit-snapshot-tests-spec-ts--edit-with-ai-example-snapshots--change-colour.snap.json @@ -31,7 +31,7 @@ } ], "project_name": "test-dir", - "kcl_version": "0.2.64", + "kcl_version": "0.2.65", "files": { "b.kcl": "sketch003 = startSketchOn(XY)\n |> startProfile(at = [52.92, 157.81])\n |> angledLine(angle = 0, length = 176.4, tag = $rectangleSegmentA001)\n |> angledLine(\n angle = segAng(rectangleSegmentA001) - 90,\n length = 53.4,\n tag = $rectangleSegmentB001,\n )\n |> angledLine(angle = segAng(rectangleSegmentA001), length = -segLen(rectangleSegmentA001), tag = $rectangleSegmentC001)\n |> line(endAbsolute = [profileStartX(%), profileStartY(%)])\n |> close()\nextrude(sketch003, length = 20)", "main.kcl": "import \"b.kcl\" as b\nsketch001 = startSketchOn(XZ)\nprofile001 = startProfile(sketch001, at = [57.81, 250.51])\n |> line(end = [121.13, 56.63], tag = $seg02)\n |> line(end = [83.37, -34.61], tag = $seg01)\n |> line(end = [19.66, -116.4])\n |> line(end = [-221.8, -41.69])\n |> line(endAbsolute = [profileStartX(%), profileStartY(%)])\n |> close()\nextrude001 = extrude(profile001, length = 200)\nsketch002 = startSketchOn(XZ)\n |> startProfile(at = [-73.64, -42.89])\n |> xLine(length = 173.71)\n |> line(end = [-22.12, -94.4])\n |> xLine(length = -156.98)\n |> line(endAbsolute = [profileStartX(%), profileStartY(%)])\n |> close()\nextrude002 = extrude(sketch002, length = 50)\nb" diff --git a/e2e/playwright/storageStates.ts b/e2e/playwright/storageStates.ts index 48d9fc5e5..345bdfdb1 100644 --- a/e2e/playwright/storageStates.ts +++ b/e2e/playwright/storageStates.ts @@ -1,7 +1,7 @@ import type { SaveSettingsPayload } from '@src/lib/settings/settingsTypes' import { Themes } from '@src/lib/theme' import type { DeepPartial } from '@src/lib/types' -import { ONBOARDING_SUBPATHS } from '@src/lib/onboardingPaths' +import { onboardingPaths } from '@src/routes/Onboarding/paths' import type { Settings } from '@rust/kcl-lib/bindings/Settings' @@ -31,15 +31,12 @@ export const TEST_SETTINGS: DeepPartial = { export const TEST_SETTINGS_ONBOARDING_USER_MENU: DeepPartial = { ...TEST_SETTINGS, - app: { - ...TEST_SETTINGS.app, - onboarding_status: ONBOARDING_SUBPATHS.USER_MENU, - }, + app: { ...TEST_SETTINGS.app, onboarding_status: onboardingPaths.USER_MENU }, } export const TEST_SETTINGS_ONBOARDING_EXPORT: DeepPartial = { ...TEST_SETTINGS, - app: { ...TEST_SETTINGS.app, onboarding_status: ONBOARDING_SUBPATHS.EXPORT }, + app: { ...TEST_SETTINGS.app, onboarding_status: onboardingPaths.EXPORT }, } export const TEST_SETTINGS_ONBOARDING_PARAMETRIC_MODELING: DeepPartial = @@ -47,7 +44,7 @@ export const TEST_SETTINGS_ONBOARDING_PARAMETRIC_MODELING: DeepPartial ...TEST_SETTINGS, app: { ...TEST_SETTINGS.app, - onboarding_status: ONBOARDING_SUBPATHS.PARAMETRIC_MODELING, + onboarding_status: onboardingPaths.PARAMETRIC_MODELING, }, } diff --git a/e2e/playwright/test-utils.ts b/e2e/playwright/test-utils.ts index 9f4201e09..9ef93263f 100644 --- a/e2e/playwright/test-utils.ts +++ b/e2e/playwright/test-utils.ts @@ -5,7 +5,7 @@ import type { BrowserContext, Locator, Page, TestInfo } from '@playwright/test' import { expect } from '@playwright/test' import type { EngineCommand } from '@src/lang/std/artifactGraph' import type { Configuration } from '@src/lang/wasm' -import { COOKIE_NAME, IS_PLAYWRIGHT_KEY } from '@src/lib/constants' +import { COOKIE_NAME } from '@src/lib/constants' import { reportRejection } from '@src/lib/trap' import type { DeepPartial } from '@src/lib/types' import { isArray } from '@src/lib/utils' @@ -19,6 +19,7 @@ import type { ProjectConfiguration } from '@rust/kcl-lib/bindings/ProjectConfigu import { isErrorWhitelisted } from '@e2e/playwright/lib/console-error-whitelist' import { secrets } from '@e2e/playwright/secrets' import { TEST_SETTINGS, TEST_SETTINGS_KEY } from '@e2e/playwright/storageStates' +import { IS_PLAYWRIGHT_KEY } from '@src/lib/constants' import { test } from '@e2e/playwright/zoo-test' const toNormalizedCode = (text: string) => { diff --git a/flake.lock b/flake.lock index 5f2194b0b..5efd040d0 100644 --- a/flake.lock +++ b/flake.lock @@ -5,11 +5,11 @@ "nixpkgs": "nixpkgs" }, "locked": { - "lastModified": 1743800763, - "narHash": "sha256-YFKV+fxEpMgP5VsUcM6Il28lI0NlpM7+oB1XxbBAYCw=", + "lastModified": 1745925850, + "narHash": "sha256-cyAAMal0aPrlb1NgzMxZqeN1mAJ2pJseDhm2m6Um8T0=", "owner": "nix-community", "repo": "naersk", - "rev": "ed0232117731a4c19d3ee93aa0c382a8fe754b01", + "rev": "38bc60bbc157ae266d4a0c96671c6c742ee17a5f", "type": "github" }, "original": { @@ -20,11 +20,11 @@ }, "nixpkgs": { "locked": { - "lastModified": 1744316434, - "narHash": "sha256-lzFCg/1C39pyY2hMB2gcuHV79ozpOz/Vu15hdjiFOfI=", + "lastModified": 1745998881, + "narHash": "sha256-vonyYAKJSlsX4n9GCsS0pHxR6yCrfqBIuGvANlkwG6U=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "d19cf9dfc633816a437204555afeb9e722386b76", + "rev": "423d2df5b04b4ee7688c3d71396e872afa236a89", "type": "github" }, "original": { @@ -36,11 +36,11 @@ }, "nixpkgs_2": { "locked": { - "lastModified": 1744316434, - "narHash": "sha256-lzFCg/1C39pyY2hMB2gcuHV79ozpOz/Vu15hdjiFOfI=", + "lastModified": 1745998881, + "narHash": "sha256-vonyYAKJSlsX4n9GCsS0pHxR6yCrfqBIuGvANlkwG6U=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "d19cf9dfc633816a437204555afeb9e722386b76", + "rev": "423d2df5b04b4ee7688c3d71396e872afa236a89", "type": "github" }, "original": { @@ -52,11 +52,11 @@ }, "nixpkgs_3": { "locked": { - "lastModified": 1736320768, - "narHash": "sha256-nIYdTAiKIGnFNugbomgBJR+Xv5F1ZQU+HfaBqJKroC0=", + "lastModified": 1744536153, + "narHash": "sha256-awS2zRgF4uTwrOKwwiJcByDzDOdo3Q1rPZbiHQg/N38=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "4bc9c909d9ac828a039f288cf872d16d38185db8", + "rev": "18dd725c29603f582cf1900e0d25f9f1063dbf11", "type": "github" }, "original": { @@ -78,11 +78,11 @@ "nixpkgs": "nixpkgs_3" }, "locked": { - "lastModified": 1744338850, - "narHash": "sha256-pwMIVmsb8fjjT92n5XFDqCsplcX70qVMMT7NulumPXs=", + "lastModified": 1745980514, + "narHash": "sha256-CITAeiuXGjDvT5iZBXr6vKVWQwsUQLJUMFO91bfJFC4=", "owner": "oxalica", "repo": "rust-overlay", - "rev": "5e64aecc018e6f775572609e7d7485fdba6985a7", + "rev": "7fbdae44b0f40ea432e46fd152ad8be0f8f41ad6", "type": "github" }, "original": { diff --git a/flake.nix b/flake.nix index 2dc022cde..e07cbc790 100644 --- a/flake.nix +++ b/flake.nix @@ -71,7 +71,7 @@ TARGET_CC = "${pkgs.stdenv.cc}/bin/${pkgs.stdenv.cc.targetPrefix}cc"; LIBCLANG_PATH = "${pkgs.libclang.lib}/lib"; - ELECTRON_OVERRIDE_DIST_PATH = "${pkgs.electron}/bin/"; + ELECTRON_OVERRIDE_DIST_PATH = if pkgs.stdenv.isDarwin then "${pkgs.electron}/Applications" else "${pkgs.electron}/bin"; PLAYWRIGHT_SKIP_VALIDATE_HOST_REQUIREMENTS = true; PLAYWRIGHT_CHROMIUM_EXECUTABLE_PATH = "${pkgs.playwright-driver.browsers}/chromium-1091/chrome-linux/chrome"; PLAYWRIGHT_BROWSERS_PATH = "${pkgs.playwright-driver.browsers}"; diff --git a/known-circular.txt b/known-circular.txt index 45ea02e96..fd905ec04 100644 --- a/known-circular.txt +++ b/known-circular.txt @@ -11,3 +11,4 @@ 6) src/lib/singletons.ts -> src/lang/codeManager.ts 7) src/lib/singletons.ts -> src/clientSideScene/sceneEntities.ts -> src/clientSideScene/segments.ts -> src/components/Toolbar/angleLengthInfo.ts 8) src/lib/singletons.ts -> src/clientSideScene/sceneEntities.ts -> src/clientSideScene/segments.ts + 9) src/routes/Onboarding/index.tsx -> src/routes/Onboarding/Camera.tsx -> src/routes/Onboarding/utils.tsx diff --git a/package-lock.json b/package-lock.json index bf254901d..f466a9116 100644 --- a/package-lock.json +++ b/package-lock.json @@ -32,6 +32,7 @@ "@kittycad/lib": "2.0.28", "@lezer/highlight": "^1.2.1", "@lezer/lr": "^1.4.1", + "@million/lint": "^1.0.14", "@react-hook/resize-observer": "^2.0.1", "@replit/codemirror-interact": "^6.3.1", "@ts-stack/markdown": "^1.5.0", @@ -170,7 +171,6 @@ "version": "2.3.0", "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", - "dev": true, "license": "Apache-2.0", "dependencies": { "@jridgewell/gen-mapping": "^0.3.5", @@ -180,6 +180,43 @@ "node": ">=6.0.0" } }, + "node_modules/@antfu/ni": { + "version": "0.21.12", + "resolved": "https://registry.npmjs.org/@antfu/ni/-/ni-0.21.12.tgz", + "integrity": "sha512-2aDL3WUv8hMJb2L3r/PIQWsTLyq7RQr3v9xD16fiz6O8ys1xEyLhhTOv8gxtZvJiTzjTF5pHoArvRdesGL1DMQ==", + "license": "MIT", + "bin": { + "na": "bin/na.mjs", + "nci": "bin/nci.mjs", + "ni": "bin/ni.mjs", + "nlx": "bin/nlx.mjs", + "nr": "bin/nr.mjs", + "nu": "bin/nu.mjs", + "nun": "bin/nun.mjs" + } + }, + "node_modules/@axiomhq/js": { + "version": "1.0.0-rc.3", + "resolved": "https://registry.npmjs.org/@axiomhq/js/-/js-1.0.0-rc.3.tgz", + "integrity": "sha512-Zm10TczcMLounWqC42nMkXQ7XKLqjzLrd5ia022oBKDUZqAFVg2y9d1quQVNV4FlXyg9MKDdfMjpKQRmzEGaog==", + "license": "MIT", + "dependencies": { + "fetch-retry": "^6.0.0", + "uuid": "^8.3.2" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/@axiomhq/js/node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "license": "MIT", + "bin": { + "uuid": "dist/bin/uuid" + } + }, "node_modules/@azure/abort-controller": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/@azure/abort-controller/-/abort-controller-2.1.2.tgz", @@ -365,7 +402,6 @@ "version": "7.26.2", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.2.tgz", "integrity": "sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==", - "dev": true, "license": "MIT", "dependencies": { "@babel/helper-validator-identifier": "^7.25.9", @@ -380,7 +416,6 @@ "version": "7.26.8", "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.26.8.tgz", "integrity": "sha512-oH5UPLMWR3L2wEFLnFJ1TZXqHufiTKAiLfqw5zkhS4dKXLJ10yVztfil/twG8EDTA4F/tvVNw9nOl4ZMslB8rQ==", - "dev": true, "license": "MIT", "engines": { "node": ">=6.9.0" @@ -421,7 +456,6 @@ "version": "7.27.0", "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.27.0.tgz", "integrity": "sha512-VybsKvpiN1gU1sdMZIp7FcqphVVKEwcuj02x73uvcHE0PTihx1nlBcowYWhDwjpoAXRv43+gDzyggGnn1XZhVw==", - "dev": true, "license": "MIT", "dependencies": { "@babel/parser": "^7.27.0", @@ -451,7 +485,6 @@ "version": "7.27.0", "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.0.tgz", "integrity": "sha512-LVk7fbXml0H2xH34dFzKQ7TDZ2G4/rVTOrq9V+icbbadjbVxxeFeDsNHv2SrZeWoA+6ZiTyWYWtScEIW07EAcA==", - "dev": true, "license": "MIT", "dependencies": { "@babel/compat-data": "^7.26.8", @@ -539,7 +572,6 @@ "version": "7.25.9", "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.25.9.tgz", "integrity": "sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==", - "dev": true, "license": "MIT", "dependencies": { "@babel/traverse": "^7.25.9", @@ -553,7 +585,6 @@ "version": "7.26.0", "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.26.0.tgz", "integrity": "sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==", - "dev": true, "license": "MIT", "dependencies": { "@babel/helper-module-imports": "^7.25.9", @@ -644,7 +675,6 @@ "version": "7.25.9", "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz", "integrity": "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==", - "dev": true, "license": "MIT", "engines": { "node": ">=6.9.0" @@ -654,7 +684,6 @@ "version": "7.25.9", "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz", "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==", - "dev": true, "license": "MIT", "engines": { "node": ">=6.9.0" @@ -664,7 +693,6 @@ "version": "7.25.9", "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.25.9.tgz", "integrity": "sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==", - "dev": true, "license": "MIT", "engines": { "node": ">=6.9.0" @@ -689,7 +717,6 @@ "version": "7.27.0", "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.27.0.tgz", "integrity": "sha512-U5eyP/CTFPuNE3qk+WZMxFkp/4zUzdceQlfzf7DdGdhp+Fezd7HD+i8Y24ZuTMKX3wQBld449jijbGq6OdGNQg==", - "dev": true, "license": "MIT", "dependencies": { "@babel/template": "^7.27.0", @@ -703,7 +730,6 @@ "version": "7.27.0", "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.27.0.tgz", "integrity": "sha512-iaepho73/2Pz7w2eMS0Q5f83+0RKI7i4xmiYeBmDzfRVbQtTOG7Ts0S4HzJVsTMGI9keU8rNfuZr8DKfSt7Yyg==", - "dev": true, "license": "MIT", "dependencies": { "@babel/types": "^7.27.0" @@ -1881,7 +1907,6 @@ "version": "7.27.0", "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.0.tgz", "integrity": "sha512-2ncevenBqXI6qRMukPlXwHKHchC7RyMuu4xv5JBXRfOGVcTy1mXCD12qrp7Jsoxll1EV3+9sE4GugBVRjT2jFA==", - "dev": true, "license": "MIT", "dependencies": { "@babel/code-frame": "^7.26.2", @@ -1896,7 +1921,6 @@ "version": "7.27.0", "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.27.0.tgz", "integrity": "sha512-19lYZFzYVQkkHkl4Cy4WrAVcqBkgvV2YM2TU3xG6DIwO7O3ecbDPfW3yM3bjAGcqcQHi+CCtjMR3dIEHxsd6bA==", - "dev": true, "license": "MIT", "dependencies": { "@babel/code-frame": "^7.26.2", @@ -1915,7 +1939,6 @@ "version": "7.27.0", "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.27.0.tgz", "integrity": "sha512-H45s8fVLYjbhFH62dIJ3WtmJ6RSPt/3DRO0ZcT2SUiYiQyz3BLVb9ADEnLl91m74aQPS3AzzeajZHYOalWe3bg==", - "dev": true, "license": "MIT", "dependencies": { "@babel/helper-string-parser": "^7.25.9", @@ -2089,6 +2112,42 @@ "node": ">=14.21.3" } }, + "node_modules/@clack/core": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@clack/core/-/core-0.3.5.tgz", + "integrity": "sha512-5cfhQNH+1VQ2xLQlmzXMqUoiaH0lRBq9/CLW9lTyMbuKLC3+xEK01tHVvyut++mLOn5urSHmkm6I0Lg9MaJSTQ==", + "license": "MIT", + "dependencies": { + "picocolors": "^1.0.0", + "sisteransi": "^1.0.5" + } + }, + "node_modules/@clack/prompts": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/@clack/prompts/-/prompts-0.7.0.tgz", + "integrity": "sha512-0MhX9/B4iL6Re04jPrttDm+BsP8y6mS7byuv0BvXgdXhbV5PdlsHt55dvNsuBCPZ7xq1oTAOOuotR9NFbQyMSA==", + "bundleDependencies": [ + "is-unicode-supported" + ], + "license": "MIT", + "dependencies": { + "@clack/core": "^0.3.3", + "is-unicode-supported": "*", + "picocolors": "^1.0.0", + "sisteransi": "^1.0.5" + } + }, + "node_modules/@clack/prompts/node_modules/is-unicode-supported": { + "version": "1.3.0", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/@codemirror/autocomplete": { "version": "6.18.6", "resolved": "https://registry.npmjs.org/@codemirror/autocomplete/-/autocomplete-6.18.6.tgz", @@ -3847,6 +3906,18 @@ "tailwindcss": "^3.0 || ^4.0" } }, + "node_modules/@hono/node-server": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@hono/node-server/-/node-server-1.14.1.tgz", + "integrity": "sha512-vmbuM+HPinjWzPe7FFPWMMQMsbKE9gDPhaH0FFdqbGpkT5lp++tcWDTxwBl5EgS5y6JVgIaCdjeHRfQ4XRBRjQ==", + "license": "MIT", + "engines": { + "node": ">=18.14.1" + }, + "peerDependencies": { + "hono": "^4" + } + }, "node_modules/@humanwhocodes/config-array": { "version": "0.13.0", "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.13.0.tgz", @@ -4005,7 +4076,6 @@ "version": "0.3.8", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz", "integrity": "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==", - "dev": true, "license": "MIT", "dependencies": { "@jridgewell/set-array": "^1.2.1", @@ -4029,7 +4099,6 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", - "dev": true, "license": "MIT", "engines": { "node": ">=6.0.0" @@ -4045,7 +4114,6 @@ "version": "0.3.25", "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", - "dev": true, "license": "MIT", "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", @@ -4179,6 +4247,634 @@ "integrity": "sha512-l0h88YhZFyKdXIFNfSWpyjStDjGHwZ/U7iobcK1cQQD8sejsONdQtTVU+1wVN1PBw40PiiHB1vA5S7VTfQiP9g==", "license": "MIT" }, + "node_modules/@million/install": { + "version": "1.0.14", + "resolved": "https://registry.npmjs.org/@million/install/-/install-1.0.14.tgz", + "integrity": "sha512-xZvj4AEHc5hyn8RCiLl9dYNqggj2fa0lgNvUkCiJyhRJPNE2hZrUa/Ka0Weu82VpBaO//zujG0YErk7osjNXPA==", + "dependencies": { + "@antfu/ni": "^0.21.12", + "@axiomhq/js": "1.0.0-rc.3", + "@babel/parser": "^7.25.3", + "@babel/types": "7.26.0", + "@clack/prompts": "^0.7.0", + "ast-types": "^0.14.2", + "cli-high": "^0.4.2", + "diff": "^5.1.0", + "effect": "^3.8.4", + "nanoid": "^5.0.7", + "recast": "^0.23.9", + "xycolors": "^0.1.2" + }, + "bin": { + "install": "bin/index.js" + } + }, + "node_modules/@million/install/node_modules/@babel/types": { + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.0.tgz", + "integrity": "sha512-Z/yiTPj+lDVnF7lWeKCIJzaIkI0vYO87dMpZ4bg4TDrFe4XXLFWL1TbXU27gBP3QccxV9mZICCrnjnYlJjXHOA==", + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.25.9", + "@babel/helper-validator-identifier": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@million/install/node_modules/ast-types": { + "version": "0.14.2", + "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.14.2.tgz", + "integrity": "sha512-O0yuUDnZeQDL+ncNGlJ78BiO4jnYI3bvMsD5prT0/nsgijG/LpNBIr63gTjVTNsiGkgQhiyCShTgxt8oXOrklA==", + "license": "MIT", + "dependencies": { + "tslib": "^2.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@million/install/node_modules/diff": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-5.2.0.tgz", + "integrity": "sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/@million/install/node_modules/nanoid": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-5.1.5.tgz", + "integrity": "sha512-Ir/+ZpE9fDsNH0hQ3C68uyThDXzYcim2EqcZ8zn8Chtt1iylPT9xXJB0kPCnqzgcEGikO9RxSrh63MsmVCU7Fw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.js" + }, + "engines": { + "node": "^18 || >=20" + } + }, + "node_modules/@million/lint": { + "version": "1.0.14", + "resolved": "https://registry.npmjs.org/@million/lint/-/lint-1.0.14.tgz", + "integrity": "sha512-u6/kglVwZRu5+GMmtkNlGLqJVkgTl0TtM+hLa9rBg7pldx+5NG5bk45NvL37uZmAr2Xfa1C6qHb7GrFwfP372g==", + "license": "UNLICENSED", + "dependencies": { + "@axiomhq/js": "1.0.0-rc.3", + "@babel/core": "7.26.0", + "@babel/types": "7.26.0", + "@hono/node-server": "^1.11.1", + "@million/install": "latest", + "@rollup/pluginutils": "^5.1.0", + "@rrweb/types": "2.0.0-alpha.16", + "babel-plugin-syntax-hermes-parser": "^0.21.1", + "ci-info": "^4.0.0", + "esbuild": "^0.20.1", + "faster-babel-types": "^0.1.0", + "hono": "^4.5.9", + "isomorphic-fetch": "^3.0.0", + "nanoid": "^5.0.7", + "ohash": "^1.1.4", + "pako": "^2.1.0", + "pathe": "^1.1.2", + "piscina": "^4.4.0", + "pretty-ms": "8.0.0", + "react-scan": "^0.0.31", + "rrweb": "2.0.0-alpha.4", + "rrweb-player": "1.0.0-alpha.4", + "semver": "^7.6.2", + "socket.io": "^4.8.1", + "socket.io-client": "^4.7.5", + "tmp": "^0.2.3", + "unplugin": "^1.6.0", + "update-notifier-cjs": "^5.1.6" + }, + "bin": { + "lint": "cli.js" + } + }, + "node_modules/@million/lint/node_modules/@babel/core": { + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.26.0.tgz", + "integrity": "sha512-i1SLeK+DzNnQ3LL/CswPCa/E5u4lh1k6IAEphON8F+cXt0t9euTshDru0q7/IqMa1PMPz5RnHuHscF8/ZJsStg==", + "license": "MIT", + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.26.0", + "@babel/generator": "^7.26.0", + "@babel/helper-compilation-targets": "^7.25.9", + "@babel/helper-module-transforms": "^7.26.0", + "@babel/helpers": "^7.26.0", + "@babel/parser": "^7.26.0", + "@babel/template": "^7.25.9", + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.26.0", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@million/lint/node_modules/@babel/core/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@million/lint/node_modules/@babel/types": { + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.0.tgz", + "integrity": "sha512-Z/yiTPj+lDVnF7lWeKCIJzaIkI0vYO87dMpZ4bg4TDrFe4XXLFWL1TbXU27gBP3QccxV9mZICCrnjnYlJjXHOA==", + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.25.9", + "@babel/helper-validator-identifier": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@million/lint/node_modules/@esbuild/aix-ppc64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.20.2.tgz", + "integrity": "sha512-D+EBOJHXdNZcLJRBkhENNG8Wji2kgc9AZ9KiPr1JuZjsNtyHzrsfLRrY0tk2H2aoFu6RANO1y1iPPUCDYWkb5g==", + "cpu": [ + "ppc64" + ], + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@million/lint/node_modules/@esbuild/android-arm": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.20.2.tgz", + "integrity": "sha512-t98Ra6pw2VaDhqNWO2Oph2LXbz/EJcnLmKLGBJwEwXX/JAN83Fym1rU8l0JUWK6HkIbWONCSSatf4sf2NBRx/w==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@million/lint/node_modules/@esbuild/android-arm64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.20.2.tgz", + "integrity": "sha512-mRzjLacRtl/tWU0SvD8lUEwb61yP9cqQo6noDZP/O8VkwafSYwZ4yWy24kan8jE/IMERpYncRt2dw438LP3Xmg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@million/lint/node_modules/@esbuild/android-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.20.2.tgz", + "integrity": "sha512-btzExgV+/lMGDDa194CcUQm53ncxzeBrWJcncOBxuC6ndBkKxnHdFJn86mCIgTELsooUmwUm9FkhSp5HYu00Rg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@million/lint/node_modules/@esbuild/darwin-arm64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.20.2.tgz", + "integrity": "sha512-4J6IRT+10J3aJH3l1yzEg9y3wkTDgDk7TSDFX+wKFiWjqWp/iCfLIYzGyasx9l0SAFPT1HwSCR+0w/h1ES/MjA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@million/lint/node_modules/@esbuild/darwin-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.20.2.tgz", + "integrity": "sha512-tBcXp9KNphnNH0dfhv8KYkZhjc+H3XBkF5DKtswJblV7KlT9EI2+jeA8DgBjp908WEuYll6pF+UStUCfEpdysA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@million/lint/node_modules/@esbuild/freebsd-arm64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.20.2.tgz", + "integrity": "sha512-d3qI41G4SuLiCGCFGUrKsSeTXyWG6yem1KcGZVS+3FYlYhtNoNgYrWcvkOoaqMhwXSMrZRl69ArHsGJ9mYdbbw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@million/lint/node_modules/@esbuild/freebsd-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.20.2.tgz", + "integrity": "sha512-d+DipyvHRuqEeM5zDivKV1KuXn9WeRX6vqSqIDgwIfPQtwMP4jaDsQsDncjTDDsExT4lR/91OLjRo8bmC1e+Cw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@million/lint/node_modules/@esbuild/linux-arm": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.20.2.tgz", + "integrity": "sha512-VhLPeR8HTMPccbuWWcEUD1Az68TqaTYyj6nfE4QByZIQEQVWBB8vup8PpR7y1QHL3CpcF6xd5WVBU/+SBEvGTg==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@million/lint/node_modules/@esbuild/linux-arm64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.20.2.tgz", + "integrity": "sha512-9pb6rBjGvTFNira2FLIWqDk/uaf42sSyLE8j1rnUpuzsODBq7FvpwHYZxQ/It/8b+QOS1RYfqgGFNLRI+qlq2A==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@million/lint/node_modules/@esbuild/linux-ia32": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.20.2.tgz", + "integrity": "sha512-o10utieEkNPFDZFQm9CoP7Tvb33UutoJqg3qKf1PWVeeJhJw0Q347PxMvBgVVFgouYLGIhFYG0UGdBumROyiig==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@million/lint/node_modules/@esbuild/linux-loong64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.20.2.tgz", + "integrity": "sha512-PR7sp6R/UC4CFVomVINKJ80pMFlfDfMQMYynX7t1tNTeivQ6XdX5r2XovMmha/VjR1YN/HgHWsVcTRIMkymrgQ==", + "cpu": [ + "loong64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@million/lint/node_modules/@esbuild/linux-mips64el": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.20.2.tgz", + "integrity": "sha512-4BlTqeutE/KnOiTG5Y6Sb/Hw6hsBOZapOVF6njAESHInhlQAghVVZL1ZpIctBOoTFbQyGW+LsVYZ8lSSB3wkjA==", + "cpu": [ + "mips64el" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@million/lint/node_modules/@esbuild/linux-ppc64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.20.2.tgz", + "integrity": "sha512-rD3KsaDprDcfajSKdn25ooz5J5/fWBylaaXkuotBDGnMnDP1Uv5DLAN/45qfnf3JDYyJv/ytGHQaziHUdyzaAg==", + "cpu": [ + "ppc64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@million/lint/node_modules/@esbuild/linux-riscv64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.20.2.tgz", + "integrity": "sha512-snwmBKacKmwTMmhLlz/3aH1Q9T8v45bKYGE3j26TsaOVtjIag4wLfWSiZykXzXuE1kbCE+zJRmwp+ZbIHinnVg==", + "cpu": [ + "riscv64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@million/lint/node_modules/@esbuild/linux-s390x": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.20.2.tgz", + "integrity": "sha512-wcWISOobRWNm3cezm5HOZcYz1sKoHLd8VL1dl309DiixxVFoFe/o8HnwuIwn6sXre88Nwj+VwZUvJf4AFxkyrQ==", + "cpu": [ + "s390x" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@million/lint/node_modules/@esbuild/linux-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.20.2.tgz", + "integrity": "sha512-1MdwI6OOTsfQfek8sLwgyjOXAu+wKhLEoaOLTjbijk6E2WONYpH9ZU2mNtR+lZ2B4uwr+usqGuVfFT9tMtGvGw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@million/lint/node_modules/@esbuild/netbsd-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.20.2.tgz", + "integrity": "sha512-K8/DhBxcVQkzYc43yJXDSyjlFeHQJBiowJ0uVL6Tor3jGQfSGHNNJcWxNbOI8v5k82prYqzPuwkzHt3J1T1iZQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@million/lint/node_modules/@esbuild/openbsd-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.20.2.tgz", + "integrity": "sha512-eMpKlV0SThJmmJgiVyN9jTPJ2VBPquf6Kt/nAoo6DgHAoN57K15ZghiHaMvqjCye/uU4X5u3YSMgVBI1h3vKrQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@million/lint/node_modules/@esbuild/sunos-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.20.2.tgz", + "integrity": "sha512-2UyFtRC6cXLyejf/YEld4Hajo7UHILetzE1vsRcGL3earZEW77JxrFjH4Ez2qaTiEfMgAXxfAZCm1fvM/G/o8w==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@million/lint/node_modules/@esbuild/win32-arm64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.20.2.tgz", + "integrity": "sha512-GRibxoawM9ZCnDxnP3usoUDO9vUkpAxIIZ6GQI+IlVmr5kP3zUq+l17xELTHMWTWzjxa2guPNyrpq1GWmPvcGQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@million/lint/node_modules/@esbuild/win32-ia32": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.20.2.tgz", + "integrity": "sha512-HfLOfn9YWmkSKRQqovpnITazdtquEW8/SoHW7pWpuEeguaZI4QnCRW6b+oZTztdBnZOS2hqJ6im/D5cPzBTTlQ==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@million/lint/node_modules/@esbuild/win32-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.20.2.tgz", + "integrity": "sha512-N49X4lJX27+l9jbLKSqZ6bKNjzQvHaT8IIFUy+YIqmXQdjYCToGWwOItDrfby14c78aDd5NHQl29xingXfCdLQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@million/lint/node_modules/ci-info": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.2.0.tgz", + "integrity": "sha512-cYY9mypksY8NRqgDB1XD1RiJL338v/551niynFTGkZOO2LHuB2OmOYxDIe/ttN9AHwrqdum1360G3ald0W9kCg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@million/lint/node_modules/esbuild": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.20.2.tgz", + "integrity": "sha512-WdOOppmUNU+IbZ0PaDiTst80zjnrOkyJNHoKupIcVyU8Lvla3Ugx94VzkQ32Ijqd7UhHJy75gNWDMUekcrSJ6g==", + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.20.2", + "@esbuild/android-arm": "0.20.2", + "@esbuild/android-arm64": "0.20.2", + "@esbuild/android-x64": "0.20.2", + "@esbuild/darwin-arm64": "0.20.2", + "@esbuild/darwin-x64": "0.20.2", + "@esbuild/freebsd-arm64": "0.20.2", + "@esbuild/freebsd-x64": "0.20.2", + "@esbuild/linux-arm": "0.20.2", + "@esbuild/linux-arm64": "0.20.2", + "@esbuild/linux-ia32": "0.20.2", + "@esbuild/linux-loong64": "0.20.2", + "@esbuild/linux-mips64el": "0.20.2", + "@esbuild/linux-ppc64": "0.20.2", + "@esbuild/linux-riscv64": "0.20.2", + "@esbuild/linux-s390x": "0.20.2", + "@esbuild/linux-x64": "0.20.2", + "@esbuild/netbsd-x64": "0.20.2", + "@esbuild/openbsd-x64": "0.20.2", + "@esbuild/sunos-x64": "0.20.2", + "@esbuild/win32-arm64": "0.20.2", + "@esbuild/win32-ia32": "0.20.2", + "@esbuild/win32-x64": "0.20.2" + } + }, + "node_modules/@million/lint/node_modules/nanoid": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-5.1.5.tgz", + "integrity": "sha512-Ir/+ZpE9fDsNH0hQ3C68uyThDXzYcim2EqcZ8zn8Chtt1iylPT9xXJB0kPCnqzgcEGikO9RxSrh63MsmVCU7Fw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.js" + }, + "engines": { + "node": "^18 || >=20" + } + }, + "node_modules/@million/lint/node_modules/pako": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/pako/-/pako-2.1.0.tgz", + "integrity": "sha512-w+eufiZ1WuJYgPXbV/PO3NCMEc3xqylkKHzp8bxp1uW4qaSNQUkwmLLEc3kKsfz8lpV1F8Ht3U1Cm+9Srog2ug==", + "license": "(MIT AND Zlib)" + }, + "node_modules/@million/lint/node_modules/pathe": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.2.tgz", + "integrity": "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==", + "license": "MIT" + }, + "node_modules/@million/lint/node_modules/semver": { + "version": "7.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz", + "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/@nabla/vite-plugin-eslint": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/@nabla/vite-plugin-eslint/-/vite-plugin-eslint-2.0.5.tgz", @@ -4195,6 +4891,294 @@ "vite": "^4 || ^5 || ^6" } }, + "node_modules/@napi-rs/nice": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice/-/nice-1.0.1.tgz", + "integrity": "sha512-zM0mVWSXE0a0h9aKACLwKmD6nHcRiKrPpCfvaKqG1CqDEyjEawId0ocXxVzPMCAm6kkWr2P025msfxXEnt8UGQ==", + "license": "MIT", + "optional": true, + "engines": { + "node": ">= 10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Brooooooklyn" + }, + "optionalDependencies": { + "@napi-rs/nice-android-arm-eabi": "1.0.1", + "@napi-rs/nice-android-arm64": "1.0.1", + "@napi-rs/nice-darwin-arm64": "1.0.1", + "@napi-rs/nice-darwin-x64": "1.0.1", + "@napi-rs/nice-freebsd-x64": "1.0.1", + "@napi-rs/nice-linux-arm-gnueabihf": "1.0.1", + "@napi-rs/nice-linux-arm64-gnu": "1.0.1", + "@napi-rs/nice-linux-arm64-musl": "1.0.1", + "@napi-rs/nice-linux-ppc64-gnu": "1.0.1", + "@napi-rs/nice-linux-riscv64-gnu": "1.0.1", + "@napi-rs/nice-linux-s390x-gnu": "1.0.1", + "@napi-rs/nice-linux-x64-gnu": "1.0.1", + "@napi-rs/nice-linux-x64-musl": "1.0.1", + "@napi-rs/nice-win32-arm64-msvc": "1.0.1", + "@napi-rs/nice-win32-ia32-msvc": "1.0.1", + "@napi-rs/nice-win32-x64-msvc": "1.0.1" + } + }, + "node_modules/@napi-rs/nice-android-arm-eabi": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-android-arm-eabi/-/nice-android-arm-eabi-1.0.1.tgz", + "integrity": "sha512-5qpvOu5IGwDo7MEKVqqyAxF90I6aLj4n07OzpARdgDRfz8UbBztTByBp0RC59r3J1Ij8uzYi6jI7r5Lws7nn6w==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/nice-android-arm64": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-android-arm64/-/nice-android-arm64-1.0.1.tgz", + "integrity": "sha512-GqvXL0P8fZ+mQqG1g0o4AO9hJjQaeYG84FRfZaYjyJtZZZcMjXW5TwkL8Y8UApheJgyE13TQ4YNUssQaTgTyvA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/nice-darwin-arm64": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-darwin-arm64/-/nice-darwin-arm64-1.0.1.tgz", + "integrity": "sha512-91k3HEqUl2fsrz/sKkuEkscj6EAj3/eZNCLqzD2AA0TtVbkQi8nqxZCZDMkfklULmxLkMxuUdKe7RvG/T6s2AA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/nice-darwin-x64": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-darwin-x64/-/nice-darwin-x64-1.0.1.tgz", + "integrity": "sha512-jXnMleYSIR/+TAN/p5u+NkCA7yidgswx5ftqzXdD5wgy/hNR92oerTXHc0jrlBisbd7DpzoaGY4cFD7Sm5GlgQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/nice-freebsd-x64": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-freebsd-x64/-/nice-freebsd-x64-1.0.1.tgz", + "integrity": "sha512-j+iJ/ezONXRQsVIB/FJfwjeQXX7A2tf3gEXs4WUGFrJjpe/z2KB7sOv6zpkm08PofF36C9S7wTNuzHZ/Iiccfw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/nice-linux-arm-gnueabihf": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-linux-arm-gnueabihf/-/nice-linux-arm-gnueabihf-1.0.1.tgz", + "integrity": "sha512-G8RgJ8FYXYkkSGQwywAUh84m946UTn6l03/vmEXBYNJxQJcD+I3B3k5jmjFG/OPiU8DfvxutOP8bi+F89MCV7Q==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/nice-linux-arm64-gnu": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-linux-arm64-gnu/-/nice-linux-arm64-gnu-1.0.1.tgz", + "integrity": "sha512-IMDak59/W5JSab1oZvmNbrms3mHqcreaCeClUjwlwDr0m3BoR09ZiN8cKFBzuSlXgRdZ4PNqCYNeGQv7YMTjuA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/nice-linux-arm64-musl": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-linux-arm64-musl/-/nice-linux-arm64-musl-1.0.1.tgz", + "integrity": "sha512-wG8fa2VKuWM4CfjOjjRX9YLIbysSVV1S3Kgm2Fnc67ap/soHBeYZa6AGMeR5BJAylYRjnoVOzV19Cmkco3QEPw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/nice-linux-ppc64-gnu": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-linux-ppc64-gnu/-/nice-linux-ppc64-gnu-1.0.1.tgz", + "integrity": "sha512-lxQ9WrBf0IlNTCA9oS2jg/iAjQyTI6JHzABV664LLrLA/SIdD+I1i3Mjf7TsnoUbgopBcCuDztVLfJ0q9ubf6Q==", + "cpu": [ + "ppc64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/nice-linux-riscv64-gnu": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-linux-riscv64-gnu/-/nice-linux-riscv64-gnu-1.0.1.tgz", + "integrity": "sha512-3xs69dO8WSWBb13KBVex+yvxmUeEsdWexxibqskzoKaWx9AIqkMbWmE2npkazJoopPKX2ULKd8Fm9veEn0g4Ig==", + "cpu": [ + "riscv64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/nice-linux-s390x-gnu": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-linux-s390x-gnu/-/nice-linux-s390x-gnu-1.0.1.tgz", + "integrity": "sha512-lMFI3i9rlW7hgToyAzTaEybQYGbQHDrpRkg+1gJWEpH0PLAQoZ8jiY0IzakLfNWnVda1eTYYlxxFYzW8Rqczkg==", + "cpu": [ + "s390x" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/nice-linux-x64-gnu": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-linux-x64-gnu/-/nice-linux-x64-gnu-1.0.1.tgz", + "integrity": "sha512-XQAJs7DRN2GpLN6Fb+ZdGFeYZDdGl2Fn3TmFlqEL5JorgWKrQGRUrpGKbgZ25UeZPILuTKJ+OowG2avN8mThBA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/nice-linux-x64-musl": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-linux-x64-musl/-/nice-linux-x64-musl-1.0.1.tgz", + "integrity": "sha512-/rodHpRSgiI9o1faq9SZOp/o2QkKQg7T+DK0R5AkbnI/YxvAIEHf2cngjYzLMQSQgUhxym+LFr+UGZx4vK4QdQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/nice-win32-arm64-msvc": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-win32-arm64-msvc/-/nice-win32-arm64-msvc-1.0.1.tgz", + "integrity": "sha512-rEcz9vZymaCB3OqEXoHnp9YViLct8ugF+6uO5McifTedjq4QMQs3DHz35xBEGhH3gJWEsXMUbzazkz5KNM5YUg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/nice-win32-ia32-msvc": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-win32-ia32-msvc/-/nice-win32-ia32-msvc-1.0.1.tgz", + "integrity": "sha512-t7eBAyPUrWL8su3gDxw9xxxqNwZzAqKo0Szv3IjVQd1GpXXVkb6vBBQUuxfIYaXMzZLwlxRQ7uzM2vdUE9ULGw==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/nice-win32-x64-msvc": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-win32-x64-msvc/-/nice-win32-x64-msvc-1.0.1.tgz", + "integrity": "sha512-JlF+uDcatt3St2ntBG8H02F1mM45i5SF9W+bIKiReVE6wiy3o16oBP/yxt+RZ+N6LbCImJXJ6bXNO2kn9AXicg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", @@ -4302,6 +5286,47 @@ "node": ">=18" } }, + "node_modules/@pnpm/config.env-replace": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@pnpm/config.env-replace/-/config.env-replace-1.1.0.tgz", + "integrity": "sha512-htyl8TWnKL7K/ESFa1oW2UB5lVDxuF5DpM7tBi6Hu2LNL3mWkIzNLG6N4zoCUP1lCKNxWy/3iu8mS8MvToGd6w==", + "license": "MIT", + "engines": { + "node": ">=12.22.0" + } + }, + "node_modules/@pnpm/network.ca-file": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@pnpm/network.ca-file/-/network.ca-file-1.0.2.tgz", + "integrity": "sha512-YcPQ8a0jwYU9bTdJDpXjMi7Brhkr1mXsXrUJvjqM2mQDgkRiz8jFaQGOdaLxgjtUfQgZhKy/O3cG/YwmgKaxLA==", + "license": "MIT", + "dependencies": { + "graceful-fs": "4.2.10" + }, + "engines": { + "node": ">=12.22.0" + } + }, + "node_modules/@pnpm/network.ca-file/node_modules/graceful-fs": { + "version": "4.2.10", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", + "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", + "license": "ISC" + }, + "node_modules/@pnpm/npm-conf": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/@pnpm/npm-conf/-/npm-conf-2.3.1.tgz", + "integrity": "sha512-c83qWb22rNRuB0UaVCI0uRPNRr8Z0FWnEIvT47jiHAmOIUHbBOg5XvV7pM5x+rKn9HRpjxquDbXYSXr3fAKFcw==", + "license": "MIT", + "dependencies": { + "@pnpm/config.env-replace": "^1.1.0", + "@pnpm/network.ca-file": "^1.0.1", + "config-chain": "^1.1.11" + }, + "engines": { + "node": ">=12" + } + }, "node_modules/@react-hook/latest": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/@react-hook/latest/-/latest-1.0.3.tgz", @@ -4487,7 +5512,6 @@ "version": "5.1.4", "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.1.4.tgz", "integrity": "sha512-USm05zrsFxYLPdWWq+K3STlWiT/3ELn3RcV5hJMghpeAIhxfsUIg6mt12CBJBInWMV4VneoV7SfGv8xIwo2qNQ==", - "dev": true, "license": "MIT", "dependencies": { "@types/estree": "^1.0.0", @@ -4510,14 +5534,12 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", - "dev": true, "license": "MIT" }, "node_modules/@rollup/pluginutils/node_modules/picomatch": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", - "dev": true, "license": "MIT", "engines": { "node": ">=12" @@ -4806,6 +5828,15 @@ "win32" ] }, + "node_modules/@rrweb/types": { + "version": "2.0.0-alpha.16", + "resolved": "https://registry.npmjs.org/@rrweb/types/-/types-2.0.0-alpha.16.tgz", + "integrity": "sha512-E6cACNVsm+NUhn7dzocQoKyXI7BHrHRRm5Ab23yrAzEQ2caWocCEYJhqDlc4KRVJBkQfXZfyWm8+2d0uggFuZg==", + "license": "MIT", + "dependencies": { + "rrweb-snapshot": "^2.0.0-alpha.16" + } + }, "node_modules/@rtsao/scc": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@rtsao/scc/-/scc-1.1.0.tgz", @@ -4833,6 +5864,18 @@ "url": "https://github.com/sindresorhus/is?sponsor=1" } }, + "node_modules/@socket.io/component-emitter": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.2.tgz", + "integrity": "sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA==", + "license": "MIT" + }, + "node_modules/@standard-schema/spec": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@standard-schema/spec/-/spec-1.0.0.tgz", + "integrity": "sha512-m2bOd0f2RT9k8QJx1JN85cZYyH1RqFBdlwtkSlf4tBDYLCiiZnv1fIIwacK6cqwXavOydf0NPToMQgpKq+dVlA==", + "license": "MIT" + }, "node_modules/@swc/core": { "version": "1.11.20", "resolved": "https://registry.npmjs.org/@swc/core/-/core-1.11.20.tgz", @@ -5241,6 +6284,12 @@ "dev": true, "license": "MIT" }, + "node_modules/@tsconfig/svelte": { + "version": "1.0.13", + "resolved": "https://registry.npmjs.org/@tsconfig/svelte/-/svelte-1.0.13.tgz", + "integrity": "sha512-5lYJP45Xllo4yE/RUBccBT32eBlRDbqN8r1/MIvQbKxW3aFqaYPCNgm8D5V20X4ShHcwvYWNlKg3liDh1MlBoA==", + "license": "MIT" + }, "node_modules/@tweenjs/tween.js": { "version": "23.1.3", "resolved": "https://registry.npmjs.org/@tweenjs/tween.js/-/tween.js-23.1.3.tgz", @@ -5312,6 +6361,21 @@ "@types/responselike": "^1.0.0" } }, + "node_modules/@types/cors": { + "version": "2.8.17", + "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.17.tgz", + "integrity": "sha512-8CGDvrBj1zgo2qE+oS3pOCyYNqCPryMWY2bGfwA0dcfopWGgxs+78df0Rs3rc9THP4JkOhLsAa+15VdpAqkcUA==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/css-font-loading-module": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/@types/css-font-loading-module/-/css-font-loading-module-0.0.7.tgz", + "integrity": "sha512-nl09VhutdjINdWyXxHWN/w9zlNCfr60JUqJbd24YXUuCwgeL0TpFSdElCwb6cxfB6ybE19Gjj4g0jsgkXxKv1Q==", + "license": "MIT" + }, "node_modules/@types/debug": { "version": "4.1.12", "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz", @@ -5355,7 +6419,6 @@ "version": "1.0.7", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.7.tgz", "integrity": "sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==", - "dev": true, "license": "MIT" }, "node_modules/@types/fs-extra": { @@ -5522,7 +6585,6 @@ "version": "22.14.1", "resolved": "https://registry.npmjs.org/@types/node/-/node-22.14.1.tgz", "integrity": "sha512-u0HuPQwe/dHrItgHHpmw3N2fYCR6x4ivMNbPHRkBVP4CvN+kiRrKHWk3i8tXiO/joPwXLMYvF9TTF0eqgHIuOw==", - "dev": true, "license": "MIT", "dependencies": { "undici-types": "~6.21.0" @@ -6886,6 +7948,12 @@ "url": "https://opencollective.com/xstate" } }, + "node_modules/@xstate/fsm": { + "version": "1.6.5", + "resolved": "https://registry.npmjs.org/@xstate/fsm/-/fsm-1.6.5.tgz", + "integrity": "sha512-b5o1I6aLNeYlU/3CPlj/Z91ybk1gUsKT+5NAJI+2W4UjvS5KLG28K9v5UvNoFVjHV8PajVZ00RH3vnjyQO7ZAw==", + "license": "MIT" + }, "node_modules/@xstate/inspect": { "version": "0.8.0", "resolved": "https://registry.npmjs.org/@xstate/inspect/-/inspect-0.8.0.tgz", @@ -6972,7 +8040,6 @@ "version": "1.3.8", "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", - "dev": true, "license": "MIT", "dependencies": { "mime-types": "~2.1.34", @@ -7080,6 +8147,15 @@ "ajv": "^6.9.1" } }, + "node_modules/ansi-align": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz", + "integrity": "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==", + "license": "ISC", + "dependencies": { + "string-width": "^4.1.0" + } + }, "node_modules/ansi-colors": { "version": "4.1.3", "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", @@ -7676,7 +8752,6 @@ "version": "0.16.1", "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.16.1.tgz", "integrity": "sha512-6t10qk83GOG8p0vKmaCr8eiilZwO171AvbROMtvvNiwrTly62t+7XkA8RdIIVbpMhCASAsxgAzdRSwh6nw/5Dg==", - "dev": true, "license": "MIT", "dependencies": { "tslib": "^2.0.1" @@ -7884,6 +8959,15 @@ "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, + "node_modules/babel-plugin-syntax-hermes-parser": { + "version": "0.21.1", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-hermes-parser/-/babel-plugin-syntax-hermes-parser-0.21.1.tgz", + "integrity": "sha512-tUCEa+EykZx3oJXc+PolKz2iwDscCJ2hCONMvEqjAb4jIQH5ZapDd5Brs2Nk4TQpSJ/1Ykz53ksQbevXbF0wxg==", + "license": "MIT", + "dependencies": { + "hermes-parser": "0.21.1" + } + }, "node_modules/balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", @@ -7926,6 +9010,15 @@ ], "license": "MIT" }, + "node_modules/base64id": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz", + "integrity": "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==", + "license": "MIT", + "engines": { + "node": "^4.5.0 || >= 5.9" + } + }, "node_modules/basic-auth": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.1.tgz", @@ -8074,6 +9167,57 @@ "license": "MIT", "optional": true }, + "node_modules/boxen": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/boxen/-/boxen-5.1.2.tgz", + "integrity": "sha512-9gYgQKXx+1nP8mP7CzFyaUARhg7D3n1dF/FnErWmu9l6JvGpNUN278h0aSb+QjoiKSWG+iZ3uHrcqk0qrY9RQQ==", + "license": "MIT", + "dependencies": { + "ansi-align": "^3.0.0", + "camelcase": "^6.2.0", + "chalk": "^4.1.0", + "cli-boxes": "^2.2.1", + "string-width": "^4.2.2", + "type-fest": "^0.20.2", + "widest-line": "^3.1.0", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/boxen/node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/boxen/node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, "node_modules/brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -8109,7 +9253,6 @@ "version": "4.24.4", "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.4.tgz", "integrity": "sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A==", - "dev": true, "funding": [ { "type": "opencollective", @@ -8448,7 +9591,6 @@ "version": "6.3.0", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", - "dev": true, "license": "MIT", "engines": { "node": ">=10" @@ -8471,7 +9613,6 @@ "version": "1.0.30001713", "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001713.tgz", "integrity": "sha512-wCIWIg+A4Xr7NfhTuHdX+/FKh3+Op3LBbSp2N5Pfx6T/LhdQy3GTyoTg48BReaW/MyMNZAkTadsBtai3ldWK0Q==", - "dev": true, "funding": [ { "type": "opencollective", @@ -8509,7 +9650,6 @@ "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", @@ -8661,6 +9801,18 @@ "node": ">=6" } }, + "node_modules/cli-boxes": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-2.2.1.tgz", + "integrity": "sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==", + "license": "MIT", + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/cli-cursor": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-4.0.0.tgz", @@ -8677,6 +9829,24 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/cli-high": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/cli-high/-/cli-high-0.4.3.tgz", + "integrity": "sha512-YbwZhmK0fpwVn3bsbYiYdkseXFcGvSVkX+fl0CY73PAz77Uzkr46X3Ifs4V7NgwfvCqGx+6C5zEi8SL8m9lqtg==", + "license": "MIT", + "dependencies": { + "@clack/prompts": "^0.7.0", + "sugar-high": "^0.7.1", + "xycolors": "^0.1.2", + "yargs": "^17.7.2" + }, + "bin": { + "cli-high": "bin/index.js" + }, + "funding": { + "url": "https://github.com/sponsors/xinyao27" + } + }, "node_modules/cli-spinners": { "version": "2.9.2", "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz", @@ -8858,6 +10028,22 @@ "dev": true, "license": "MIT" }, + "node_modules/config-chain": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.13.tgz", + "integrity": "sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==", + "license": "MIT", + "dependencies": { + "ini": "^1.3.4", + "proto-list": "~1.2.1" + } + }, + "node_modules/config-chain/node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "license": "ISC" + }, "node_modules/config-file-ts": { "version": "0.2.8-rc1", "resolved": "https://registry.npmjs.org/config-file-ts/-/config-file-ts-0.2.8-rc1.tgz", @@ -8926,6 +10112,38 @@ "node": ">=16 || 14 >=14.17" } }, + "node_modules/configstore": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/configstore/-/configstore-5.0.1.tgz", + "integrity": "sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA==", + "license": "BSD-2-Clause", + "dependencies": { + "dot-prop": "^5.2.0", + "graceful-fs": "^4.1.2", + "make-dir": "^3.0.0", + "unique-string": "^2.0.0", + "write-file-atomic": "^3.0.0", + "xdg-basedir": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/configstore/node_modules/make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "license": "MIT", + "dependencies": { + "semver": "^6.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/content-disposition": { "version": "0.5.4", "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", @@ -8953,7 +10171,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", - "dev": true, "license": "MIT" }, "node_modules/cookie": { @@ -8993,6 +10210,19 @@ "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", "license": "MIT" }, + "node_modules/cors": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", + "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", + "license": "MIT", + "dependencies": { + "object-assign": "^4", + "vary": "^1" + }, + "engines": { + "node": ">= 0.10" + } + }, "node_modules/corser": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/corser/-/corser-2.0.1.tgz", @@ -9096,6 +10326,15 @@ "node": ">= 8" } }, + "node_modules/crypto-random-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", + "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/css-line-break": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/css-line-break/-/css-line-break-2.1.0.tgz", @@ -9311,9 +10550,7 @@ "version": "0.6.0", "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", - "dev": true, "license": "MIT", - "optional": true, "engines": { "node": ">=4.0.0" } @@ -9666,6 +10903,18 @@ "url": "https://github.com/fb55/domutils?sponsor=1" } }, + "node_modules/dot-prop": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", + "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", + "license": "MIT", + "dependencies": { + "is-obj": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/dotenv": { "version": "16.5.0", "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.5.0.tgz", @@ -9825,6 +11074,16 @@ "dev": true, "license": "MIT" }, + "node_modules/effect": { + "version": "3.14.18", + "resolved": "https://registry.npmjs.org/effect/-/effect-3.14.18.tgz", + "integrity": "sha512-hqXZGfps5lQzoVq14X0uajOx5SKiEvDn40lFVGjHs7+SpdnL39xUZo3NZ96Gs8uVz2nFxBYPCfQA0rOaW+5uQA==", + "license": "MIT", + "dependencies": { + "@standard-schema/spec": "^1.0.0", + "fast-check": "^3.23.1" + } + }, "node_modules/ejs": { "version": "3.1.10", "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.10.tgz", @@ -9907,7 +11166,6 @@ "version": "1.5.136", "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.136.tgz", "integrity": "sha512-kL4+wUTD7RSA5FHx5YwWtjDnEEkIIikFgWHR4P6fqjw1PPLlqYkxeOb++wAauAssat0YClCy8Y3C5SxgSkjibQ==", - "dev": true, "license": "ISC" }, "node_modules/electron-updater": { @@ -10077,6 +11335,133 @@ "once": "^1.4.0" } }, + "node_modules/engine.io": { + "version": "6.6.4", + "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.6.4.tgz", + "integrity": "sha512-ZCkIjSYNDyGn0R6ewHDtXgns/Zre/NT6Agvq1/WobF7JXgFff4SeDroKiCO3fNJreU9YG429Sc81o4w5ok/W5g==", + "license": "MIT", + "dependencies": { + "@types/cors": "^2.8.12", + "@types/node": ">=10.0.0", + "accepts": "~1.3.4", + "base64id": "2.0.0", + "cookie": "~0.7.2", + "cors": "~2.8.5", + "debug": "~4.3.1", + "engine.io-parser": "~5.2.1", + "ws": "~8.17.1" + }, + "engines": { + "node": ">=10.2.0" + } + }, + "node_modules/engine.io-client": { + "version": "6.6.3", + "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-6.6.3.tgz", + "integrity": "sha512-T0iLjnyNWahNyv/lcjS2y4oE358tVS/SYQNxYXGAJ9/GLgH4VCvOQ/mhTjqU88mLZCQgiG8RIegFHYCdVC+j5w==", + "license": "MIT", + "dependencies": { + "@socket.io/component-emitter": "~3.1.0", + "debug": "~4.3.1", + "engine.io-parser": "~5.2.1", + "ws": "~8.17.1", + "xmlhttprequest-ssl": "~2.1.1" + } + }, + "node_modules/engine.io-client/node_modules/debug": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", + "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/engine.io-client/node_modules/ws": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz", + "integrity": "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==", + "license": "MIT", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/engine.io-parser": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.2.3.tgz", + "integrity": "sha512-HqD3yTBfnBxIrbnM1DoD6Pcq8NECnh8d4As1Qgh0z5Gg3jRRIqijury0CL3ghu/edArpUYiYqQiDUQBIs4np3Q==", + "license": "MIT", + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/engine.io/node_modules/cookie": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", + "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/engine.io/node_modules/debug": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", + "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/engine.io/node_modules/ws": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz", + "integrity": "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==", + "license": "MIT", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, "node_modules/entities": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", @@ -10354,6 +11739,15 @@ "node": ">=6" } }, + "node_modules/escape-goat": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/escape-goat/-/escape-goat-2.1.1.tgz", + "integrity": "sha512-8/uIhbG12Csjy2JEW7D9pHbreaVaS/OpN3ycnyvElTdwM5n6GY6W6e2IPemfvGZeUMqZ9A/3GqIZMgKnBhAw/Q==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/escape-html": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", @@ -10807,7 +12201,6 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true, "license": "BSD-2-Clause", "bin": { "esparse": "bin/esparse.js", @@ -11190,6 +12583,28 @@ "license": "MIT", "optional": true }, + "node_modules/fast-check": { + "version": "3.23.2", + "resolved": "https://registry.npmjs.org/fast-check/-/fast-check-3.23.2.tgz", + "integrity": "sha512-h5+1OzzfCC3Ef7VbtKdcv7zsstUQwUDlYpUTvjeUsJAssPgLn7QzbboPtL5ro04Mq0rPOsMzl7q5hIbRs2wD1A==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/dubzzz" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fast-check" + } + ], + "license": "MIT", + "dependencies": { + "pure-rand": "^6.1.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, "node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", @@ -11246,6 +12661,18 @@ "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==", "license": "MIT" }, + "node_modules/faster-babel-types": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/faster-babel-types/-/faster-babel-types-0.1.0.tgz", + "integrity": "sha512-0bEgAyXBdX330U6WbY80Q/h8k0NAPT3Z3sRlC6Fiv0kxekow9JQv2KBL55jIDFxNKcixjvByNnTZfH4axKSB9g==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@babel/types": "^7" + } + }, "node_modules/fastq": { "version": "1.19.1", "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz", @@ -11335,6 +12762,12 @@ "node": "^12.20 || >= 14.13" } }, + "node_modules/fetch-retry": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/fetch-retry/-/fetch-retry-6.0.0.tgz", + "integrity": "sha512-BUFj1aMubgib37I3v4q78fYo63Po7t4HUPTpQ6/QE6yK6cIQrP+W43FYToeTEyg5m2Y7eFUtijUuAv/PDlWuag==", + "license": "MIT" + }, "node_modules/fflate": { "version": "0.8.2", "resolved": "https://registry.npmjs.org/fflate/-/fflate-0.8.2.tgz", @@ -11717,7 +13150,6 @@ "version": "2.3.2", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "dev": true, "hasInstallScript": true, "license": "MIT", "optional": true, @@ -11797,7 +13229,6 @@ "version": "1.0.0-beta.2", "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", - "dev": true, "license": "MIT", "engines": { "node": ">=6.9.0" @@ -12018,7 +13449,6 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.1.tgz", "integrity": "sha512-NBcGGFbBA9s1VzD41QXDG+3++t9Mn5t1FpLdhESY6oKY4gYTFpX4wO3sqGUa0Srjtbfj3szX0RnemmrVRUdULA==", - "dev": true, "license": "MIT", "dependencies": { "ini": "2.0.0" @@ -12034,7 +13464,6 @@ "version": "11.12.0", "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "dev": true, "license": "MIT", "engines": { "node": ">=4" @@ -12172,7 +13601,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, "license": "MIT", "engines": { "node": ">=8" @@ -12236,6 +13664,15 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/has-yarn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/has-yarn/-/has-yarn-2.1.0.tgz", + "integrity": "sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/hasown": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", @@ -12259,6 +13696,30 @@ "he": "bin/he" } }, + "node_modules/hermes-estree": { + "version": "0.21.1", + "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.21.1.tgz", + "integrity": "sha512-ayfESdfG0wZM32uGw0CMfcW6pW6RM8htLXZI56A4rr7hIOjmKw+wd3+71wUc1uQfn90ZyY1NMCbQeMnunrIidg==", + "license": "MIT" + }, + "node_modules/hermes-parser": { + "version": "0.21.1", + "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.21.1.tgz", + "integrity": "sha512-ANsRSBqQHzca7AXbsuwKApSQhAdljPip63MgqLebSVzNUI+A3NDzfiH9Ny4df4fA7Ndso3kPR1V/x1YEc7BYxA==", + "license": "MIT", + "dependencies": { + "hermes-estree": "0.21.1" + } + }, + "node_modules/hono": { + "version": "4.7.8", + "resolved": "https://registry.npmjs.org/hono/-/hono-4.7.8.tgz", + "integrity": "sha512-PCibtFdxa7/Ldud9yddl1G81GjYaeMYYTq4ywSaNsYbB1Lug4mwtOMJf2WXykL0pntYwmpRJeOI3NmoDgD+Jxw==", + "license": "MIT", + "engines": { + "node": ">=16.9.0" + } + }, "node_modules/hosted-git-info": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz", @@ -12571,11 +14032,19 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/import-lazy": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz", + "integrity": "sha512-m7ZEHgtw69qOGw+jwxXkHlrlIPdTGkyh66zXZ1ajZbxkDBNjSY/LGbmjc7h0s2ELsUDTAhFr55TrPSSqJGPG0A==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, "node_modules/imurmurhash": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "dev": true, "license": "MIT", "engines": { "node": ">=0.8.19" @@ -12633,7 +14102,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz", "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==", - "dev": true, "license": "ISC", "engines": { "node": ">=10" @@ -12964,6 +14432,22 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/is-installed-globally": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.4.0.tgz", + "integrity": "sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==", + "license": "MIT", + "dependencies": { + "global-dirs": "^3.0.0", + "is-path-inside": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/is-interactive": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", @@ -12994,6 +14478,18 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-npm": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-5.0.0.tgz", + "integrity": "sha512-WW/rQLOazUq+ST/bCAVBp/2oMERWLsR7OrKyt052dNDk4DHcDE0/7QSXITlmi+VBcV13DfIbysG3tZJm5RfdBA==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/is-number": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", @@ -13021,11 +14517,19 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-obj": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", + "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/is-path-inside": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", - "dev": true, "license": "MIT", "engines": { "node": ">=8" @@ -13150,11 +14654,16 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", + "license": "MIT" + }, "node_modules/is-unicode-supported": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", - "dev": true, "license": "MIT", "engines": { "node": ">=10" @@ -13225,6 +14734,12 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/is-yarn-global": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/is-yarn-global/-/is-yarn-global-0.3.0.tgz", + "integrity": "sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw==", + "license": "MIT" + }, "node_modules/isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", @@ -13578,7 +15093,6 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", - "dev": true, "license": "MIT", "bin": { "jsesc": "bin/jsesc" @@ -13626,7 +15140,6 @@ "version": "2.2.3", "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "dev": true, "license": "MIT", "bin": { "json5": "lib/cli.js" @@ -13823,6 +15336,15 @@ "kill-port": "cli.js" } }, + "node_modules/kleur": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", + "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/language-subtag-registry": { "version": "0.3.23", "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.23.tgz", @@ -14321,7 +15843,6 @@ "version": "5.1.1", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "dev": true, "license": "ISC", "dependencies": { "yallist": "^3.0.2" @@ -14609,7 +16130,6 @@ "version": "1.52.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "dev": true, "license": "MIT", "engines": { "node": ">= 0.6" @@ -14619,7 +16139,6 @@ "version": "2.1.35", "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "dev": true, "license": "MIT", "dependencies": { "mime-db": "1.52.0" @@ -14804,6 +16323,12 @@ "dev": true, "license": "ISC" }, + "node_modules/mitt": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mitt/-/mitt-3.0.1.tgz", + "integrity": "sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==", + "license": "MIT" + }, "node_modules/mkdirp": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", @@ -15008,6 +16533,15 @@ "url": "https://github.com/chalk/supports-color?sponsor=1" } }, + "node_modules/mri": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz", + "integrity": "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, "node_modules/ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", @@ -15050,7 +16584,6 @@ "version": "3.3.11", "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", - "dev": true, "funding": [ { "type": "github", @@ -15084,7 +16617,6 @@ "version": "0.6.3", "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", - "dev": true, "license": "MIT", "engines": { "node": ">= 0.6" @@ -15206,7 +16738,6 @@ "version": "2.0.19", "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz", "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==", - "dev": true, "license": "MIT" }, "node_modules/nopt": { @@ -15455,6 +16986,12 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/ohash": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/ohash/-/ohash-1.1.6.tgz", + "integrity": "sha512-TBu7PtV8YkAZn0tSxobKY2n2aAQva936lhRrj6957aDaCf9IEtqsKbgMzXE/F/sjqYOwmrukeORHNLe5glk7Cg==", + "license": "MIT" + }, "node_modules/oidc-token-hash": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/oidc-token-hash/-/oidc-token-hash-5.1.0.tgz", @@ -15889,6 +17426,18 @@ "node": ">=0.10.0" } }, + "node_modules/parse-ms": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/parse-ms/-/parse-ms-3.0.0.tgz", + "integrity": "sha512-Tpb8Z7r7XbbtBTrM9UhpkzzaMrqA2VXMT3YChzYltwV3P3pM6t8wl7TvpMnSTosz1aQAdVib7kdoys7vYOPerw==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/parse-semver": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/parse-semver/-/parse-semver-1.1.1.tgz", @@ -16093,7 +17642,6 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", - "dev": true, "license": "ISC" }, "node_modules/picomatch": { @@ -16129,6 +17677,15 @@ "node": ">= 6" } }, + "node_modules/piscina": { + "version": "4.9.2", + "resolved": "https://registry.npmjs.org/piscina/-/piscina-4.9.2.tgz", + "integrity": "sha512-Fq0FERJWFEUpB4eSY59wSNwXD4RYqR+nR/WiEVcZW8IWfVBxJJafcgTEZDQo8k3w0sUarJ8RyVbbUF4GQ2LGbQ==", + "license": "MIT", + "optionalDependencies": { + "@napi-rs/nice": "^1.0.1" + } + }, "node_modules/pixelmatch": { "version": "5.3.0", "resolved": "https://registry.npmjs.org/pixelmatch/-/pixelmatch-5.3.0.tgz", @@ -16156,7 +17713,6 @@ "version": "1.52.0", "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.52.0.tgz", "integrity": "sha512-JAwMNMBlxJ2oD1kce4KPtMkDeKGHQstdpFPcPH3maElAXon/QZeTvtsfXmTMRyO9TslfoYOXkSsvao2nE1ilTw==", - "dev": true, "license": "Apache-2.0", "dependencies": { "playwright-core": "1.52.0" @@ -16175,7 +17731,6 @@ "version": "1.52.0", "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.52.0.tgz", "integrity": "sha512-l2osTgLXSMeuLZOML9qYODUQoPPnUsKsb5/P6LJ2e6uPKXUdPK5WYhN4z03G+YNbWmGDY4YENauNu4ZKczreHg==", - "dev": true, "license": "Apache-2.0", "bin": { "playwright-core": "cli.js" @@ -16247,7 +17802,6 @@ "version": "8.5.3", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.3.tgz", "integrity": "sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==", - "dev": true, "funding": [ { "type": "opencollective", @@ -16492,6 +18046,21 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, + "node_modules/pretty-ms": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/pretty-ms/-/pretty-ms-8.0.0.tgz", + "integrity": "sha512-ASJqOugUF1bbzI35STMBUpZqdfYKlJugy6JBziGi2EE+AL5JPJGSzvpeVXojxrr0ViUYoToUjb5kjSEGf7Y83Q==", + "license": "MIT", + "dependencies": { + "parse-ms": "^3.0.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/proc-log": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-2.0.1.tgz", @@ -16565,6 +18134,12 @@ "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", "license": "MIT" }, + "node_modules/proto-list": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz", + "integrity": "sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==", + "license": "ISC" + }, "node_modules/proxy-addr": { "version": "2.0.7", "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", @@ -16610,12 +18185,40 @@ "node": ">=6" } }, + "node_modules/pupa": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/pupa/-/pupa-2.1.1.tgz", + "integrity": "sha512-l1jNAspIBSFqbT+y+5FosojNpVpF94nlI+wDUpqP9enwOTfHx9f0gh5nB96vl+6yTpsJsypeNrwfzPrKuHB41A==", + "license": "MIT", + "dependencies": { + "escape-goat": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/pure-color": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/pure-color/-/pure-color-1.3.0.tgz", "integrity": "sha512-QFADYnsVoBMw1srW7OVKEYjG+MbIa49s54w1MA1EDY6r2r/sTcKKYqRX1f4GYvnXP7eN/Pe9HFcX+hwzmrXRHA==", "license": "MIT" }, + "node_modules/pure-rand": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.1.0.tgz", + "integrity": "sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/dubzzz" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fast-check" + } + ], + "license": "MIT" + }, "node_modules/qs": { "version": "6.13.0", "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", @@ -16719,9 +18322,7 @@ "version": "1.2.8", "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", - "dev": true, "license": "(BSD-2-Clause OR MIT OR Apache-2.0)", - "optional": true, "dependencies": { "deep-extend": "^0.6.0", "ini": "~1.3.0", @@ -16736,17 +18337,13 @@ "version": "1.3.8", "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", - "dev": true, - "license": "ISC", - "optional": true + "license": "ISC" }, "node_modules/rc/node_modules/strip-json-comments": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", - "dev": true, "license": "MIT", - "optional": true, "engines": { "node": ">=0.10.0" } @@ -16922,6 +18519,33 @@ "react-dom": ">=16.8" } }, + "node_modules/react-scan": { + "version": "0.0.31", + "resolved": "https://registry.npmjs.org/react-scan/-/react-scan-0.0.31.tgz", + "integrity": "sha512-reHgQnASWVXwHe0Ibk/EbsEPZhKrmNRf8EUNDmjMi1lzXec+Cj9litKxD0TG2ghAwg5V4sT0wzhiOgZSIefeVg==", + "license": "MIT", + "dependencies": { + "@clack/core": "^0.3.5", + "@clack/prompts": "^0.8.2", + "kleur": "^4.1.5", + "mri": "^1.2.0", + "playwright": "^1.49.0" + }, + "bin": { + "react-scan": "bin/cli.js" + } + }, + "node_modules/react-scan/node_modules/@clack/prompts": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/@clack/prompts/-/prompts-0.8.2.tgz", + "integrity": "sha512-6b9Ab2UiZwJYA9iMyboYyW9yJvAO9V753ZhS+DHKEjZRKAxPPOb7MXXu84lsPFG+vZt6FRFniZ8rXi+zCIw4yQ==", + "license": "MIT", + "dependencies": { + "@clack/core": "0.3.5", + "picocolors": "^1.0.0", + "sisteransi": "^1.0.5" + } + }, "node_modules/react-textarea-autosize": { "version": "8.5.9", "resolved": "https://registry.npmjs.org/react-textarea-autosize/-/react-textarea-autosize-8.5.9.tgz", @@ -17105,7 +18729,6 @@ "version": "0.23.11", "resolved": "https://registry.npmjs.org/recast/-/recast-0.23.11.tgz", "integrity": "sha512-YTUo+Flmw4ZXiWfQKGcwwc11KnoRAYgzAE2E7mXKCjSviTKShtxBsN6YUUBB2gtaBzKzeKunxhUwNHQuRryhWA==", - "dev": true, "license": "MIT", "dependencies": { "ast-types": "^0.16.1", @@ -17243,6 +18866,30 @@ "node": ">=4" } }, + "node_modules/registry-auth-token": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-5.1.0.tgz", + "integrity": "sha512-GdekYuwLXLxMuFTwAPg5UKGLW/UXzQrZvH/Zj791BQif5T05T0RsaLfHc9q3ZOKi7n+BoprPD9mJ0O0k4xzUlw==", + "license": "MIT", + "dependencies": { + "@pnpm/npm-conf": "^2.1.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/registry-url": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-5.1.0.tgz", + "integrity": "sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw==", + "license": "MIT", + "dependencies": { + "rc": "^1.2.8" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/regjsgen": { "version": "0.8.0", "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.8.0.tgz", @@ -17515,6 +19162,56 @@ "typescript": "^4.5 || ^5.0" } }, + "node_modules/rrdom": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/rrdom/-/rrdom-0.1.7.tgz", + "integrity": "sha512-ZLd8f14z9pUy2Hk9y636cNv5Y2BMnNEY99wxzW9tD2BLDfe1xFxtLjB4q/xCBYo6HRe0wofzKzjm4JojmpBfFw==", + "license": "MIT", + "dependencies": { + "rrweb-snapshot": "^2.0.0-alpha.4" + } + }, + "node_modules/rrweb": { + "version": "2.0.0-alpha.4", + "resolved": "https://registry.npmjs.org/rrweb/-/rrweb-2.0.0-alpha.4.tgz", + "integrity": "sha512-wEHUILbxDPcNwkM3m4qgPgXAiBJyqCbbOHyVoNEVBJzHszWEFYyTbrZqUdeb1EfmTRC2PsumCIkVcomJ/xcOzA==", + "license": "MIT", + "dependencies": { + "@rrweb/types": "^2.0.0-alpha.4", + "@types/css-font-loading-module": "0.0.7", + "@xstate/fsm": "^1.4.0", + "base64-arraybuffer": "^1.0.1", + "fflate": "^0.4.4", + "mitt": "^3.0.0", + "rrdom": "^0.1.7", + "rrweb-snapshot": "^2.0.0-alpha.4" + } + }, + "node_modules/rrweb-player": { + "version": "1.0.0-alpha.4", + "resolved": "https://registry.npmjs.org/rrweb-player/-/rrweb-player-1.0.0-alpha.4.tgz", + "integrity": "sha512-Wlmn9GZ5Fdqa37vd3TzsYdLl/JWEvXNUrLCrYpnOwEgmY409HwVIvvA5aIo7k582LoKgdRCsB87N+f0oWAR0Kg==", + "license": "MIT", + "dependencies": { + "@tsconfig/svelte": "^1.0.0", + "rrweb": "^2.0.0-alpha.4" + } + }, + "node_modules/rrweb-snapshot": { + "version": "2.0.0-alpha.18", + "resolved": "https://registry.npmjs.org/rrweb-snapshot/-/rrweb-snapshot-2.0.0-alpha.18.tgz", + "integrity": "sha512-hBHZL/NfgQX6wO1D9mpwqFu1NJPpim+moIcKhFEjVTZVRUfCln+LOugRc4teVTCISYHN8Cw5e2iNTWCSm+SkoA==", + "license": "MIT", + "dependencies": { + "postcss": "^8.4.38" + } + }, + "node_modules/rrweb/node_modules/fflate": { + "version": "0.4.8", + "resolved": "https://registry.npmjs.org/fflate/-/fflate-0.4.8.tgz", + "integrity": "sha512-FJqqoDBR00Mdj9ppamLa/Y7vxm+PRmNWA67N846RvsoYVMKB4q3y/de5PA7gUmRMYK/8CMz2GDZQmCRN1wBcWA==", + "license": "MIT" + }, "node_modules/run-applescript": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/run-applescript/-/run-applescript-7.0.0.tgz", @@ -17685,7 +19382,6 @@ "version": "6.3.1", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, "license": "ISC", "bin": { "semver": "bin/semver.js" @@ -17699,6 +19395,18 @@ "license": "MIT", "optional": true }, + "node_modules/semver-diff": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-3.1.1.tgz", + "integrity": "sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg==", + "license": "MIT", + "dependencies": { + "semver": "^6.3.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/send": { "version": "0.19.0", "resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz", @@ -18000,7 +19708,6 @@ "version": "3.0.7", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true, "license": "ISC" }, "node_modules/simple-concat": { @@ -18078,6 +19785,12 @@ "node": ">=10" } }, + "node_modules/sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", + "license": "MIT" + }, "node_modules/sketch-helpers": { "version": "0.0.4", "resolved": "https://registry.npmjs.org/sketch-helpers/-/sketch-helpers-0.0.4.tgz", @@ -18124,6 +19837,151 @@ "npm": ">= 3.0.0" } }, + "node_modules/socket.io": { + "version": "4.8.1", + "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.8.1.tgz", + "integrity": "sha512-oZ7iUCxph8WYRHHcjBEc9unw3adt5CmSNlppj/5Q4k2RIrhl8Z5yY2Xr4j9zj0+wzVZ0bxmYoGSzKJnRl6A4yg==", + "license": "MIT", + "dependencies": { + "accepts": "~1.3.4", + "base64id": "~2.0.0", + "cors": "~2.8.5", + "debug": "~4.3.2", + "engine.io": "~6.6.0", + "socket.io-adapter": "~2.5.2", + "socket.io-parser": "~4.2.4" + }, + "engines": { + "node": ">=10.2.0" + } + }, + "node_modules/socket.io-adapter": { + "version": "2.5.5", + "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.5.5.tgz", + "integrity": "sha512-eLDQas5dzPgOWCk9GuuJC2lBqItuhKI4uxGgo9aIV7MYbk2h9Q6uULEh8WBzThoI7l+qU9Ast9fVUmkqPP9wYg==", + "license": "MIT", + "dependencies": { + "debug": "~4.3.4", + "ws": "~8.17.1" + } + }, + "node_modules/socket.io-adapter/node_modules/debug": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", + "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/socket.io-adapter/node_modules/ws": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz", + "integrity": "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==", + "license": "MIT", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/socket.io-client": { + "version": "4.8.1", + "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-4.8.1.tgz", + "integrity": "sha512-hJVXfu3E28NmzGk8o1sHhN3om52tRvwYeidbj7xKy2eIIse5IoKX3USlS6Tqt3BHAtflLIkCQBkzVrEEfWUyYQ==", + "license": "MIT", + "dependencies": { + "@socket.io/component-emitter": "~3.1.0", + "debug": "~4.3.2", + "engine.io-client": "~6.6.1", + "socket.io-parser": "~4.2.4" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/socket.io-client/node_modules/debug": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", + "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/socket.io-parser": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.4.tgz", + "integrity": "sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew==", + "license": "MIT", + "dependencies": { + "@socket.io/component-emitter": "~3.1.0", + "debug": "~4.3.1" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/socket.io-parser/node_modules/debug": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", + "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/socket.io/node_modules/debug": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", + "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, "node_modules/socks": { "version": "2.8.4", "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.4.tgz", @@ -18171,7 +20029,6 @@ "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" @@ -18181,7 +20038,6 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", - "dev": true, "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" @@ -18717,6 +20573,12 @@ "dev": true, "license": "MIT" }, + "node_modules/sugar-high": { + "version": "0.7.5", + "resolved": "https://registry.npmjs.org/sugar-high/-/sugar-high-0.7.5.tgz", + "integrity": "sha512-lfGxo0il0Mx4WLdXEt0WsJ8V3QkQWssXnolj5xBurzlGJW07LuwmJWKtS0B2WJ5XWz1439RHngXAmzsnLD0rFA==", + "license": "MIT" + }, "node_modules/sumchecker": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/sumchecker/-/sumchecker-3.0.1.tgz", @@ -18734,7 +20596,6 @@ "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, "license": "MIT", "dependencies": { "has-flag": "^4.0.0" @@ -19038,7 +20899,6 @@ "version": "1.3.3", "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.3.tgz", "integrity": "sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==", - "dev": true, "license": "MIT" }, "node_modules/tiny-typed-emitter": { @@ -19125,7 +20985,6 @@ "version": "0.2.3", "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.3.tgz", "integrity": "sha512-nZD7m9iCPC5g0pYmcaxogYKggSfLsdxl8of3Q/oIbqCqLLIO9IAF0GWjX1z9NZRHPiXv8Wex4yDCaZsgEw0Y8w==", - "dev": true, "license": "MIT", "engines": { "node": ">=14.14" @@ -19488,6 +21347,15 @@ "underscore": "^1.12.1" } }, + "node_modules/typedarray-to-buffer": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", + "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", + "license": "MIT", + "dependencies": { + "is-typedarray": "^1.0.0" + } + }, "node_modules/typescript": { "version": "5.8.3", "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.3.tgz", @@ -19597,7 +21465,6 @@ "version": "6.21.0", "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", - "dev": true, "license": "MIT" }, "node_modules/unicode-canonical-property-names-ecmascript": { @@ -19682,6 +21549,18 @@ "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, + "node_modules/unique-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", + "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==", + "license": "MIT", + "dependencies": { + "crypto-random-string": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/universalify": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", @@ -19701,11 +21580,23 @@ "node": ">= 0.8" } }, + "node_modules/unplugin": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/unplugin/-/unplugin-1.16.1.tgz", + "integrity": "sha512-4/u/j4FrCKdi17jaxuJA0jClGxB1AvU2hw/IuayPc4ay1XGaJs/rbb4v5WKwAjNifjmXK9PIFyuPiaK8azyR9w==", + "license": "MIT", + "dependencies": { + "acorn": "^8.14.0", + "webpack-virtual-modules": "^0.6.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, "node_modules/update-browserslist-db": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz", "integrity": "sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==", - "dev": true, "funding": [ { "type": "opencollective", @@ -19732,6 +21623,63 @@ "browserslist": ">= 4.21.0" } }, + "node_modules/update-notifier-cjs": { + "version": "5.1.7", + "resolved": "https://registry.npmjs.org/update-notifier-cjs/-/update-notifier-cjs-5.1.7.tgz", + "integrity": "sha512-eZWTh8F+VCEoC4UIh0pKmh8h4izj65VvLhCpJpVefUxdYe0fU3GBrC4Sbh1AoWA/miNPAb6UVlp2fUQNsfp+3g==", + "license": "BSD-2-Clause", + "dependencies": { + "boxen": "^5.0.0", + "chalk": "^4.1.0", + "configstore": "^5.0.1", + "has-yarn": "^2.1.0", + "import-lazy": "^2.1.0", + "is-ci": "^2.0.0", + "is-installed-globally": "^0.4.0", + "is-npm": "^5.0.0", + "is-yarn-global": "^0.3.0", + "isomorphic-fetch": "^3.0.0", + "pupa": "^2.1.1", + "registry-auth-token": "^5.0.1", + "registry-url": "^5.1.0", + "semver": "^7.3.7", + "semver-diff": "^3.1.1", + "xdg-basedir": "^4.0.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/update-notifier-cjs/node_modules/ci-info": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", + "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", + "license": "MIT" + }, + "node_modules/update-notifier-cjs/node_modules/is-ci": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", + "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", + "license": "MIT", + "dependencies": { + "ci-info": "^2.0.0" + }, + "bin": { + "is-ci": "bin.js" + } + }, + "node_modules/update-notifier-cjs/node_modules/semver": { + "version": "7.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz", + "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/uri-js": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", @@ -19890,7 +21838,6 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", - "dev": true, "license": "MIT", "engines": { "node": ">= 0.8" @@ -20314,6 +22261,12 @@ "node": ">=12" } }, + "node_modules/webpack-virtual-modules": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/webpack-virtual-modules/-/webpack-virtual-modules-0.6.2.tgz", + "integrity": "sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==", + "license": "MIT" + }, "node_modules/whatwg-encoding": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-2.0.0.tgz", @@ -20483,6 +22436,18 @@ "node": ">=20.11" } }, + "node_modules/widest-line": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz", + "integrity": "sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==", + "license": "MIT", + "dependencies": { + "string-width": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/win-ca": { "version": "3.5.1", "resolved": "https://registry.npmjs.org/win-ca/-/win-ca-3.5.1.tgz", @@ -20617,6 +22582,18 @@ "dev": true, "license": "ISC" }, + "node_modules/write-file-atomic": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", + "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", + "license": "ISC", + "dependencies": { + "imurmurhash": "^0.1.4", + "is-typedarray": "^1.0.0", + "signal-exit": "^3.0.2", + "typedarray-to-buffer": "^3.1.5" + } + }, "node_modules/ws": { "version": "8.18.1", "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.1.tgz", @@ -20639,6 +22616,15 @@ } } }, + "node_modules/xdg-basedir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-4.0.0.tgz", + "integrity": "sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/xml2js": { "version": "0.5.0", "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.5.0.tgz", @@ -20673,6 +22659,14 @@ "node": ">=8.0" } }, + "node_modules/xmlhttprequest-ssl": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-2.1.2.tgz", + "integrity": "sha512-TEU+nJVUUnA4CYJFLvK5X9AOeH4KvDvhIfm0vV1GaQRtchnG0hgK5p8hw/xjv8cunWYCsiPCSDzObPyhEwq3KQ==", + "engines": { + "node": ">=0.4.0" + } + }, "node_modules/xstate": { "version": "5.19.2", "resolved": "https://registry.npmjs.org/xstate/-/xstate-5.19.2.tgz", @@ -20725,6 +22719,15 @@ "xterm": "^4.0.0" } }, + "node_modules/xycolors": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/xycolors/-/xycolors-0.1.2.tgz", + "integrity": "sha512-iUIDKoRUq/6Nfkiwv/PqxR6ENzgLkaaOeWwY54CtObpEwmvQHCvsgxd5xIGfEF/QU75H2quxIffOoU4tf2kKDg==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/xinyao27" + } + }, "node_modules/y18n": { "version": "5.0.8", "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", @@ -20738,7 +22741,6 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true, "license": "ISC" }, "node_modules/yaml": { diff --git a/package.json b/package.json index ae3098221..73a2810f3 100644 --- a/package.json +++ b/package.json @@ -34,6 +34,7 @@ "@kittycad/lib": "2.0.28", "@lezer/highlight": "^1.2.1", "@lezer/lr": "^1.4.1", + "@million/lint": "^1.0.14", "@react-hook/resize-observer": "^2.0.1", "@replit/codemirror-interact": "^6.3.1", "@ts-stack/markdown": "^1.5.0", diff --git a/packages/codemirror-lsp-client/src/plugin/lsp.ts b/packages/codemirror-lsp-client/src/plugin/lsp.ts index 1d7a6fa4e..f6ac9f1eb 100644 --- a/packages/codemirror-lsp-client/src/plugin/lsp.ts +++ b/packages/codemirror-lsp-client/src/plugin/lsp.ts @@ -547,19 +547,10 @@ export class LanguageServerPlugin implements PluginValue { try { // First check if rename is possible at this position - const prepareResult = await this.client - .textDocumentPrepareRename({ - textDocument: { uri: this.getDocUri() }, - position: { line, character }, - }) - .catch(() => { - // In case prepareRename is not supported, - // we fallback to the default implementation - return this.prepareRenameFallback(view, { - line, - character, - }) - }) + let prepareResult = this.prepareRenameFallback(view, { + line, + character, + }) if (!prepareResult || 'defaultBehavior' in prepareResult) { showErrorMessage(view, 'Cannot rename this symbol') diff --git a/public/kcl-samples/80-20-rail/main.kcl b/public/kcl-samples/80-20-rail/main.kcl index 89d9fde94..d75a3acc1 100644 --- a/public/kcl-samples/80-20-rail/main.kcl +++ b/public/kcl-samples/80-20-rail/main.kcl @@ -139,4 +139,4 @@ fn rail8020(originStart, railHeight, railLength) { } // Generate one adjustable rail of 80/20 -rail8020([0, 0], 1.5, 48) +rail8020(originStart = [0, 0], railHeight = 1.5, railLength = 48) diff --git a/public/kcl-samples/axial-fan/fan.kcl b/public/kcl-samples/axial-fan/fan.kcl index 7f4073bb1..91eeafad7 100644 --- a/public/kcl-samples/axial-fan/fan.kcl +++ b/public/kcl-samples/axial-fan/fan.kcl @@ -72,14 +72,14 @@ fn fanBlade(offsetHeight, startAngle: number(deg)) { } // Loft the fan blade cross sections into a single blade, then pattern them about the fan center -loft([ - fanBlade(4.5, 50), - fanBlade((fanHeight - 2 - 4) / 2, 30), - fanBlade(fanHeight - 2, 0) - ]) +crossSections = [ + fanBlade(offsetHeight = 4.5, startAngle = 50), + fanBlade(offsetHeight = (fanHeight - 2 - 4) / 2, startAngle = 30), + fanBlade(offsetHeight = fanHeight - 2, startAngle = 0) +] +loft(crossSections) |> appearance(color = "#f3e2d8") |> patternCircular3d( - %, instances = 9, axis = [0, 0, 1], center = [0, 0, 0], diff --git a/public/kcl-samples/bench/bench-parts.kcl b/public/kcl-samples/bench/bench-parts.kcl index 129fb1954..306d7c452 100644 --- a/public/kcl-samples/bench/bench-parts.kcl +++ b/public/kcl-samples/bench/bench-parts.kcl @@ -6,7 +6,7 @@ export dividerThickness = 4 -fn dividerSketch(plane) { +fn dividerSketch(@plane) { sketch000 = startSketchOn(plane) |> startProfile(at = [-16.82, 21.2]) |> line(end = [-0.13, -1.27]) @@ -33,7 +33,7 @@ fn dividerSketch(plane) { return sketch000 } -export fn divider(plane) { +export fn divider(@plane) { right = dividerSketch(plane) |> extrude(length = dividerThickness / 2) left = dividerSketch(plane) @@ -43,7 +43,7 @@ export fn divider(plane) { return 0 } -fn connectorSketch(plane, start) { +fn connectorSketch(@plane, start) { sketch001 = startSketchOn(plane) |> startProfile(at = start) |> polygon( @@ -55,15 +55,15 @@ fn connectorSketch(plane, start) { return sketch001 } -export fn connector(plane, length) { - connectorSketch(plane, [-12, 8]) +export fn connector(@plane, length) { + connectorSketch(plane, start = [-12, 8]) |> extrude(length = length) - connectorSketch(plane, [16, 8]) + connectorSketch(plane, start = [16, 8]) |> extrude(length = length) return 0 } -fn seatSlatSketch(plane) { +fn seatSlatSketch(@plane) { sketch003 = startSketchOn(plane) |> startProfile(at = [-7, 19]) |> line(end = [-10, 0.5]) @@ -77,13 +77,13 @@ fn seatSlatSketch(plane) { return sketch003 } -export fn seatSlats(plane, length) { +export fn seatSlats(@plane, length) { seatSlatSketch(plane) |> extrude(length = length) return 0 } -fn backSlatsSketch(plane) { +fn backSlatsSketch(@plane) { sketch004 = startSketchOn(plane) |> startProfile(at = [22, 38.5]) |> angledLine(angle = 173, length = 2) @@ -97,13 +97,13 @@ fn backSlatsSketch(plane) { return sketch004 } -export fn backSlats(plane, length) { +export fn backSlats(@plane, length) { b = backSlatsSketch(plane) |> extrude(length = length) return b } -fn armRestPath(plane) { +fn armRestPath(@plane) { sketch005 = startSketchOn(plane) |> startProfile(at = [20, 33]) |> xLine(length = -20) @@ -111,7 +111,7 @@ fn armRestPath(plane) { return sketch005 } -fn armRestProfile(plane, offset) { +fn armRestProfile(@plane, offset) { sketch006 = startSketchOn(plane) |> startProfile(at = [offset, 32.4]) |> xLine(length = 1.3) @@ -124,9 +124,9 @@ fn armRestProfile(plane, offset) { return sketch006 } -export fn armRest(plane, offset) { +export fn armRest(@plane, offset) { path = armRestPath( offsetPlane(plane, offset = offset)) - profile = armRestProfile( offsetPlane(-XZ, offset = 20), -offset) + profile = armRestProfile( offsetPlane(-XZ, offset = 20), offset = -offset) sweep(profile, path = path) return 0 } diff --git a/public/kcl-samples/bench/main.kcl b/public/kcl-samples/bench/main.kcl index 6b9b482cf..bc6b25ca5 100644 --- a/public/kcl-samples/bench/main.kcl +++ b/public/kcl-samples/bench/main.kcl @@ -21,14 +21,14 @@ divider(offsetPlane(YZ, offset = benchLength / 2)) divider(offsetPlane(YZ, offset = -benchLength / 2)) // Create the connectors to join the dividers -connector(offsetPlane(YZ, offset = -benchLength / 2), benchLength) +connector(offsetPlane(YZ, offset = -benchLength / 2), length = benchLength) // Create the seat slats -seatSlats(offsetPlane(YZ, offset = -benchLength / 2 - (dividerThickness / 2)), benchLength + dividerThickness) +seatSlats(offsetPlane(YZ, offset = -benchLength / 2 - (dividerThickness / 2)), length = benchLength + dividerThickness) // Create the back slats -backSlats(offsetPlane(YZ, offset = -benchLength / 2 - (dividerThickness / 2)), benchLength + dividerThickness) +backSlats(offsetPlane(YZ, offset = -benchLength / 2 - (dividerThickness / 2)), length = benchLength + dividerThickness) // Create the arm rests -armRest(YZ, benchLength / 2) -armRest(YZ, -benchLength / 2) +armRest(YZ, offset = benchLength / 2) +armRest(YZ, offset = -benchLength / 2) diff --git a/public/kcl-samples/car-wheel-assembly/car-wheel.kcl b/public/kcl-samples/car-wheel-assembly/car-wheel.kcl index d19b8c695..66ada0459 100644 --- a/public/kcl-samples/car-wheel-assembly/car-wheel.kcl +++ b/public/kcl-samples/car-wheel-assembly/car-wheel.kcl @@ -121,8 +121,8 @@ fn spoke(spokeGap, spokeAngle, spokeThickness) { return spokePattern } -spoke(spokeGap, spokeAngle, spokeThickness) -spoke(-spokeGap, -spokeAngle, -spokeThickness) +spoke(spokeGap = spokeGap, spokeAngle = spokeAngle, spokeThickness = spokeThickness) +spoke(spokeGap = -spokeGap, spokeAngle = -spokeAngle, spokeThickness = -spokeThickness) // Define and revolve wheel exterior startSketchOn(XY) diff --git a/public/kcl-samples/car-wheel-assembly/lug-nut.kcl b/public/kcl-samples/car-wheel-assembly/lug-nut.kcl index f25f5a40b..73345c748 100644 --- a/public/kcl-samples/car-wheel-assembly/lug-nut.kcl +++ b/public/kcl-samples/car-wheel-assembly/lug-nut.kcl @@ -31,4 +31,4 @@ fn lug(plane, length, diameter) { return lugSketch } -lugNut = lug(customPlane, lugLength, lugDiameter) +lugNut = lug(plane = customPlane, length = lugLength, diameter = lugDiameter) diff --git a/public/kcl-samples/color-cube/main.kcl b/public/kcl-samples/color-cube/main.kcl index 433127289..b736af766 100644 --- a/public/kcl-samples/color-cube/main.kcl +++ b/public/kcl-samples/color-cube/main.kcl @@ -33,9 +33,9 @@ fn sketchRectangle(profile, color) { } // Sketch each side of the cube -sketchRectangle(bluePlane, '#0000FF') -sketchRectangle(yellowPlane, '#FFFF00') -sketchRectangle(greenPlane, '#00FF00') -sketchRectangle(redPlane, '#FF0000') -sketchRectangle(tealPlane, '#00FFFF') -sketchRectangle(purplePlane, '#FF00FF') +sketchRectangle(profile = bluePlane, color = '#0000FF') +sketchRectangle(profile = yellowPlane, color = '#FFFF00') +sketchRectangle(profile = greenPlane, color = '#00FF00') +sketchRectangle(profile = redPlane, color = '#FF0000') +sketchRectangle(profile = tealPlane, color = '#00FFFF') +sketchRectangle(profile = purplePlane, color = '#FF00FF') diff --git a/public/kcl-samples/cycloidal-gear/main.kcl b/public/kcl-samples/cycloidal-gear/main.kcl index a325e7a1a..19193eef6 100644 --- a/public/kcl-samples/cycloidal-gear/main.kcl +++ b/public/kcl-samples/cycloidal-gear/main.kcl @@ -7,7 +7,7 @@ // Create a function for the cycloidal gear fn cycloidalGear(gearPitch, gearHeight, holeDiameter, helixAngle: number(deg)) { // Create a function to draw the gear profile as a sketch. Rotate each profile about the gear's axis by an helix angle proportional to the total gear height - fn gearSketch(gHeight) { + fn gearSketch(@gHeight) { helixAngleP = helixAngle * gHeight / gearHeight gearProfile = startSketchOn(offsetPlane(XY, offset = gHeight)) |> startProfile(at = [ @@ -36,4 +36,9 @@ fn cycloidalGear(gearPitch, gearHeight, holeDiameter, helixAngle: number(deg)) { } // Call the cycloidal gear function -cycloidalGear(.3, 1.5, 0.297, -80) +cycloidalGear( + gearPitch = .3, + gearHeight = 1.5, + holeDiameter = 0.297, + helixAngle = -80, +) diff --git a/public/kcl-samples/dodecahedron/main.kcl b/public/kcl-samples/dodecahedron/main.kcl index 2a38fc53f..0bcef31df 100644 --- a/public/kcl-samples/dodecahedron/main.kcl +++ b/public/kcl-samples/dodecahedron/main.kcl @@ -8,7 +8,7 @@ dihedral = 116.565 // Create a face template function that makes a large thin cube -fn createFaceTemplate(dither) { +fn createFaceTemplate(@dither) { baseSketch = startSketchOn(XY) |> startProfile(at = [-1000 - dither, -1000 - dither]) |> line(endAbsolute = [1000 + dither, -1000 - dither]) @@ -62,7 +62,7 @@ dodecFaces = map( }, ) -fn calculateArrayLength(arr) { +fn calculateArrayLength(@arr) { return reduce( arr, initial = 0, @@ -72,7 +72,7 @@ fn calculateArrayLength(arr) { ) } -fn createIntersection(solids) { +fn createIntersection(@solids) { fn reduceIntersect(previous, current) { return intersect([previous, current]) } diff --git a/public/kcl-samples/enclosure/main.kcl b/public/kcl-samples/enclosure/main.kcl index 113ddfb24..35816874b 100644 --- a/public/kcl-samples/enclosure/main.kcl +++ b/public/kcl-samples/enclosure/main.kcl @@ -34,7 +34,7 @@ extrude001 = extrude(sketch001, length = height) |> shell(faces = [END], thickness = wallThickness) // Define a function to create the internal structure to secure a fastener at each corner -fn function001(originStart) { +fn function001(@originStart) { // Create a plane to sketch on shell interior plane001 = { origin = [0.0, 0.0, wallThickness], diff --git a/public/kcl-samples/exhaust-manifold/main.kcl b/public/kcl-samples/exhaust-manifold/main.kcl index a5104bf38..bb7132457 100644 --- a/public/kcl-samples/exhaust-manifold/main.kcl +++ b/public/kcl-samples/exhaust-manifold/main.kcl @@ -42,10 +42,34 @@ fn primaryTube(n, angle001, length001, length002, length003) { } // Draw a primary tube for each cylinder with specified lengths and angles -primaryTube(0, 0, 3, 6, 5) -primaryTube(1, 1, 3, 6, 5) -primaryTube(2, 24.3, 5, 5, 3) -primaryTube(3, 25.2, 5, 5, 3) +primaryTube( + n = 0, + angle001 = 0, + length001 = 3, + length002 = 6, + length003 = 5, +) +primaryTube( + n = 1, + angle001 = 1, + length001 = 3, + length002 = 6, + length003 = 5, +) +primaryTube( + n = 2, + angle001 = 24.3, + length001 = 5, + length002 = 5, + length003 = 3, +) +primaryTube( + n = 3, + angle001 = 25.2, + length001 = 5, + length002 = 5, + length003 = 3, +) // Create the mounting flange for the header flangeSketch = startSketchOn(XY) diff --git a/public/kcl-samples/focusrite-scarlett-mounting-bracket/main.kcl b/public/kcl-samples/focusrite-scarlett-mounting-bracket/main.kcl index 6f1c1189a..d5a0f402b 100644 --- a/public/kcl-samples/focusrite-scarlett-mounting-bracket/main.kcl +++ b/public/kcl-samples/focusrite-scarlett-mounting-bracket/main.kcl @@ -15,17 +15,6 @@ tabLength = 25 tabWidth = 12 tabThk = 4 -// Define a rectangular shape func -fn rectShape(pos, w, l) { - rr = startSketchOn(XY) - |> startProfile(at = [pos[0] - (w / 2), pos[1] - (l / 2)]) - |> line(endAbsolute = [pos[0] + w / 2, pos[1] - (l / 2)], tag = $edge01) - |> line(endAbsolute = [pos[0] + w / 2, pos[1] + l / 2], tag = $edge02) - |> line(endAbsolute = [pos[0] - (w / 2), pos[1] + l / 2], tag = $edge03) - |> close(tag = $edge04) - return rr -} - // Define the bracket plane bracketPlane = { origin = { x = 0, y = length / 2 + thk, z = 0 }, @@ -50,7 +39,7 @@ fn bracketSketch(w, d, t) { } // Build the body of the bracket -bs = bracketSketch(width, depth, thk) +bs = bracketSketch(w = width, d = depth, t = thk) bracketBody = bs |> extrude(length = length + 2 * thk) |> fillet( diff --git a/public/kcl-samples/food-service-spatula/main.kcl b/public/kcl-samples/food-service-spatula/main.kcl index 83aaa5401..29f42a6ec 100644 --- a/public/kcl-samples/food-service-spatula/main.kcl +++ b/public/kcl-samples/food-service-spatula/main.kcl @@ -55,13 +55,28 @@ flipperProfile = startProfile(flipperSketch, at = [-flipperLength, -32.0]) |> close() // Create a profile of the middle -slotProfile000 = slot(flipperSketch, [-25, 0], [-55, 0], flipperSlotWidth) +slotProfile000 = slot( + sketch1 = flipperSketch, + start = [-25, 0], + end = [-55, 0], + width = flipperSlotWidth, +) // Create a profile of the top slot -slotProfile001 = slot(flipperSketch, [-25, 18], [-55, 19], flipperSlotWidth) +slotProfile001 = slot( + sketch1 = flipperSketch, + start = [-25, 18], + end = [-55, 19], + width = flipperSlotWidth, +) // Create a profile of the bottom slot -slotProfile002 = slot(flipperSketch, [-25, -18], [-55, -19], flipperSlotWidth) +slotProfile002 = slot( + sketch1 = flipperSketch, + start = [-25, -18], + end = [-55, -19], + width = flipperSlotWidth, +) // Create a profile with slots for the spatula spatulaProfile = flipperProfile @@ -138,7 +153,12 @@ grip = extrude(gripProfile, length = -gripLength) holeSketch = startSketchOn(grip, face = gripEdgeTop) // Create a profile for the grip hole -gripHoleProfile = slot(holeSketch, [0, 200], [0, 210], gripSlotWidth) +gripHoleProfile = slot( + sketch1 = holeSketch, + start = [0, 200], + end = [0, 210], + width = gripSlotWidth, +) // Cut a hole in the grip extrude(gripHoleProfile, length = -gripWidth - 20) diff --git a/public/kcl-samples/gridfinity-baseplate-magnets/main.kcl b/public/kcl-samples/gridfinity-baseplate-magnets/main.kcl index 9be98dff7..5deff7bf3 100644 --- a/public/kcl-samples/gridfinity-baseplate-magnets/main.kcl +++ b/public/kcl-samples/gridfinity-baseplate-magnets/main.kcl @@ -22,7 +22,7 @@ countBinLength = 3 height = firstStep + secondStep + thirdStep // Define a function which builds the profile of the baseplate bin -fn face(plane) { +fn face(@plane) { faceSketch = startSketchOn(plane) |> startProfile(at = [0, 0]) |> yLine(length = height) @@ -84,7 +84,7 @@ basePlateCorners = patternLinear3d( |> patternLinear3d(axis = [0.0, 1.0, 0.0], instances = countBinLength, distance = binLength) // Create the center cutout for the magnet profile -fn magnetCenterCutout(plane) { +fn magnetCenterCutout(@plane) { magnetSketch = startSketchOn(plane) |> startProfile(at = [ firstStep + thirdStep, @@ -111,7 +111,7 @@ fn magnetCenterCutout(plane) { } // Create the outside profile of the magnets -fn magnetBase(plane) { +fn magnetBase(@plane) { magnetBaseSketch = startSketchOn(plane) |> startProfile(at = [0, 0]) |> xLine(length = binLength, tag = $line001) diff --git a/public/kcl-samples/gridfinity-baseplate/main.kcl b/public/kcl-samples/gridfinity-baseplate/main.kcl index 1d1281fbe..e016a10bb 100644 --- a/public/kcl-samples/gridfinity-baseplate/main.kcl +++ b/public/kcl-samples/gridfinity-baseplate/main.kcl @@ -19,7 +19,7 @@ countBinLength = 3 height = firstStep + secondStep + thirdStep // Define a function which builds the profile of the baseplate bin -fn face(plane) { +fn face(@plane) { faceSketch = startSketchOn(plane) |> startProfile(at = [0, 0]) |> yLine(length = height) diff --git a/public/kcl-samples/gridfinity-bins-stacking-lip/main.kcl b/public/kcl-samples/gridfinity-bins-stacking-lip/main.kcl index 0f63cdfa0..869e674e4 100644 --- a/public/kcl-samples/gridfinity-bins-stacking-lip/main.kcl +++ b/public/kcl-samples/gridfinity-bins-stacking-lip/main.kcl @@ -34,7 +34,7 @@ height = firstStep + secondStep + thirdStep lipHeight = lipStep1 + lipStep2 + lipStep3 + lipStep4 + lipStep5 // Define a function which builds the profile of the baseplate bin -fn face(plane) { +fn face(@plane) { faceSketch = startSketchOn(plane) |> startProfile(at = [binBaseLength + binTol, 0]) |> yLine(length = height) @@ -174,7 +174,7 @@ binTop = startSketchOn(offsetPlane(XY, offset = height)) |> shell(faces = [END], thickness = binThk) // Define a function which builds the profile of the baseplate bin -fn lipFace(plane) { +fn lipFace(@plane) { faceSketch = startSketchOn(plane) |> startProfile(at = [0, 0]) // |> yLine(length = lipHeight, tag = $line100) diff --git a/public/kcl-samples/gridfinity-bins/main.kcl b/public/kcl-samples/gridfinity-bins/main.kcl index 1fbad9966..5458b3d72 100644 --- a/public/kcl-samples/gridfinity-bins/main.kcl +++ b/public/kcl-samples/gridfinity-bins/main.kcl @@ -27,7 +27,7 @@ countBinHeight = 2 height = firstStep + secondStep + thirdStep // Define a function which builds the profile of the baseplate bin -fn face(plane) { +fn face(@plane) { faceSketch = startSketchOn(plane) |> startProfile(at = [binBaseLength + binTol, 0]) |> yLine(length = height) diff --git a/public/kcl-samples/hex-nut/main.kcl b/public/kcl-samples/hex-nut/main.kcl index 9d5432e71..fb61c1fd9 100644 --- a/public/kcl-samples/hex-nut/main.kcl +++ b/public/kcl-samples/hex-nut/main.kcl @@ -25,4 +25,4 @@ fn hexNut(start, thk, innerDia) { } // Create a hex nut -hexNut([0, 0], thickness, diameter) +hexNut(start = [0, 0], thk = thickness, innerDia = diameter) diff --git a/public/kcl-samples/keyboard/main.kcl b/public/kcl-samples/keyboard/main.kcl index b3c0bc8ad..5b46a7284 100644 --- a/public/kcl-samples/keyboard/main.kcl +++ b/public/kcl-samples/keyboard/main.kcl @@ -88,37 +88,163 @@ fn keyFn(originStart, keyWidth, keyHeight, repeats, color) { } // Build the first row of keys -keyFn([0.3, row1], 1.1, keyHeight, 0, highlightColor2) -keyFn([1.5, row1], 0.8, keyHeight, 2, highlightColor1) -keyFn([spacing * 7 + 3.5, row1], 5.2, keyHeight, 0, highlightColor2) -keyFn([spacing * 8 + 8.7, row1], 0.8, keyHeight, 0, highlightColor1) -keyFn([spacing * 8 + 9.6, row1], 0.8, keyHeight, 0, highlightColor1) -keyFn([spacing * 10 + 10.3, row1], 1.1, keyHeight, 0, highlightColor1) -keyFn([spacing * 12 + 10.3 + 1, row1], 0.8, keyHeight, 0, highlightColor2) +keyFn( + originStart = [0.3, row1], + keyWidth = 1.1, + keyHeight = keyHeight, + repeats = 0, + color = highlightColor2, +) +keyFn( + originStart = [1.5, row1], + keyWidth = 0.8, + keyHeight = keyHeight, + repeats = 2, + color = highlightColor1, +) +keyFn( + originStart = [spacing * 7 + 3.5, row1], + keyWidth = 5.2, + keyHeight = keyHeight, + repeats = 0, + color = highlightColor2, +) +keyFn( + originStart = [spacing * 8 + 8.7, row1], + keyWidth = 0.8, + keyHeight = keyHeight, + repeats = 0, + color = highlightColor1, +) +keyFn( + originStart = [spacing * 8 + 9.6, row1], + keyWidth = 0.8, + keyHeight = keyHeight, + repeats = 0, + color = highlightColor1, +) +keyFn( + originStart = [spacing * 10 + 10.3, row1], + keyWidth = 1.1, + keyHeight = keyHeight, + repeats = 0, + color = highlightColor1, +) +keyFn( + originStart = [spacing * 12 + 10.3 + 1, row1], + keyWidth = 0.8, + keyHeight = keyHeight, + repeats = 0, + color = highlightColor2, +) // Build the second row of keys -keyFn([spacing * 3, row2], 1.7, keyHeight, 0, highlightColor2) -keyFn([spacing * 4 + 1.7, row2], 0.8, keyHeight, 9, highlightColor1) -keyFn([spacing * 14 + 1.7 + 0.8 * 10, row2], 2.2, keyHeight, 0, highlightColor2) +keyFn( + originStart = [spacing * 3, row2], + keyWidth = 1.7, + keyHeight = keyHeight, + repeats = 0, + color = highlightColor2, +) +keyFn( + originStart = [spacing * 4 + 1.7, row2], + keyWidth = 0.8, + keyHeight = keyHeight, + repeats = 9, + color = highlightColor1, +) +keyFn( + originStart = [spacing * 14 + 1.7 + 0.8 * 10, row2], + keyWidth = 2.2, + keyHeight = keyHeight, + repeats = 0, + color = highlightColor2, +) // Build the third row of keys -keyFn([spacing * 3, row3], 1.1 + .1, keyHeight, 0, highlightColor1) -keyFn([spacing * 4 + 1.1 + .1, row3], 0.8, keyHeight, 10, highlightColor1) -keyFn([spacing * 3 + 11.1 + .1, row3], 1.4 + .4, keyHeight, 0, highlightColor2) +keyFn( + originStart = [spacing * 3, row3], + keyWidth = 1.1 + .1, + keyHeight = keyHeight, + repeats = 0, + color = highlightColor1, +) +keyFn( + originStart = [spacing * 4 + 1.1 + .1, row3], + keyWidth = 0.8, + keyHeight = keyHeight, + repeats = 10, + color = highlightColor1, +) +keyFn( + originStart = [spacing * 3 + 11.1 + .1, row3], + keyWidth = 1.4 + .4, + keyHeight = keyHeight, + repeats = 0, + color = highlightColor2, +) // Build the fourth row of keys -keyFn([spacing * 3, row4], 0.9, keyHeight, 0, highlightColor1) -keyFn([spacing * 4 + 0.9, row4], 0.8, keyHeight, 11, highlightColor1) -keyFn([spacing * 3 + 11.8, row4], 1.2, keyHeight, 0, highlightColor1) +keyFn( + originStart = [spacing * 3, row4], + keyWidth = 0.9, + keyHeight = keyHeight, + repeats = 0, + color = highlightColor1, +) +keyFn( + originStart = [spacing * 4 + 0.9, row4], + keyWidth = 0.8, + keyHeight = keyHeight, + repeats = 11, + color = highlightColor1, +) +keyFn( + originStart = [spacing * 3 + 11.8, row4], + keyWidth = 1.2, + keyHeight = keyHeight, + repeats = 0, + color = highlightColor1, +) // Build the fifth row of keys -keyFn([spacing * 3, row5], 0.8, keyHeight, 12, highlightColor1) -keyFn([spacing * 3 + 11.7, row5], 1.3, keyHeight, 0, highlightColor2) +keyFn( + originStart = [spacing * 3, row5], + keyWidth = 0.8, + keyHeight = keyHeight, + repeats = 12, + color = highlightColor1, +) +keyFn( + originStart = [spacing * 3 + 11.7, row5], + keyWidth = 1.3, + keyHeight = keyHeight, + repeats = 0, + color = highlightColor2, +) // Build the sixth row of keys -keyFn([spacing * 3, row6], 1.1, keyHeight * .6, 0, highlightColor2) -keyFn([spacing * 4 + 1.1, row6], 0.8, keyHeight * .6, 11, highlightColor1) -keyFn([spacing * 3 + 12, row6], 1, keyHeight * .6, 0, highlightColor2) +keyFn( + originStart = [spacing * 3, row6], + keyWidth = 1.1, + keyHeight = keyHeight * .6, + repeats = 0, + color = highlightColor2, +) +keyFn( + originStart = [spacing * 4 + 1.1, row6], + keyWidth = 0.8, + keyHeight = keyHeight * .6, + repeats = 11, + color = highlightColor1, +) +keyFn( + originStart = [spacing * 3 + 12, row6], + keyWidth = 1, + keyHeight = keyHeight * .6, + repeats = 0, + color = highlightColor2, +) // Create a plane to sketch ZOO brand letters on plane002 = { @@ -185,6 +311,6 @@ fn o(origin, scale, depth) { } // Place the Z logo on the Z key. Place the O logo on the O and P keys -z([2.3, 1.3], .4, 0.03) -o([8.71, row4 + .08], 0.4, 0.03) -o([8.71 + 0.9, row4 + .08], 0.4, 0.03) +z(origin = [2.3, 1.3], scale = .4, depth = 0.03) +o(origin = [8.71, row4 + .08], scale = 0.4, depth = 0.03) +o(origin = [8.71 + 0.9, row4 + .08], scale = 0.4, depth = 0.03) diff --git a/public/kcl-samples/kitt/main.kcl b/public/kcl-samples/kitt/main.kcl index dbc62717e..b7a5757b4 100644 --- a/public/kcl-samples/kitt/main.kcl +++ b/public/kcl-samples/kitt/main.kcl @@ -37,7 +37,15 @@ kitHeadElevation = kitBodyElevation + kitBodyHeight - kitHeadOffset - kitHeadHei kitHeadWidth = kitBodyWidth - (kitHeadOffset * 2) kitHeadDepth = 3 -kitHead = pixelBox(kitBody, END, -kitHeadWidth / 2, kitHeadElevation, kitHeadWidth, kitHeadHeight, kitHeadDepth) +kitHead = pixelBox( + kitExtrude = kitBody, + extrudeTag = END, + positionY = -kitHeadWidth / 2, + positionZ = kitHeadElevation, + width = kitHeadWidth, + height = kitHeadHeight, + depth = kitHeadDepth, +) kitFaceElevation = kitHeadElevation + 2 // 3. Kitty Face @@ -67,17 +75,49 @@ kitFace = startSketchOn(kitHead, face = END) // 3.1.1 Kitty Left Eye kitEyeDepth = 0.5 -kitEyeHeihgt = kitFaceElevation + 7 +kitEyeHeight = kitFaceElevation + 7 kitEyeOffset = 7 // 3.1.2 Kitty Right Eye -kitLeftEye1 = pixelBox(kitFace, START, -kitEyeOffset, kitEyeHeihgt, 1, 1, kitEyeDepth) +kitLeftEye1 = pixelBox( + kitExtrude = kitFace, + extrudeTag = START, + positionY = -kitEyeOffset, + positionZ = kitEyeHeight, + width = 1, + height = 1, + depth = kitEyeDepth, +) // 3.2 Kitty Nose -kitLeftEye2 = pixelBox(kitFace, START, -kitEyeOffset + 1, kitEyeHeihgt + 1, 3, 1, kitEyeDepth) -kitLeftEye3 = pixelBox(kitFace, START, -kitEyeOffset + 4, kitEyeHeihgt, 1, 1, kitEyeDepth) -kitRightEye = pixelBox(kitFace, START, kitEyeOffset - 3, kitEyeHeihgt - 1, 2, 4, kitEyeDepth) -kitNoseElevation = kitEyeHeihgt - 5 +kitLeftEye2 = pixelBox( + kitExtrude = kitFace, + extrudeTag = START, + positionY = -kitEyeOffset + 1, + positionZ = kitEyeHeight + 1, + width = 3, + height = 1, + depth = kitEyeDepth, +) +kitLeftEye3 = pixelBox( + kitExtrude = kitFace, + extrudeTag = START, + positionY = -kitEyeOffset + 4, + positionZ = kitEyeHeight, + width = 1, + height = 1, + depth = kitEyeDepth, +) +kitRightEye = pixelBox( + kitExtrude = kitFace, + extrudeTag = START, + positionY = kitEyeOffset - 3, + positionZ = kitEyeHeight - 1, + width = 2, + height = 4, + depth = kitEyeDepth, +) +kitNoseElevation = kitEyeHeight - 5 kitNose = startSketchOn(kitFace, face = START) |> startProfile(at = [-2, kitNoseElevation]) // H V |> line(end = [0, 1]) // lower-left up @@ -97,13 +137,45 @@ kitNose = startSketchOn(kitFace, face = START) // 3.3 Kitty Mouth kitMouthOffset = 4 -kitMouthHeight = kitEyeHeihgt - 3 -kitMouthUpLeft = pixelBox(kitFace, START, -kitMouthOffset, kitMouthHeight, 1, 1, kitEyeDepth) +kitMouthHeight = kitEyeHeight - 3 +kitMouthUpLeft = pixelBox( + kitExtrude = kitFace, + extrudeTag = START, + positionY = -kitMouthOffset, + positionZ = kitMouthHeight, + width = 1, + height = 1, + depth = kitEyeDepth, +) // 4. Kitty Belly -kitMouthDownLeft = pixelBox(kitFace, START, -kitMouthOffset + 1, kitMouthHeight - 1, 1, 1, kitEyeDepth) -kitMouthUpRight = pixelBox(kitFace, START, kitMouthOffset, kitMouthHeight, 1, 1, kitEyeDepth) -kitMouthDownRight = pixelBox(kitFace, START, kitMouthOffset - 1, kitMouthHeight - 1, 1, 1, kitEyeDepth) +kitMouthDownLeft = pixelBox( + kitExtrude = kitFace, + extrudeTag = START, + positionY = -kitMouthOffset + 1, + positionZ = kitMouthHeight - 1, + width = 1, + height = 1, + depth = kitEyeDepth, +) +kitMouthUpRight = pixelBox( + kitExtrude = kitFace, + extrudeTag = START, + positionY = kitMouthOffset, + positionZ = kitMouthHeight, + width = 1, + height = 1, + depth = kitEyeDepth, +) +kitMouthDownRight = pixelBox( + kitExtrude = kitFace, + extrudeTag = START, + positionY = kitMouthOffset - 1, + positionZ = kitMouthHeight - 1, + width = 1, + height = 1, + depth = kitEyeDepth, +) kitBellyElevation = kitBodyElevation + 1 kitBellyHeight = kitHeadElevation - kitBellyElevation - 1 @@ -111,7 +183,15 @@ kitBellyHeight = kitHeadElevation - kitBellyElevation - 1 // 4.1 Kitty VHS kitBellyWidth = kitHeadWidth kitBellyDepth = kitHeadDepth -kitBelly = pixelBox(kitBody, END, -kitBellyWidth / 2, kitBellyElevation, kitBellyWidth, kitBellyHeight, kitBellyDepth) +kitBelly = pixelBox( + kitExtrude = kitBody, + extrudeTag = END, + positionY = -kitBellyWidth / 2, + positionZ = kitBellyElevation, + width = kitBellyWidth, + height = kitBellyHeight, + depth = kitBellyDepth, +) kitVHSelevation = kitBellyElevation + 1 kitVHSheight = 2 @@ -119,7 +199,15 @@ kitVHSheight = 2 // 4.2 Kitty Floppy kitVHSwidth = 8 kitVHSdepth = 1 -kitVHS = pixelBox(kitBelly, END, -kitVHSwidth / 2, kitVHSelevation, kitVHSwidth, kitVHSheight, kitVHSdepth) +kitVHS = pixelBox( + kitExtrude = kitBelly, + extrudeTag = END, + positionY = -kitVHSwidth / 2, + positionZ = kitVHSelevation, + width = kitVHSwidth, + height = kitVHSheight, + depth = kitVHSdepth, +) kitFloppyElevation = kitBellyElevation + 1 kitFloppyHeight = 1 @@ -128,9 +216,33 @@ kitFloppyOffset = kitBellyWidth / 2 - 1 kitFloppyDepth = 2 // 4.3 Kitty Belly Button -kitFloppy1 = pixelBox(kitBelly, END, -kitFloppyOffset, kitFloppyElevation, kitFloppyWidth, kitFloppyHeight, -kitFloppyDepth) -kitFloppy2 = pixelBox(kitBelly, END, -kitFloppyOffset, kitFloppyElevation + 2, kitFloppyWidth, kitFloppyHeight, -kitFloppyDepth) -kitFloppy3 = pixelBox(kitBelly, END, kitFloppyOffset, kitFloppyElevation, -kitFloppyWidth, kitFloppyHeight, -kitFloppyDepth) +kitFloppy1 = pixelBox( + kitExtrude = kitBelly, + extrudeTag = END, + positionY = -kitFloppyOffset, + positionZ = kitFloppyElevation, + width = kitFloppyWidth, + height = kitFloppyHeight, + depth = -kitFloppyDepth, +) +kitFloppy2 = pixelBox( + kitExtrude = kitBelly, + extrudeTag = END, + positionY = -kitFloppyOffset, + positionZ = kitFloppyElevation + 2, + width = kitFloppyWidth, + height = kitFloppyHeight, + depth = -kitFloppyDepth, +) +kitFloppy3 = pixelBox( + kitExtrude = kitBelly, + extrudeTag = END, + positionY = kitFloppyOffset, + positionZ = kitFloppyElevation, + width = -kitFloppyWidth, + height = kitFloppyHeight, + depth = -kitFloppyDepth, +) kitBellyButtonOffset = kitHeadWidth / 2 - 3 kitBellyButtonElevation = kitHeadElevation - 1 @@ -139,18 +251,50 @@ kitBellyButtonWidth = 2 // 4.4 Kitty Buttons kitBellyButtonHeight = 1 kitBellyButtonDepth = kitHeadDepth + 1 -kitBellyButton = pixelBox(kitBody, END, -kitBellyButtonOffset, kitBellyButtonElevation, kitBellyButtonWidth, kitBellyButtonHeight, kitBellyButtonDepth) +kitBellyButton = pixelBox( + kitExtrude = kitBody, + extrudeTag = END, + positionY = -kitBellyButtonOffset, + positionZ = kitBellyButtonElevation, + width = kitBellyButtonWidth, + height = kitBellyButtonHeight, + depth = kitBellyButtonDepth, +) kitButtonWidth = 1 kitButtonHeight = 2 kitButtonDepth = kitFloppyDepth kitButtonElevation = kitFloppyElevation + 2 -kitButton1 = pixelBox(kitBelly, END, kitFloppyOffset, kitFloppyElevation + 2, -kitButtonWidth, kitButtonHeight, -kitButtonDepth) +kitButton1 = pixelBox( + kitExtrude = kitBelly, + extrudeTag = END, + positionY = kitFloppyOffset, + positionZ = kitFloppyElevation + 2, + width = -kitButtonWidth, + height = kitButtonHeight, + depth = -kitButtonDepth, +) // 5. Kitty Legs -kitButton2 = pixelBox(kitBelly, END, kitFloppyOffset - kitButtonWidth - 1, kitFloppyElevation + 2, -kitButtonWidth, kitButtonHeight, -kitButtonDepth) -kitButton3 = pixelBox(kitBelly, END, kitFloppyOffset - (2 * (kitButtonWidth + 1)), kitFloppyElevation + 2, -kitButtonWidth, kitButtonHeight, -kitButtonDepth) +kitButton2 = pixelBox( + kitExtrude = kitBelly, + extrudeTag = END, + positionY = kitFloppyOffset - kitButtonWidth - 1, + positionZ = kitFloppyElevation + 2, + width = -kitButtonWidth, + height = kitButtonHeight, + depth = -kitButtonDepth, +) +kitButton3 = pixelBox( + kitExtrude = kitBelly, + extrudeTag = END, + positionY = kitFloppyOffset - (2 * (kitButtonWidth + 1)), + positionZ = kitFloppyElevation + 2, + width = -kitButtonWidth, + height = kitButtonHeight, + depth = -kitButtonDepth, +) kitShoeWidth = 7 kitShoeLength = 10 @@ -175,14 +319,22 @@ fn kitLeg(offsetFront, offsetSide) { kitPantsFrontWidth = kitPantsWidth kitPantsHeight = kitBodyElevation - kitShoeHeight - kitPants = pixelBox(kitShoe, END, kitPantsOffsetSide, kitPantsOffsetFront, kitPantsFrontWidth, kitPantsWidth, kitPantsHeight) + kitPants = pixelBox( + kitExtrude = kitShoe, + extrudeTag = END, + positionY = kitPantsOffsetSide, + positionZ = kitPantsOffsetFront, + width = kitPantsFrontWidth, + height = kitPantsWidth, + depth = kitPantsHeight, + ) return kitShoe } kitLegOffset = 3 -kitRightLeg = kitLeg(0, kitLegOffset) -kitLeftLeg = kitLeg(0, -kitLegOffset - kitShoeWidth) +kitRightLeg = kitLeg(offsetFront = 0, offsetSide = kitLegOffset) +kitLeftLeg = kitLeg(offsetFront = 0, offsetSide = -kitLegOffset - kitShoeWidth) // 6. Kitty Ears kitEarWidth = 8 @@ -192,24 +344,56 @@ kitEarHeight = 2 fn kitEar(earOffsetFront, earOffsetSide) { kitNewEarOffsetFront = kitBodyDepth - earOffsetFront kitNewEarOffsetSide = -(kitBodyWidth / 2 - earOffsetSide) - baseVolume = pixelBox(kitBody, seg01, kitNewEarOffsetSide, kitNewEarOffsetFront, kitEarWidth, -kitEarDepth, kitEarHeight) + baseVolume = pixelBox( + kitExtrude = kitBody, + extrudeTag = seg01, + positionY = kitNewEarOffsetSide, + positionZ = kitNewEarOffsetFront, + width = kitEarWidth, + height = -kitEarDepth, + depth = kitEarHeight, + ) secondOffset = 1 - secondLevel = pixelBox(baseVolume, END, kitNewEarOffsetSide + secondOffset, kitNewEarOffsetFront - 0.01, kitEarWidth - (secondOffset * 2), -kitEarDepth + secondOffset * 2, kitEarHeight) + secondLevel = pixelBox( + kitExtrude = baseVolume, + extrudeTag = END, + positionY = kitNewEarOffsetSide + secondOffset, + positionZ = kitNewEarOffsetFront - 0.01, + width = kitEarWidth - (secondOffset * 2), + height = -kitEarDepth + secondOffset * 2, + depth = kitEarHeight, + ) thirdOffset = 2 - thirdLevel = pixelBox(secondLevel, END, kitNewEarOffsetSide + thirdOffset, kitNewEarOffsetFront - 0.02, kitEarWidth - (thirdOffset * 2), -kitEarDepth + thirdOffset * 2, kitEarHeight) + thirdLevel = pixelBox( + kitExtrude = secondLevel, + extrudeTag = END, + positionY = kitNewEarOffsetSide + thirdOffset, + positionZ = kitNewEarOffsetFront - 0.02, + width = kitEarWidth - (thirdOffset * 2), + height = -kitEarDepth + thirdOffset * 2, + depth = kitEarHeight, + ) fourthOffset = 3 - fourthLevel = pixelBox(thirdLevel, END, kitNewEarOffsetSide + fourthOffset, kitNewEarOffsetFront - 0.03, kitEarWidth - (fourthOffset * 2), -kitEarDepth + fourthOffset * 2, kitEarHeight) + fourthLevel = pixelBox( + kitExtrude = thirdLevel, + extrudeTag = END, + positionY = kitNewEarOffsetSide + fourthOffset, + positionZ = kitNewEarOffsetFront - 0.03, + width = kitEarWidth - (fourthOffset * 2), + height = -kitEarDepth + fourthOffset * 2, + depth = kitEarHeight, + ) return baseVolume } kitEarOffsetFront = 4 kitEarOffsetSide = 1 -kitRightEar = kitEar(kitEarOffsetFront, kitEarOffsetSide) -kitLeftEar = kitEar(kitEarOffsetFront, kitBodyWidth - kitEarWidth - kitEarOffsetSide) +kitRightEar = kitEar(earOffsetFront = kitEarOffsetFront, earOffsetSide = kitEarOffsetSide) +kitLeftEar = kitEar(earOffsetFront = kitEarOffsetFront, earOffsetSide = kitBodyWidth - kitEarWidth - kitEarOffsetSide) // 7. Kitty Side // 7.1 Grill @@ -228,19 +412,75 @@ grillColumnE = grillColumnA - 4 grillHoleSize = 1 grillHoleDepth = -2 -grillHoleAB = pixelBox(kitBody, seg02, grillRowA, grillColumnB, grillHoleSize, grillHoleSize, grillHoleDepth) +grillHoleAB = pixelBox( + kitExtrude = kitBody, + extrudeTag = seg02, + positionY = grillRowA, + positionZ = grillColumnB, + width = grillHoleSize, + height = grillHoleSize, + depth = grillHoleDepth, +) -grillHoleAD = pixelBox(kitBody, seg02, grillRowA, grillColumnD, grillHoleSize, grillHoleSize, grillHoleDepth) +grillHoleAD = pixelBox( + kitExtrude = kitBody, + extrudeTag = seg02, + positionY = grillRowA, + positionZ = grillColumnD, + width = grillHoleSize, + height = grillHoleSize, + depth = grillHoleDepth, +) -grillHoleBA = pixelBox(kitBody, seg02, grillRowB, grillColumnA, grillHoleSize, grillHoleSize, grillHoleDepth) +grillHoleBA = pixelBox( + kitExtrude = kitBody, + extrudeTag = seg02, + positionY = grillRowB, + positionZ = grillColumnA, + width = grillHoleSize, + height = grillHoleSize, + depth = grillHoleDepth, +) -grillHoleBC = pixelBox(kitBody, seg02, grillRowB, grillColumnC, grillHoleSize, grillHoleSize, grillHoleDepth) +grillHoleBC = pixelBox( + kitExtrude = kitBody, + extrudeTag = seg02, + positionY = grillRowB, + positionZ = grillColumnC, + width = grillHoleSize, + height = grillHoleSize, + depth = grillHoleDepth, +) -grillHoleBE = pixelBox(kitBody, seg02, grillRowB, grillColumnE, grillHoleSize, grillHoleSize, grillHoleDepth) +grillHoleBE = pixelBox( + kitExtrude = kitBody, + extrudeTag = seg02, + positionY = grillRowB, + positionZ = grillColumnE, + width = grillHoleSize, + height = grillHoleSize, + depth = grillHoleDepth, +) -grillHoleCB = pixelBox(kitBody, seg02, grillRowC, grillColumnB, grillHoleSize, grillHoleSize, grillHoleDepth) +grillHoleCB = pixelBox( + kitExtrude = kitBody, + extrudeTag = seg02, + positionY = grillRowC, + positionZ = grillColumnB, + width = grillHoleSize, + height = grillHoleSize, + depth = grillHoleDepth, +) -grillHoleCD = pixelBox(kitBody, seg02, grillRowC, grillColumnD, grillHoleSize, grillHoleSize, grillHoleDepth) +grillHoleCD = pixelBox( + kitExtrude = kitBody, + extrudeTag = seg02, + positionY = grillRowC, + positionZ = grillColumnD, + width = grillHoleSize, + height = grillHoleSize, + depth = grillHoleDepth, +) // 7.2 Kitty Vent kitVentElevation = kitBodyElevation + 1 @@ -249,8 +489,32 @@ kitVentHoleWidth = 1 kitVentHoleHeight = 4 kitVentHoleDepth = grillHoleDepth -kitVentA = pixelBox(kitBody, seg02, kitVentElevation, kitVentOffset, kitVentHoleHeight, kitVentHoleWidth, kitVentHoleDepth) +kitVentA = pixelBox( + kitExtrude = kitBody, + extrudeTag = seg02, + positionY = kitVentElevation, + positionZ = kitVentOffset, + width = kitVentHoleHeight, + height = kitVentHoleWidth, + depth = kitVentHoleDepth, +) -kitVentB = pixelBox(kitBody, seg02, kitVentElevation, kitVentOffset + 2, kitVentHoleHeight, kitVentHoleWidth, kitVentHoleDepth) +kitVentB = pixelBox( + kitExtrude = kitBody, + extrudeTag = seg02, + positionY = kitVentElevation, + positionZ = kitVentOffset + 2, + width = kitVentHoleHeight, + height = kitVentHoleWidth, + depth = kitVentHoleDepth, +) -kitVentC = pixelBox(kitBody, seg02, kitVentElevation, kitVentOffset + 4, kitVentHoleHeight, kitVentHoleWidth, kitVentHoleDepth) +kitVentC = pixelBox( + kitExtrude = kitBody, + extrudeTag = seg02, + positionY = kitVentElevation, + positionZ = kitVentOffset + 4, + width = kitVentHoleHeight, + height = kitVentHoleWidth, + depth = kitVentHoleDepth, +) diff --git a/public/kcl-samples/makeup-mirror/main.kcl b/public/kcl-samples/makeup-mirror/main.kcl index a2586ab97..e88b25e15 100644 --- a/public/kcl-samples/makeup-mirror/main.kcl +++ b/public/kcl-samples/makeup-mirror/main.kcl @@ -29,15 +29,15 @@ fn hingeFn(x, y, z) { return hingeBody } -hingePartA1 = hingeFn(0, 0, 0) -hingePartA2 = hingeFn(0, 0, hingeHeight + hingeGap) -hingePartA3 = hingeFn(0, 0, hingeHeight * 2 + hingeGap * 2) +hingePartA1 = hingeFn(x = 0, y = 0, z = 0) +hingePartA2 = hingeFn(x = 0, y = 0, z = hingeHeight + hingeGap) +hingePartA3 = hingeFn(x = 0, y = 0, z = hingeHeight * 2 + hingeGap * 2) -hingePartB2 = hingeFn(armLength, 0, hingeHeight + hingeGap) -hingePartB3 = hingeFn(armLength, 0, hingeHeight * 2 + hingeGap * 2) +hingePartB2 = hingeFn(x = armLength, y = 0, z = hingeHeight + hingeGap) +hingePartB3 = hingeFn(x = armLength, y = 0, z = hingeHeight * 2 + hingeGap * 2) -hingePartC2 = hingeFn(armLength, -armLength, hingeHeight * 2 + hingeGap * 2) -hingePartC3 = hingeFn(armLength, -armLength, hingeHeight * 3 + hingeGap * 3) +hingePartC2 = hingeFn(x = armLength, y = -armLength, z = hingeHeight * 2 + hingeGap * 2) +hingePartC3 = hingeFn(x = armLength, y = -armLength, z = hingeHeight * 3 + hingeGap * 3) // Add a function to create the arm fn armFn(plane, offset, altitude) { @@ -47,8 +47,8 @@ fn armFn(plane, offset, altitude) { return armBody } -armPartA = armFn(YZ, 0, hingeHeight * 1.5 + hingeGap) -armPartB = armFn(XZ, armLength, hingeHeight * 2.5 + hingeGap * 2) +armPartA = armFn(plane = YZ, offset = 0, altitude = hingeHeight * 1.5 + hingeGap) +armPartB = armFn(plane = XZ, offset = armLength, altitude = hingeHeight * 2.5 + hingeGap * 2) // Add a function to create the mirror fn mirrorFn(plane, offsetX, offsetY, altitude, radius, tiefe, gestellR, gestellD) { @@ -72,4 +72,13 @@ fn mirrorFn(plane, offsetX, offsetY, altitude, radius, tiefe, gestellR, gestellD return armBody } -mirror = mirrorFn(XZ, armLength, armLength, hingeHeight * 4 + hingeGap * 3 + mirrorRadius + archToMirrorGap + archThickness, mirrorRadius, mirrorThickness, archRadius, archThickness) +mirror = mirrorFn( + plane = XZ, + offsetX = armLength, + offsetY = armLength, + altitude = hingeHeight * 4 + hingeGap * 3 + mirrorRadius + archToMirrorGap + archThickness, + radius = mirrorRadius, + tiefe = mirrorThickness, + gestellR = archRadius, + gestellD = archThickness, +) diff --git a/public/kcl-samples/mounting-plate/main.kcl b/public/kcl-samples/mounting-plate/main.kcl index b4a323481..601a87c44 100644 --- a/public/kcl-samples/mounting-plate/main.kcl +++ b/public/kcl-samples/mounting-plate/main.kcl @@ -27,7 +27,7 @@ holeRadius = .25 holeIndex = .75 // Create the mounting plate extrusion, holes, and fillets -rs = rectShape([0, 0], plateWidth, plateLength) +rs = rectShape(pos = [0, 0], w = plateWidth, l = plateLength) part = rs |> subtract2d(tool = circle( center = [ diff --git a/public/kcl-samples/walkie-talkie/case.kcl b/public/kcl-samples/walkie-talkie/case.kcl index 84c658978..8b1b562a9 100644 --- a/public/kcl-samples/walkie-talkie/case.kcl +++ b/public/kcl-samples/walkie-talkie/case.kcl @@ -62,10 +62,10 @@ case = startSketchOn(XZ) |> subtract2d(tool = squareHolePatternSketch) // Create the Zoo logo - |> subtract2d(tool = zLogo(startSketchOn(XZ), [-.30, -1.825], .20)) - |> subtract2d(tool = oLogo(startSketchOn(XZ), [-.075, -1.825], .20)) - |> subtract2d(tool = oLogo2(startSketchOn(XZ), [-.075, -1.825], .20)) - |> subtract2d(tool = oLogo(startSketchOn(XZ), [.175, -1.825], .20)) - |> subtract2d(tool = oLogo2(startSketchOn(XZ), [.175, -1.825], .20)) + |> subtract2d(tool = zLogo(surface = startSketchOn(XZ), origin = [-.30, -1.825], scale = .20)) + |> subtract2d(tool = oLogo(surface = startSketchOn(XZ), origin = [-.075, -1.825], scale = .20)) + |> subtract2d(tool = oLogo2(surface = startSketchOn(XZ), origin = [-.075, -1.825], scale = .20)) + |> subtract2d(tool = oLogo(surface = startSketchOn(XZ), origin = [.175, -1.825], scale = .20)) + |> subtract2d(tool = oLogo2(surface = startSketchOn(XZ), origin = [.175, -1.825], scale = .20)) extrude(case, length = -0.0625) |> appearance(color = '#D0FF01', metalness = 0, roughness = 50) diff --git a/public/zma-logomark-outlined.png b/public/zma-logomark-outlined.png index 311f4f6c5..1da0517f9 100644 Binary files a/public/zma-logomark-outlined.png and b/public/zma-logomark-outlined.png differ diff --git a/rust/Cargo.lock b/rust/Cargo.lock index b3c589952..f34af57fd 100644 --- a/rust/Cargo.lock +++ b/rust/Cargo.lock @@ -713,6 +713,15 @@ dependencies = [ "typenum", ] +[[package]] +name = "csscolorparser" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "46f9a16a848a7fb95dd47ce387ac1ee9a6df879ba784b815537fcd388a1a8288" +dependencies = [ + "phf", +] + [[package]] name = "darling" version = "0.20.10" @@ -1899,6 +1908,7 @@ dependencies = [ "console_error_panic_hook", "convert_case", "criterion", + "csscolorparser", "dashmap 6.1.0", "dhat", "expectorate", @@ -2064,9 +2074,9 @@ dependencies = [ [[package]] name = "kittycad-modeling-cmds" -version = "0.2.114" +version = "0.2.115" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "681ce29b9da92aa6f8bfc003ccb79a9f1a84368e064d68684327b3181dfe16ec" +checksum = "e95dfcade93787f8a7529ad7b9b81f038823e273e7684297085ef720962b7497" dependencies = [ "anyhow", "chrono", @@ -2630,6 +2640,48 @@ dependencies = [ "sha2", ] +[[package]] +name = "phf" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fd6780a80ae0c52cc120a26a1a42c1ae51b247a253e4e06113d23d2c2edd078" +dependencies = [ + "phf_macros", + "phf_shared", +] + +[[package]] +name = "phf_generator" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c80231409c20246a13fddb31776fb942c38553c51e871f8cbd687a4cfb5843d" +dependencies = [ + "phf_shared", + "rand 0.8.5", +] + +[[package]] +name = "phf_macros" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f84ac04429c13a7ff43785d75ad27569f2951ce0ffd30a3321230db2fc727216" +dependencies = [ + "phf_generator", + "phf_shared", + "proc-macro2", + "quote", + "syn 2.0.100", +] + +[[package]] +name = "phf_shared" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67eabc2ef2a60eb7faa00097bd1ffdb5bd28e62bf39990626a582201b7a754e5" +dependencies = [ + "siphasher", +] + [[package]] name = "phonenumber" version = "0.3.7+8.13.52" @@ -3575,6 +3627,12 @@ version = "2.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bbbb5d9659141646ae647b42fe094daf6c6192d1620870b449d9557f748b2daa" +[[package]] +name = "siphasher" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56199f7ddabf13fe5074ce809e7d3f42b42ae711800501b5b16ea82ad029c39d" + [[package]] name = "slab" version = "0.4.9" diff --git a/rust/Cargo.toml b/rust/Cargo.toml index cff411851..d403ce4d3 100644 --- a/rust/Cargo.toml +++ b/rust/Cargo.toml @@ -36,7 +36,7 @@ dashmap = { version = "6.1.0" } http = "1" indexmap = "2.9.0" kittycad = { version = "0.3.36", default-features = false, features = ["js", "requests"] } -kittycad-modeling-cmds = { version = "0.2.114", features = ["ts-rs", "websocket"] } +kittycad-modeling-cmds = { version = "0.2.115", features = ["ts-rs", "websocket"] } lazy_static = "1.5.0" miette = "7.5.0" pyo3 = { version = "0.24.1" } diff --git a/rust/kcl-derive-docs/src/lib.rs b/rust/kcl-derive-docs/src/lib.rs index 0a0a5abd8..b1cb159c4 100644 --- a/rust/kcl-derive-docs/src/lib.rs +++ b/rust/kcl-derive-docs/src/lib.rs @@ -792,15 +792,21 @@ fn rust_type_to_openapi_type(t: &str) -> String { if t.starts_with("Option<") { t = t.replace("Option<", "").replace('>', ""); } + + if t == "[TyF64;2]" { + return "Point2d".to_owned(); + } + if t == "[TyF64;3]" { + return "Point3d".to_owned(); + } + if let Some((inner_type, _length)) = parse_array_type(&t) { t = format!("[{inner_type}]") } - if t == "f64" || t == "TyF64" { + if t == "f64" || t == "TyF64" || t == "u32" || t == "NonZeroU32" { return "number".to_string(); - } else if t == "u32" { - return "integer".to_string(); - } else if t == "str" { + } else if t == "str" || t == "String" { return "string".to_string(); } else { return t.replace("f64", "number").replace("TyF64", "number").to_string(); diff --git a/rust/kcl-lib/Cargo.toml b/rust/kcl-lib/Cargo.toml index bafd947da..9ad253667 100644 --- a/rust/kcl-lib/Cargo.toml +++ b/rust/kcl-lib/Cargo.toml @@ -31,6 +31,7 @@ clap = { version = "4.5.36", default-features = false, optional = true, features "derive", ] } convert_case = "0.8.0" +csscolorparser = "0.7.0" dashmap = { workspace = true } dhat = { version = "0.3", optional = true } fnv = "1.0.7" diff --git a/rust/kcl-lib/e2e/executor/inputs/cube.kcl b/rust/kcl-lib/e2e/executor/inputs/cube.kcl index 236ccb38f..d42b5a9d7 100644 --- a/rust/kcl-lib/e2e/executor/inputs/cube.kcl +++ b/rust/kcl-lib/e2e/executor/inputs/cube.kcl @@ -17,4 +17,4 @@ fn cube(length, center) { |> extrude(length = length) } -myCube = cube(40, [0,0]) +myCube = cube(length=40, center=[0,0]) diff --git a/rust/kcl-lib/e2e/executor/inputs/extrude-inside-fn-with-tags.kcl b/rust/kcl-lib/e2e/executor/inputs/extrude-inside-fn-with-tags.kcl index 8a6e4aa51..f2e0bde2a 100644 --- a/rust/kcl-lib/e2e/executor/inputs/extrude-inside-fn-with-tags.kcl +++ b/rust/kcl-lib/e2e/executor/inputs/extrude-inside-fn-with-tags.kcl @@ -48,7 +48,7 @@ fn bracketSketch(w, d, t) { } // build the body of the bracket -bs = bracketSketch(width, depth, thk) +bs = bracketSketch(w = width, d = depth, t = thk) bracketBody = bs |> fillet( radius = radius, diff --git a/rust/kcl-lib/e2e/executor/inputs/fillet-and-shell.kcl b/rust/kcl-lib/e2e/executor/inputs/fillet-and-shell.kcl index 5049b7673..eac52902c 100644 --- a/rust/kcl-lib/e2e/executor/inputs/fillet-and-shell.kcl +++ b/rust/kcl-lib/e2e/executor/inputs/fillet-and-shell.kcl @@ -40,9 +40,9 @@ miniHdmiHole = startSketchOn(XY) case = startSketchOn(XY) |> startProfile(at = [0, 0]) - |> line(endAbsolute = [caseWidth, 0], $edge1) - |> line(endAbsolute = [caseWidth, caseLength], $edge2) - |> line(endAbsolute = [0, caseLength], $edge3) + |> line(endAbsolute = [caseWidth, 0], tag = $edge1) + |> line(endAbsolute = [caseWidth, caseLength], tag = $edge2) + |> line(endAbsolute = [0, caseLength], tag = $edge3) |> close(tag = $edge4) |> extrude(length = caseHeight) |> fillet( @@ -65,15 +65,15 @@ fn m25Screw(x, y, height) { return screw } -m25Screw(border + rpizWidth / 2 - (widthBetweenScrews / 2), 0 + border + rpizLength / 2 - (lengthBetweenScrews / 2), screwHeight) +m25Screw(x = border + rpizWidth / 2 - (widthBetweenScrews / 2), y = 0 + border + rpizLength / 2 - (lengthBetweenScrews / 2), height = screwHeight) -m25Screw(border + rpizWidth / 2 - (widthBetweenScrews / 2), 0 + border + rpizLength / 2 + lengthBetweenScrews / 2, screwHeight) +m25Screw(x = border + rpizWidth / 2 - (widthBetweenScrews / 2), y = 0 + border + rpizLength / 2 + lengthBetweenScrews / 2, height = screwHeight) -m25Screw(border + rpizWidth / 2 + widthBetweenScrews / 2, 0 + border + rpizLength / 2 + lengthBetweenScrews / 2, screwHeight) +m25Screw(x = border + rpizWidth / 2 + widthBetweenScrews / 2, y = 0 + border + rpizLength / 2 + lengthBetweenScrews / 2, height = screwHeight) -m25Screw(border + rpizWidth / 2 + widthBetweenScrews / 2, 0 + border + rpizLength / 2 - (lengthBetweenScrews / 2), screwHeight) +m25Screw(x = border + rpizWidth / 2 + widthBetweenScrews / 2, y = 0 + border + rpizLength / 2 - (lengthBetweenScrews / 2), height = screwHeight) shell( - faces = ['end'], + faces = [END], thickness = caseThickness ) diff --git a/rust/kcl-lib/e2e/executor/inputs/focusrite_scarlett_mounting_braket.kcl b/rust/kcl-lib/e2e/executor/inputs/focusrite_scarlett_mounting_braket.kcl index 831ec4ffc..ed867dd74 100644 --- a/rust/kcl-lib/e2e/executor/inputs/focusrite_scarlett_mounting_braket.kcl +++ b/rust/kcl-lib/e2e/executor/inputs/focusrite_scarlett_mounting_braket.kcl @@ -48,7 +48,7 @@ fn bracketSketch(w, d, t) { } // build the body of the bracket -bs = bracketSketch(width, depth, thk) +bs = bracketSketch(w = width, d = depth, t = thk) bracketBody = bs |> extrude(length = length + 2 * thk) |> fillet( diff --git a/rust/kcl-lib/e2e/executor/inputs/function_sketch.kcl b/rust/kcl-lib/e2e/executor/inputs/function_sketch.kcl index 10d18389d..b3db288fa 100644 --- a/rust/kcl-lib/e2e/executor/inputs/function_sketch.kcl +++ b/rust/kcl-lib/e2e/executor/inputs/function_sketch.kcl @@ -10,4 +10,4 @@ fn box(h, l, w) { return myBox } -fnBox = box(3, 6, 10) +fnBox = box(h = 3, l = 6, w = 10) diff --git a/rust/kcl-lib/e2e/executor/inputs/function_sketch_with_position.kcl b/rust/kcl-lib/e2e/executor/inputs/function_sketch_with_position.kcl index e1ff9664f..c1b2325bb 100644 --- a/rust/kcl-lib/e2e/executor/inputs/function_sketch_with_position.kcl +++ b/rust/kcl-lib/e2e/executor/inputs/function_sketch_with_position.kcl @@ -10,4 +10,4 @@ fn box(p, h, l, w) { return myBox } -thing = box([0,0], 3, 6, 10) +thing = box(p = [0,0], h = 3, l = 6, w = 10) diff --git a/rust/kcl-lib/e2e/executor/inputs/global-tags.kcl b/rust/kcl-lib/e2e/executor/inputs/global-tags.kcl index 819d53f69..5fc1a34cf 100644 --- a/rust/kcl-lib/e2e/executor/inputs/global-tags.kcl +++ b/rust/kcl-lib/e2e/executor/inputs/global-tags.kcl @@ -48,7 +48,7 @@ fn bracketSketch(w, d, t) { } // build the body of the bracket -bs = bracketSketch(width, depth, thk) +bs = bracketSketch(w = width, d = depth, t = thk) bracketBody = bs |> extrude(length = length + 2 * thk) |> fillet( diff --git a/rust/kcl-lib/e2e/executor/inputs/lsystem.kcl b/rust/kcl-lib/e2e/executor/inputs/lsystem.kcl index 0748ced2d..aefc82a5d 100644 --- a/rust/kcl-lib/e2e/executor/inputs/lsystem.kcl +++ b/rust/kcl-lib/e2e/executor/inputs/lsystem.kcl @@ -3,14 +3,14 @@ // Comparators -fn cond(bools) { +fn cond(@bools) { return fn(a, b) { x = min([max([-1, a-b]), 1]) + 1 return bools[x] } } -fn Not(b) { return if b { false } else { true } } +fn Not(@b) { return if b { false } else { true } } fn And(a, b) { return if a { if b { true } else { false } } else { false }} fn Or(a, b) { return if a { true } else { if b { true } else { false }}} @@ -18,14 +18,14 @@ Eq = cond([false, true, false]) Lt = cond([true, false, false]) Gt = cond([false, false, true]) -fn Lte(a, b) { return Not(Gt(a, b)) } -fn Gte(a, b) { return Not(Lt(a, b)) } +fn Lte(a, b) { return Not(Gt(a = a, b = b)) } +fn Gte(a, b) { return Not(Lt(a = a, b = b)) } // L-system // Note: it was most concise to encode productions directly in axioms. // Change them as you need. -fn setSketch(state, q) { +fn setSketch(@state, q) { return { depthMax = state.depthMax, depth = state.depth + 1, @@ -37,7 +37,7 @@ fn setSketch(state, q) { } } -fn setDepth(state, q) { +fn setDepth(@state, q) { return { depthMax = state.depthMax, depth = q, @@ -49,7 +49,7 @@ fn setDepth(state, q) { } } -fn setAngle(state, q) { +fn setAngle(@state, q) { return { depthMax = state.depthMax, depth = state.depth, @@ -61,7 +61,7 @@ fn setAngle(state, q) { } } -fn setLength(state, q) { +fn setLength(@state, q) { return { depthMax = state.depthMax, depth = state.depth, @@ -73,31 +73,31 @@ fn setLength(state, q) { } } -fn Gt2(state) { return setLength(state, state.currentLength * state.factor) } -fn Lt2(state) { return setLength(state, state.currentLength / state.factor) } -fn Add(state) { return setAngle(state, rem(state.currentAngle - state.angle, divisor = 360)) } -fn Sub(state) { return setAngle(state, rem(state.currentAngle + state.angle, divisor = 360)) } +fn Gt2(@state) { return setLength(state, q = state.currentLength * state.factor) } +fn Lt2(@state) { return setLength(state, q = state.currentLength / state.factor) } +fn Add(@state) { return setAngle(state, q = rem(state.currentAngle - state.angle, divisor = 360)) } +fn Sub(@state) { return setAngle(state, q = rem(state.currentAngle + state.angle, divisor = 360)) } // Only necessary to get around recursion limitations... -fn F(state, F) { - return if Lt(state.depth, state.depthMax) { - stateNext = state |> setDepth(%, state.depth + 1) +fn F(@state, F) { + return if Lt(a = state.depth, b = state.depthMax) { + stateNext = state |> setDepth(%, q = state.depth + 1) // Produce // Note:if you need [ and ], just save state to a variable. stateNext - |> F(%, F) |> Sub(%) |> F(%, F) + |> F(%, F = F) |> Sub(%) |> F(%, F = F) |> Add(%) |> Add(%) - |> F(%, F) |> Sub(%) |> F(%, F) - |> setDepth(%, stateNext.depth - 1) + |> F(%, F = F) |> Sub(%) |> F(%, F = F) + |> setDepth(%, q = stateNext.depth - 1) } else { // Pass onto the next instruction - state |> setSketch(%, angledLine(state.q, angle = state.currentAngle, length = state.currentLength)) + state |> setSketch(%, q = angledLine(state.q, angle = state.currentAngle, length = state.currentLength)) } } -fn LSystem(args, axioms) { +fn LSystem(@args, axioms) { myThing = startSketchOn(XY) |> startProfile(at = [0, 0]) return axioms({ @@ -115,7 +115,8 @@ LSystem({ iterations = 1, factor = 1.36, angle = 60, -}, fn(q) { - result = q |> F(%, F) |> Add(%) |> Add(%) |> F(%, F) |> Add(%) |> Add(%) |> F(%, F) +}, axioms = fn(@q) { + result = q |> F(%, F = F) |> Add(%) |> Add(%) |> F(%, F = F) |> Add(%) |> Add(%) |> F(%, F = F) return result.q }) + diff --git a/rust/kcl-lib/e2e/executor/inputs/member_expression_sketch.kcl b/rust/kcl-lib/e2e/executor/inputs/member_expression_sketch.kcl index f251c5ba7..72ba39c2e 100644 --- a/rust/kcl-lib/e2e/executor/inputs/member_expression_sketch.kcl +++ b/rust/kcl-lib/e2e/executor/inputs/member_expression_sketch.kcl @@ -9,8 +9,8 @@ fn square(pos, scale) { return sg } -sq = square([0,0], 10) -cb = square([3,3], 4) +sq = square(pos = [0,0], scale = 10) +cb = square(pos = [3,3], scale = 4) |> extrude(length = 10) // pt1 = sq.paths[0] diff --git a/rust/kcl-lib/e2e/executor/inputs/negative_args.kcl b/rust/kcl-lib/e2e/executor/inputs/negative_args.kcl index ce660f60a..7066a271c 100644 --- a/rust/kcl-lib/e2e/executor/inputs/negative_args.kcl +++ b/rust/kcl-lib/e2e/executor/inputs/negative_args.kcl @@ -13,7 +13,7 @@ fn box(sk1, sk2, scale) { return boxSketch } -box(0, 0, 5) -box(10, 23, 8) -thing = box(-12, -15, 10) -box(-20, -5, 10) +box(sk1 = 0, sk2 = 0, scale = 5) +box(sk1 = 10, sk2 = 23, scale = 8) +thing = box(sk1 = -12, sk2 = -15, scale = 10) +box(sk1 = -20, sk2 = -5, scale = 10) diff --git a/rust/kcl-lib/e2e/executor/inputs/no_visuals/identity.kcl b/rust/kcl-lib/e2e/executor/inputs/no_visuals/identity.kcl index 01c9f74b0..266179666 100644 --- a/rust/kcl-lib/e2e/executor/inputs/no_visuals/identity.kcl +++ b/rust/kcl-lib/e2e/executor/inputs/no_visuals/identity.kcl @@ -1,3 +1,3 @@ -export fn identity(x) { +export fn identity(@x) { return x } diff --git a/rust/kcl-lib/e2e/executor/inputs/no_visuals/numbers.kcl b/rust/kcl-lib/e2e/executor/inputs/no_visuals/numbers.kcl index 6f26c0049..d00dcd6cd 100644 --- a/rust/kcl-lib/e2e/executor/inputs/no_visuals/numbers.kcl +++ b/rust/kcl-lib/e2e/executor/inputs/no_visuals/numbers.kcl @@ -1,7 +1,7 @@ -export fn increment(x) { +export fn increment(@x) { return x + 1 } -export fn decrement(x) { +export fn decrement(@x) { return x - 1 } diff --git a/rust/kcl-lib/e2e/executor/inputs/no_visuals/pipe_substitution_inside_function_called_from_pipeline.kcl b/rust/kcl-lib/e2e/executor/inputs/no_visuals/pipe_substitution_inside_function_called_from_pipeline.kcl index b56efda1f..5b31ef8db 100644 --- a/rust/kcl-lib/e2e/executor/inputs/no_visuals/pipe_substitution_inside_function_called_from_pipeline.kcl +++ b/rust/kcl-lib/e2e/executor/inputs/no_visuals/pipe_substitution_inside_function_called_from_pipeline.kcl @@ -1,5 +1,5 @@ // Make sure pipe value doesn't leak into the function call. -fn f(ignored) { +fn f(@ignored) { return % } diff --git a/rust/kcl-lib/e2e/executor/inputs/pattern_vase.kcl b/rust/kcl-lib/e2e/executor/inputs/pattern_vase.kcl index 4fd999134..2f776041f 100644 --- a/rust/kcl-lib/e2e/executor/inputs/pattern_vase.kcl +++ b/rust/kcl-lib/e2e/executor/inputs/pattern_vase.kcl @@ -4,7 +4,7 @@ h = 10 // layer height t = 0.005 // taper factor [0-1) // Defines how to modify each layer of the vase. // Each replica is shifted up the Z axis, and has a smoothly-varying radius -fn transform(replicaId) { +fn transform(@replicaId) { scale = r * abs(1 - (t * replicaId)) * (5 + cos((replicaId / 8): number(rad))) return { translate = [0, 0, replicaId * 10], diff --git a/rust/kcl-lib/e2e/executor/inputs/pentagon_fillet_sugar.kcl b/rust/kcl-lib/e2e/executor/inputs/pentagon_fillet_sugar.kcl index 4e62c28d1..695d26ef4 100644 --- a/rust/kcl-lib/e2e/executor/inputs/pentagon_fillet_sugar.kcl +++ b/rust/kcl-lib/e2e/executor/inputs/pentagon_fillet_sugar.kcl @@ -10,7 +10,7 @@ p = startSketchOn(XY) |> angledLine(angle = 300, length = triangleLen, tag = $c) |> extrude(length = triangleHeight) -fn circl(x, face) { +fn circl(@x, face) { return startSketchOn(p, face = face) |> startProfile(at = [x + radius, triangleHeight/2]) |> arc( @@ -22,7 +22,7 @@ return startSketchOn(p, face = face) |> close() } -c1 = circl(-200,c) +c1 = circl(-200, face = c) plumbus1 = c1 |> extrude(length = plumbusLen) @@ -30,7 +30,7 @@ plumbus1 = radius = 5, tags = [c1.tags.arc_tag, getOppositeEdge(c1.tags.arc_tag)] ) -c2 = circl(200, a) +c2 = circl(200, face = a) plumbus0 = c2 |> extrude(length = plumbusLen) diff --git a/rust/kcl-lib/e2e/executor/inputs/pipe_as_arg.kcl b/rust/kcl-lib/e2e/executor/inputs/pipe_as_arg.kcl index c474adc9d..7bec20674 100644 --- a/rust/kcl-lib/e2e/executor/inputs/pipe_as_arg.kcl +++ b/rust/kcl-lib/e2e/executor/inputs/pipe_as_arg.kcl @@ -17,7 +17,7 @@ fn cube(length, center) { |> extrude(length = length) } -fn double(x) { return x * 2} +fn double(@x) { return x * 2} fn width() { return 200 } -myCube = cube(200 |> double(%), [0,0]) +myCube = cube(length = 200 |> double(), center = [0,0]) diff --git a/rust/kcl-lib/e2e/executor/inputs/riddle.kcl b/rust/kcl-lib/e2e/executor/inputs/riddle.kcl index cf25ccc22..e7e12d850 100644 --- a/rust/kcl-lib/e2e/executor/inputs/riddle.kcl +++ b/rust/kcl-lib/e2e/executor/inputs/riddle.kcl @@ -1,11 +1,11 @@ ANSWER = 41803 -fn m(s) { +fn m(@s) { return (ANSWER * s + 12345) % 214748 } -fn p(xs, ys) { - ox = 35 - (m(xs) % 70) - oy = 35 - (m(ys) % 70) +fn p(x, y) { + ox = 35 - (m(x) % 70) + oy = 35 - (m(y) % 70) r = startSketchOn(XZ) |> startProfile(at = [ox, oy]) |> line(end = [1, 0]) @@ -15,2640 +15,2640 @@ fn p(xs, ys) { |> extrude(length = 1) return r } -p(177533, 177533) -p(133828, 31489) -p(144509, 138041) -p(87312, 57981) -p(160197, 14025) -p(76508, 129013) -p(212949, 43329) -p(155560, 70405) -p(23301, 60893) -p(64504, 75837) -p(32297, 166861) -p(113668, 168121) -p(84273, 151141) -p(156140, 172777) -p(172545, 179961) -p(23840, 102521) -p(14437, 158125) -p(175384, 118925) -p(74857, 149881) -p(188160, 98057) -p(7481, 153469) -p(53632, 172685) -p(71397, 109897) -p(161504, 66717) -p(59133, 126201) -p(107904, 151817) -p(70065, 208005) -p(88948, 18197) -p(117193, 119701) -p(143744, 134645) -p(192365, 65941) -p(77044, 11013) -p(9317, 54293) -p(83804, 116305) -p(87401, 139301) -p(162664, 3545) -p(53985, 72733) -p(4748, 151041) -p(109849, 31589) -p(66428, 19649) -p(211705, 141629) -p(195360, 39449) -p(62425, 42361) -p(164956, 112325) -p(169429, 128821) -p(158808, 2769) -p(127569, 108153) -p(129956, 174721) -p(91825, 71181) -p(147196, 149005) -p(103533, 49053) -p(86320, 136389) -p(26261, 148421) -p(205548, 114361) -p(69701, 7909) -p(80524, 44689) -p(35217, 156281) -p(120084, 149297) -p(173561, 146193) -p(152268, 196165) -p(28745, 13733) -p(122832, 155021) -p(42297, 30521) -p(155600, 68853) -p(51093, 184325) -p(173616, 137457) -p(61057, 197425) -p(116036, 138817) -p(65681, 162981) -p(162981, 12040) -p(12040, 12040) -p(62221, 143240) -p(148348, 201848) -p(202309, 83656) -p(7412, 49112) -p(15573, 212236) -p(167400, 74052) -p(40189, 102872) -p(68092, 162356) -p(24629, 139260) -p(129196, 186712) -p(64189, 21068) -p(156816, 24948) -p(176817, 102096) -p(131844, 161480) -p(58493, 185744) -p(130844, 93844) -p(95141, 164876) -p(83260, 68812) -p(53089, 93068) -p(115736, 49888) -p(187745, 132760) -p(36420, 153328) -p(48461, 91224) -p(0, 6416) -p(115581, 15828) -p(24708, 57164) -p(144561, 117716) -p(88332, 184384) -p(136277, 92584) -p(184272, 38924) -p(193985, 91616) -p(91664, 188848) -p(191425, 13108) -p(84064, 127420) -p(109881, 202624) -p(169908, 194380) -p(34253, 124024) -p(89624, 60952) -p(134657, 194672) -p(107056, 38240) -p(144713, 155080) -p(111972, 123732) -p(11353, 112768) -p(145224, 170508) -p(140961, 196224) -p(26800, 76572) -p(156649, 116748) -p(187372, 159252) -p(18433, 104424) -p(42264, 100544) -p(161141, 44548) -p(206324, 173320) -p(174017, 16020) -p(108476, 71040) -p(169521, 209708) -p(37796, 163132) -p(108545, 106168) -p(63188, 211844) -p(214089, 61728) -p(205804, 71816) -p(85093, 48628) -p(11400, 160704) -p(72637, 9228) -p(24176, 197484) -p(43785, 151292) -p(33164, 159152) -p(183489, 3112) -p(214121, 34269) -p(88704, 137617) -p(137617, 137617) -p(48980, 164985) -p(71017, 72601) -p(84560, 78325) -p(71369, 46885) -p(155752, 53193) -p(146157, 26409) -p(35976, 131309) -p(116913, 197201) -p(152000, 94045) -p(25273, 161681) -p(139352, 169641) -p(40669, 118985) -p(127480, 154505) -p(206281, 152077) -p(163544, 102973) -p(168209, 22045) -p(192524, 59017) -p(102677, 79877) -p(88952, 62221) -p(181145, 8845) -p(171692, 49021) -p(177717, 35045) -p(20860, 183033) -p(128581, 129173) -p(53628, 166829) -p(115257, 81821) -p(90568, 20685) -p(135501, 191477) -p(81700, 82497) -p(112473, 123549) -p(78564, 67553) -p(210449, 149265) -p(107060, 9237) -p(204301, 76581) -p(108096, 157801) -p(119553, 135481) -p(64876, 20785) -p(194725, 25341) -p(30492, 93661) -p(200901, 193221) -p(8916, 161973) -p(130321, 208649) -p(176472, 7393) -p(111657, 70565) -p(62512, 2345) -p(34961, 62413) -p(172328, 188173) -p(119353, 144509) -p(100872, 122965) -p(148141, 154989) -p(152080, 12049) -p(100557, 126361) -p(39964, 205837) -p(10569, 69789) -p(6356, 120153) -p(93893, 57949) -p(166920, 9429) -p(163533, 196033) -p(158544, 40677) -p(15221, 51833) -p(18092, 106369) -p(127657, 101521) -p(166240, 35437) -p(59021, 70857) -p(194928, 96281) -p(139625, 133637) -p(16937, 95364) -p(159252, 42380) -p(132377, 98568) -p(39633, 208124) -p(92476, 48980) -p(201849, 104100) -p(17693, 174356) -p(173300, 148348) -p(175445, 189592) -p(63969, 125836) -p(68876, 174548) -p(160685, 164168) -p(138041, 212497) -p(117716, 56749) -p(154989, 12793) -p(111733, 146513) -p(9020, 144085) -p(142073, 106921) -p(134525, 76549) -p(864, 63449) -p(41917, 39285) -p(158097, 110025) -p(116036, 89065) -p(65681, 25117) -p(196457, 214592) -p(143240, 87472) -p(90165, 15664) -p(102705, 4792) -p(94128, 72820) -p(176033, 71460) -p(127249, 46228) -p(156028, 140356) -p(115861, 31576) -p(9725, 28472) -p(85372, 204696) -p(212793, 193048) -p(78557, 96017) -p(71816, 165013) -p(150041, 82725) -p(213533, 213533) -p(184088, 112513) -p(70561, 62833) -p(30344, 104169) -p(36469, 66713) -p(65540, 153173) -p(197809, 118629) -p(141488, 198105) -p(208065, 90101) -p(21612, 110769) -p(208417, 158029) -p(31084, 52061) -p(170637, 202569) -p(17468, 92329) -p(176329, 201017) -p(110081, 206157) -p(177092, 34105) -p(185253, 190537) -p(200544, 148709) -p(132525, 188693) -p(75812, 127849) -p(15749, 48181) -p(199116, 15573) -p(71905, 86705) -p(198085, 18385) -p(143316, 183645) -p(106445, 93789) -p(31684, 63025) -p(150953, 154725) -p(6712, 108441) -p(85905, 145121) -p(152432, 139689) -p(22017, 32553) -p(131732, 70885) -p(210341, 193541) -p(169156, 50993) -p(99877, 57785) -p(14052, 205189) -p(54137, 125421) -p(165081, 118821) -p(30936, 121441) -p(161845, 208001) -p(177533, 105972) -p(203500, 197188) -p(144509, 207284) -p(212949, 198356) -p(198356, 198356) -p(103261, 97144) -p(64504, 106264) -p(208229, 11844) -p(189748, 151972) -p(134637, 59104) -p(29504, 150804) -p(145861, 99764) -p(9380, 165456) -p(153589, 184864) -p(81256, 76084) -p(185773, 58812) -p(118096, 115000) -p(2725, 104128) -p(138225, 60656) -p(49780, 65796) -p(11457, 154784) -p(30044, 91612) -p(178909, 165072) -p(161404, 206600) -p(11093, 121692) -p(40164, 30184) -p(162537, 61624) -p(162473, 147116) -p(107796, 34940) -p(1161, 114416) -p(2864, 53864) -p(82349, 131104) -p(209328, 15532) -p(204197, 92388) -p(149036, 182536) -p(68309, 173900) -p(176172, 169436) -p(87001, 9032) -p(179536, 19512) -p(121029, 46004) -p(202308, 170796) -p(188633, 164780) -p(20689, 65120) -p(154268, 167400) -p(144381, 154300) -p(195097, 211173) -p(102872, 11753) -p(67553, 172649) -p(142309, 79389) -p(194376, 129269) -p(129269, 129269) -p(66832, 113549) -p(182121, 124905) -p(141036, 199917) -p(25665, 8649) -p(168756, 195353) -p(61629, 175461) -p(63048, 123545) -p(93913, 184681) -p(155008, 75901) -p(139681, 137905) -p(173892, 214569) -p(110829, 190113) -p(4989, 166049) -p(120228, 138297) -p(166137, 170413) -p(91664, 178373) -p(142813, 143921) -p(84064, 3509) -p(144713, 33589) -p(177280, 188369) -p(186117, 114909) -p(156649, 108893) -p(53068, 73765) -p(18433, 59113) -p(42264, 45429) -p(161141, 67457) -p(168184, 91229) -p(153541, 103069) -p(108476, 7581) -p(169521, 38245) -p(21200, 46881) -p(22085, 54841) -p(113452, 190889) -p(88037, 131697) -p(209876, 141009) -p(41713, 196905) -p(201569, 183513) -p(68684, 105789) -p(23761, 70561) -p(57013, 30344) -p(56972, 52664) -p(100745, 115452) -p(202569, 140000) -p(206600, 149220) -p(62117, 121952) -p(50017, 181144) -p(76952, 80416) -p(191949, 120300) -p(39725, 149120) -p(46676, 193176) -p(5441, 150964) -p(41304, 16568) -p(73237, 212876) -p(95808, 180560) -p(64876, 66832) -p(194725, 189296) -p(41748, 99048) -p(124437, 132140) -p(59472, 80808) -p(116445, 135728) -p(124433, 39272) -p(190084, 145340) -p(64817, 65280) -p(189249, 75176) -p(192604, 200552) -p(43949, 43252) -p(10501, 9484) -p(196388, 50820) -p(205901, 110888) -p(151817, 184549) -p(155080, 159901) -p(70857, 154469) -p(164237, 86833) -p(115000, 8617) -p(67457, 45105) -p(1689, 109637) -p(26396, 20457) -p(97045, 115553) -p(56321, 127101) -p(184568, 126425) -p(11649, 27441) -p(205880, 115653) -p(108073, 44813) -p(76108, 112741) -p(23832, 156797) -p(210153, 116913) -p(122776, 208713) -p(30401, 101485) -p(31528, 29385) -p(190097, 83145) -p(77657, 162037) -p(80044, 36177) -p(59577, 3085) -p(85609, 19973) -p(45492, 115261) -p(164569, 18613) -p(165081, 186101) -p(30936, 193961) -p(161845, 169897) -p(177533, 158500) -p(15828, 22644) -p(19717, 187128) -p(212949, 49720) -p(168952, 122696) -p(103261, 175096) -p(155209, 18180) -p(54440, 12556) -p(123345, 166944) -p(126869, 69320) -p(61328, 206052) -p(61821, 42828) -p(29948, 104840) -p(361, 107460) -p(112788, 93292) -p(44984, 53216) -p(59453, 191300) -p(162952, 193144) -p(161017, 207796) -p(205424, 19540) -p(48225, 106684) -p(72033, 11388) -p(17648, 51856) -p(56957, 152968) -p(129765, 208672) -p(211428, 204984) -p(56273, 3044) -p(36217, 94360) -p(109828, 3528) -p(36669, 125800) -p(204125, 60793) -p(12432, 108145) -p(129173, 30613) -p(183645, 119401) -p(112088, 64189) -p(36401, 207029) -p(95141, 25665) -p(203880, 65349) -p(53089, 43129) -p(48461, 37697) -p(0, 141) -p(115581, 31289) -p(24708, 203049) -p(144561, 151233) -p(117060, 127553) -p(91664, 128137) -p(117873, 84273) -p(139468, 7517) -p(144713, 212461) -p(86740, 119985) -p(30077, 34009) -p(90757, 203533) -p(2220, 171417) -p(180973, 117173) -p(35929, 183933) -p(169216, 197809) -p(45793, 188881) -p(143445, 145601) -p(130980, 16637) -p(54717, 21393) -p(13733, 17664) -p(119560, 38040) -p(197201, 135856) -p(201985, 195632) -p(114416, 135472) -p(2049, 161964) -p(173933, 176324) -p(121592, 35228) -p(143529, 182340) -p(207897, 58516) -p(20184, 14560) -p(180789, 38332) -p(160, 100344) -p(25301, 23388) -p(157328, 52892) -p(1516, 130232) -p(190557, 113344) -p(131608, 80060) -p(142193, 188164) -p(72964, 166328) -p(96261, 49880) -p(58641, 16404) -p(52000, 112860) -p(116441, 211644) -p(180029, 67836) -p(105368, 82488) -p(49573, 202816) -p(59021, 53568) -p(70236, 154104) -p(71697, 5340) -p(119701, 64641) -p(170508, 23497) -p(133637, 75413) -p(184521, 201273) -p(60656, 79293) -p(202145, 201757) -p(68649, 100929) -p(200000, 6025) -p(152357, 11657) -p(62045, 90841) -p(95288, 100153) -p(99569, 194281) -p(201124, 37081) -p(170761, 153913) -p(153932, 191277) -p(184532, 56005) -p(158917, 40669) -p(125884, 136449) -p(41949, 124609) -p(114884, 149841) -p(175445, 187197) -p(9829, 160613) -p(163108, 147513) -p(156617, 214273) -p(99877, 173129) -p(126812, 184385) -p(130893, 66385) -p(165081, 54161) -p(30936, 78417) -p(127493, 82205) -p(138041, 157176) -p(117716, 1812) -p(154989, 37332) -p(207709, 50332) -p(106264, 83908) -p(193025, 11224) -p(66221, 100504) -p(118096, 37232) -p(2725, 92936) -p(21969, 139028) -p(64432, 53728) -p(45709, 59844) -p(144529, 20252) -p(111880, 78476) -p(4077, 46260) -p(37420, 48104) -p(111857, 35680) -p(83380, 66636) -p(145885, 196668) -p(193004, 110400) -p(87529, 35872) -p(13129, 77700) -p(205424, 62756) -p(81801, 153488) -p(11965, 208024) -p(188340, 192304) -p(86069, 201132) -p(209333, 45576) -p(211428, 209476) -p(210077, 212680) -p(17293, 104192) -p(51504, 103508) -p(203089, 122432) -p(61377, 116617) -p(212236, 62665) -p(81821, 110993) -p(183645, 65477) -p(24752, 41997) -p(36401, 27053) -p(95141, 150485) -p(203880, 156501) -p(159833, 150777) -p(151517, 30741) -p(39008, 115649) -p(192821, 199881) -p(152581, 32001) -p(52688, 140781) -p(193985, 20161) -p(91664, 49465) -p(191425, 127097) -p(201480, 12493) -p(30889, 203469) -p(169908, 179789) -p(100337, 24333) -p(51461, 74113) -p(129344, 14629) -p(78989, 106621) -p(157909, 190853) -p(137492, 162617) -p(59769, 113029) -p(68437, 2697) -p(211528, 32969) -p(56173, 162325) -p(43785, 60045) -p(104196, 152137) -p(134193, 68197) -p(148421, 31084) -p(68904, 69708) -p(137617, 184020) -p(201017, 184312) -p(155752, 120656) -p(110637, 210320) -p(71269, 93388) -p(20572, 77084) -p(102677, 57576) -p(177717, 81156) -p(20860, 60588) -p(54737, 43216) -p(83685, 99596) -p(166808, 140064) -p(28825, 63400) -p(165024, 80672) -p(75177, 214008) -p(171884, 161024) -p(11389, 87080) -p(87520, 1780) -p(73845, 67572) -p(124437, 91252) -p(59472, 68056) -p(31437, 193140) -p(124433, 208376) -p(46760, 66896) -p(64817, 131036) -p(64941, 48556) -p(195708, 55056) -p(6101, 99012) -p(82793, 96784) -p(128168, 79412) -p(205901, 23616) -p(151817, 185773) -p(155080, 102225) -p(70857, 83109) -p(51185, 172481) -p(115000, 172189) -p(67457, 52053) -p(40824, 196353) -p(105073, 180825) -p(203140, 59621) -p(165885, 180049) -p(173604, 1689) -p(79293, 38177) -p(80220, 7513) -p(130009, 133857) -p(115416, 27889) -p(27889, 27889) -p(47064, 122309) -p(57845, 66513) -p(75437, 93005) -p(177092, 207609) -p(185253, 72337) -p(169077, 19353) -p(108192, 36817) -p(34841, 71269) -p(18181, 35749) -p(137692, 153557) -p(57833, 118137) -p(108932, 125321) -p(182693, 18285) -p(56984, 213625) -p(115701, 181701) -p(131572, 133473) -p(71905, 10425) -p(198085, 75733) -p(143316, 79805) -p(79953, 89509) -p(202668, 42157) -p(150953, 105813) -p(6712, 63309) -p(85905, 25561) -p(81984, 63017) -p(22017, 138905) -p(131732, 30125) -p(210341, 146181) -p(12632, 95141) -p(146453, 212265) -p(45492, 74081) -p(62581, 21197) -p(75809, 127841) -p(167660, 21873) -p(42293, 155985) -p(57981, 62492) -p(117716, 88208) -p(154989, 70352) -p(207709, 52596) -p(106264, 76368) -p(81333, 98012) -p(200552, 146532) -p(24337, 133916) -p(57872, 188160) -p(75445, 147016) -p(65408, 209604) -p(185261, 54440) -p(103900, 118096) -p(190853, 126540) -p(138120, 58612) -p(180825, 151380) -p(151380, 151380) -p(63377, 8440) -p(59909, 105872) -p(49780, 194760) -p(11457, 70744) -p(133465, 88792) -p(86556, 3884) -p(117129, 155844) -p(177809, 38620) -p(181356, 200000) -p(63757, 17468) -p(20436, 160408) -p(166681, 144588) -p(174692, 122076) -p(186541, 97912) -p(146132, 204364) -p(77529, 80448) -p(206721, 156428) -p(49572, 211548) -p(93153, 176320) -p(134064, 120040) -p(82349, 137504) -p(209328, 192524) -p(204197, 78896) -p(164464, 136728) -p(6297, 148084) -p(18196, 72680) -p(43045, 140900) -p(12340, 171080) -p(197401, 20280) -p(173196, 39788) -p(91693, 121592) -p(185949, 168268) -p(54224, 55408) -p(1249, 13296) -p(104465, 14173) -p(120920, 92681) -p(76581, 30185) -p(19745, 92197) -p(113640, 51053) -p(113549, 208353) -p(49852, 93649) -p(182121, 164489) -p(211484, 132565) -p(25665, 202821) -p(168756, 53089) -p(83465, 158181) -p(130292, 86957) -p(93913, 20097) -p(155008, 23201) -p(139681, 16701) -p(173892, 110829) -p(110829, 110829) -p(4989, 154593) -p(120228, 213977) -p(166137, 193793) -p(68641, 104421) -p(81992, 40765) -p(193985, 154785) -p(30889, 182153) -p(169908, 149837) -p(34253, 7481) -p(89624, 120141) -p(134657, 14565) -p(107056, 114225) -p(144713, 198549) -p(177280, 203789) -p(186117, 15533) -p(141997, 106073) -p(2220, 43869) -p(180973, 210389) -p(144152, 8257) -p(208501, 155661) -p(196136, 63377) -p(17201, 99573) -p(172716, 97045) -p(95577, 22133) -p(55944, 83169) -p(74969, 143821) -p(45816, 94233) -p(113361, 181085) -p(4348, 66189) -p(41521, 116453) -p(176245, 186809) -p(104196, 49401) -p(134193, 152357) -p(114361, 22384) -p(147704, 24128) -p(78325, 145624) -p(177717, 174928) -p(15328, 70128) -p(128581, 181336) -p(106973, 166584) -p(480, 77988) -p(118097, 203848) -p(110365, 56252) -p(115564, 25196) -p(106937, 2492) -p(5853, 111272) -p(95960, 115736) -p(116445, 13356) -p(197397, 124080) -p(154660, 62460) -p(205901, 192008) -p(151817, 15793) -p(155080, 5213) -p(70857, 97889) -p(182665, 41801) -p(82288, 211425) -p(180889, 143789) -p(128125, 196965) -p(6596, 125833) -p(107233, 125349) -p(183633, 93809) -p(142832, 40633) -p(198253, 76345) -p(179457, 202497) -p(202220, 111181) -p(137113, 82945) -p(206225, 187745) -p(30544, 178817) -p(153601, 191725) -p(59825, 136956) -p(133828, 211576) -p(144509, 64464) -p(197317, 205268) -p(170108, 67376) -p(46585, 72424) -p(66121, 47000) -p(77044, 184408) -p(9317, 122396) -p(40693, 207696) -p(81604, 99300) -p(181365, 201872) -p(145105, 199736) -p(162628, 104932) -p(80249, 126960) -p(73965, 148888) -p(124480, 54760) -p(159133, 35160) -p(208489, 51273) -p(51924, 85725) -p(62221, 177717) -p(148348, 200621) -p(202309, 160253) -p(7412, 129681) -p(15573, 83589) -p(171088, 78057) -p(120441, 56421) -p(102836, 127937) -p(32197, 211485) -p(172768, 94845) -p(119401, 3437) -p(181756, 85625) -p(122281, 125025) -p(131844, 207897) -p(58493, 140261) -p(130844, 102705) -p(131529, 7217) -p(185348, 106493) -p(161677, 35069) -p(13356, 201397) -p(178817, 12365) -p(36420, 48461) -p(48461, 48461) -p(49296, 151517) -p(115581, 169373) -p(121840, 80777) -p(137469, 206345) -p(117636, 101445) -p(44961, 5765) -p(58312, 80193) -p(43469, 178009) -p(169288, 53701) -p(201997, 197317) -p(15836, 142881) -p(127829, 207021) -p(53552, 87277) -p(184177, 150549) -p(209560, 154913) -p(133873, 63405) -p(148000, 181213) -p(68925, 111733) -p(134384, 32741) -p(35701, 20901) -p(138908, 18765) -p(152409, 64373) -p(189048, 138225) -p(187213, 116581) -p(124968, 21969) -p(41713, 59909) -p(77192, 179369) -p(154249, 15369) -p(122668, 56321) -p(116953, 182665) -p(37628, 182181) -p(209397, 118525) -p(149005, 130324) -p(151292, 173312) -p(35729, 191068) -p(13076, 131776) -p(184069, 190192) -p(6636, 92476) -p(158029, 13776) -p(206600, 206304) -p(62117, 95288) -p(121952, 85100) -p(205993, 177092) -p(160928, 56380) -p(204601, 52108) -p(17664, 155456) -p(105493, 26200) -p(6860, 147888) -p(133113, 135272) -p(93388, 9704) -p(168209, 27168) -p(192524, 14260) -p(198649, 59192) -p(51496, 65500) -p(82945, 111300) -p(171692, 20860) -p(200621, 15328) -p(15328, 15328) -p(128581, 22028) -p(79628, 56472) -p(194725, 203584) -p(41748, 129640) -p(48065, 94128) -p(52296, 149924) -p(31437, 202032) -p(90588, 18240) -p(79149, 105284) -p(173912, 208440) -p(17497, 31824) -p(24248, 39008) -p(145845, 40752) -p(38768, 211060) -p(95641, 162924) -p(6812, 140804) -p(68049, 152736) -p(145832, 144976) -p(10569, 75788) -p(188112, 213872) -p(105341, 177192) -p(166920, 138084) -p(163533, 88496) -p(158544, 182240) -p(15221, 54920) -p(18092, 52692) -p(127657, 107904) -p(166240, 170108) -p(59021, 124208) -p(70236, 78792) -p(71697, 63172) -p(86317, 155365) -p(170508, 55413) -p(133637, 142073) -p(42380, 207281) -p(42097, 213005) -p(164036, 61821) -p(184521, 49397) -p(60656, 45709) -p(202145, 11457) -p(197740, 57549) -p(150005, 164101) -p(92032, 11649) -p(142013, 123049) -p(180496, 210869) -p(177593, 33777) -p(48104, 185061) -p(144277, 120429) -p(107648, 180889) -p(66513, 196217) -p(15624, 105585) -p(186809, 94713) -p(13164, 5149) -p(109437, 37949) -p(10412, 99569) -p(75437, 8837) -p(177092, 101313) -p(101313, 101313) -p(22472, 210193) -p(182693, 128581) -p(133256, 170601) -p(119097, 199421) -p(117504, 179045) -p(84421, 51241) -p(76520, 73077) -p(1709, 117617) -p(64356, 128873) -p(196725, 118877) -p(15996, 4373) -p(201641, 180789) -p(164144, 95881) -p(90985, 177977) -p(144896, 188065) -p(37969, 93937) -p(193576, 199713) -p(23861, 90933) -p(111740, 107037) -p(63905, 16405) -p(180120, 136833) -p(86093, 115581) -p(98476, 187581) -p(1153, 166137) -p(2664, 8253) -p(144737, 207473) -p(36400, 62981) -p(102393, 205245) -p(114192, 64049) -p(51029, 89089) -p(60893, 86136) -p(188848, 177160) -p(120153, 106320) -p(212461, 57508) -p(99660, 88948) -p(167597, 39360) -p(103900, 134656) -p(192505, 212964) -p(82324, 19276) -p(59909, 200448) -p(49780, 183660) -p(11457, 133104) -p(44761, 185796) -p(26764, 6660) -p(74033, 45668) -p(140752, 113404) -p(196365, 94288) -p(195648, 123784) -p(64937, 70608) -p(177948, 99912) -p(54233, 7436) -p(121929, 44317) -p(102872, 16757) -p(67553, 114965) -p(112709, 147081) -p(113344, 150769) -p(61629, 99729) -p(63048, 111953) -p(206573, 50433) -p(107164, 167173) -p(97565, 62273) -p(140804, 15305) -p(60945, 131653) -p(17201, 191913) -p(173492, 105161) -p(151373, 70425) -p(93984, 61205) -p(131541, 197545) -p(171384, 171637) -p(200209, 126805) -p(37628, 200749) -p(186593, 25685) -p(149005, 76108) -p(159152, 78920) -p(119469, 194300) -p(204601, 51360) -p(17664, 209728) -p(56973, 90760) -p(107004, 143644) -p(133113, 52428) -p(93388, 81540) -p(198385, 166356) -p(74036, 61456) -p(143233, 192456) -p(18753, 136952) -p(145832, 93572) -p(124881, 74940) -p(93592, 97360) -p(146877, 63200) -p(56104, 86296) -p(82793, 29724) -p(128168, 49616) -p(202605, 78144) -p(109897, 94457) -p(38240, 212357) -p(63673, 101149) -p(163392, 33513) -p(138653, 38561) -p(203436, 41373) -p(59844, 164905) -p(130009, 144529) -p(140156, 181109) -p(9476, 80481) -p(211425, 154425) -p(23804, 48165) -p(39633, 100765) -p(92476, 109785) -p(37949, 128125) -p(168401, 168401) -p(141868, 74273) -p(208445, 190137) -p(191808, 116093) -p(202973, 76893) -p(34476, 136669) -p(183633, 169077) -p(142832, 180917) -p(198253, 209545) -p(55948, 110469) -p(202101, 30601) -p(142284, 111921) -p(214001, 65053) -p(129536, 207117) -p(43277, 124729) -p(65748, 98629) -p(148921, 42149) -p(183424, 50401) -p(32825, 200517) -p(56364, 70777) -p(9405, 83685) -p(29356, 2657) -p(69149, 135501) -p(118404, 98821) -p(212760, 112989) -p(161721, 106973) -p(72308, 157237) -p(157613, 92321) -p(46556, 84945) -p(2509, 6637) -p(140853, 181460) -p(150516, 43660) -p(7393, 128960) -p(10264, 23092) -p(191637, 29592) -p(112604, 111204) -p(150868, 25904) -p(46653, 127216) -p(204980, 105672) -p(72940, 87524) -p(156497, 82768) -p(131132, 213576) -p(206345, 137696) -p(138084, 139540) -p(137609, 109260) -p(18861, 131772) -p(131772, 131772) -p(5245, 38036) -p(153476, 122844) -p(39657, 196596) -p(162856, 46672) -p(106001, 195336) -p(26676, 21732) -p(116833, 84712) -p(135424, 65204) -p(100013, 19696) -p(131120, 113048) -p(61649, 7080) -p(95768, 49000) -p(40173, 52396) -p(152792, 191548) -p(105933, 20180) -p(36412, 88884) -p(168781, 123720) -p(120704, 111880) -p(42305, 8340) -p(38184, 185924) -p(104761, 86556) -p(47564, 26196) -p(14508, 49484) -p(130865, 118288) -p(212528, 18920) -p(8073, 37744) -p(155336, 76076) -p(171941, 174084) -p(19749, 112857) -p(65124, 114509) -p(94045, 58713) -p(27728, 139349) -p(20845, 34841) -p(126872, 27949) -p(104192, 46873) -p(75473, 214069) -p(68832, 116837) -p(89828, 102085) -p(43061, 20189) -p(181204, 76953) -p(3437, 115285) -p(143616, 118097) -p(118877, 172633) -p(57485, 57161) -p(181460, 140417) -p(140417, 140417) -p(180552, 110045) -p(35585, 6989) -p(128020, 18345) -p(168981, 85205) -p(214156, 2333) -p(95873, 155461) -p(18492, 187577) -p(184145, 84329) -p(177020, 167009) -p(121909, 91605) -p(157972, 54249) -p(96261, 5729) -p(168804, 168753) -p(97005, 18729) -p(103656, 193985) -p(104925, 16693) -p(69464, 78797) -p(157585, 100633) -p(156768, 113925) -p(44209, 199417) -p(104044, 36293) -p(165500, 88017) -p(158717, 78121) -p(160128, 17569) -p(65521, 193109) -p(83820, 146141) -p(42393, 13881) -p(141629, 198700) -p(209708, 15000) -p(33885, 41492) -p(137676, 59932) -p(109733, 175020) -p(28472, 142220) -p(12761, 4136) -p(154784, 203356) -p(111805, 203648) -p(36460, 71964) -p(100609, 173952) -p(92032, 69152) -p(68649, 28008) -p(200000, 129704) -p(203013, 22768) -p(200544, 200544) -p(72749, 186860) -p(75812, 18788) -p(28853, 50228) -p(149532, 207044) -p(84033, 39748) -p(17816, 117672) -p(187641, 94476) -p(18652, 83612) -p(77469, 170848) -p(199116, 177832) -p(93057, 189772) -p(70504, 165024) -p(47317, 98456) -p(86868, 50520) -p(208976, 101076) -p(75457, 148628) -p(6712, 144164) -p(85609, 180552) -p(45492, 182688) -p(62581, 107384) -p(104629, 107868) -p(167660, 151248) -p(42293, 204232) -p(57981, 125733) -p(117716, 213745) -p(154989, 143297) -p(111184, 196181) -p(153113, 94485) -p(197128, 55477) -p(34397, 120685) -p(97144, 38297) -p(23301, 210933) -p(64504, 191425) -p(208229, 170465) -p(189748, 176773) -p(155209, 39657) -p(54440, 11905) -p(123345, 66149) -p(203356, 97297) -p(97297, 97297) -p(98324, 102829) -p(117741, 85657) -p(23764, 101669) -p(136241, 144657) -p(6268, 80801) -p(185213, 82645) -p(28748, 185801) -p(168393, 178909) -p(20656, 205985) -p(56569, 133009) -p(204808, 183957) -p(185117, 125925) -p(199144, 121945) -p(193448, 148437) -p(199765, 82353) -p(168476, 202973) -p(71249, 72749) -p(105560, 132525) -p(190285, 114961) -p(36217, 65373) -p(131564, 47033) -p(94209, 26557) -p(61377, 160720) -p(212236, 101236) -p(81821, 77756) -p(178044, 188380) -p(100129, 171884) -p(95916, 2936) -p(183645, 97064) -p(24752, 109872) -p(194093, 126368) -p(112832, 107060) -p(136129, 17204) -p(102896, 30396) -p(95141, 131608) -p(82192, 186536) -p(202529, 128020) -p(91664, 12740) -p(191425, 84064) -p(84064, 84064) -p(61945, 139468) -p(182716, 201480) -p(13877, 115888) -p(38484, 84840) -p(134465, 80376) -p(122100, 124916) -p(44961, 125208) -p(25804, 180128) -p(162053, 19824) -p(169288, 163148) -p(201997, 42044) -p(11372, 70572) -p(5676, 162856) -p(92829, 1092) -p(75416, 75036) -p(95897, 174504) -p(6192, 68728) -p(41713, 208272) -p(112005, 99492) -p(45004, 142380) -p(29001, 131416) -p(71181, 83681) -p(20776, 186445) -p(100745, 145885) -p(140000, 65925) -p(206577, 51173) -p(193144, 197217) -p(62756, 168689) -p(9389, 54569) -p(120656, 25265) -p(81165, 186545) -p(30760, 183633) -p(117329, 30697) -p(198800, 206821) -p(76345, 50105) -p(96488, 73977) -p(45649, 7017) -p(9704, 198869) -p(75989, 136665) -p(6660, 97657) -p(26461, 122981) -p(134716, 28853) -p(207044, 6925) -p(197249, 163157) -p(18364, 172377) -p(172377, 172377) -p(89848, 56897) -p(118777, 69221) -p(119097, 198285) -p(117504, 101053) -p(149245, 11389) -p(76520, 211869) -p(1709, 2845) -p(186236, 200029) -p(64096, 96489) -p(94085, 148505) -p(208064, 14685) -p(146453, 195181) -p(76156, 118517) -p(62581, 168981) -p(162392, 68637) -p(75841, 42537) -p(197780, 124533) -p(107441, 180621) -p(95660, 174997) -p(144573, 204493) -p(14025, 110716) -p(184384, 211344) -p(12049, 182816) -p(75176, 169908) -p(88769, 197368) -p(57872, 152052) -p(103900, 181748) -p(5509, 211928) -p(152772, 26676) -p(168309, 181164) -p(182336, 4748) -p(55417, 88588) -p(140092, 81604) -p(203857, 185436) -p(86784, 184852) -p(59909, 65008) -p(49780, 170876) -p(164101, 175732) -p(205880, 190384) -p(108073, 88688) -p(138020, 204068) -p(30044, 181356) -p(75661, 36088) -p(161404, 123424) -p(197217, 98876) -p(98876, 98876) -p(40077, 114112) -p(46997, 172720) -p(141276, 67044) -p(71221, 15812) -p(195780, 91500) -p(33441, 169324) -p(88812, 142832) -p(170932, 149532) -p(87001, 166704) -p(179536, 37448) -p(121029, 144484) -p(202308, 76848) -p(118185, 177576) -p(120080, 128664) -p(157061, 105084) -p(110828, 84416) -p(85605, 32792) -p(39864, 64232) -p(144381, 46084) -p(83505, 138669) -p(162356, 99369) -p(67553, 102181) -p(72556, 180297) -p(22009, 119553) -p(13524, 121689) -p(195116, 42889) -p(41121, 175641) -p(193140, 189225) -p(21197, 74329) -p(163220, 126053) -p(214369, 137893) -p(47224, 203493) -p(191725, 73069) -p(136956, 95873) -p(169373, 75397) -p(64140, 75013) -p(192821, 98009) -p(84484, 72585) -p(68481, 213681) -p(113372, 63849) -p(16168, 151961) -p(170465, 43181) -p(80376, 100337) -p(21577, 34253) -p(170976, 61037) -p(61037, 61037) -p(51461, 66861) -p(163888, 150509) -p(166033, 16789) -p(145224, 56381) -p(199769, 60745) -p(119768, 34737) -p(146384, 210961) -p(75069, 136241) -p(174780, 148273) -p(35929, 164385) -p(169216, 87529) -p(45793, 29889) -p(27120, 43281) -p(152405, 174765) -p(179824, 33185) -p(19913, 111209) -p(78772, 128673) -p(156997, 124017) -p(156281, 26644) -p(94428, 115048) -p(96473, 64976) -p(128456, 23832) -p(208909, 150952) -p(190044, 47412) -p(125321, 76424) -p(34932, 82732) -p(10393, 23732) -p(211485, 211988) -p(175540, 159396) -p(73077, 88556) -p(55180, 214316) -p(102349, 200248) -p(213416, 64392) -p(132493, 41296) -p(114012, 63132) -p(175641, 126888) -p(126888, 126888) -p(130677, 41588) -p(197888, 70892) -p(106116, 213156) -p(190741, 111944) -p(110548, 140280) -p(126296, 35280) -p(179481, 4032) -p(59404, 185888) -p(150748, 141248) -p(52457, 169100) -p(45140, 194040) -p(59021, 91076) -p(194928, 174824) -p(9885, 170552) -p(72733, 137277) -p(173320, 100013) -p(50381, 211705) -p(196092, 168041) -p(209101, 24709) -p(28472, 103217) -p(165589, 67605) -p(17468, 111853) -p(43193, 132229) -p(110081, 87105) -p(209116, 173373) -p(21837, 210153) -p(15004, 110977) -p(80321, 184829) -p(168584, 56057) -p(28853, 125437) -p(161172, 35289) -p(142649, 118061) -p(17816, 187641) -p(187641, 187641) -p(174400, 182693) -p(70504, 149893) -p(47317, 132521) -p(86868, 205689) -p(161332, 89533) -p(75457, 79537) -p(6712, 208893) -p(123580, 94097) -p(94085, 176385) -p(153528, 155809) -p(175077, 198313) -p(167660, 67021) -p(58789, 87205) -p(57981, 108608) -p(117716, 10500) -p(154989, 29132) -p(60236, 89592) -p(153113, 166640) -p(197128, 119964) -p(182861, 13028) -p(118096, 199924) -p(2725, 91144) -p(59909, 24284) -p(136048, 94732) -p(37557, 166832) -p(205880, 69792) -p(108073, 81732) -p(138020, 43400) -p(24681, 150528) -p(114112, 128500) -p(128673, 83476) -p(26644, 68724) -p(167649, 104244) -p(104244, 104244) -p(168904, 87356) -p(194429, 149268) -p(39224, 113072) -p(108348, 45436) -p(113789, 36992) -p(122092, 163244) -p(76420, 142284) -p(60509, 116468) -p(76964, 172948) -p(172265, 118604) -p(177948, 34180) -p(54233, 105796) -p(83505, 88141) -p(102872, 15457) -p(67553, 40397) -p(133696, 107257) -p(129533, 39621) -p(73888, 156845) -p(139689, 133557) -p(153232, 11577) -p(79389, 182369) -p(66832, 101633) -p(138941, 45253) -p(45448, 15073) -p(144825, 76401) -p(52892, 85329) -p(173129, 200901) -p(195116, 124437) -p(41121, 199349) -p(169660, 5853) -p(74081, 20697) -p(59580, 170045) -p(86957, 38069) -p(47808, 124529) -p(109337, 99981) -p(101436, 142193) -p(159669, 70869) -p(211060, 148209) -p(62981, 164997) -p(186664, 208761) -p(134657, 49909) -p(107056, 144713) -p(147525, 51269) -p(25312, 204005) -p(169713, 201193) -p(93984, 104253) -p(131541, 10317) -p(45816, 146849) -p(80173, 139089) -p(113124, 13129) -p(38413, 55049) -p(114361, 192708) -p(147704, 205424) -p(78325, 207944) -p(128456, 19980) -p(132245, 80340) -p(91352, 102852) -p(34105, 141276) -p(121692, 40164) -p(142369, 81600) -p(153976, 134584) -p(116913, 210756) -p(152000, 167868) -p(83981, 31528) -p(139352, 102268) -p(136449, 41524) -p(62656, 148944) -p(56357, 125556) -p(77084, 146424) -p(185289, 173300) -p(136728, 211632) -p(101609, 114884) -p(174928, 32596) -p(37821, 199116) -p(137632, 131572) -p(198385, 175436) -p(29304, 174468) -p(81905, 2124) -p(126888, 163988) -p(130677, 109644) -p(136360, 97804) -p(413, 26188) -p(178340, 136912) -p(212801, 38220) -p(174428, 169904) -p(40909, 201736) -p(186620, 44820) -p(59021, 111972) -p(194928, 129344) -p(139625, 47056) -p(16937, 136045) -p(116748, 75301) -p(132377, 124205) -p(172412, 36193) -p(42097, 125565) -p(38176, 116737) -p(184521, 198149) -p(60656, 16785) -p(202145, 101793) -p(130104, 147885) -p(126425, 80249) -p(133176, 166709) -p(125417, 107809) -p(74528, 33381) -p(19125, 41917) -p(35872, 199025) -p(152137, 56569) -p(184020, 51037) -p(80873, 154869) -p(97912, 48225) -p(196513, 104897) -p(100792, 77529) -p(151065, 49101) -p(7308, 71221) -p(130365, 162537) -p(187572, 187285) -p(20677, 207853) -p(76424, 145073) -p(104185, 156813) -p(133256, 93057) -p(171297, 152249) -p(101876, 84613) -p(133709, 166417) -p(123580, 202421) -p(131833, 130321) -p(77256, 31437) -p(75809, 31145) -p(167660, 122753) -p(42293, 40073) -p(57981, 106116) -p(117716, 6072) -p(154989, 182488) -p(59909, 165992) -p(136048, 125332) -p(37557, 38480) -p(205880, 151340) -p(27337, 77396) -p(138020, 85156) -p(30044, 58664) -p(178909, 170940) -p(161404, 70796) -p(58956, 58956) -p(194429, 195780) -p(56688, 135328) -p(202476, 17520) -p(82349, 2868) -p(209328, 129504) -p(46505, 211208) -p(116044, 23536) -p(151665, 139500) -p(167440, 194328) -p(124845, 76520) -p(188268, 192968) -p(185949, 155996) -p(54224, 126692) -p(1249, 146968) -p(127461, 167745) -p(21068, 178125) -p(76581, 13741) -p(177133, 122429) -p(75788, 172501) -p(178753, 138049) -p(141932, 88269) -p(13461, 214713) -p(101824, 123105) -p(62360, 2485) -p(23745, 73809) -p(163148, 201997) -p(203256, 211609) -p(211609, 211609) -p(50672, 197049) -p(76224, 105933) -p(131253, 95937) -p(47856, 123981) -p(41849, 5981) -p(145540, 163573) -p(175053, 127569) -p(27120, 134169) -p(152405, 68961) -p(67648, 185117) -p(76777, 44313) -p(78772, 18013) -p(156997, 8501) -p(156281, 93660) -p(153912, 183132) -p(78325, 134420) -p(83589, 203800) -p(29304, 148004) -p(81905, 86868) -p(38976, 28452) -p(16757, 154120) -p(154808, 142280) -p(33440, 88036) -p(142037, 160812) -p(30396, 57564) -p(75160, 30488) -p(116897, 52032) -p(52032, 52032) -p(1604, 36020) -p(128441, 209916) -p(47956, 54168) -p(6721, 103656) -p(81400, 118308) -p(10569, 20400) -p(3248, 52516) -p(34697, 66684) -p(105204, 107152) -p(10501, 147420) -p(196388, 15836) -p(205901, 211468) -p(151817, 130157) -p(155080, 92117) -p(70857, 177417) -p(65837, 141997) -p(63468, 90757) -p(91229, 78433) -p(9968, 145293) -p(198425, 209925) -p(166068, 154321) -p(160937, 181589) -p(33484, 168781) -p(164493, 133261) -p(91476, 99785) -p(130009, 150049) -p(140156, 73193) -p(183929, 150925) -p(25136, 33701) -p(96561, 12349) -p(113285, 166937) -p(173312, 179937) -p(105585, 182073) -p(171021, 2937) -p(18920, 30013) -p(10485, 48161) -p(57312, 152669) -p(148437, 140829) -p(34476, 168389) -p(23248, 206721) -p(205981, 130641) -p(163244, 114337) -p(117545, 8469) -p(102268, 49129) -p(80925, 36029) -p(40608, 9829) -p(92049, 198085) -p(2344, 121329) -p(188665, 132969) -p(23656, 185953) -p(159521, 138017) -p(76485, 152769) -p(63344, 21377) -p(82469, 124141) -p(52065, 203476) -p(185744, 151852) -p(93661, 171360) -p(191505, 167380) -p(39212, 172328) -p(75901, 24248) -p(214428, 119636) -p(82369, 46760) -p(187128, 190084) -p(203049, 10856) -p(166328, 64908) -p(121797, 107504) -p(1812, 152920) -p(6477, 93144) -p(41564, 16580) -p(21097, 174948) -p(119264, 57724) -p(200201, 37732) -p(68937, 201632) -p(75788, 204836) -p(11065, 69464) -p(18861, 145836) -p(131772, 116532) -p(5245, 107896) -p(172692, 81404) -p(39657, 43072) -p(204292, 73444) -p(174824, 90716) -p(137277, 2220) -p(91144, 83632) -p(27589, 186012) -p(95768, 157676) -p(40173, 179220) -p(52256, 568) -p(204809, 91884) -p(119176, 152144) -p(14093, 205904) -p(7552, 175140) -p(150401, 134388) -p(8073, 188340) -p(155336, 17648) -p(171941, 172620) -p(140369, 56957) -p(65124, 52009) -p(161681, 178161) -p(43425, 51617) -p(138288, 112561) -p(165273, 197761) -p(181144, 113337) -p(949, 141965) -p(208672, 189801) -p(121245, 52201) -p(111792, 59577) -p(124609, 9405) -p(165520, 76657) -p(45393, 142057) -p(99596, 168457) -p(51569, 117801) -p(39788, 19209) -p(111505, 1837) -p(94845, 79953) -p(81996, 145745) -p(117617, 184661) -p(205565, 60645) -p(126148, 4557) -p(209413, 158169) -p(23544, 107513) -p(190557, 173597) -p(131608, 15813) -p(29748, 213965) -p(29565, 162925) -p(136360, 119353) -p(124529, 145845) -p(54816, 10865) -p(122753, 64817) -p(32264, 198729) -p(36737, 171269) -p(54160, 3781) -p(77073, 121781) -p(85668, 201933) -p(116433, 95289) -p(175561, 198829) -p(194928, 189417) -p(139625, 18433) -p(21009, 42264) -p(100544, 14704) -p(167797, 206840) -p(72921, 191220) -p(60656, 54588) -p(111805, 129500) -p(101741, 62448) -p(105580, 33336) -p(152357, 85152) -p(75437, 175208) -p(177092, 50608) -p(21837, 136392) -p(99136, 91752) -p(80321, 138528) -p(209728, 108348) -p(169077, 208100) -p(108192, 65452) -p(34841, 49732) -p(161332, 161332) -p(150953, 208976) -p(6712, 182192) -p(85609, 139304) -p(45492, 180348) -p(164569, 46920) -p(165081, 67688) -p(30936, 70016) -p(161845, 100872) -p(138041, 148141) -p(117716, 158621) -p(154989, 105345) -p(207709, 131061) -p(106264, 186473) -p(81333, 126305) -p(199941, 137853) -p(111496, 117185) -p(145665, 16165) -p(18765, 161141) -p(61328, 140281) -p(16213, 119221) -p(29948, 87973) -p(361, 52653) -p(112788, 80989) -p(89601, 196077) -p(117512, 2581) -p(143329, 63617) -p(91752, 14321) -p(14321, 14321) -p(42616, 113789) -p(129765, 87297) -p(211428, 83801) -p(56273, 3841) -p(49217, 78269) -p(29092, 84869) -p(203089, 149693) -p(61377, 3900) -p(212236, 84928) -p(81821, 46112) -p(84277, 118696) -p(67640, 150720) -p(211173, 192156) -p(95141, 53872) -p(83260, 130244) -p(53089, 198948) -p(151517, 126848) -p(39008, 164404) -p(187581, 21072) -p(24708, 206516) -p(68481, 45044) -p(113372, 191672) -p(136277, 191864) -p(105672, 73864) -p(18729, 87256) -p(112712, 75416) -p(38585, 189052) -p(189052, 189052) -p(191577, 47856) -p(42680, 124228) -p(203285, 138880) -p(149069, 155376) -p(60240, 131312) -p(23761, 47564) -p(193253, 112881) -p(20776, 150629) -p(35729, 85805) -p(202569, 69701) -p(167884, 29041) -p(62117, 18169) -p(168209, 124237) -p(192524, 204197) -p(198649, 46505) -p(177717, 4877) -p(20860, 140149) -p(54737, 84837) -p(44700, 53397) -p(174257, 214577) -p(90568, 185273) -p(2657, 169453) -p(38712, 140633) -p(32997, 127049) -p(50520, 68341) -p(28985, 60673) -p(2936, 212349) -p(211869, 202545) -p(87520, 171297) -p(97525, 190321) -p(64392, 72513) -p(172989, 177705) -p(110936, 62225) -p(90569, 48057) -p(207360, 181777) -p(130321, 105605) -p(176472, 24093) -p(2777, 37969) -p(9528, 65237) -p(30593, 30593) -p(187076, 117637) -p(46281, 188669) -p(162565, 120449) -p(142240, 6721) -p(128081, 159657) -p(206348, 177121) -p(54589, 116469) -p(25728, 27197) -p(10985, 67465) -p(5512, 83093) -p(122353, 2549) -p(191801, 204540) -p(194380, 198332) -p(140337, 173392) -p(28481, 134384) -p(61916, 181736) -p(146349, 22108) -p(191889, 173492) -p(148568, 172716) -p(97045, 174652) -p(182665, 91104) -p(190776, 122252) -p(185061, 57720) -p(186088, 34240) -p(52177, 190764) -p(46704, 213860) -p(128125, 80524) -p(6596, 10660) -p(107233, 172032) -p(66240, 154376) -p(202973, 117596) -p(22828, 104688) -p(183633, 135160) -p(142832, 202796) -p(198253, 23952) -p(94280, 134968) -p(202101, 39380) -p(160140, 91588) -p(141901, 116528) -p(125556, 31812) -p(172241, 149036) -p(129504, 130888) -p(181037, 164464) -p(174788, 25212) -p(202737, 140208) -p(140208, 140208) -p(91497, 207552) -p(52325, 31228) -p(33944, 48600) -p(122065, 152432) -p(173456, 99448) -p(107573, 123128) -p(119372, 110704) -p(157613, 101584) -p(126032, 19972) -p(161461, 199884) -p(115621, 127693) -p(142756, 139825) -p(70565, 116145) -p(203829, 133325) -p(141100, 46281) -p(113, 92181) -p(28181, 72773) -p(86172, 32789) -p(7481, 141185) -p(87277, 117989) -p(63172, 189705) -p(8353, 54433) -p(134656, 200961) -p(59261, 35701) -p(131128, 76845) -p(57677, 143997) -p(195336, 57245) -p(193501, 86941) -p(204424, 60057) -p(187937, 82961) -p(166060, 169521) -p(40693, 210665) -p(81604, 169713) -p(181365, 151373) -p(67788, 95577) -p(101373, 64521) -p(103760, 124105) -p(10317, 42009) -p(162628, 65689) -p(81317, 44629) -p(212860, 57537) -p(87977, 194169) -p(129956, 51905) -p(43209, 208045) -p(200368, 56469) -p(56469, 56469) -p(42913, 39581) -p(172420, 145549) -p(66269, 170973) -p(114164, 137013) -p(185881, 178157) -p(115876, 100425) -p(50285, 101593) -p(207352, 19789) -p(174461, 59381) -p(68853, 57104) -p(182832, 59340) -p(152077, 76420) -p(198297, 64288) -p(173900, 176172) -p(170897, 202372) -p(128717, 137940) -p(205624, 200920) -p(133341, 62344) -p(125025, 131732) -p(20184, 123580) -p(177977, 40416) -p(124533, 129112) -p(83448, 64964) -p(72585, 158224) -p(213156, 129788) -p(36549, 76128) -p(29132, 164432) -p(159753, 150748) -p(14836, 3736) -p(157585, 32264) -p(32848, 32848) -p(55269, 165500) -p(160128, 152884) -p(42617, 107276) -p(49276, 37796) -p(179409, 100484) -p(42361, 190541) -p(56388, 120577) -p(181381, 131541) -p(165013, 178901) -p(136152, 75069) -p(70561, 145517) -p(207609, 139985) -p(30760, 96029) -p(204273, 214221) -p(210709, 80209) -p(9704, 60509) -p(89473, 8109) -p(2845, 105925) -p(87520, 210341) -p(149733, 11213) -p(70800, 131833) -p(94097, 94085) -p(71636, 41877) -p(140929, 122905) -p(64908, 199177) -p(48513, 31013) -p(6356, 7525) -p(7525, 7525) -p(56104, 202673) -p(197397, 205485) -p(154660, 37805) -p(163497, 199469) -p(54101, 172160) -p(38240, 147904) -p(35437, 160128) -p(101357, 207580) -p(61916, 97832) -p(67457, 189048) -p(183929, 183224) -p(88792, 190116) -p(57845, 121120) -p(131233, 97732) -p(95288, 107144) -p(99569, 152268) -p(50105, 183808) -p(115080, 136064) -p(213973, 138976) -p(74972, 76964) -p(125437, 176916) -p(92112, 179536) -p(198085, 2344) -p(143316, 10396) -p(50549, 112776) -p(123580, 57656) -p(131833, 12632) -p(12632, 12632) -p(165081, 33300) -p(30936, 97440) -p(120701, 165468) -p(31489, 170325) -p(15828, 132869) -p(207973, 187597) -p(212949, 148881) -p(155560, 208657) -p(103261, 150433) -p(64504, 74061) -p(32297, 150725) -p(113668, 64941) -p(84273, 189249) -p(156140, 15645) -p(150133, 163533) -p(80512, 144417) -p(24333, 67753) -p(96784, 194005) -p(38661, 98709) -p(147016, 91433) -p(198549, 115113) -p(63405, 34861) -p(120328, 65817) -p(142073, 126753) -p(32856, 187213) -p(162121, 9145) -p(166060, 66593) -p(80869, 131993) -p(81604, 95897) -p(181365, 214089) -p(146849, 113361) -p(138564, 3613) -p(80249, 68437) -p(151340, 35637) -p(191617, 211277) -p(37864, 35929) -p(183433, 49705) -p(19392, 181973) -p(146329, 76197) -p(86320, 16421) -p(108449, 13993) -p(115200, 79885) -p(112297, 14093) -p(80524, 3805) -p(35217, 42913) -p(30105, 30105) -p(122832, 178669) -p(209693, 6133) -p(172749, 108121) -p(143404, 205161) -p(174461, 179353) -p(68853, 71984) -p(210876, 86928) -p(118985, 137484) -p(63901, 60436) -p(15532, 211428) -p(170897, 145052) -p(150964, 48988) -p(3085, 166112) -p(196832, 50924) -p(104457, 173196) -p(176324, 33944) -p(108597, 23656) -p(87888, 198620) -p(105945, 210360) -p(1780, 143792) -p(44777, 195416) -p(178648, 157476) -p(51053, 2212) -p(32641, 126812) -p(198444, 104492) -p(93937, 45492) -p(107868, 207548) -p(58873, 22204) -p(151308, 84500) -p(1393, 127588) -p(110716, 193964) -p(78409, 51508) -p(179649, 180764) -p(136912, 69172) -p(25421, 205120) -p(179576, 16864) -p(214713, 22104) -p(184976, 157376) -p(17589, 48696) -p(67720, 167472) -p(171269, 124776) -p(67204, 40736) -p(131837, 85668) -p(95016, 26084) -p(200801, 107304) -p(107600, 130984) -p(117989, 19000) -p(203901, 122156) -p(122156, 122156) -p(212313, 141464) -p(42617, 93720) -p(201628, 209876) -p(93825, 92652) -p(42361, 41713) -p(1268, 203285) -p(181381, 167381) -p(62833, 17457) -p(18344, 10273) -p(93949, 45793) -p(68968, 89749) -p(53257, 208525) -p(213912, 36765) -p(16345, 56949) -p(200872, 138461) -p(157893, 63257) -p(77700, 71993) -p(117785, 66269) -p(120656, 204937) -p(207609, 61897) -p(30760, 209693) -p(34165, 179705) -p(45649, 183201) -p(10964, 68205) -p(134597, 190285) -p(83612, 19301) -p(47033, 48797) -p(67276, 197853) -p(123465, 91693) -p(64232, 191545) -p(54145, 113621) -p(73681, 122065) -p(90136, 19493) -p(154777, 174173) -p(24412, 41621) -p(178125, 124585) -p(42328, 79853) -p(152769, 29681) -p(15996, 15029) -p(3973, 24833) -p(14412, 162333) -p(64493, 207165) -p(207876, 116241) -p(181777, 54137) -p(86932, 130893) -p(167677, 186597) -p(109289, 164569) -p(76156, 62581) -p(62581, 62581) -p(165081, 5617) -p(211040, 75097) -p(127493, 4841) -p(138041, 162292) -p(117716, 81264) -p(154989, 12468) -p(181213, 175392) -p(123140, 128624) -p(207281, 148124) -p(89601, 75832) -p(88884, 63024) -p(42601, 101356) -p(110296, 116784) -p(102829, 11400) -p(99492, 116976) -p(148113, 176268) -p(88688, 196744) -p(82873, 53612) -p(189284, 7228) -p(59453, 27120) -p(162952, 168992) -p(100753, 114164) -p(188340, 137644) -p(119645, 93104) -p(203321, 135900) -p(202796, 59236) -p(71121, 67196) -p(49217, 205572) -p(29092, 120080) -p(203089, 14212) -p(61377, 11501) -p(106268, 208301) -p(44365, 136685) -p(171509, 31785) -p(64140, 9949) -p(166137, 122809) -p(152581, 137461) -p(184272, 189861) -p(193985, 54589) -p(150372, 152989) -p(147177, 117469) -p(201480, 5877) -p(30889, 208201) -p(169908, 187049) -p(100337, 81081) -p(158520, 34697) -p(9089, 46437) -p(107056, 127657) -p(157909, 8497) -p(90716, 90785) -p(11057, 16257) -p(156353, 92921) -p(96636, 154149) -p(169713, 11017) -p(43785, 140273) -p(33164, 35181) -p(183489, 180741) -p(214121, 123928) -p(68904, 179824) -p(164985, 108792) -p(160253, 165172) -p(189032, 18936) -p(128581, 139748) -p(135501, 203796) -p(34348, 92196) -p(126349, 103360) -p(122136, 23884) -p(205401, 188268) -p(126368, 147608) -p(200029, 9524) -p(87520, 38828) -p(73845, 110344) -p(64876, 137320) -p(187449, 119372) -p(33596, 180892) -p(159461, 4376) -p(172328, 47656) -p(119353, 44552) -p(188669, 72012) -p(35308, 36400) -p(49869, 48240) -p(10885, 55032) -p(128168, 188752) -p(202605, 118012) -p(109897, 63485) -p(80068, 103853) -p(81629, 9141) -p(163392, 59021) -p(120505, 53197) -p(203436, 212149) -p(28481, 17877) -p(61916, 117921) -p(146349, 54457) -p(71488, 167025) -p(8617, 65521) -p(54960, 131121) -p(81653, 189729) -p(180596, 169937) -p(148773, 132573) -p(192688, 203121) -p(207933, 32529) -p(140740, 9725) -p(1689, 69109) -p(27464, 88617) -p(22133, 201569) -p(133976, 197981) -p(78965, 145773) -p(139576, 116953) -p(182665, 200209) -p(190776, 43785) -p(196217, 176245) -p(141640, 80173) -p(206081, 19913) -p(182460, 24377) -p(142293, 143445) -p(150404, 188469) -p(107233, 8073) -p(199184, 5261) -p(123113, 213409) -p(179352, 37377) -p(183633, 172749) -p(142832, 67849) -p(198253, 152565) -p(94280, 73965) -p(202101, 61057) -p(116468, 77361) -p(17885, 47181) -p(173300, 122093) -p(201837, 36217) -p(65748, 49217) -p(84097, 17293) -p(183424, 196329) -p(33217, 64937) -p(159036, 172265) -p(142057, 3317) -p(29356, 91529) -p(15681, 147225) -p(153824, 157997) -p(127049, 176629) -p(107016, 185949) -p(159817, 213893) -p(150072, 38837) -p(133193, 135485) -p(67944, 76485) -p(158485, 66297) -p(52384, 35341) -p(24833, 2641) -p(15280, 157613) -p(163953, 115109) -p(43968, 141601) -p(141601, 141601) -p(126032, 150429) -p(57045, 137913) -p(4029, 87024) -p(150516, 204148) -p(7393, 177656) -p(198520, 72080) -p(156701, 73148) -p(194892, 30544) -p(191505, 119916) -p(39212, 30936) -p(184681, 211040) -p(214428, 187360) -p(126517, 68876) -p(202072, 167660) -p(203049, 165624) -p(154488, 95660) -p(123641, 192600) -p(150868, 57328) -p(6477, 45588) -p(41564, 164848) -p(21097, 114192) -p(2424, 42192) -p(154785, 154368) -p(72940, 176688) -p(156497, 30352) -p(87076, 196480) -p(80777, 5512) -p(213872, 1048) -p(98693, 125064) -p(147756, 128168) -p(66929, 154660) -p(201576, 196388) -p(212357, 75184) -p(196596, 194928) -p(105289, 55584) -p(131064, 163296) -p(87401, 158248) -p(67760, 83820) -p(78249, 13756) -p(81604, 16184) -p(181365, 60532) -p(67788, 40248) -p(88565, 169312) -p(186240, 68684) -p(134525, 60240) -p(178540, 66064) -p(166709, 45004) -p(77396, 37628) -p(154545, 172708) -p(37864, 157472) -p(183433, 52088) -p(19392, 191340) -p(146329, 104196) -p(62448, 27540) -p(22281, 22200) -p(157028, 33748) -p(71153, 113124) -p(55684, 78772) -p(35217, 130980) -p(108244, 25012) -p(67401, 155336) -p(308, 89544) -p(6133, 14924) -p(183868, 207352) -p(42297, 60140) -p(155600, 143404) -p(51093, 43744) -p(173616, 124480) -p(61057, 10068) -p(10068, 10068) -p(65681, 111864) -p(196457, 212209) -p(143240, 136813) -p(180997, 146809) -p(148348, 12989) -p(202309, 36669) -p(7412, 108477) -p(15573, 26573) -p(65120, 54233) -p(129561, 144381) -p(102836, 156413) -p(6481, 1249) -p(129196, 130505) -p(130173, 106149) -p(156816, 82469) -p(87445, 168929) -p(74496, 16385) -p(174165, 201345) -p(130844, 2509) -p(95141, 161461) -p(203880, 181) -p(53089, 106049) -p(13356, 74125) -p(178817, 153601) -p(36420, 19005) -p(48461, 94309) -p(0, 161845) -p(115581, 160685) -p(24708, 151173) -p(144561, 58789) -p(117060, 144573) -p(96009, 86641) -p(70928, 204641) -p(5729, 200177) -p(127760, 112841) -p(143297, 195421) -p(73000, 51029) -p(207113, 107117) -p(182716, 27641) -p(13877, 141761) -p(38484, 122353) -p(137469, 20949) -p(117636, 35601) -p(3041, 66557) -p(44820, 130797) -p(162053, 177665) -p(169288, 204057) -p(201997, 163497) -p(11372, 205901) -p(127829, 101001) -p(53552, 93049) -p(184177, 106825) -p(209560, 147969) -p(133873, 71697) -p(30100, 95277) -p(139373, 139625) -p(134384, 4545) -p(35701, 164273) -p(138908, 62869) -p(130765, 24537) -p(97832, 9885) -p(24089, 42393) -p(124968, 67817) -p(76065, 198433) -p(36048, 179409) -p(11017, 93825) -p(66872, 104305) -p(9725, 182713) -p(121860, 212793) -p(212793, 212793) +p(x = 177533, y = 177533) +p(x = 133828, y = 31489) +p(x = 144509, y = 138041) +p(x = 87312, y = 57981) +p(x = 160197, y = 14025) +p(x = 76508, y = 129013) +p(x = 212949, y = 43329) +p(x = 155560, y = 70405) +p(x = 23301, y = 60893) +p(x = 64504, y = 75837) +p(x = 32297, y = 166861) +p(x = 113668, y = 168121) +p(x = 84273, y = 151141) +p(x = 156140, y = 172777) +p(x = 172545, y = 179961) +p(x = 23840, y = 102521) +p(x = 14437, y = 158125) +p(x = 175384, y = 118925) +p(x = 74857, y = 149881) +p(x = 188160, y = 98057) +p(x = 7481, y = 153469) +p(x = 53632, y = 172685) +p(x = 71397, y = 109897) +p(x = 161504, y = 66717) +p(x = 59133, y = 126201) +p(x = 107904, y = 151817) +p(x = 70065, y = 208005) +p(x = 88948, y = 18197) +p(x = 117193, y = 119701) +p(x = 143744, y = 134645) +p(x = 192365, y = 65941) +p(x = 77044, y = 11013) +p(x = 9317, y = 54293) +p(x = 83804, y = 116305) +p(x = 87401, y = 139301) +p(x = 162664, y = 3545) +p(x = 53985, y = 72733) +p(x = 4748, y = 151041) +p(x = 109849, y = 31589) +p(x = 66428, y = 19649) +p(x = 211705, y = 141629) +p(x = 195360, y = 39449) +p(x = 62425, y = 42361) +p(x = 164956, y = 112325) +p(x = 169429, y = 128821) +p(x = 158808, y = 2769) +p(x = 127569, y = 108153) +p(x = 129956, y = 174721) +p(x = 91825, y = 71181) +p(x = 147196, y = 149005) +p(x = 103533, y = 49053) +p(x = 86320, y = 136389) +p(x = 26261, y = 148421) +p(x = 205548, y = 114361) +p(x = 69701, y = 7909) +p(x = 80524, y = 44689) +p(x = 35217, y = 156281) +p(x = 120084, y = 149297) +p(x = 173561, y = 146193) +p(x = 152268, y = 196165) +p(x = 28745, y = 13733) +p(x = 122832, y = 155021) +p(x = 42297, y = 30521) +p(x = 155600, y = 68853) +p(x = 51093, y = 184325) +p(x = 173616, y = 137457) +p(x = 61057, y = 197425) +p(x = 116036, y = 138817) +p(x = 65681, y = 162981) +p(x = 162981, y = 12040) +p(x = 12040, y = 12040) +p(x = 62221, y = 143240) +p(x = 148348, y = 201848) +p(x = 202309, y = 83656) +p(x = 7412, y = 49112) +p(x = 15573, y = 212236) +p(x = 167400, y = 74052) +p(x = 40189, y = 102872) +p(x = 68092, y = 162356) +p(x = 24629, y = 139260) +p(x = 129196, y = 186712) +p(x = 64189, y = 21068) +p(x = 156816, y = 24948) +p(x = 176817, y = 102096) +p(x = 131844, y = 161480) +p(x = 58493, y = 185744) +p(x = 130844, y = 93844) +p(x = 95141, y = 164876) +p(x = 83260, y = 68812) +p(x = 53089, y = 93068) +p(x = 115736, y = 49888) +p(x = 187745, y = 132760) +p(x = 36420, y = 153328) +p(x = 48461, y = 91224) +p(x = 0, y = 6416) +p(x = 115581, y = 15828) +p(x = 24708, y = 57164) +p(x = 144561, y = 117716) +p(x = 88332, y = 184384) +p(x = 136277, y = 92584) +p(x = 184272, y = 38924) +p(x = 193985, y = 91616) +p(x = 91664, y = 188848) +p(x = 191425, y = 13108) +p(x = 84064, y = 127420) +p(x = 109881, y = 202624) +p(x = 169908, y = 194380) +p(x = 34253, y = 124024) +p(x = 89624, y = 60952) +p(x = 134657, y = 194672) +p(x = 107056, y = 38240) +p(x = 144713, y = 155080) +p(x = 111972, y = 123732) +p(x = 11353, y = 112768) +p(x = 145224, y = 170508) +p(x = 140961, y = 196224) +p(x = 26800, y = 76572) +p(x = 156649, y = 116748) +p(x = 187372, y = 159252) +p(x = 18433, y = 104424) +p(x = 42264, y = 100544) +p(x = 161141, y = 44548) +p(x = 206324, y = 173320) +p(x = 174017, y = 16020) +p(x = 108476, y = 71040) +p(x = 169521, y = 209708) +p(x = 37796, y = 163132) +p(x = 108545, y = 106168) +p(x = 63188, y = 211844) +p(x = 214089, y = 61728) +p(x = 205804, y = 71816) +p(x = 85093, y = 48628) +p(x = 11400, y = 160704) +p(x = 72637, y = 9228) +p(x = 24176, y = 197484) +p(x = 43785, y = 151292) +p(x = 33164, y = 159152) +p(x = 183489, y = 3112) +p(x = 214121, y = 34269) +p(x = 88704, y = 137617) +p(x = 137617, y = 137617) +p(x = 48980, y = 164985) +p(x = 71017, y = 72601) +p(x = 84560, y = 78325) +p(x = 71369, y = 46885) +p(x = 155752, y = 53193) +p(x = 146157, y = 26409) +p(x = 35976, y = 131309) +p(x = 116913, y = 197201) +p(x = 152000, y = 94045) +p(x = 25273, y = 161681) +p(x = 139352, y = 169641) +p(x = 40669, y = 118985) +p(x = 127480, y = 154505) +p(x = 206281, y = 152077) +p(x = 163544, y = 102973) +p(x = 168209, y = 22045) +p(x = 192524, y = 59017) +p(x = 102677, y = 79877) +p(x = 88952, y = 62221) +p(x = 181145, y = 8845) +p(x = 171692, y = 49021) +p(x = 177717, y = 35045) +p(x = 20860, y = 183033) +p(x = 128581, y = 129173) +p(x = 53628, y = 166829) +p(x = 115257, y = 81821) +p(x = 90568, y = 20685) +p(x = 135501, y = 191477) +p(x = 81700, y = 82497) +p(x = 112473, y = 123549) +p(x = 78564, y = 67553) +p(x = 210449, y = 149265) +p(x = 107060, y = 9237) +p(x = 204301, y = 76581) +p(x = 108096, y = 157801) +p(x = 119553, y = 135481) +p(x = 64876, y = 20785) +p(x = 194725, y = 25341) +p(x = 30492, y = 93661) +p(x = 200901, y = 193221) +p(x = 8916, y = 161973) +p(x = 130321, y = 208649) +p(x = 176472, y = 7393) +p(x = 111657, y = 70565) +p(x = 62512, y = 2345) +p(x = 34961, y = 62413) +p(x = 172328, y = 188173) +p(x = 119353, y = 144509) +p(x = 100872, y = 122965) +p(x = 148141, y = 154989) +p(x = 152080, y = 12049) +p(x = 100557, y = 126361) +p(x = 39964, y = 205837) +p(x = 10569, y = 69789) +p(x = 6356, y = 120153) +p(x = 93893, y = 57949) +p(x = 166920, y = 9429) +p(x = 163533, y = 196033) +p(x = 158544, y = 40677) +p(x = 15221, y = 51833) +p(x = 18092, y = 106369) +p(x = 127657, y = 101521) +p(x = 166240, y = 35437) +p(x = 59021, y = 70857) +p(x = 194928, y = 96281) +p(x = 139625, y = 133637) +p(x = 16937, y = 95364) +p(x = 159252, y = 42380) +p(x = 132377, y = 98568) +p(x = 39633, y = 208124) +p(x = 92476, y = 48980) +p(x = 201849, y = 104100) +p(x = 17693, y = 174356) +p(x = 173300, y = 148348) +p(x = 175445, y = 189592) +p(x = 63969, y = 125836) +p(x = 68876, y = 174548) +p(x = 160685, y = 164168) +p(x = 138041, y = 212497) +p(x = 117716, y = 56749) +p(x = 154989, y = 12793) +p(x = 111733, y = 146513) +p(x = 9020, y = 144085) +p(x = 142073, y = 106921) +p(x = 134525, y = 76549) +p(x = 864, y = 63449) +p(x = 41917, y = 39285) +p(x = 158097, y = 110025) +p(x = 116036, y = 89065) +p(x = 65681, y = 25117) +p(x = 196457, y = 214592) +p(x = 143240, y = 87472) +p(x = 90165, y = 15664) +p(x = 102705, y = 4792) +p(x = 94128, y = 72820) +p(x = 176033, y = 71460) +p(x = 127249, y = 46228) +p(x = 156028, y = 140356) +p(x = 115861, y = 31576) +p(x = 9725, y = 28472) +p(x = 85372, y = 204696) +p(x = 212793, y = 193048) +p(x = 78557, y = 96017) +p(x = 71816, y = 165013) +p(x = 150041, y = 82725) +p(x = 213533, y = 213533) +p(x = 184088, y = 112513) +p(x = 70561, y = 62833) +p(x = 30344, y = 104169) +p(x = 36469, y = 66713) +p(x = 65540, y = 153173) +p(x = 197809, y = 118629) +p(x = 141488, y = 198105) +p(x = 208065, y = 90101) +p(x = 21612, y = 110769) +p(x = 208417, y = 158029) +p(x = 31084, y = 52061) +p(x = 170637, y = 202569) +p(x = 17468, y = 92329) +p(x = 176329, y = 201017) +p(x = 110081, y = 206157) +p(x = 177092, y = 34105) +p(x = 185253, y = 190537) +p(x = 200544, y = 148709) +p(x = 132525, y = 188693) +p(x = 75812, y = 127849) +p(x = 15749, y = 48181) +p(x = 199116, y = 15573) +p(x = 71905, y = 86705) +p(x = 198085, y = 18385) +p(x = 143316, y = 183645) +p(x = 106445, y = 93789) +p(x = 31684, y = 63025) +p(x = 150953, y = 154725) +p(x = 6712, y = 108441) +p(x = 85905, y = 145121) +p(x = 152432, y = 139689) +p(x = 22017, y = 32553) +p(x = 131732, y = 70885) +p(x = 210341, y = 193541) +p(x = 169156, y = 50993) +p(x = 99877, y = 57785) +p(x = 14052, y = 205189) +p(x = 54137, y = 125421) +p(x = 165081, y = 118821) +p(x = 30936, y = 121441) +p(x = 161845, y = 208001) +p(x = 177533, y = 105972) +p(x = 203500, y = 197188) +p(x = 144509, y = 207284) +p(x = 212949, y = 198356) +p(x = 198356, y = 198356) +p(x = 103261, y = 97144) +p(x = 64504, y = 106264) +p(x = 208229, y = 11844) +p(x = 189748, y = 151972) +p(x = 134637, y = 59104) +p(x = 29504, y = 150804) +p(x = 145861, y = 99764) +p(x = 9380, y = 165456) +p(x = 153589, y = 184864) +p(x = 81256, y = 76084) +p(x = 185773, y = 58812) +p(x = 118096, y = 115000) +p(x = 2725, y = 104128) +p(x = 138225, y = 60656) +p(x = 49780, y = 65796) +p(x = 11457, y = 154784) +p(x = 30044, y = 91612) +p(x = 178909, y = 165072) +p(x = 161404, y = 206600) +p(x = 11093, y = 121692) +p(x = 40164, y = 30184) +p(x = 162537, y = 61624) +p(x = 162473, y = 147116) +p(x = 107796, y = 34940) +p(x = 1161, y = 114416) +p(x = 2864, y = 53864) +p(x = 82349, y = 131104) +p(x = 209328, y = 15532) +p(x = 204197, y = 92388) +p(x = 149036, y = 182536) +p(x = 68309, y = 173900) +p(x = 176172, y = 169436) +p(x = 87001, y = 9032) +p(x = 179536, y = 19512) +p(x = 121029, y = 46004) +p(x = 202308, y = 170796) +p(x = 188633, y = 164780) +p(x = 20689, y = 65120) +p(x = 154268, y = 167400) +p(x = 144381, y = 154300) +p(x = 195097, y = 211173) +p(x = 102872, y = 11753) +p(x = 67553, y = 172649) +p(x = 142309, y = 79389) +p(x = 194376, y = 129269) +p(x = 129269, y = 129269) +p(x = 66832, y = 113549) +p(x = 182121, y = 124905) +p(x = 141036, y = 199917) +p(x = 25665, y = 8649) +p(x = 168756, y = 195353) +p(x = 61629, y = 175461) +p(x = 63048, y = 123545) +p(x = 93913, y = 184681) +p(x = 155008, y = 75901) +p(x = 139681, y = 137905) +p(x = 173892, y = 214569) +p(x = 110829, y = 190113) +p(x = 4989, y = 166049) +p(x = 120228, y = 138297) +p(x = 166137, y = 170413) +p(x = 91664, y = 178373) +p(x = 142813, y = 143921) +p(x = 84064, y = 3509) +p(x = 144713, y = 33589) +p(x = 177280, y = 188369) +p(x = 186117, y = 114909) +p(x = 156649, y = 108893) +p(x = 53068, y = 73765) +p(x = 18433, y = 59113) +p(x = 42264, y = 45429) +p(x = 161141, y = 67457) +p(x = 168184, y = 91229) +p(x = 153541, y = 103069) +p(x = 108476, y = 7581) +p(x = 169521, y = 38245) +p(x = 21200, y = 46881) +p(x = 22085, y = 54841) +p(x = 113452, y = 190889) +p(x = 88037, y = 131697) +p(x = 209876, y = 141009) +p(x = 41713, y = 196905) +p(x = 201569, y = 183513) +p(x = 68684, y = 105789) +p(x = 23761, y = 70561) +p(x = 57013, y = 30344) +p(x = 56972, y = 52664) +p(x = 100745, y = 115452) +p(x = 202569, y = 140000) +p(x = 206600, y = 149220) +p(x = 62117, y = 121952) +p(x = 50017, y = 181144) +p(x = 76952, y = 80416) +p(x = 191949, y = 120300) +p(x = 39725, y = 149120) +p(x = 46676, y = 193176) +p(x = 5441, y = 150964) +p(x = 41304, y = 16568) +p(x = 73237, y = 212876) +p(x = 95808, y = 180560) +p(x = 64876, y = 66832) +p(x = 194725, y = 189296) +p(x = 41748, y = 99048) +p(x = 124437, y = 132140) +p(x = 59472, y = 80808) +p(x = 116445, y = 135728) +p(x = 124433, y = 39272) +p(x = 190084, y = 145340) +p(x = 64817, y = 65280) +p(x = 189249, y = 75176) +p(x = 192604, y = 200552) +p(x = 43949, y = 43252) +p(x = 10501, y = 9484) +p(x = 196388, y = 50820) +p(x = 205901, y = 110888) +p(x = 151817, y = 184549) +p(x = 155080, y = 159901) +p(x = 70857, y = 154469) +p(x = 164237, y = 86833) +p(x = 115000, y = 8617) +p(x = 67457, y = 45105) +p(x = 1689, y = 109637) +p(x = 26396, y = 20457) +p(x = 97045, y = 115553) +p(x = 56321, y = 127101) +p(x = 184568, y = 126425) +p(x = 11649, y = 27441) +p(x = 205880, y = 115653) +p(x = 108073, y = 44813) +p(x = 76108, y = 112741) +p(x = 23832, y = 156797) +p(x = 210153, y = 116913) +p(x = 122776, y = 208713) +p(x = 30401, y = 101485) +p(x = 31528, y = 29385) +p(x = 190097, y = 83145) +p(x = 77657, y = 162037) +p(x = 80044, y = 36177) +p(x = 59577, y = 3085) +p(x = 85609, y = 19973) +p(x = 45492, y = 115261) +p(x = 164569, y = 18613) +p(x = 165081, y = 186101) +p(x = 30936, y = 193961) +p(x = 161845, y = 169897) +p(x = 177533, y = 158500) +p(x = 15828, y = 22644) +p(x = 19717, y = 187128) +p(x = 212949, y = 49720) +p(x = 168952, y = 122696) +p(x = 103261, y = 175096) +p(x = 155209, y = 18180) +p(x = 54440, y = 12556) +p(x = 123345, y = 166944) +p(x = 126869, y = 69320) +p(x = 61328, y = 206052) +p(x = 61821, y = 42828) +p(x = 29948, y = 104840) +p(x = 361, y = 107460) +p(x = 112788, y = 93292) +p(x = 44984, y = 53216) +p(x = 59453, y = 191300) +p(x = 162952, y = 193144) +p(x = 161017, y = 207796) +p(x = 205424, y = 19540) +p(x = 48225, y = 106684) +p(x = 72033, y = 11388) +p(x = 17648, y = 51856) +p(x = 56957, y = 152968) +p(x = 129765, y = 208672) +p(x = 211428, y = 204984) +p(x = 56273, y = 3044) +p(x = 36217, y = 94360) +p(x = 109828, y = 3528) +p(x = 36669, y = 125800) +p(x = 204125, y = 60793) +p(x = 12432, y = 108145) +p(x = 129173, y = 30613) +p(x = 183645, y = 119401) +p(x = 112088, y = 64189) +p(x = 36401, y = 207029) +p(x = 95141, y = 25665) +p(x = 203880, y = 65349) +p(x = 53089, y = 43129) +p(x = 48461, y = 37697) +p(x = 0, y = 141) +p(x = 115581, y = 31289) +p(x = 24708, y = 203049) +p(x = 144561, y = 151233) +p(x = 117060, y = 127553) +p(x = 91664, y = 128137) +p(x = 117873, y = 84273) +p(x = 139468, y = 7517) +p(x = 144713, y = 212461) +p(x = 86740, y = 119985) +p(x = 30077, y = 34009) +p(x = 90757, y = 203533) +p(x = 2220, y = 171417) +p(x = 180973, y = 117173) +p(x = 35929, y = 183933) +p(x = 169216, y = 197809) +p(x = 45793, y = 188881) +p(x = 143445, y = 145601) +p(x = 130980, y = 16637) +p(x = 54717, y = 21393) +p(x = 13733, y = 17664) +p(x = 119560, y = 38040) +p(x = 197201, y = 135856) +p(x = 201985, y = 195632) +p(x = 114416, y = 135472) +p(x = 2049, y = 161964) +p(x = 173933, y = 176324) +p(x = 121592, y = 35228) +p(x = 143529, y = 182340) +p(x = 207897, y = 58516) +p(x = 20184, y = 14560) +p(x = 180789, y = 38332) +p(x = 160, y = 100344) +p(x = 25301, y = 23388) +p(x = 157328, y = 52892) +p(x = 1516, y = 130232) +p(x = 190557, y = 113344) +p(x = 131608, y = 80060) +p(x = 142193, y = 188164) +p(x = 72964, y = 166328) +p(x = 96261, y = 49880) +p(x = 58641, y = 16404) +p(x = 52000, y = 112860) +p(x = 116441, y = 211644) +p(x = 180029, y = 67836) +p(x = 105368, y = 82488) +p(x = 49573, y = 202816) +p(x = 59021, y = 53568) +p(x = 70236, y = 154104) +p(x = 71697, y = 5340) +p(x = 119701, y = 64641) +p(x = 170508, y = 23497) +p(x = 133637, y = 75413) +p(x = 184521, y = 201273) +p(x = 60656, y = 79293) +p(x = 202145, y = 201757) +p(x = 68649, y = 100929) +p(x = 200000, y = 6025) +p(x = 152357, y = 11657) +p(x = 62045, y = 90841) +p(x = 95288, y = 100153) +p(x = 99569, y = 194281) +p(x = 201124, y = 37081) +p(x = 170761, y = 153913) +p(x = 153932, y = 191277) +p(x = 184532, y = 56005) +p(x = 158917, y = 40669) +p(x = 125884, y = 136449) +p(x = 41949, y = 124609) +p(x = 114884, y = 149841) +p(x = 175445, y = 187197) +p(x = 9829, y = 160613) +p(x = 163108, y = 147513) +p(x = 156617, y = 214273) +p(x = 99877, y = 173129) +p(x = 126812, y = 184385) +p(x = 130893, y = 66385) +p(x = 165081, y = 54161) +p(x = 30936, y = 78417) +p(x = 127493, y = 82205) +p(x = 138041, y = 157176) +p(x = 117716, y = 1812) +p(x = 154989, y = 37332) +p(x = 207709, y = 50332) +p(x = 106264, y = 83908) +p(x = 193025, y = 11224) +p(x = 66221, y = 100504) +p(x = 118096, y = 37232) +p(x = 2725, y = 92936) +p(x = 21969, y = 139028) +p(x = 64432, y = 53728) +p(x = 45709, y = 59844) +p(x = 144529, y = 20252) +p(x = 111880, y = 78476) +p(x = 4077, y = 46260) +p(x = 37420, y = 48104) +p(x = 111857, y = 35680) +p(x = 83380, y = 66636) +p(x = 145885, y = 196668) +p(x = 193004, y = 110400) +p(x = 87529, y = 35872) +p(x = 13129, y = 77700) +p(x = 205424, y = 62756) +p(x = 81801, y = 153488) +p(x = 11965, y = 208024) +p(x = 188340, y = 192304) +p(x = 86069, y = 201132) +p(x = 209333, y = 45576) +p(x = 211428, y = 209476) +p(x = 210077, y = 212680) +p(x = 17293, y = 104192) +p(x = 51504, y = 103508) +p(x = 203089, y = 122432) +p(x = 61377, y = 116617) +p(x = 212236, y = 62665) +p(x = 81821, y = 110993) +p(x = 183645, y = 65477) +p(x = 24752, y = 41997) +p(x = 36401, y = 27053) +p(x = 95141, y = 150485) +p(x = 203880, y = 156501) +p(x = 159833, y = 150777) +p(x = 151517, y = 30741) +p(x = 39008, y = 115649) +p(x = 192821, y = 199881) +p(x = 152581, y = 32001) +p(x = 52688, y = 140781) +p(x = 193985, y = 20161) +p(x = 91664, y = 49465) +p(x = 191425, y = 127097) +p(x = 201480, y = 12493) +p(x = 30889, y = 203469) +p(x = 169908, y = 179789) +p(x = 100337, y = 24333) +p(x = 51461, y = 74113) +p(x = 129344, y = 14629) +p(x = 78989, y = 106621) +p(x = 157909, y = 190853) +p(x = 137492, y = 162617) +p(x = 59769, y = 113029) +p(x = 68437, y = 2697) +p(x = 211528, y = 32969) +p(x = 56173, y = 162325) +p(x = 43785, y = 60045) +p(x = 104196, y = 152137) +p(x = 134193, y = 68197) +p(x = 148421, y = 31084) +p(x = 68904, y = 69708) +p(x = 137617, y = 184020) +p(x = 201017, y = 184312) +p(x = 155752, y = 120656) +p(x = 110637, y = 210320) +p(x = 71269, y = 93388) +p(x = 20572, y = 77084) +p(x = 102677, y = 57576) +p(x = 177717, y = 81156) +p(x = 20860, y = 60588) +p(x = 54737, y = 43216) +p(x = 83685, y = 99596) +p(x = 166808, y = 140064) +p(x = 28825, y = 63400) +p(x = 165024, y = 80672) +p(x = 75177, y = 214008) +p(x = 171884, y = 161024) +p(x = 11389, y = 87080) +p(x = 87520, y = 1780) +p(x = 73845, y = 67572) +p(x = 124437, y = 91252) +p(x = 59472, y = 68056) +p(x = 31437, y = 193140) +p(x = 124433, y = 208376) +p(x = 46760, y = 66896) +p(x = 64817, y = 131036) +p(x = 64941, y = 48556) +p(x = 195708, y = 55056) +p(x = 6101, y = 99012) +p(x = 82793, y = 96784) +p(x = 128168, y = 79412) +p(x = 205901, y = 23616) +p(x = 151817, y = 185773) +p(x = 155080, y = 102225) +p(x = 70857, y = 83109) +p(x = 51185, y = 172481) +p(x = 115000, y = 172189) +p(x = 67457, y = 52053) +p(x = 40824, y = 196353) +p(x = 105073, y = 180825) +p(x = 203140, y = 59621) +p(x = 165885, y = 180049) +p(x = 173604, y = 1689) +p(x = 79293, y = 38177) +p(x = 80220, y = 7513) +p(x = 130009, y = 133857) +p(x = 115416, y = 27889) +p(x = 27889, y = 27889) +p(x = 47064, y = 122309) +p(x = 57845, y = 66513) +p(x = 75437, y = 93005) +p(x = 177092, y = 207609) +p(x = 185253, y = 72337) +p(x = 169077, y = 19353) +p(x = 108192, y = 36817) +p(x = 34841, y = 71269) +p(x = 18181, y = 35749) +p(x = 137692, y = 153557) +p(x = 57833, y = 118137) +p(x = 108932, y = 125321) +p(x = 182693, y = 18285) +p(x = 56984, y = 213625) +p(x = 115701, y = 181701) +p(x = 131572, y = 133473) +p(x = 71905, y = 10425) +p(x = 198085, y = 75733) +p(x = 143316, y = 79805) +p(x = 79953, y = 89509) +p(x = 202668, y = 42157) +p(x = 150953, y = 105813) +p(x = 6712, y = 63309) +p(x = 85905, y = 25561) +p(x = 81984, y = 63017) +p(x = 22017, y = 138905) +p(x = 131732, y = 30125) +p(x = 210341, y = 146181) +p(x = 12632, y = 95141) +p(x = 146453, y = 212265) +p(x = 45492, y = 74081) +p(x = 62581, y = 21197) +p(x = 75809, y = 127841) +p(x = 167660, y = 21873) +p(x = 42293, y = 155985) +p(x = 57981, y = 62492) +p(x = 117716, y = 88208) +p(x = 154989, y = 70352) +p(x = 207709, y = 52596) +p(x = 106264, y = 76368) +p(x = 81333, y = 98012) +p(x = 200552, y = 146532) +p(x = 24337, y = 133916) +p(x = 57872, y = 188160) +p(x = 75445, y = 147016) +p(x = 65408, y = 209604) +p(x = 185261, y = 54440) +p(x = 103900, y = 118096) +p(x = 190853, y = 126540) +p(x = 138120, y = 58612) +p(x = 180825, y = 151380) +p(x = 151380, y = 151380) +p(x = 63377, y = 8440) +p(x = 59909, y = 105872) +p(x = 49780, y = 194760) +p(x = 11457, y = 70744) +p(x = 133465, y = 88792) +p(x = 86556, y = 3884) +p(x = 117129, y = 155844) +p(x = 177809, y = 38620) +p(x = 181356, y = 200000) +p(x = 63757, y = 17468) +p(x = 20436, y = 160408) +p(x = 166681, y = 144588) +p(x = 174692, y = 122076) +p(x = 186541, y = 97912) +p(x = 146132, y = 204364) +p(x = 77529, y = 80448) +p(x = 206721, y = 156428) +p(x = 49572, y = 211548) +p(x = 93153, y = 176320) +p(x = 134064, y = 120040) +p(x = 82349, y = 137504) +p(x = 209328, y = 192524) +p(x = 204197, y = 78896) +p(x = 164464, y = 136728) +p(x = 6297, y = 148084) +p(x = 18196, y = 72680) +p(x = 43045, y = 140900) +p(x = 12340, y = 171080) +p(x = 197401, y = 20280) +p(x = 173196, y = 39788) +p(x = 91693, y = 121592) +p(x = 185949, y = 168268) +p(x = 54224, y = 55408) +p(x = 1249, y = 13296) +p(x = 104465, y = 14173) +p(x = 120920, y = 92681) +p(x = 76581, y = 30185) +p(x = 19745, y = 92197) +p(x = 113640, y = 51053) +p(x = 113549, y = 208353) +p(x = 49852, y = 93649) +p(x = 182121, y = 164489) +p(x = 211484, y = 132565) +p(x = 25665, y = 202821) +p(x = 168756, y = 53089) +p(x = 83465, y = 158181) +p(x = 130292, y = 86957) +p(x = 93913, y = 20097) +p(x = 155008, y = 23201) +p(x = 139681, y = 16701) +p(x = 173892, y = 110829) +p(x = 110829, y = 110829) +p(x = 4989, y = 154593) +p(x = 120228, y = 213977) +p(x = 166137, y = 193793) +p(x = 68641, y = 104421) +p(x = 81992, y = 40765) +p(x = 193985, y = 154785) +p(x = 30889, y = 182153) +p(x = 169908, y = 149837) +p(x = 34253, y = 7481) +p(x = 89624, y = 120141) +p(x = 134657, y = 14565) +p(x = 107056, y = 114225) +p(x = 144713, y = 198549) +p(x = 177280, y = 203789) +p(x = 186117, y = 15533) +p(x = 141997, y = 106073) +p(x = 2220, y = 43869) +p(x = 180973, y = 210389) +p(x = 144152, y = 8257) +p(x = 208501, y = 155661) +p(x = 196136, y = 63377) +p(x = 17201, y = 99573) +p(x = 172716, y = 97045) +p(x = 95577, y = 22133) +p(x = 55944, y = 83169) +p(x = 74969, y = 143821) +p(x = 45816, y = 94233) +p(x = 113361, y = 181085) +p(x = 4348, y = 66189) +p(x = 41521, y = 116453) +p(x = 176245, y = 186809) +p(x = 104196, y = 49401) +p(x = 134193, y = 152357) +p(x = 114361, y = 22384) +p(x = 147704, y = 24128) +p(x = 78325, y = 145624) +p(x = 177717, y = 174928) +p(x = 15328, y = 70128) +p(x = 128581, y = 181336) +p(x = 106973, y = 166584) +p(x = 480, y = 77988) +p(x = 118097, y = 203848) +p(x = 110365, y = 56252) +p(x = 115564, y = 25196) +p(x = 106937, y = 2492) +p(x = 5853, y = 111272) +p(x = 95960, y = 115736) +p(x = 116445, y = 13356) +p(x = 197397, y = 124080) +p(x = 154660, y = 62460) +p(x = 205901, y = 192008) +p(x = 151817, y = 15793) +p(x = 155080, y = 5213) +p(x = 70857, y = 97889) +p(x = 182665, y = 41801) +p(x = 82288, y = 211425) +p(x = 180889, y = 143789) +p(x = 128125, y = 196965) +p(x = 6596, y = 125833) +p(x = 107233, y = 125349) +p(x = 183633, y = 93809) +p(x = 142832, y = 40633) +p(x = 198253, y = 76345) +p(x = 179457, y = 202497) +p(x = 202220, y = 111181) +p(x = 137113, y = 82945) +p(x = 206225, y = 187745) +p(x = 30544, y = 178817) +p(x = 153601, y = 191725) +p(x = 59825, y = 136956) +p(x = 133828, y = 211576) +p(x = 144509, y = 64464) +p(x = 197317, y = 205268) +p(x = 170108, y = 67376) +p(x = 46585, y = 72424) +p(x = 66121, y = 47000) +p(x = 77044, y = 184408) +p(x = 9317, y = 122396) +p(x = 40693, y = 207696) +p(x = 81604, y = 99300) +p(x = 181365, y = 201872) +p(x = 145105, y = 199736) +p(x = 162628, y = 104932) +p(x = 80249, y = 126960) +p(x = 73965, y = 148888) +p(x = 124480, y = 54760) +p(x = 159133, y = 35160) +p(x = 208489, y = 51273) +p(x = 51924, y = 85725) +p(x = 62221, y = 177717) +p(x = 148348, y = 200621) +p(x = 202309, y = 160253) +p(x = 7412, y = 129681) +p(x = 15573, y = 83589) +p(x = 171088, y = 78057) +p(x = 120441, y = 56421) +p(x = 102836, y = 127937) +p(x = 32197, y = 211485) +p(x = 172768, y = 94845) +p(x = 119401, y = 3437) +p(x = 181756, y = 85625) +p(x = 122281, y = 125025) +p(x = 131844, y = 207897) +p(x = 58493, y = 140261) +p(x = 130844, y = 102705) +p(x = 131529, y = 7217) +p(x = 185348, y = 106493) +p(x = 161677, y = 35069) +p(x = 13356, y = 201397) +p(x = 178817, y = 12365) +p(x = 36420, y = 48461) +p(x = 48461, y = 48461) +p(x = 49296, y = 151517) +p(x = 115581, y = 169373) +p(x = 121840, y = 80777) +p(x = 137469, y = 206345) +p(x = 117636, y = 101445) +p(x = 44961, y = 5765) +p(x = 58312, y = 80193) +p(x = 43469, y = 178009) +p(x = 169288, y = 53701) +p(x = 201997, y = 197317) +p(x = 15836, y = 142881) +p(x = 127829, y = 207021) +p(x = 53552, y = 87277) +p(x = 184177, y = 150549) +p(x = 209560, y = 154913) +p(x = 133873, y = 63405) +p(x = 148000, y = 181213) +p(x = 68925, y = 111733) +p(x = 134384, y = 32741) +p(x = 35701, y = 20901) +p(x = 138908, y = 18765) +p(x = 152409, y = 64373) +p(x = 189048, y = 138225) +p(x = 187213, y = 116581) +p(x = 124968, y = 21969) +p(x = 41713, y = 59909) +p(x = 77192, y = 179369) +p(x = 154249, y = 15369) +p(x = 122668, y = 56321) +p(x = 116953, y = 182665) +p(x = 37628, y = 182181) +p(x = 209397, y = 118525) +p(x = 149005, y = 130324) +p(x = 151292, y = 173312) +p(x = 35729, y = 191068) +p(x = 13076, y = 131776) +p(x = 184069, y = 190192) +p(x = 6636, y = 92476) +p(x = 158029, y = 13776) +p(x = 206600, y = 206304) +p(x = 62117, y = 95288) +p(x = 121952, y = 85100) +p(x = 205993, y = 177092) +p(x = 160928, y = 56380) +p(x = 204601, y = 52108) +p(x = 17664, y = 155456) +p(x = 105493, y = 26200) +p(x = 6860, y = 147888) +p(x = 133113, y = 135272) +p(x = 93388, y = 9704) +p(x = 168209, y = 27168) +p(x = 192524, y = 14260) +p(x = 198649, y = 59192) +p(x = 51496, y = 65500) +p(x = 82945, y = 111300) +p(x = 171692, y = 20860) +p(x = 200621, y = 15328) +p(x = 15328, y = 15328) +p(x = 128581, y = 22028) +p(x = 79628, y = 56472) +p(x = 194725, y = 203584) +p(x = 41748, y = 129640) +p(x = 48065, y = 94128) +p(x = 52296, y = 149924) +p(x = 31437, y = 202032) +p(x = 90588, y = 18240) +p(x = 79149, y = 105284) +p(x = 173912, y = 208440) +p(x = 17497, y = 31824) +p(x = 24248, y = 39008) +p(x = 145845, y = 40752) +p(x = 38768, y = 211060) +p(x = 95641, y = 162924) +p(x = 6812, y = 140804) +p(x = 68049, y = 152736) +p(x = 145832, y = 144976) +p(x = 10569, y = 75788) +p(x = 188112, y = 213872) +p(x = 105341, y = 177192) +p(x = 166920, y = 138084) +p(x = 163533, y = 88496) +p(x = 158544, y = 182240) +p(x = 15221, y = 54920) +p(x = 18092, y = 52692) +p(x = 127657, y = 107904) +p(x = 166240, y = 170108) +p(x = 59021, y = 124208) +p(x = 70236, y = 78792) +p(x = 71697, y = 63172) +p(x = 86317, y = 155365) +p(x = 170508, y = 55413) +p(x = 133637, y = 142073) +p(x = 42380, y = 207281) +p(x = 42097, y = 213005) +p(x = 164036, y = 61821) +p(x = 184521, y = 49397) +p(x = 60656, y = 45709) +p(x = 202145, y = 11457) +p(x = 197740, y = 57549) +p(x = 150005, y = 164101) +p(x = 92032, y = 11649) +p(x = 142013, y = 123049) +p(x = 180496, y = 210869) +p(x = 177593, y = 33777) +p(x = 48104, y = 185061) +p(x = 144277, y = 120429) +p(x = 107648, y = 180889) +p(x = 66513, y = 196217) +p(x = 15624, y = 105585) +p(x = 186809, y = 94713) +p(x = 13164, y = 5149) +p(x = 109437, y = 37949) +p(x = 10412, y = 99569) +p(x = 75437, y = 8837) +p(x = 177092, y = 101313) +p(x = 101313, y = 101313) +p(x = 22472, y = 210193) +p(x = 182693, y = 128581) +p(x = 133256, y = 170601) +p(x = 119097, y = 199421) +p(x = 117504, y = 179045) +p(x = 84421, y = 51241) +p(x = 76520, y = 73077) +p(x = 1709, y = 117617) +p(x = 64356, y = 128873) +p(x = 196725, y = 118877) +p(x = 15996, y = 4373) +p(x = 201641, y = 180789) +p(x = 164144, y = 95881) +p(x = 90985, y = 177977) +p(x = 144896, y = 188065) +p(x = 37969, y = 93937) +p(x = 193576, y = 199713) +p(x = 23861, y = 90933) +p(x = 111740, y = 107037) +p(x = 63905, y = 16405) +p(x = 180120, y = 136833) +p(x = 86093, y = 115581) +p(x = 98476, y = 187581) +p(x = 1153, y = 166137) +p(x = 2664, y = 8253) +p(x = 144737, y = 207473) +p(x = 36400, y = 62981) +p(x = 102393, y = 205245) +p(x = 114192, y = 64049) +p(x = 51029, y = 89089) +p(x = 60893, y = 86136) +p(x = 188848, y = 177160) +p(x = 120153, y = 106320) +p(x = 212461, y = 57508) +p(x = 99660, y = 88948) +p(x = 167597, y = 39360) +p(x = 103900, y = 134656) +p(x = 192505, y = 212964) +p(x = 82324, y = 19276) +p(x = 59909, y = 200448) +p(x = 49780, y = 183660) +p(x = 11457, y = 133104) +p(x = 44761, y = 185796) +p(x = 26764, y = 6660) +p(x = 74033, y = 45668) +p(x = 140752, y = 113404) +p(x = 196365, y = 94288) +p(x = 195648, y = 123784) +p(x = 64937, y = 70608) +p(x = 177948, y = 99912) +p(x = 54233, y = 7436) +p(x = 121929, y = 44317) +p(x = 102872, y = 16757) +p(x = 67553, y = 114965) +p(x = 112709, y = 147081) +p(x = 113344, y = 150769) +p(x = 61629, y = 99729) +p(x = 63048, y = 111953) +p(x = 206573, y = 50433) +p(x = 107164, y = 167173) +p(x = 97565, y = 62273) +p(x = 140804, y = 15305) +p(x = 60945, y = 131653) +p(x = 17201, y = 191913) +p(x = 173492, y = 105161) +p(x = 151373, y = 70425) +p(x = 93984, y = 61205) +p(x = 131541, y = 197545) +p(x = 171384, y = 171637) +p(x = 200209, y = 126805) +p(x = 37628, y = 200749) +p(x = 186593, y = 25685) +p(x = 149005, y = 76108) +p(x = 159152, y = 78920) +p(x = 119469, y = 194300) +p(x = 204601, y = 51360) +p(x = 17664, y = 209728) +p(x = 56973, y = 90760) +p(x = 107004, y = 143644) +p(x = 133113, y = 52428) +p(x = 93388, y = 81540) +p(x = 198385, y = 166356) +p(x = 74036, y = 61456) +p(x = 143233, y = 192456) +p(x = 18753, y = 136952) +p(x = 145832, y = 93572) +p(x = 124881, y = 74940) +p(x = 93592, y = 97360) +p(x = 146877, y = 63200) +p(x = 56104, y = 86296) +p(x = 82793, y = 29724) +p(x = 128168, y = 49616) +p(x = 202605, y = 78144) +p(x = 109897, y = 94457) +p(x = 38240, y = 212357) +p(x = 63673, y = 101149) +p(x = 163392, y = 33513) +p(x = 138653, y = 38561) +p(x = 203436, y = 41373) +p(x = 59844, y = 164905) +p(x = 130009, y = 144529) +p(x = 140156, y = 181109) +p(x = 9476, y = 80481) +p(x = 211425, y = 154425) +p(x = 23804, y = 48165) +p(x = 39633, y = 100765) +p(x = 92476, y = 109785) +p(x = 37949, y = 128125) +p(x = 168401, y = 168401) +p(x = 141868, y = 74273) +p(x = 208445, y = 190137) +p(x = 191808, y = 116093) +p(x = 202973, y = 76893) +p(x = 34476, y = 136669) +p(x = 183633, y = 169077) +p(x = 142832, y = 180917) +p(x = 198253, y = 209545) +p(x = 55948, y = 110469) +p(x = 202101, y = 30601) +p(x = 142284, y = 111921) +p(x = 214001, y = 65053) +p(x = 129536, y = 207117) +p(x = 43277, y = 124729) +p(x = 65748, y = 98629) +p(x = 148921, y = 42149) +p(x = 183424, y = 50401) +p(x = 32825, y = 200517) +p(x = 56364, y = 70777) +p(x = 9405, y = 83685) +p(x = 29356, y = 2657) +p(x = 69149, y = 135501) +p(x = 118404, y = 98821) +p(x = 212760, y = 112989) +p(x = 161721, y = 106973) +p(x = 72308, y = 157237) +p(x = 157613, y = 92321) +p(x = 46556, y = 84945) +p(x = 2509, y = 6637) +p(x = 140853, y = 181460) +p(x = 150516, y = 43660) +p(x = 7393, y = 128960) +p(x = 10264, y = 23092) +p(x = 191637, y = 29592) +p(x = 112604, y = 111204) +p(x = 150868, y = 25904) +p(x = 46653, y = 127216) +p(x = 204980, y = 105672) +p(x = 72940, y = 87524) +p(x = 156497, y = 82768) +p(x = 131132, y = 213576) +p(x = 206345, y = 137696) +p(x = 138084, y = 139540) +p(x = 137609, y = 109260) +p(x = 18861, y = 131772) +p(x = 131772, y = 131772) +p(x = 5245, y = 38036) +p(x = 153476, y = 122844) +p(x = 39657, y = 196596) +p(x = 162856, y = 46672) +p(x = 106001, y = 195336) +p(x = 26676, y = 21732) +p(x = 116833, y = 84712) +p(x = 135424, y = 65204) +p(x = 100013, y = 19696) +p(x = 131120, y = 113048) +p(x = 61649, y = 7080) +p(x = 95768, y = 49000) +p(x = 40173, y = 52396) +p(x = 152792, y = 191548) +p(x = 105933, y = 20180) +p(x = 36412, y = 88884) +p(x = 168781, y = 123720) +p(x = 120704, y = 111880) +p(x = 42305, y = 8340) +p(x = 38184, y = 185924) +p(x = 104761, y = 86556) +p(x = 47564, y = 26196) +p(x = 14508, y = 49484) +p(x = 130865, y = 118288) +p(x = 212528, y = 18920) +p(x = 8073, y = 37744) +p(x = 155336, y = 76076) +p(x = 171941, y = 174084) +p(x = 19749, y = 112857) +p(x = 65124, y = 114509) +p(x = 94045, y = 58713) +p(x = 27728, y = 139349) +p(x = 20845, y = 34841) +p(x = 126872, y = 27949) +p(x = 104192, y = 46873) +p(x = 75473, y = 214069) +p(x = 68832, y = 116837) +p(x = 89828, y = 102085) +p(x = 43061, y = 20189) +p(x = 181204, y = 76953) +p(x = 3437, y = 115285) +p(x = 143616, y = 118097) +p(x = 118877, y = 172633) +p(x = 57485, y = 57161) +p(x = 181460, y = 140417) +p(x = 140417, y = 140417) +p(x = 180552, y = 110045) +p(x = 35585, y = 6989) +p(x = 128020, y = 18345) +p(x = 168981, y = 85205) +p(x = 214156, y = 2333) +p(x = 95873, y = 155461) +p(x = 18492, y = 187577) +p(x = 184145, y = 84329) +p(x = 177020, y = 167009) +p(x = 121909, y = 91605) +p(x = 157972, y = 54249) +p(x = 96261, y = 5729) +p(x = 168804, y = 168753) +p(x = 97005, y = 18729) +p(x = 103656, y = 193985) +p(x = 104925, y = 16693) +p(x = 69464, y = 78797) +p(x = 157585, y = 100633) +p(x = 156768, y = 113925) +p(x = 44209, y = 199417) +p(x = 104044, y = 36293) +p(x = 165500, y = 88017) +p(x = 158717, y = 78121) +p(x = 160128, y = 17569) +p(x = 65521, y = 193109) +p(x = 83820, y = 146141) +p(x = 42393, y = 13881) +p(x = 141629, y = 198700) +p(x = 209708, y = 15000) +p(x = 33885, y = 41492) +p(x = 137676, y = 59932) +p(x = 109733, y = 175020) +p(x = 28472, y = 142220) +p(x = 12761, y = 4136) +p(x = 154784, y = 203356) +p(x = 111805, y = 203648) +p(x = 36460, y = 71964) +p(x = 100609, y = 173952) +p(x = 92032, y = 69152) +p(x = 68649, y = 28008) +p(x = 200000, y = 129704) +p(x = 203013, y = 22768) +p(x = 200544, y = 200544) +p(x = 72749, y = 186860) +p(x = 75812, y = 18788) +p(x = 28853, y = 50228) +p(x = 149532, y = 207044) +p(x = 84033, y = 39748) +p(x = 17816, y = 117672) +p(x = 187641, y = 94476) +p(x = 18652, y = 83612) +p(x = 77469, y = 170848) +p(x = 199116, y = 177832) +p(x = 93057, y = 189772) +p(x = 70504, y = 165024) +p(x = 47317, y = 98456) +p(x = 86868, y = 50520) +p(x = 208976, y = 101076) +p(x = 75457, y = 148628) +p(x = 6712, y = 144164) +p(x = 85609, y = 180552) +p(x = 45492, y = 182688) +p(x = 62581, y = 107384) +p(x = 104629, y = 107868) +p(x = 167660, y = 151248) +p(x = 42293, y = 204232) +p(x = 57981, y = 125733) +p(x = 117716, y = 213745) +p(x = 154989, y = 143297) +p(x = 111184, y = 196181) +p(x = 153113, y = 94485) +p(x = 197128, y = 55477) +p(x = 34397, y = 120685) +p(x = 97144, y = 38297) +p(x = 23301, y = 210933) +p(x = 64504, y = 191425) +p(x = 208229, y = 170465) +p(x = 189748, y = 176773) +p(x = 155209, y = 39657) +p(x = 54440, y = 11905) +p(x = 123345, y = 66149) +p(x = 203356, y = 97297) +p(x = 97297, y = 97297) +p(x = 98324, y = 102829) +p(x = 117741, y = 85657) +p(x = 23764, y = 101669) +p(x = 136241, y = 144657) +p(x = 6268, y = 80801) +p(x = 185213, y = 82645) +p(x = 28748, y = 185801) +p(x = 168393, y = 178909) +p(x = 20656, y = 205985) +p(x = 56569, y = 133009) +p(x = 204808, y = 183957) +p(x = 185117, y = 125925) +p(x = 199144, y = 121945) +p(x = 193448, y = 148437) +p(x = 199765, y = 82353) +p(x = 168476, y = 202973) +p(x = 71249, y = 72749) +p(x = 105560, y = 132525) +p(x = 190285, y = 114961) +p(x = 36217, y = 65373) +p(x = 131564, y = 47033) +p(x = 94209, y = 26557) +p(x = 61377, y = 160720) +p(x = 212236, y = 101236) +p(x = 81821, y = 77756) +p(x = 178044, y = 188380) +p(x = 100129, y = 171884) +p(x = 95916, y = 2936) +p(x = 183645, y = 97064) +p(x = 24752, y = 109872) +p(x = 194093, y = 126368) +p(x = 112832, y = 107060) +p(x = 136129, y = 17204) +p(x = 102896, y = 30396) +p(x = 95141, y = 131608) +p(x = 82192, y = 186536) +p(x = 202529, y = 128020) +p(x = 91664, y = 12740) +p(x = 191425, y = 84064) +p(x = 84064, y = 84064) +p(x = 61945, y = 139468) +p(x = 182716, y = 201480) +p(x = 13877, y = 115888) +p(x = 38484, y = 84840) +p(x = 134465, y = 80376) +p(x = 122100, y = 124916) +p(x = 44961, y = 125208) +p(x = 25804, y = 180128) +p(x = 162053, y = 19824) +p(x = 169288, y = 163148) +p(x = 201997, y = 42044) +p(x = 11372, y = 70572) +p(x = 5676, y = 162856) +p(x = 92829, y = 1092) +p(x = 75416, y = 75036) +p(x = 95897, y = 174504) +p(x = 6192, y = 68728) +p(x = 41713, y = 208272) +p(x = 112005, y = 99492) +p(x = 45004, y = 142380) +p(x = 29001, y = 131416) +p(x = 71181, y = 83681) +p(x = 20776, y = 186445) +p(x = 100745, y = 145885) +p(x = 140000, y = 65925) +p(x = 206577, y = 51173) +p(x = 193144, y = 197217) +p(x = 62756, y = 168689) +p(x = 9389, y = 54569) +p(x = 120656, y = 25265) +p(x = 81165, y = 186545) +p(x = 30760, y = 183633) +p(x = 117329, y = 30697) +p(x = 198800, y = 206821) +p(x = 76345, y = 50105) +p(x = 96488, y = 73977) +p(x = 45649, y = 7017) +p(x = 9704, y = 198869) +p(x = 75989, y = 136665) +p(x = 6660, y = 97657) +p(x = 26461, y = 122981) +p(x = 134716, y = 28853) +p(x = 207044, y = 6925) +p(x = 197249, y = 163157) +p(x = 18364, y = 172377) +p(x = 172377, y = 172377) +p(x = 89848, y = 56897) +p(x = 118777, y = 69221) +p(x = 119097, y = 198285) +p(x = 117504, y = 101053) +p(x = 149245, y = 11389) +p(x = 76520, y = 211869) +p(x = 1709, y = 2845) +p(x = 186236, y = 200029) +p(x = 64096, y = 96489) +p(x = 94085, y = 148505) +p(x = 208064, y = 14685) +p(x = 146453, y = 195181) +p(x = 76156, y = 118517) +p(x = 62581, y = 168981) +p(x = 162392, y = 68637) +p(x = 75841, y = 42537) +p(x = 197780, y = 124533) +p(x = 107441, y = 180621) +p(x = 95660, y = 174997) +p(x = 144573, y = 204493) +p(x = 14025, y = 110716) +p(x = 184384, y = 211344) +p(x = 12049, y = 182816) +p(x = 75176, y = 169908) +p(x = 88769, y = 197368) +p(x = 57872, y = 152052) +p(x = 103900, y = 181748) +p(x = 5509, y = 211928) +p(x = 152772, y = 26676) +p(x = 168309, y = 181164) +p(x = 182336, y = 4748) +p(x = 55417, y = 88588) +p(x = 140092, y = 81604) +p(x = 203857, y = 185436) +p(x = 86784, y = 184852) +p(x = 59909, y = 65008) +p(x = 49780, y = 170876) +p(x = 164101, y = 175732) +p(x = 205880, y = 190384) +p(x = 108073, y = 88688) +p(x = 138020, y = 204068) +p(x = 30044, y = 181356) +p(x = 75661, y = 36088) +p(x = 161404, y = 123424) +p(x = 197217, y = 98876) +p(x = 98876, y = 98876) +p(x = 40077, y = 114112) +p(x = 46997, y = 172720) +p(x = 141276, y = 67044) +p(x = 71221, y = 15812) +p(x = 195780, y = 91500) +p(x = 33441, y = 169324) +p(x = 88812, y = 142832) +p(x = 170932, y = 149532) +p(x = 87001, y = 166704) +p(x = 179536, y = 37448) +p(x = 121029, y = 144484) +p(x = 202308, y = 76848) +p(x = 118185, y = 177576) +p(x = 120080, y = 128664) +p(x = 157061, y = 105084) +p(x = 110828, y = 84416) +p(x = 85605, y = 32792) +p(x = 39864, y = 64232) +p(x = 144381, y = 46084) +p(x = 83505, y = 138669) +p(x = 162356, y = 99369) +p(x = 67553, y = 102181) +p(x = 72556, y = 180297) +p(x = 22009, y = 119553) +p(x = 13524, y = 121689) +p(x = 195116, y = 42889) +p(x = 41121, y = 175641) +p(x = 193140, y = 189225) +p(x = 21197, y = 74329) +p(x = 163220, y = 126053) +p(x = 214369, y = 137893) +p(x = 47224, y = 203493) +p(x = 191725, y = 73069) +p(x = 136956, y = 95873) +p(x = 169373, y = 75397) +p(x = 64140, y = 75013) +p(x = 192821, y = 98009) +p(x = 84484, y = 72585) +p(x = 68481, y = 213681) +p(x = 113372, y = 63849) +p(x = 16168, y = 151961) +p(x = 170465, y = 43181) +p(x = 80376, y = 100337) +p(x = 21577, y = 34253) +p(x = 170976, y = 61037) +p(x = 61037, y = 61037) +p(x = 51461, y = 66861) +p(x = 163888, y = 150509) +p(x = 166033, y = 16789) +p(x = 145224, y = 56381) +p(x = 199769, y = 60745) +p(x = 119768, y = 34737) +p(x = 146384, y = 210961) +p(x = 75069, y = 136241) +p(x = 174780, y = 148273) +p(x = 35929, y = 164385) +p(x = 169216, y = 87529) +p(x = 45793, y = 29889) +p(x = 27120, y = 43281) +p(x = 152405, y = 174765) +p(x = 179824, y = 33185) +p(x = 19913, y = 111209) +p(x = 78772, y = 128673) +p(x = 156997, y = 124017) +p(x = 156281, y = 26644) +p(x = 94428, y = 115048) +p(x = 96473, y = 64976) +p(x = 128456, y = 23832) +p(x = 208909, y = 150952) +p(x = 190044, y = 47412) +p(x = 125321, y = 76424) +p(x = 34932, y = 82732) +p(x = 10393, y = 23732) +p(x = 211485, y = 211988) +p(x = 175540, y = 159396) +p(x = 73077, y = 88556) +p(x = 55180, y = 214316) +p(x = 102349, y = 200248) +p(x = 213416, y = 64392) +p(x = 132493, y = 41296) +p(x = 114012, y = 63132) +p(x = 175641, y = 126888) +p(x = 126888, y = 126888) +p(x = 130677, y = 41588) +p(x = 197888, y = 70892) +p(x = 106116, y = 213156) +p(x = 190741, y = 111944) +p(x = 110548, y = 140280) +p(x = 126296, y = 35280) +p(x = 179481, y = 4032) +p(x = 59404, y = 185888) +p(x = 150748, y = 141248) +p(x = 52457, y = 169100) +p(x = 45140, y = 194040) +p(x = 59021, y = 91076) +p(x = 194928, y = 174824) +p(x = 9885, y = 170552) +p(x = 72733, y = 137277) +p(x = 173320, y = 100013) +p(x = 50381, y = 211705) +p(x = 196092, y = 168041) +p(x = 209101, y = 24709) +p(x = 28472, y = 103217) +p(x = 165589, y = 67605) +p(x = 17468, y = 111853) +p(x = 43193, y = 132229) +p(x = 110081, y = 87105) +p(x = 209116, y = 173373) +p(x = 21837, y = 210153) +p(x = 15004, y = 110977) +p(x = 80321, y = 184829) +p(x = 168584, y = 56057) +p(x = 28853, y = 125437) +p(x = 161172, y = 35289) +p(x = 142649, y = 118061) +p(x = 17816, y = 187641) +p(x = 187641, y = 187641) +p(x = 174400, y = 182693) +p(x = 70504, y = 149893) +p(x = 47317, y = 132521) +p(x = 86868, y = 205689) +p(x = 161332, y = 89533) +p(x = 75457, y = 79537) +p(x = 6712, y = 208893) +p(x = 123580, y = 94097) +p(x = 94085, y = 176385) +p(x = 153528, y = 155809) +p(x = 175077, y = 198313) +p(x = 167660, y = 67021) +p(x = 58789, y = 87205) +p(x = 57981, y = 108608) +p(x = 117716, y = 10500) +p(x = 154989, y = 29132) +p(x = 60236, y = 89592) +p(x = 153113, y = 166640) +p(x = 197128, y = 119964) +p(x = 182861, y = 13028) +p(x = 118096, y = 199924) +p(x = 2725, y = 91144) +p(x = 59909, y = 24284) +p(x = 136048, y = 94732) +p(x = 37557, y = 166832) +p(x = 205880, y = 69792) +p(x = 108073, y = 81732) +p(x = 138020, y = 43400) +p(x = 24681, y = 150528) +p(x = 114112, y = 128500) +p(x = 128673, y = 83476) +p(x = 26644, y = 68724) +p(x = 167649, y = 104244) +p(x = 104244, y = 104244) +p(x = 168904, y = 87356) +p(x = 194429, y = 149268) +p(x = 39224, y = 113072) +p(x = 108348, y = 45436) +p(x = 113789, y = 36992) +p(x = 122092, y = 163244) +p(x = 76420, y = 142284) +p(x = 60509, y = 116468) +p(x = 76964, y = 172948) +p(x = 172265, y = 118604) +p(x = 177948, y = 34180) +p(x = 54233, y = 105796) +p(x = 83505, y = 88141) +p(x = 102872, y = 15457) +p(x = 67553, y = 40397) +p(x = 133696, y = 107257) +p(x = 129533, y = 39621) +p(x = 73888, y = 156845) +p(x = 139689, y = 133557) +p(x = 153232, y = 11577) +p(x = 79389, y = 182369) +p(x = 66832, y = 101633) +p(x = 138941, y = 45253) +p(x = 45448, y = 15073) +p(x = 144825, y = 76401) +p(x = 52892, y = 85329) +p(x = 173129, y = 200901) +p(x = 195116, y = 124437) +p(x = 41121, y = 199349) +p(x = 169660, y = 5853) +p(x = 74081, y = 20697) +p(x = 59580, y = 170045) +p(x = 86957, y = 38069) +p(x = 47808, y = 124529) +p(x = 109337, y = 99981) +p(x = 101436, y = 142193) +p(x = 159669, y = 70869) +p(x = 211060, y = 148209) +p(x = 62981, y = 164997) +p(x = 186664, y = 208761) +p(x = 134657, y = 49909) +p(x = 107056, y = 144713) +p(x = 147525, y = 51269) +p(x = 25312, y = 204005) +p(x = 169713, y = 201193) +p(x = 93984, y = 104253) +p(x = 131541, y = 10317) +p(x = 45816, y = 146849) +p(x = 80173, y = 139089) +p(x = 113124, y = 13129) +p(x = 38413, y = 55049) +p(x = 114361, y = 192708) +p(x = 147704, y = 205424) +p(x = 78325, y = 207944) +p(x = 128456, y = 19980) +p(x = 132245, y = 80340) +p(x = 91352, y = 102852) +p(x = 34105, y = 141276) +p(x = 121692, y = 40164) +p(x = 142369, y = 81600) +p(x = 153976, y = 134584) +p(x = 116913, y = 210756) +p(x = 152000, y = 167868) +p(x = 83981, y = 31528) +p(x = 139352, y = 102268) +p(x = 136449, y = 41524) +p(x = 62656, y = 148944) +p(x = 56357, y = 125556) +p(x = 77084, y = 146424) +p(x = 185289, y = 173300) +p(x = 136728, y = 211632) +p(x = 101609, y = 114884) +p(x = 174928, y = 32596) +p(x = 37821, y = 199116) +p(x = 137632, y = 131572) +p(x = 198385, y = 175436) +p(x = 29304, y = 174468) +p(x = 81905, y = 2124) +p(x = 126888, y = 163988) +p(x = 130677, y = 109644) +p(x = 136360, y = 97804) +p(x = 413, y = 26188) +p(x = 178340, y = 136912) +p(x = 212801, y = 38220) +p(x = 174428, y = 169904) +p(x = 40909, y = 201736) +p(x = 186620, y = 44820) +p(x = 59021, y = 111972) +p(x = 194928, y = 129344) +p(x = 139625, y = 47056) +p(x = 16937, y = 136045) +p(x = 116748, y = 75301) +p(x = 132377, y = 124205) +p(x = 172412, y = 36193) +p(x = 42097, y = 125565) +p(x = 38176, y = 116737) +p(x = 184521, y = 198149) +p(x = 60656, y = 16785) +p(x = 202145, y = 101793) +p(x = 130104, y = 147885) +p(x = 126425, y = 80249) +p(x = 133176, y = 166709) +p(x = 125417, y = 107809) +p(x = 74528, y = 33381) +p(x = 19125, y = 41917) +p(x = 35872, y = 199025) +p(x = 152137, y = 56569) +p(x = 184020, y = 51037) +p(x = 80873, y = 154869) +p(x = 97912, y = 48225) +p(x = 196513, y = 104897) +p(x = 100792, y = 77529) +p(x = 151065, y = 49101) +p(x = 7308, y = 71221) +p(x = 130365, y = 162537) +p(x = 187572, y = 187285) +p(x = 20677, y = 207853) +p(x = 76424, y = 145073) +p(x = 104185, y = 156813) +p(x = 133256, y = 93057) +p(x = 171297, y = 152249) +p(x = 101876, y = 84613) +p(x = 133709, y = 166417) +p(x = 123580, y = 202421) +p(x = 131833, y = 130321) +p(x = 77256, y = 31437) +p(x = 75809, y = 31145) +p(x = 167660, y = 122753) +p(x = 42293, y = 40073) +p(x = 57981, y = 106116) +p(x = 117716, y = 6072) +p(x = 154989, y = 182488) +p(x = 59909, y = 165992) +p(x = 136048, y = 125332) +p(x = 37557, y = 38480) +p(x = 205880, y = 151340) +p(x = 27337, y = 77396) +p(x = 138020, y = 85156) +p(x = 30044, y = 58664) +p(x = 178909, y = 170940) +p(x = 161404, y = 70796) +p(x = 58956, y = 58956) +p(x = 194429, y = 195780) +p(x = 56688, y = 135328) +p(x = 202476, y = 17520) +p(x = 82349, y = 2868) +p(x = 209328, y = 129504) +p(x = 46505, y = 211208) +p(x = 116044, y = 23536) +p(x = 151665, y = 139500) +p(x = 167440, y = 194328) +p(x = 124845, y = 76520) +p(x = 188268, y = 192968) +p(x = 185949, y = 155996) +p(x = 54224, y = 126692) +p(x = 1249, y = 146968) +p(x = 127461, y = 167745) +p(x = 21068, y = 178125) +p(x = 76581, y = 13741) +p(x = 177133, y = 122429) +p(x = 75788, y = 172501) +p(x = 178753, y = 138049) +p(x = 141932, y = 88269) +p(x = 13461, y = 214713) +p(x = 101824, y = 123105) +p(x = 62360, y = 2485) +p(x = 23745, y = 73809) +p(x = 163148, y = 201997) +p(x = 203256, y = 211609) +p(x = 211609, y = 211609) +p(x = 50672, y = 197049) +p(x = 76224, y = 105933) +p(x = 131253, y = 95937) +p(x = 47856, y = 123981) +p(x = 41849, y = 5981) +p(x = 145540, y = 163573) +p(x = 175053, y = 127569) +p(x = 27120, y = 134169) +p(x = 152405, y = 68961) +p(x = 67648, y = 185117) +p(x = 76777, y = 44313) +p(x = 78772, y = 18013) +p(x = 156997, y = 8501) +p(x = 156281, y = 93660) +p(x = 153912, y = 183132) +p(x = 78325, y = 134420) +p(x = 83589, y = 203800) +p(x = 29304, y = 148004) +p(x = 81905, y = 86868) +p(x = 38976, y = 28452) +p(x = 16757, y = 154120) +p(x = 154808, y = 142280) +p(x = 33440, y = 88036) +p(x = 142037, y = 160812) +p(x = 30396, y = 57564) +p(x = 75160, y = 30488) +p(x = 116897, y = 52032) +p(x = 52032, y = 52032) +p(x = 1604, y = 36020) +p(x = 128441, y = 209916) +p(x = 47956, y = 54168) +p(x = 6721, y = 103656) +p(x = 81400, y = 118308) +p(x = 10569, y = 20400) +p(x = 3248, y = 52516) +p(x = 34697, y = 66684) +p(x = 105204, y = 107152) +p(x = 10501, y = 147420) +p(x = 196388, y = 15836) +p(x = 205901, y = 211468) +p(x = 151817, y = 130157) +p(x = 155080, y = 92117) +p(x = 70857, y = 177417) +p(x = 65837, y = 141997) +p(x = 63468, y = 90757) +p(x = 91229, y = 78433) +p(x = 9968, y = 145293) +p(x = 198425, y = 209925) +p(x = 166068, y = 154321) +p(x = 160937, y = 181589) +p(x = 33484, y = 168781) +p(x = 164493, y = 133261) +p(x = 91476, y = 99785) +p(x = 130009, y = 150049) +p(x = 140156, y = 73193) +p(x = 183929, y = 150925) +p(x = 25136, y = 33701) +p(x = 96561, y = 12349) +p(x = 113285, y = 166937) +p(x = 173312, y = 179937) +p(x = 105585, y = 182073) +p(x = 171021, y = 2937) +p(x = 18920, y = 30013) +p(x = 10485, y = 48161) +p(x = 57312, y = 152669) +p(x = 148437, y = 140829) +p(x = 34476, y = 168389) +p(x = 23248, y = 206721) +p(x = 205981, y = 130641) +p(x = 163244, y = 114337) +p(x = 117545, y = 8469) +p(x = 102268, y = 49129) +p(x = 80925, y = 36029) +p(x = 40608, y = 9829) +p(x = 92049, y = 198085) +p(x = 2344, y = 121329) +p(x = 188665, y = 132969) +p(x = 23656, y = 185953) +p(x = 159521, y = 138017) +p(x = 76485, y = 152769) +p(x = 63344, y = 21377) +p(x = 82469, y = 124141) +p(x = 52065, y = 203476) +p(x = 185744, y = 151852) +p(x = 93661, y = 171360) +p(x = 191505, y = 167380) +p(x = 39212, y = 172328) +p(x = 75901, y = 24248) +p(x = 214428, y = 119636) +p(x = 82369, y = 46760) +p(x = 187128, y = 190084) +p(x = 203049, y = 10856) +p(x = 166328, y = 64908) +p(x = 121797, y = 107504) +p(x = 1812, y = 152920) +p(x = 6477, y = 93144) +p(x = 41564, y = 16580) +p(x = 21097, y = 174948) +p(x = 119264, y = 57724) +p(x = 200201, y = 37732) +p(x = 68937, y = 201632) +p(x = 75788, y = 204836) +p(x = 11065, y = 69464) +p(x = 18861, y = 145836) +p(x = 131772, y = 116532) +p(x = 5245, y = 107896) +p(x = 172692, y = 81404) +p(x = 39657, y = 43072) +p(x = 204292, y = 73444) +p(x = 174824, y = 90716) +p(x = 137277, y = 2220) +p(x = 91144, y = 83632) +p(x = 27589, y = 186012) +p(x = 95768, y = 157676) +p(x = 40173, y = 179220) +p(x = 52256, y = 568) +p(x = 204809, y = 91884) +p(x = 119176, y = 152144) +p(x = 14093, y = 205904) +p(x = 7552, y = 175140) +p(x = 150401, y = 134388) +p(x = 8073, y = 188340) +p(x = 155336, y = 17648) +p(x = 171941, y = 172620) +p(x = 140369, y = 56957) +p(x = 65124, y = 52009) +p(x = 161681, y = 178161) +p(x = 43425, y = 51617) +p(x = 138288, y = 112561) +p(x = 165273, y = 197761) +p(x = 181144, y = 113337) +p(x = 949, y = 141965) +p(x = 208672, y = 189801) +p(x = 121245, y = 52201) +p(x = 111792, y = 59577) +p(x = 124609, y = 9405) +p(x = 165520, y = 76657) +p(x = 45393, y = 142057) +p(x = 99596, y = 168457) +p(x = 51569, y = 117801) +p(x = 39788, y = 19209) +p(x = 111505, y = 1837) +p(x = 94845, y = 79953) +p(x = 81996, y = 145745) +p(x = 117617, y = 184661) +p(x = 205565, y = 60645) +p(x = 126148, y = 4557) +p(x = 209413, y = 158169) +p(x = 23544, y = 107513) +p(x = 190557, y = 173597) +p(x = 131608, y = 15813) +p(x = 29748, y = 213965) +p(x = 29565, y = 162925) +p(x = 136360, y = 119353) +p(x = 124529, y = 145845) +p(x = 54816, y = 10865) +p(x = 122753, y = 64817) +p(x = 32264, y = 198729) +p(x = 36737, y = 171269) +p(x = 54160, y = 3781) +p(x = 77073, y = 121781) +p(x = 85668, y = 201933) +p(x = 116433, y = 95289) +p(x = 175561, y = 198829) +p(x = 194928, y = 189417) +p(x = 139625, y = 18433) +p(x = 21009, y = 42264) +p(x = 100544, y = 14704) +p(x = 167797, y = 206840) +p(x = 72921, y = 191220) +p(x = 60656, y = 54588) +p(x = 111805, y = 129500) +p(x = 101741, y = 62448) +p(x = 105580, y = 33336) +p(x = 152357, y = 85152) +p(x = 75437, y = 175208) +p(x = 177092, y = 50608) +p(x = 21837, y = 136392) +p(x = 99136, y = 91752) +p(x = 80321, y = 138528) +p(x = 209728, y = 108348) +p(x = 169077, y = 208100) +p(x = 108192, y = 65452) +p(x = 34841, y = 49732) +p(x = 161332, y = 161332) +p(x = 150953, y = 208976) +p(x = 6712, y = 182192) +p(x = 85609, y = 139304) +p(x = 45492, y = 180348) +p(x = 164569, y = 46920) +p(x = 165081, y = 67688) +p(x = 30936, y = 70016) +p(x = 161845, y = 100872) +p(x = 138041, y = 148141) +p(x = 117716, y = 158621) +p(x = 154989, y = 105345) +p(x = 207709, y = 131061) +p(x = 106264, y = 186473) +p(x = 81333, y = 126305) +p(x = 199941, y = 137853) +p(x = 111496, y = 117185) +p(x = 145665, y = 16165) +p(x = 18765, y = 161141) +p(x = 61328, y = 140281) +p(x = 16213, y = 119221) +p(x = 29948, y = 87973) +p(x = 361, y = 52653) +p(x = 112788, y = 80989) +p(x = 89601, y = 196077) +p(x = 117512, y = 2581) +p(x = 143329, y = 63617) +p(x = 91752, y = 14321) +p(x = 14321, y = 14321) +p(x = 42616, y = 113789) +p(x = 129765, y = 87297) +p(x = 211428, y = 83801) +p(x = 56273, y = 3841) +p(x = 49217, y = 78269) +p(x = 29092, y = 84869) +p(x = 203089, y = 149693) +p(x = 61377, y = 3900) +p(x = 212236, y = 84928) +p(x = 81821, y = 46112) +p(x = 84277, y = 118696) +p(x = 67640, y = 150720) +p(x = 211173, y = 192156) +p(x = 95141, y = 53872) +p(x = 83260, y = 130244) +p(x = 53089, y = 198948) +p(x = 151517, y = 126848) +p(x = 39008, y = 164404) +p(x = 187581, y = 21072) +p(x = 24708, y = 206516) +p(x = 68481, y = 45044) +p(x = 113372, y = 191672) +p(x = 136277, y = 191864) +p(x = 105672, y = 73864) +p(x = 18729, y = 87256) +p(x = 112712, y = 75416) +p(x = 38585, y = 189052) +p(x = 189052, y = 189052) +p(x = 191577, y = 47856) +p(x = 42680, y = 124228) +p(x = 203285, y = 138880) +p(x = 149069, y = 155376) +p(x = 60240, y = 131312) +p(x = 23761, y = 47564) +p(x = 193253, y = 112881) +p(x = 20776, y = 150629) +p(x = 35729, y = 85805) +p(x = 202569, y = 69701) +p(x = 167884, y = 29041) +p(x = 62117, y = 18169) +p(x = 168209, y = 124237) +p(x = 192524, y = 204197) +p(x = 198649, y = 46505) +p(x = 177717, y = 4877) +p(x = 20860, y = 140149) +p(x = 54737, y = 84837) +p(x = 44700, y = 53397) +p(x = 174257, y = 214577) +p(x = 90568, y = 185273) +p(x = 2657, y = 169453) +p(x = 38712, y = 140633) +p(x = 32997, y = 127049) +p(x = 50520, y = 68341) +p(x = 28985, y = 60673) +p(x = 2936, y = 212349) +p(x = 211869, y = 202545) +p(x = 87520, y = 171297) +p(x = 97525, y = 190321) +p(x = 64392, y = 72513) +p(x = 172989, y = 177705) +p(x = 110936, y = 62225) +p(x = 90569, y = 48057) +p(x = 207360, y = 181777) +p(x = 130321, y = 105605) +p(x = 176472, y = 24093) +p(x = 2777, y = 37969) +p(x = 9528, y = 65237) +p(x = 30593, y = 30593) +p(x = 187076, y = 117637) +p(x = 46281, y = 188669) +p(x = 162565, y = 120449) +p(x = 142240, y = 6721) +p(x = 128081, y = 159657) +p(x = 206348, y = 177121) +p(x = 54589, y = 116469) +p(x = 25728, y = 27197) +p(x = 10985, y = 67465) +p(x = 5512, y = 83093) +p(x = 122353, y = 2549) +p(x = 191801, y = 204540) +p(x = 194380, y = 198332) +p(x = 140337, y = 173392) +p(x = 28481, y = 134384) +p(x = 61916, y = 181736) +p(x = 146349, y = 22108) +p(x = 191889, y = 173492) +p(x = 148568, y = 172716) +p(x = 97045, y = 174652) +p(x = 182665, y = 91104) +p(x = 190776, y = 122252) +p(x = 185061, y = 57720) +p(x = 186088, y = 34240) +p(x = 52177, y = 190764) +p(x = 46704, y = 213860) +p(x = 128125, y = 80524) +p(x = 6596, y = 10660) +p(x = 107233, y = 172032) +p(x = 66240, y = 154376) +p(x = 202973, y = 117596) +p(x = 22828, y = 104688) +p(x = 183633, y = 135160) +p(x = 142832, y = 202796) +p(x = 198253, y = 23952) +p(x = 94280, y = 134968) +p(x = 202101, y = 39380) +p(x = 160140, y = 91588) +p(x = 141901, y = 116528) +p(x = 125556, y = 31812) +p(x = 172241, y = 149036) +p(x = 129504, y = 130888) +p(x = 181037, y = 164464) +p(x = 174788, y = 25212) +p(x = 202737, y = 140208) +p(x = 140208, y = 140208) +p(x = 91497, y = 207552) +p(x = 52325, y = 31228) +p(x = 33944, y = 48600) +p(x = 122065, y = 152432) +p(x = 173456, y = 99448) +p(x = 107573, y = 123128) +p(x = 119372, y = 110704) +p(x = 157613, y = 101584) +p(x = 126032, y = 19972) +p(x = 161461, y = 199884) +p(x = 115621, y = 127693) +p(x = 142756, y = 139825) +p(x = 70565, y = 116145) +p(x = 203829, y = 133325) +p(x = 141100, y = 46281) +p(x = 113, y = 92181) +p(x = 28181, y = 72773) +p(x = 86172, y = 32789) +p(x = 7481, y = 141185) +p(x = 87277, y = 117989) +p(x = 63172, y = 189705) +p(x = 8353, y = 54433) +p(x = 134656, y = 200961) +p(x = 59261, y = 35701) +p(x = 131128, y = 76845) +p(x = 57677, y = 143997) +p(x = 195336, y = 57245) +p(x = 193501, y = 86941) +p(x = 204424, y = 60057) +p(x = 187937, y = 82961) +p(x = 166060, y = 169521) +p(x = 40693, y = 210665) +p(x = 81604, y = 169713) +p(x = 181365, y = 151373) +p(x = 67788, y = 95577) +p(x = 101373, y = 64521) +p(x = 103760, y = 124105) +p(x = 10317, y = 42009) +p(x = 162628, y = 65689) +p(x = 81317, y = 44629) +p(x = 212860, y = 57537) +p(x = 87977, y = 194169) +p(x = 129956, y = 51905) +p(x = 43209, y = 208045) +p(x = 200368, y = 56469) +p(x = 56469, y = 56469) +p(x = 42913, y = 39581) +p(x = 172420, y = 145549) +p(x = 66269, y = 170973) +p(x = 114164, y = 137013) +p(x = 185881, y = 178157) +p(x = 115876, y = 100425) +p(x = 50285, y = 101593) +p(x = 207352, y = 19789) +p(x = 174461, y = 59381) +p(x = 68853, y = 57104) +p(x = 182832, y = 59340) +p(x = 152077, y = 76420) +p(x = 198297, y = 64288) +p(x = 173900, y = 176172) +p(x = 170897, y = 202372) +p(x = 128717, y = 137940) +p(x = 205624, y = 200920) +p(x = 133341, y = 62344) +p(x = 125025, y = 131732) +p(x = 20184, y = 123580) +p(x = 177977, y = 40416) +p(x = 124533, y = 129112) +p(x = 83448, y = 64964) +p(x = 72585, y = 158224) +p(x = 213156, y = 129788) +p(x = 36549, y = 76128) +p(x = 29132, y = 164432) +p(x = 159753, y = 150748) +p(x = 14836, y = 3736) +p(x = 157585, y = 32264) +p(x = 32848, y = 32848) +p(x = 55269, y = 165500) +p(x = 160128, y = 152884) +p(x = 42617, y = 107276) +p(x = 49276, y = 37796) +p(x = 179409, y = 100484) +p(x = 42361, y = 190541) +p(x = 56388, y = 120577) +p(x = 181381, y = 131541) +p(x = 165013, y = 178901) +p(x = 136152, y = 75069) +p(x = 70561, y = 145517) +p(x = 207609, y = 139985) +p(x = 30760, y = 96029) +p(x = 204273, y = 214221) +p(x = 210709, y = 80209) +p(x = 9704, y = 60509) +p(x = 89473, y = 8109) +p(x = 2845, y = 105925) +p(x = 87520, y = 210341) +p(x = 149733, y = 11213) +p(x = 70800, y = 131833) +p(x = 94097, y = 94085) +p(x = 71636, y = 41877) +p(x = 140929, y = 122905) +p(x = 64908, y = 199177) +p(x = 48513, y = 31013) +p(x = 6356, y = 7525) +p(x = 7525, y = 7525) +p(x = 56104, y = 202673) +p(x = 197397, y = 205485) +p(x = 154660, y = 37805) +p(x = 163497, y = 199469) +p(x = 54101, y = 172160) +p(x = 38240, y = 147904) +p(x = 35437, y = 160128) +p(x = 101357, y = 207580) +p(x = 61916, y = 97832) +p(x = 67457, y = 189048) +p(x = 183929, y = 183224) +p(x = 88792, y = 190116) +p(x = 57845, y = 121120) +p(x = 131233, y = 97732) +p(x = 95288, y = 107144) +p(x = 99569, y = 152268) +p(x = 50105, y = 183808) +p(x = 115080, y = 136064) +p(x = 213973, y = 138976) +p(x = 74972, y = 76964) +p(x = 125437, y = 176916) +p(x = 92112, y = 179536) +p(x = 198085, y = 2344) +p(x = 143316, y = 10396) +p(x = 50549, y = 112776) +p(x = 123580, y = 57656) +p(x = 131833, y = 12632) +p(x = 12632, y = 12632) +p(x = 165081, y = 33300) +p(x = 30936, y = 97440) +p(x = 120701, y = 165468) +p(x = 31489, y = 170325) +p(x = 15828, y = 132869) +p(x = 207973, y = 187597) +p(x = 212949, y = 148881) +p(x = 155560, y = 208657) +p(x = 103261, y = 150433) +p(x = 64504, y = 74061) +p(x = 32297, y = 150725) +p(x = 113668, y = 64941) +p(x = 84273, y = 189249) +p(x = 156140, y = 15645) +p(x = 150133, y = 163533) +p(x = 80512, y = 144417) +p(x = 24333, y = 67753) +p(x = 96784, y = 194005) +p(x = 38661, y = 98709) +p(x = 147016, y = 91433) +p(x = 198549, y = 115113) +p(x = 63405, y = 34861) +p(x = 120328, y = 65817) +p(x = 142073, y = 126753) +p(x = 32856, y = 187213) +p(x = 162121, y = 9145) +p(x = 166060, y = 66593) +p(x = 80869, y = 131993) +p(x = 81604, y = 95897) +p(x = 181365, y = 214089) +p(x = 146849, y = 113361) +p(x = 138564, y = 3613) +p(x = 80249, y = 68437) +p(x = 151340, y = 35637) +p(x = 191617, y = 211277) +p(x = 37864, y = 35929) +p(x = 183433, y = 49705) +p(x = 19392, y = 181973) +p(x = 146329, y = 76197) +p(x = 86320, y = 16421) +p(x = 108449, y = 13993) +p(x = 115200, y = 79885) +p(x = 112297, y = 14093) +p(x = 80524, y = 3805) +p(x = 35217, y = 42913) +p(x = 30105, y = 30105) +p(x = 122832, y = 178669) +p(x = 209693, y = 6133) +p(x = 172749, y = 108121) +p(x = 143404, y = 205161) +p(x = 174461, y = 179353) +p(x = 68853, y = 71984) +p(x = 210876, y = 86928) +p(x = 118985, y = 137484) +p(x = 63901, y = 60436) +p(x = 15532, y = 211428) +p(x = 170897, y = 145052) +p(x = 150964, y = 48988) +p(x = 3085, y = 166112) +p(x = 196832, y = 50924) +p(x = 104457, y = 173196) +p(x = 176324, y = 33944) +p(x = 108597, y = 23656) +p(x = 87888, y = 198620) +p(x = 105945, y = 210360) +p(x = 1780, y = 143792) +p(x = 44777, y = 195416) +p(x = 178648, y = 157476) +p(x = 51053, y = 2212) +p(x = 32641, y = 126812) +p(x = 198444, y = 104492) +p(x = 93937, y = 45492) +p(x = 107868, y = 207548) +p(x = 58873, y = 22204) +p(x = 151308, y = 84500) +p(x = 1393, y = 127588) +p(x = 110716, y = 193964) +p(x = 78409, y = 51508) +p(x = 179649, y = 180764) +p(x = 136912, y = 69172) +p(x = 25421, y = 205120) +p(x = 179576, y = 16864) +p(x = 214713, y = 22104) +p(x = 184976, y = 157376) +p(x = 17589, y = 48696) +p(x = 67720, y = 167472) +p(x = 171269, y = 124776) +p(x = 67204, y = 40736) +p(x = 131837, y = 85668) +p(x = 95016, y = 26084) +p(x = 200801, y = 107304) +p(x = 107600, y = 130984) +p(x = 117989, y = 19000) +p(x = 203901, y = 122156) +p(x = 122156, y = 122156) +p(x = 212313, y = 141464) +p(x = 42617, y = 93720) +p(x = 201628, y = 209876) +p(x = 93825, y = 92652) +p(x = 42361, y = 41713) +p(x = 1268, y = 203285) +p(x = 181381, y = 167381) +p(x = 62833, y = 17457) +p(x = 18344, y = 10273) +p(x = 93949, y = 45793) +p(x = 68968, y = 89749) +p(x = 53257, y = 208525) +p(x = 213912, y = 36765) +p(x = 16345, y = 56949) +p(x = 200872, y = 138461) +p(x = 157893, y = 63257) +p(x = 77700, y = 71993) +p(x = 117785, y = 66269) +p(x = 120656, y = 204937) +p(x = 207609, y = 61897) +p(x = 30760, y = 209693) +p(x = 34165, y = 179705) +p(x = 45649, y = 183201) +p(x = 10964, y = 68205) +p(x = 134597, y = 190285) +p(x = 83612, y = 19301) +p(x = 47033, y = 48797) +p(x = 67276, y = 197853) +p(x = 123465, y = 91693) +p(x = 64232, y = 191545) +p(x = 54145, y = 113621) +p(x = 73681, y = 122065) +p(x = 90136, y = 19493) +p(x = 154777, y = 174173) +p(x = 24412, y = 41621) +p(x = 178125, y = 124585) +p(x = 42328, y = 79853) +p(x = 152769, y = 29681) +p(x = 15996, y = 15029) +p(x = 3973, y = 24833) +p(x = 14412, y = 162333) +p(x = 64493, y = 207165) +p(x = 207876, y = 116241) +p(x = 181777, y = 54137) +p(x = 86932, y = 130893) +p(x = 167677, y = 186597) +p(x = 109289, y = 164569) +p(x = 76156, y = 62581) +p(x = 62581, y = 62581) +p(x = 165081, y = 5617) +p(x = 211040, y = 75097) +p(x = 127493, y = 4841) +p(x = 138041, y = 162292) +p(x = 117716, y = 81264) +p(x = 154989, y = 12468) +p(x = 181213, y = 175392) +p(x = 123140, y = 128624) +p(x = 207281, y = 148124) +p(x = 89601, y = 75832) +p(x = 88884, y = 63024) +p(x = 42601, y = 101356) +p(x = 110296, y = 116784) +p(x = 102829, y = 11400) +p(x = 99492, y = 116976) +p(x = 148113, y = 176268) +p(x = 88688, y = 196744) +p(x = 82873, y = 53612) +p(x = 189284, y = 7228) +p(x = 59453, y = 27120) +p(x = 162952, y = 168992) +p(x = 100753, y = 114164) +p(x = 188340, y = 137644) +p(x = 119645, y = 93104) +p(x = 203321, y = 135900) +p(x = 202796, y = 59236) +p(x = 71121, y = 67196) +p(x = 49217, y = 205572) +p(x = 29092, y = 120080) +p(x = 203089, y = 14212) +p(x = 61377, y = 11501) +p(x = 106268, y = 208301) +p(x = 44365, y = 136685) +p(x = 171509, y = 31785) +p(x = 64140, y = 9949) +p(x = 166137, y = 122809) +p(x = 152581, y = 137461) +p(x = 184272, y = 189861) +p(x = 193985, y = 54589) +p(x = 150372, y = 152989) +p(x = 147177, y = 117469) +p(x = 201480, y = 5877) +p(x = 30889, y = 208201) +p(x = 169908, y = 187049) +p(x = 100337, y = 81081) +p(x = 158520, y = 34697) +p(x = 9089, y = 46437) +p(x = 107056, y = 127657) +p(x = 157909, y = 8497) +p(x = 90716, y = 90785) +p(x = 11057, y = 16257) +p(x = 156353, y = 92921) +p(x = 96636, y = 154149) +p(x = 169713, y = 11017) +p(x = 43785, y = 140273) +p(x = 33164, y = 35181) +p(x = 183489, y = 180741) +p(x = 214121, y = 123928) +p(x = 68904, y = 179824) +p(x = 164985, y = 108792) +p(x = 160253, y = 165172) +p(x = 189032, y = 18936) +p(x = 128581, y = 139748) +p(x = 135501, y = 203796) +p(x = 34348, y = 92196) +p(x = 126349, y = 103360) +p(x = 122136, y = 23884) +p(x = 205401, y = 188268) +p(x = 126368, y = 147608) +p(x = 200029, y = 9524) +p(x = 87520, y = 38828) +p(x = 73845, y = 110344) +p(x = 64876, y = 137320) +p(x = 187449, y = 119372) +p(x = 33596, y = 180892) +p(x = 159461, y = 4376) +p(x = 172328, y = 47656) +p(x = 119353, y = 44552) +p(x = 188669, y = 72012) +p(x = 35308, y = 36400) +p(x = 49869, y = 48240) +p(x = 10885, y = 55032) +p(x = 128168, y = 188752) +p(x = 202605, y = 118012) +p(x = 109897, y = 63485) +p(x = 80068, y = 103853) +p(x = 81629, y = 9141) +p(x = 163392, y = 59021) +p(x = 120505, y = 53197) +p(x = 203436, y = 212149) +p(x = 28481, y = 17877) +p(x = 61916, y = 117921) +p(x = 146349, y = 54457) +p(x = 71488, y = 167025) +p(x = 8617, y = 65521) +p(x = 54960, y = 131121) +p(x = 81653, y = 189729) +p(x = 180596, y = 169937) +p(x = 148773, y = 132573) +p(x = 192688, y = 203121) +p(x = 207933, y = 32529) +p(x = 140740, y = 9725) +p(x = 1689, y = 69109) +p(x = 27464, y = 88617) +p(x = 22133, y = 201569) +p(x = 133976, y = 197981) +p(x = 78965, y = 145773) +p(x = 139576, y = 116953) +p(x = 182665, y = 200209) +p(x = 190776, y = 43785) +p(x = 196217, y = 176245) +p(x = 141640, y = 80173) +p(x = 206081, y = 19913) +p(x = 182460, y = 24377) +p(x = 142293, y = 143445) +p(x = 150404, y = 188469) +p(x = 107233, y = 8073) +p(x = 199184, y = 5261) +p(x = 123113, y = 213409) +p(x = 179352, y = 37377) +p(x = 183633, y = 172749) +p(x = 142832, y = 67849) +p(x = 198253, y = 152565) +p(x = 94280, y = 73965) +p(x = 202101, y = 61057) +p(x = 116468, y = 77361) +p(x = 17885, y = 47181) +p(x = 173300, y = 122093) +p(x = 201837, y = 36217) +p(x = 65748, y = 49217) +p(x = 84097, y = 17293) +p(x = 183424, y = 196329) +p(x = 33217, y = 64937) +p(x = 159036, y = 172265) +p(x = 142057, y = 3317) +p(x = 29356, y = 91529) +p(x = 15681, y = 147225) +p(x = 153824, y = 157997) +p(x = 127049, y = 176629) +p(x = 107016, y = 185949) +p(x = 159817, y = 213893) +p(x = 150072, y = 38837) +p(x = 133193, y = 135485) +p(x = 67944, y = 76485) +p(x = 158485, y = 66297) +p(x = 52384, y = 35341) +p(x = 24833, y = 2641) +p(x = 15280, y = 157613) +p(x = 163953, y = 115109) +p(x = 43968, y = 141601) +p(x = 141601, y = 141601) +p(x = 126032, y = 150429) +p(x = 57045, y = 137913) +p(x = 4029, y = 87024) +p(x = 150516, y = 204148) +p(x = 7393, y = 177656) +p(x = 198520, y = 72080) +p(x = 156701, y = 73148) +p(x = 194892, y = 30544) +p(x = 191505, y = 119916) +p(x = 39212, y = 30936) +p(x = 184681, y = 211040) +p(x = 214428, y = 187360) +p(x = 126517, y = 68876) +p(x = 202072, y = 167660) +p(x = 203049, y = 165624) +p(x = 154488, y = 95660) +p(x = 123641, y = 192600) +p(x = 150868, y = 57328) +p(x = 6477, y = 45588) +p(x = 41564, y = 164848) +p(x = 21097, y = 114192) +p(x = 2424, y = 42192) +p(x = 154785, y = 154368) +p(x = 72940, y = 176688) +p(x = 156497, y = 30352) +p(x = 87076, y = 196480) +p(x = 80777, y = 5512) +p(x = 213872, y = 1048) +p(x = 98693, y = 125064) +p(x = 147756, y = 128168) +p(x = 66929, y = 154660) +p(x = 201576, y = 196388) +p(x = 212357, y = 75184) +p(x = 196596, y = 194928) +p(x = 105289, y = 55584) +p(x = 131064, y = 163296) +p(x = 87401, y = 158248) +p(x = 67760, y = 83820) +p(x = 78249, y = 13756) +p(x = 81604, y = 16184) +p(x = 181365, y = 60532) +p(x = 67788, y = 40248) +p(x = 88565, y = 169312) +p(x = 186240, y = 68684) +p(x = 134525, y = 60240) +p(x = 178540, y = 66064) +p(x = 166709, y = 45004) +p(x = 77396, y = 37628) +p(x = 154545, y = 172708) +p(x = 37864, y = 157472) +p(x = 183433, y = 52088) +p(x = 19392, y = 191340) +p(x = 146329, y = 104196) +p(x = 62448, y = 27540) +p(x = 22281, y = 22200) +p(x = 157028, y = 33748) +p(x = 71153, y = 113124) +p(x = 55684, y = 78772) +p(x = 35217, y = 130980) +p(x = 108244, y = 25012) +p(x = 67401, y = 155336) +p(x = 308, y = 89544) +p(x = 6133, y = 14924) +p(x = 183868, y = 207352) +p(x = 42297, y = 60140) +p(x = 155600, y = 143404) +p(x = 51093, y = 43744) +p(x = 173616, y = 124480) +p(x = 61057, y = 10068) +p(x = 10068, y = 10068) +p(x = 65681, y = 111864) +p(x = 196457, y = 212209) +p(x = 143240, y = 136813) +p(x = 180997, y = 146809) +p(x = 148348, y = 12989) +p(x = 202309, y = 36669) +p(x = 7412, y = 108477) +p(x = 15573, y = 26573) +p(x = 65120, y = 54233) +p(x = 129561, y = 144381) +p(x = 102836, y = 156413) +p(x = 6481, y = 1249) +p(x = 129196, y = 130505) +p(x = 130173, y = 106149) +p(x = 156816, y = 82469) +p(x = 87445, y = 168929) +p(x = 74496, y = 16385) +p(x = 174165, y = 201345) +p(x = 130844, y = 2509) +p(x = 95141, y = 161461) +p(x = 203880, y = 181) +p(x = 53089, y = 106049) +p(x = 13356, y = 74125) +p(x = 178817, y = 153601) +p(x = 36420, y = 19005) +p(x = 48461, y = 94309) +p(x = 0, y = 161845) +p(x = 115581, y = 160685) +p(x = 24708, y = 151173) +p(x = 144561, y = 58789) +p(x = 117060, y = 144573) +p(x = 96009, y = 86641) +p(x = 70928, y = 204641) +p(x = 5729, y = 200177) +p(x = 127760, y = 112841) +p(x = 143297, y = 195421) +p(x = 73000, y = 51029) +p(x = 207113, y = 107117) +p(x = 182716, y = 27641) +p(x = 13877, y = 141761) +p(x = 38484, y = 122353) +p(x = 137469, y = 20949) +p(x = 117636, y = 35601) +p(x = 3041, y = 66557) +p(x = 44820, y = 130797) +p(x = 162053, y = 177665) +p(x = 169288, y = 204057) +p(x = 201997, y = 163497) +p(x = 11372, y = 205901) +p(x = 127829, y = 101001) +p(x = 53552, y = 93049) +p(x = 184177, y = 106825) +p(x = 209560, y = 147969) +p(x = 133873, y = 71697) +p(x = 30100, y = 95277) +p(x = 139373, y = 139625) +p(x = 134384, y = 4545) +p(x = 35701, y = 164273) +p(x = 138908, y = 62869) +p(x = 130765, y = 24537) +p(x = 97832, y = 9885) +p(x = 24089, y = 42393) +p(x = 124968, y = 67817) +p(x = 76065, y = 198433) +p(x = 36048, y = 179409) +p(x = 11017, y = 93825) +p(x = 66872, y = 104305) +p(x = 9725, y = 182713) +p(x = 121860, y = 212793) +p(x = 212793, y = 212793) diff --git a/rust/kcl-lib/e2e/executor/inputs/riddle_small.kcl b/rust/kcl-lib/e2e/executor/inputs/riddle_small.kcl index 966358cd1..ba0447e8f 100644 --- a/rust/kcl-lib/e2e/executor/inputs/riddle_small.kcl +++ b/rust/kcl-lib/e2e/executor/inputs/riddle_small.kcl @@ -1,6 +1,6 @@ ANSWER = 41803 -fn t(s) { +fn t(@s) { return (ANSWER * s + 12345) % 214748 } diff --git a/rust/kcl-lib/e2e/executor/inputs/scoped-tags.kcl b/rust/kcl-lib/e2e/executor/inputs/scoped-tags.kcl index af4a138ff..02f0788d9 100644 --- a/rust/kcl-lib/e2e/executor/inputs/scoped-tags.kcl +++ b/rust/kcl-lib/e2e/executor/inputs/scoped-tags.kcl @@ -1,4 +1,4 @@ -fn rect(origin) { +fn rect(@origin) { return startSketchOn(XZ) |> startProfile(at = origin) |> angledLine( diff --git a/rust/kcl-lib/e2e/executor/inputs/server-rack-heavy.kcl b/rust/kcl-lib/e2e/executor/inputs/server-rack-heavy.kcl index 83329542d..df9cb4456 100644 --- a/rust/kcl-lib/e2e/executor/inputs/server-rack-heavy.kcl +++ b/rust/kcl-lib/e2e/executor/inputs/server-rack-heavy.kcl @@ -9,7 +9,7 @@ serverDepth = 31 width = 21.53 // simple caster model at each corner -fn caster(originStart) { +fn caster(@originStart) { plane001c = { origin = [ -(3.543 - 2.756) / 2 + originStart[0], @@ -1330,7 +1330,7 @@ extrude012rl = extrude(sketch012rl, length = -thickness) // GENERATE SERVER MODELS // Define planes so the server can be moved -fn streamServer(serverPos) { +fn streamServer(@serverPos) { planeXYs = { origin = [0, 0 + 2, 4.114 + 1 + serverPos * 1.75], xAxis = [1.0, 0.0, 0.0], diff --git a/rust/kcl-lib/e2e/executor/inputs/server-rack-lite.kcl b/rust/kcl-lib/e2e/executor/inputs/server-rack-lite.kcl index cfdc21b3c..71b40462b 100644 --- a/rust/kcl-lib/e2e/executor/inputs/server-rack-lite.kcl +++ b/rust/kcl-lib/e2e/executor/inputs/server-rack-lite.kcl @@ -7,7 +7,7 @@ serverDepth = 31 width = 21.53 // simple caster model at each corner -fn caster(originStart) { +fn caster(@originStart) { plane001c = { origin = [ -(3.543 - 2.756) / 2 + originStart[0], @@ -967,7 +967,7 @@ sketch012rl = startSketchOn(extrude001rl, face = 'START') extrude012rl = extrude(sketch012rl, length = -thickness) // Define planes so the server can be moved -fn streamServer(serverPos) { +fn streamServer(@serverPos) { planeXYs = { origin = [0, 0 + 2, 4.114 + 1 + serverPos * 1.75], xAxis = [1.0, 0.0, 0.0], diff --git a/rust/kcl-lib/e2e/executor/inputs/sketch_on_face_circle_tagged.kcl b/rust/kcl-lib/e2e/executor/inputs/sketch_on_face_circle_tagged.kcl index 0def47d95..55ba40de9 100644 --- a/rust/kcl-lib/e2e/executor/inputs/sketch_on_face_circle_tagged.kcl +++ b/rust/kcl-lib/e2e/executor/inputs/sketch_on_face_circle_tagged.kcl @@ -7,10 +7,10 @@ fn cube(pos, scale) { return sg } -part001 = cube([0,0], 20) +part001 = cube(pos = [0,0], scale = 20) |> close() |> extrude(length = 20) part002 = startSketchOn(part001, face = "end") - |> circle(center: [0, 0], radius: 5, tag =$myCircle) + |> circle(center = [0, 0], radius = 5, tag = $myCircle) |> extrude(length = 5) diff --git a/rust/kcl-lib/e2e/executor/inputs/sketch_on_face_end.kcl b/rust/kcl-lib/e2e/executor/inputs/sketch_on_face_end.kcl index 143b52b89..341335536 100644 --- a/rust/kcl-lib/e2e/executor/inputs/sketch_on_face_end.kcl +++ b/rust/kcl-lib/e2e/executor/inputs/sketch_on_face_end.kcl @@ -7,7 +7,7 @@ fn cube(pos, scale) { return sg } -part001 = cube([0,0], 20) +part001 = cube(pos = [0,0], scale = 20) |> close() |> extrude(length = 20) diff --git a/rust/kcl-lib/e2e/executor/inputs/sketch_on_face_end_negative_extrude.kcl b/rust/kcl-lib/e2e/executor/inputs/sketch_on_face_end_negative_extrude.kcl index 9acdd83e8..8dddd1ba3 100644 --- a/rust/kcl-lib/e2e/executor/inputs/sketch_on_face_end_negative_extrude.kcl +++ b/rust/kcl-lib/e2e/executor/inputs/sketch_on_face_end_negative_extrude.kcl @@ -7,7 +7,7 @@ fn cube(pos, scale) { return sg } -part001 = cube([0,0], 20) +part001 = cube(pos = [0,0], scale = 20) |> close() |> extrude(length = 20) diff --git a/rust/kcl-lib/e2e/executor/inputs/sketch_on_face_start.kcl b/rust/kcl-lib/e2e/executor/inputs/sketch_on_face_start.kcl index 33e55287e..7cbf7b8bf 100644 --- a/rust/kcl-lib/e2e/executor/inputs/sketch_on_face_start.kcl +++ b/rust/kcl-lib/e2e/executor/inputs/sketch_on_face_start.kcl @@ -7,7 +7,7 @@ fn cube(pos, scale) { return sg } -part001 = cube([0,0], 20) +part001 = cube(pos = [0,0], scale = 20) |> close() |> extrude(length = 20) diff --git a/rust/kcl-lib/e2e/executor/main.rs b/rust/kcl-lib/e2e/executor/main.rs index dd227a24d..c6d2e25fa 100644 --- a/rust/kcl-lib/e2e/executor/main.rs +++ b/rust/kcl-lib/e2e/executor/main.rs @@ -197,11 +197,11 @@ fn box(sk1, sk2, scale, plane) { return boxsketch } -box(0, 0, 5, XY) -box(10, 23, 8, XZ) -box(30, 43, 18, -XY) -thing = box(-12, -15, 10, YZ) -box(-20, -5, 10, XY)"#; +box(sk1 = 0, sk2 = 0, scale = 5, plane = XY) +box(sk1 = 10, sk2 = 23, scale = 8, plane = XZ) +box(sk1 = 30, sk2 = 43, scale = 18, plane = -XY) +thing = box(sk1 = -12, sk2 = -15, scale = 10, plane = YZ) +box(sk1 = -20, sk2 = -5, scale = 10, plane = XY)"#; let result = execute_and_snapshot(code, None).await.unwrap(); assert_out("different_planes_same_drawing", &result); @@ -295,7 +295,7 @@ async fn optional_params() { return sg } -thing = other_circle([2, 2], 20) +thing = other_circle(pos = [2, 2], radius = 20) "#; let result = execute_and_snapshot(code, None).await.unwrap(); assert_out("optional_params", &result); @@ -303,7 +303,7 @@ thing = other_circle([2, 2], 20) #[tokio::test(flavor = "multi_thread")] async fn kcl_test_rounded_with_holes() { - let code = r#"fn tarc(to, sktch, tag?) { + let code = r#"fn tarc(@to, sktch, tag?) { return tangentialArc(sktch, endAbsolute = to, tag = tag) } @@ -311,13 +311,13 @@ fn roundedRectangle(pos, w, l, cornerRadius) { rr = startSketchOn(XY) |> startProfile(at = [pos[0] - w/2, 0]) |> line(endAbsolute = [pos[0] - w/2, pos[1] - l/2 + cornerRadius]) - |> tarc([pos[0] - w/2 + cornerRadius, pos[1] - l/2], %, $arc0) + |> tarc([pos[0] - w/2 + cornerRadius, pos[1] - l/2], sktch=%, tag=$arc0) |> line(endAbsolute = [pos[0] + w/2 - cornerRadius, pos[1] - l/2]) - |> tarc([pos[0] + w/2, pos[1] - l/2 + cornerRadius], %) + |> tarc([pos[0] + w/2, pos[1] - l/2 + cornerRadius], sktch=%) |> line(endAbsolute = [pos[0] + w/2, pos[1] + l/2 - cornerRadius]) - |> tarc([pos[0] + w/2 - cornerRadius, pos[1] + l/2], %, $arc2) + |> tarc([pos[0] + w/2 - cornerRadius, pos[1] + l/2], sktch=%, tag=$arc2) |> line(endAbsolute = [pos[0] - w/2 + cornerRadius, pos[1] + l/2]) - |> tarc([pos[0] - w/2, pos[1] + l/2 - cornerRadius], %) + |> tarc([pos[0] - w/2, pos[1] + l/2 - cornerRadius], sktch=%) |> close() return rr } @@ -325,11 +325,11 @@ fn roundedRectangle(pos, w, l, cornerRadius) { holeRadius = 1 holeIndex = 6 -part = roundedRectangle([0, 0], 20, 20, 4) - |> subtract2d(tool = circle(center = [-holeIndex, holeIndex], radius= holeRadius)) - |> subtract2d(tool = circle(center = [holeIndex, holeIndex], radius= holeRadius)) - |> subtract2d(tool = circle(center = [-holeIndex, -holeIndex], radius= holeRadius)) - |> subtract2d(tool = circle(center = [holeIndex, -holeIndex], radius= holeRadius)) +part = roundedRectangle(pos=[0, 0], w=20, l=20, cornerRadius=4) + |> subtract2d(tool = circle(center = [-holeIndex, holeIndex], radius = holeRadius)) + |> subtract2d(tool = circle(center = [holeIndex, holeIndex], radius = holeRadius)) + |> subtract2d(tool = circle(center = [-holeIndex, -holeIndex], radius = holeRadius)) + |> subtract2d(tool = circle(center = [holeIndex, -holeIndex], radius = holeRadius)) |> extrude(length = 2) "#; @@ -581,7 +581,7 @@ async fn kcl_test_cube_mm() { return sg } -myCube = cube([0,0], 10) +myCube = cube(pos = [0,0], scale = 10) "#; let result = execute_and_snapshot(code, None).await.unwrap(); @@ -603,7 +603,7 @@ fn cube(pos, scale) { return sg } -myCube = cube([0,0], 10) +myCube = cube(pos = [0,0], scale = 10) "#; let result = execute_and_snapshot(code, None).await.unwrap(); @@ -625,7 +625,7 @@ fn cube(pos, scale) { return sg } -myCube = cube([0,0], 10) +myCube = cube(pos = [0,0], scale = 10) "#; let result = execute_and_snapshot(code, None).await.unwrap(); @@ -647,7 +647,7 @@ fn cube(pos, scale) { return sg } -myCube = cube([0,0], 10) +myCube = cube(pos = [0,0], scale = 10) "#; let result = execute_and_snapshot(code, None).await.unwrap(); @@ -669,7 +669,7 @@ fn cube(pos, scale) { return sg } -myCube = cube([0,0], 10) +myCube = cube(pos = [0,0], scale = 10) "#; let result = execute_and_snapshot(code, None).await.unwrap(); @@ -691,7 +691,7 @@ fn cube(pos, scale) { return sg } -myCube = cube([0,0], 10) +myCube = cube(pos = [0,0], scale = 10) "#; let result = execute_and_snapshot(code, None).await.unwrap(); @@ -709,7 +709,7 @@ async fn kcl_test_error_sketch_on_arc_face() { return sg } -part001 = cube([0, 0], 20) +part001 = cube(pos = [0, 0], scale = 20) |> close() |> extrude(length = 20) @@ -745,7 +745,7 @@ async fn kcl_test_sketch_on_face_of_face() { return sg } -part001 = cube([0,0], 20) +part001 = cube(pos = [0,0], scale = 20) |> close() |> extrude(length = 20) @@ -805,7 +805,7 @@ async fn kcl_test_sketch_on_face_circle() { return sg } -part001 = cube([0,0], 20) +part001 = cube(pos = [0,0], scale = 20) |> close() |> extrude(length = 20) @@ -1151,7 +1151,7 @@ async fn kcl_test_plumbus_fillets() { return sg } -fn pentagon(len) { +fn pentagon(@len) { sg = startSketchOn(XY) |> startProfile(at = [-len / 2, -len / 2]) |> angledLine(angle = 0, length = len, tag = $a) @@ -1181,7 +1181,7 @@ fn pentagon(len) { p = pentagon(32) |> extrude(length = 10) -circle0 = make_circle(p, p.sketch.tags.a, [0, 0], 2.5) +circle0 = make_circle(ext=p, face=p.sketch.tags.a, pos=[0, 0], radius=2.5) plumbus0 = circle0 |> extrude(length = 10) |> fillet( @@ -1189,7 +1189,7 @@ plumbus0 = circle0 tags = [circle0.tags.arc1, getOppositeEdge(circle0.tags.arc1)] ) -circle1 = make_circle(p, p.sketch.tags.b, [0, 0], 2.5) +circle1 = make_circle(ext=p, face=p.sketch.tags.b, pos=[0, 0], radius=2.5) plumbus1 = circle1 |> extrude(length = 10) |> fillet( @@ -1231,7 +1231,7 @@ async fn kcl_test_member_expression_in_params() { return screw } -capScrew([0, 0.5, 0], 50, 37.5, 50, 25) +capScrew(originStart = [0, 0.5, 0], length=50, dia=37.5, capDia=50, capHeadLength=25) "#; let result = execute_and_snapshot(code, None).await.unwrap(); @@ -1327,13 +1327,13 @@ fn squareHole(l, w) { extrusion = startSketchOn(XY) |> circle(center = [0, 0], radius= dia/2 ) - |> subtract2d(tool = squareHole(length, width, height)) + |> subtract2d(tool = squareHole(l = length, w = width, h = height)) |> extrude(length = height) "#; let result = execute_and_snapshot(code, None).await; assert!(result.is_err()); - let expected_msg = "semantic: Expected 2 arguments, got 3"; + let expected_msg = "semantic: `h` is not an argument of `squareHole`"; let err = result.unwrap_err().as_kcl_error().unwrap().get_message(); assert_eq!(err, expected_msg); } @@ -1531,7 +1531,7 @@ async fn kcl_test_linear_pattern3d_filleted_sketch() { return sg } -part001 = cube([0,0], 20) +part001 = cube(pos = [0,0], scale = 20) |> close(tag = $line1) |> extrude(length = 20) |> fillet( @@ -1562,7 +1562,7 @@ async fn kcl_test_circular_pattern3d_filleted_sketch() { return sg } -part001 = cube([0,0], 20) +part001 = cube(pos = [0,0], scale = 20) |> close(tag = $line1) |> extrude(length = 20) |> fillet( @@ -1589,7 +1589,7 @@ async fn kcl_test_circular_pattern3d_chamfered_sketch() { return sg } -part001 = cube([0,0], 20) +part001 = cube(pos = [0,0], scale = 20) |> close(tag = $line1) |> extrude(length = 20) |> chamfer( @@ -1615,7 +1615,7 @@ async fn kcl_test_tag_chamfer_with_more_than_one_edge_should_fail() { return sg } -part001 = cube([0,0], 20) +part001 = cube(pos = [0,0], scale = 20) |> close(tag = $line1) |> extrude(length = 20) |> chamfer( @@ -1640,7 +1640,7 @@ part001 = cube([0,0], 20) #[tokio::test(flavor = "multi_thread")] async fn kcl_test_duplicate_tags_should_error() { - let code = r#"fn triangle(len) { + let code = r#"fn triangle(@len) { return startSketchOn(XY) |> startProfile(at = [-len / 2, -len / 2]) |> angledLine(angle = 0, length = len , tag = $a) @@ -1926,7 +1926,7 @@ example = extrude(exampleSketch, length = 10) #[tokio::test(flavor = "multi_thread")] async fn kcl_test_error_inside_fn_also_has_source_range_of_call_site() { - let code = r#"fn someFunction(something) { + let code = r#"fn someFunction(@something) { startSketchOn(something) } @@ -1937,14 +1937,14 @@ someFunction('INVALID') assert!(result.is_err()); assert_eq!( result.err().unwrap().to_string(), - r#"semantic: KclErrorDetails { source_ranges: [SourceRange([45, 54, 0]), SourceRange([59, 82, 0])], message: "This function expected the input argument to be Solid or Plane but it's actually of type string (text)" }"# + r#"semantic: KclErrorDetails { source_ranges: [SourceRange([46, 55, 0]), SourceRange([60, 83, 0])], message: "This function expected the input argument to be Solid or Plane but it's actually of type string (text)" }"# ); } #[tokio::test(flavor = "multi_thread")] async fn kcl_test_error_inside_fn_also_has_source_range_of_call_site_recursive() { - let code = r#"fn someFunction(something) { - fn someNestedFunction(something2) { + let code = r#"fn someFunction(@something) { + fn someNestedFunction(@something2) { startSketchOn(something2) } @@ -1958,7 +1958,7 @@ someFunction('INVALID') assert!(result.is_err()); assert_eq!( result.err().unwrap().to_string(), - r#"semantic: KclErrorDetails { source_ranges: [SourceRange([91, 101, 0]), SourceRange([114, 143, 0]), SourceRange([147, 170, 0])], message: "This function expected the input argument to be Solid or Plane but it's actually of type string (text)" }"# + r#"semantic: KclErrorDetails { source_ranges: [SourceRange([93, 103, 0]), SourceRange([116, 145, 0]), SourceRange([149, 172, 0])], message: "This function expected the input argument to be Solid or Plane but it's actually of type string (text)" }"# ); } @@ -2038,6 +2038,17 @@ async fn kcl_test_ensure_nothing_left_in_batch_multi_file() { ctx.close().await; } +#[tokio::test(flavor = "multi_thread")] +async fn kcl_test_default_param_for_unlabeled() { + let code = r#"fn myExtrude(@sk, len) { + return extrude(sk, length = len) +} + +sketch001 = startSketchOn(XY) +|> circle(center = [0, 0], radius = 93.75) +|> myExtrude(len = 40)"#; + let _ = execute_and_snapshot(code, None).await.unwrap(); +} #[tokio::test(flavor = "multi_thread")] async fn kcl_test_better_type_names() { diff --git a/rust/kcl-lib/src/docs/gen_std_tests.rs b/rust/kcl-lib/src/docs/gen_std_tests.rs index 87f572a36..c0c3750e4 100644 --- a/rust/kcl-lib/src/docs/gen_std_tests.rs +++ b/rust/kcl-lib/src/docs/gen_std_tests.rs @@ -1,113 +1,60 @@ use std::{ - collections::{BTreeMap, HashMap}, - fs::File, + collections::HashMap, + fs::{self, File}, io::Read as _, + path::Path, }; use anyhow::Result; use base64::Engine; use convert_case::Casing; -use handlebars::Renderable; use indexmap::IndexMap; use itertools::Itertools; -use schemars::schema::SingleOrVec; use serde_json::json; use tokio::task::JoinSet; use super::kcl_doc::{ConstData, DocData, ExampleProperties, FnData, TyData}; -use crate::{ - docs::{is_primitive, StdLibFn}, - std::StdLib, - ExecutorContext, -}; +use crate::{docs::StdLibFn, std::StdLib, ExecutorContext}; -const TYPES_DIR: &str = "../../docs/kcl/types"; -const LANG_TOPICS: [&str; 5] = ["Types", "Modules", "Settings", "Known Issues", "Constants"]; -// These types are declared in std. -const DECLARED_TYPES: [&str; 14] = [ - "number", "string", "tag", "bool", "Sketch", "Solid", "Plane", "Helix", "Face", "Edge", "Point2d", "Point3d", - "Axis2d", "Axis3d", +const LANG_TOPICS: [&str; 4] = ["Types", "Modules", "Settings", "Known Issues"]; +// These types are declared in (KCL) std. +const DECLARED_TYPES: [&str; 15] = [ + "any", "number", "string", "tag", "bool", "Sketch", "Solid", "Plane", "Helix", "Face", "Edge", "Point2d", + "Point3d", "Axis2d", "Axis3d", ]; +// Types with special handling. +const SPECIAL_TYPES: [&str; 5] = ["TagDeclarator", "TagIdentifier", "Start", "End", "ImportedGeometry"]; + +const TYPE_REWRITES: [(&str, &str); 11] = [ + ("TagNode", "TagDeclarator"), + ("SketchData", "Plane | Solid"), + ("SketchOrSurface", "Sketch | Plane | Face"), + ("SketchSurface", "Plane | Face"), + ("SolidOrImportedGeometry", "[Solid] | ImportedGeometry"), + ( + "SolidOrSketchOrImportedGeometry", + "[Solid] | [Sketch] | ImportedGeometry", + ), + ("KclValue", "any"), + ("[KclValue]", "[any]"), + ("FaceTag", "TagIdentifier | Start | End"), + ("GeometryWithImportedGeometry", "Solid | Sketch | ImportedGeometry"), + ("SweepPath", "Sketch | Helix"), +]; + +fn rename_type(input: &str) -> &str { + for (i, o) in TYPE_REWRITES { + if input == i { + return o; + } + } + + input +} + fn init_handlebars() -> Result> { let mut hbs = handlebars::Handlebars::new(); - // Register the 'json' helper - hbs.register_helper( - "json", - Box::new( - |h: &handlebars::Helper, - _: &handlebars::Handlebars, - _: &handlebars::Context, - _: &mut handlebars::RenderContext, - out: &mut dyn handlebars::Output| - -> handlebars::HelperResult { - let param = h.param(0).and_then(|v| v.value().as_str()).unwrap_or(""); - out.write(&serde_json::to_string(¶m).unwrap())?; - Ok(()) - }, - ), - ); - - // Register the 'basename' helper - hbs.register_helper( - "times", - Box::new( - |h: &handlebars::Helper, - hb: &handlebars::Handlebars, - ctx: &handlebars::Context, - rc: &mut handlebars::RenderContext, - out: &mut dyn handlebars::Output| - -> handlebars::HelperResult { - let n = h.param(0).and_then(|v| v.value().as_u64()).ok_or_else(|| { - handlebars::RenderErrorReason::Other( - "times helper expects an integer as first parameter".to_string(), - ) - })?; - - let template = h - .template() - .ok_or_else(|| handlebars::RenderErrorReason::Other("times helper expects a block".to_string()))?; - - for i in 0..n { - let mut local_ctx = ctx.clone(); - let mut rc = rc.clone(); - let m = local_ctx.data_mut().as_object_mut().unwrap(); - m.insert("@index".to_string(), handlebars::JsonValue::Number(i.into())); - if i == 0 { - m.insert("@first".to_string(), handlebars::JsonValue::Bool(true)); - } - template.render(hb, &local_ctx, &mut rc, out)?; - } - - Ok(()) - }, - ), - ); - - hbs.register_helper( - "lte", - Box::new( - |h: &handlebars::Helper, - _: &handlebars::Handlebars, - _: &handlebars::Context, - _: &mut handlebars::RenderContext, - out: &mut dyn handlebars::Output| - -> handlebars::HelperResult { - let a = h.param(0).and_then(|v| v.value().as_f64()).ok_or_else(|| { - handlebars::RenderErrorReason::Other("lte helper expects a number as first parameter".to_string()) - })?; - - let b = h.param(1).and_then(|v| v.value().as_f64()).ok_or_else(|| { - handlebars::RenderErrorReason::Other("lte helper expects a number as second parameter".to_string()) - })?; - - let result = a <= b; - out.write(if result { "true" } else { "false" })?; - - Ok(()) - }, - ), - ); hbs.register_helper( "firstLine", @@ -131,146 +78,6 @@ fn init_handlebars() -> Result> { ), ); - hbs.register_helper( - "neq", - Box::new( - |h: &handlebars::Helper, - _: &handlebars::Handlebars, - _: &handlebars::Context, - _: &mut handlebars::RenderContext, - out: &mut dyn handlebars::Output| - -> handlebars::HelperResult { - let param1 = h - .param(0) - .ok_or_else(|| { - handlebars::RenderErrorReason::Other("neq helper expects two parameters".to_string()) - })? - .value(); - let param2 = h - .param(1) - .ok_or_else(|| { - handlebars::RenderErrorReason::Other("neq helper expects two parameters".to_string()) - })? - .value(); - - let result = param1 != param2; - out.write(if result { "true" } else { "false" })?; - - Ok(()) - }, - ), - ); - - // Register the 'lowercase' helper - hbs.register_helper( - "lowercase", - Box::new( - |h: &handlebars::Helper, - _: &handlebars::Handlebars, - _: &handlebars::Context, - _: &mut handlebars::RenderContext, - out: &mut dyn handlebars::Output| - -> handlebars::HelperResult { - let param = h.param(0).and_then(|v| v.value().as_str()).unwrap_or(""); - out.write(¶m.to_lowercase())?; - Ok(()) - }, - ), - ); - - hbs.register_helper( - "pretty_enum", - Box::new( - |h: &handlebars::Helper, - _: &handlebars::Handlebars, - _: &handlebars::Context, - _: &mut handlebars::RenderContext, - out: &mut dyn handlebars::Output| - -> handlebars::HelperResult { - if let Some(enum_value) = h.param(0) { - if let Some(array) = enum_value.value().as_array() { - let pretty_options = array - .iter() - .filter_map(|v| v.as_str()) - .map(|s| format!("`{}`", s)) - .collect::>() - .join(", "); - out.write(&pretty_options)?; - return Ok(()); - } - } - out.write("Invalid enum")?; - Ok(()) - }, - ), - ); - - hbs.register_helper( - "pretty_enum", - Box::new( - |h: &handlebars::Helper, - _: &handlebars::Handlebars, - _: &handlebars::Context, - _: &mut handlebars::RenderContext, - out: &mut dyn handlebars::Output| - -> handlebars::HelperResult { - if let Some(enum_value) = h.param(0) { - if let Some(array) = enum_value.value().as_array() { - let pretty_options = array - .iter() - .filter_map(|v| v.as_str()) - .map(|s| format!("`{}`", s)) - .collect::>() - .join(", "); - out.write(&pretty_options)?; - return Ok(()); - } - } - out.write("Invalid enum")?; - Ok(()) - }, - ), - ); - - hbs.register_helper( - "pretty_ref", - Box::new( - |h: &handlebars::Helper, - _: &handlebars::Handlebars, - _: &handlebars::Context, - _: &mut handlebars::RenderContext, - out: &mut dyn handlebars::Output| - -> handlebars::HelperResult { - let param = h.param(0).and_then(|v| v.value().as_str()).unwrap_or(""); - let basename = param.split('/').next_back().unwrap_or(""); - out.write(&format!("`{}`", basename))?; - Ok(()) - }, - ), - ); - - // Register helper to remove newlines from a string. - hbs.register_helper( - "remove_newlines", - Box::new( - |h: &handlebars::Helper, - _: &handlebars::Handlebars, - _: &handlebars::Context, - _: &mut handlebars::RenderContext, - out: &mut dyn handlebars::Output| - -> handlebars::HelperResult { - if let Some(param) = h.param(0) { - if let Some(string) = param.value().as_str() { - out.write(&string.replace("\n", ""))?; - return Ok(()); - } - } - out.write("")?; - Ok(()) - }, - ), - ); - // Register a helper to do safe YAML new lines. hbs.register_helper( "safe_yaml", @@ -296,16 +103,9 @@ fn init_handlebars() -> Result> { ), ); - hbs.register_template_string("schemaType", include_str!("templates/schemaType.hbs"))?; - hbs.register_template_string("properties", include_str!("templates/properties.hbs"))?; - hbs.register_template_string("array", include_str!("templates/array.hbs"))?; - hbs.register_template_string("propertyType", include_str!("templates/propertyType.hbs"))?; - hbs.register_template_string("schema", include_str!("templates/schema.hbs"))?; hbs.register_template_string("index", include_str!("templates/index.hbs"))?; - hbs.register_template_string("consts-index", include_str!("templates/consts-index.hbs"))?; hbs.register_template_string("function", include_str!("templates/function.hbs"))?; hbs.register_template_string("const", include_str!("templates/const.hbs"))?; - hbs.register_template_string("type", include_str!("templates/type.hbs"))?; hbs.register_template_string("kclType", include_str!("templates/kclType.hbs"))?; Ok(hbs) @@ -318,7 +118,9 @@ fn generate_index(combined: &IndexMap>, kcl_lib: &[Doc functions.insert("std".to_owned(), Vec::new()); let mut constants = HashMap::new(); - constants.insert("std".to_owned(), Vec::new()); + + let mut types = HashMap::new(); + types.insert("Primitive types".to_owned(), Vec::new()); for key in combined.keys() { let internal_fn = combined @@ -335,33 +137,34 @@ fn generate_index(combined: &IndexMap>, kcl_lib: &[Doc .push((internal_fn.name(), internal_fn.name())); } + for name in SPECIAL_TYPES { + types + .get_mut("Primitive types") + .unwrap() + .push((name.to_owned(), format!("types.md#{name}"))); + } + for d in kcl_lib { if d.hide() { continue; } - functions.entry(d.mod_name()).or_default().push(match d { - DocData::Fn(f) => (f.preferred_name.clone(), d.file_name()), - DocData::Const(c) => (c.preferred_name.clone(), d.file_name()), - DocData::Ty(t) => (t.preferred_name.clone(), d.file_name()), - }); + let group = match d { + DocData::Fn(_) => functions.entry(d.mod_name()).or_default(), + DocData::Ty(_) => types.entry(d.mod_name()).or_default(), + DocData::Const(_) => constants.entry(d.mod_name()).or_default(), + }; - if let DocData::Const(c) = d { - constants - .entry(d.mod_name()) - .or_default() - .push((c.name.clone(), d.file_name())); - } + group.push((d.preferred_name().to_owned(), d.file_name())); } - // TODO we should sub-divide into types, constants, and functions. - let mut sorted: Vec<_> = functions + let mut sorted_fns: Vec<_> = functions .into_iter() .map(|(m, mut fns)| { fns.sort(); let val = json!({ "name": m, - "functions": fns.into_iter().map(|(n, f)| json!({ + "items": fns.into_iter().map(|(n, f)| json!({ "name": n, "file_name": f, })).collect::>(), @@ -369,35 +172,16 @@ fn generate_index(combined: &IndexMap>, kcl_lib: &[Doc (m, val) }) .collect(); - sorted.sort_by(|t1, t2| t1.0.cmp(&t2.0)); - let data: Vec<_> = sorted.into_iter().map(|(_, val)| val).collect(); + sorted_fns.sort_by(|t1, t2| t1.0.cmp(&t2.0)); + let functions_data: Vec<_> = sorted_fns.into_iter().map(|(_, val)| val).collect(); - let topics: Vec<_> = LANG_TOPICS - .iter() - .map(|name| { - json!({ - "name": name, - "file_name": name.to_lowercase().replace(' ', "-").replace("constants", "consts"), - }) - }) - .collect(); - let data = json!({ - "lang_topics": topics, - "modules": data, - }); - - let output = hbs.render("index", &data)?; - - expectorate::assert_contents("../../docs/kcl/index.md", &output); - - // Generate the index for the constants. let mut sorted_consts: Vec<_> = constants .into_iter() .map(|(m, mut consts)| { consts.sort(); let val = json!({ "name": m, - "consts": consts.into_iter().map(|(n, f)| json!({ + "items": consts.into_iter().map(|(n, f)| json!({ "name": n, "file_name": f, })).collect::>(), @@ -406,14 +190,45 @@ fn generate_index(combined: &IndexMap>, kcl_lib: &[Doc }) .collect(); sorted_consts.sort_by(|t1, t2| t1.0.cmp(&t2.0)); - let data: Vec<_> = sorted_consts.into_iter().map(|(_, val)| val).collect(); + let consts_data: Vec<_> = sorted_consts.into_iter().map(|(_, val)| val).collect(); + + let mut sorted_types: Vec<_> = types + .into_iter() + .map(|(m, mut tys)| { + tys.sort(); + let val = json!({ + "name": m, + "items": tys.into_iter().map(|(n, f)| json!({ + "name": n, + "file_name": f, + })).collect::>(), + }); + (m, val) + }) + .collect(); + sorted_types.sort_by(|t1, t2| t1.0.cmp(&t2.0)); + let types_data: Vec<_> = sorted_types.into_iter().map(|(_, val)| val).collect(); + + let topics: Vec<_> = LANG_TOPICS + .iter() + .map(|name| { + json!({ + "name": name, + "file_name": name.to_lowercase().replace(' ', "-"), + }) + }) + .collect(); + let data = json!({ - "consts": data, + "lang_topics": topics, + "functions": functions_data, + "consts": consts_data, + "types": types_data, }); - let output = hbs.render("consts-index", &data)?; + let output = hbs.render("index", &data)?; - expectorate::assert_contents("../../docs/kcl/consts.md", &output); + expectorate::assert_contents("../../docs/kcl/index.md", &output); Ok(()) } @@ -446,7 +261,7 @@ fn generate_example(index: usize, src: &str, props: &ExampleProperties, file_nam } fn generate_type_from_kcl(ty: &TyData, file_name: String, example_name: String) -> Result<()> { - if ty.properties.doc_hidden { + if ty.properties.doc_hidden || !DECLARED_TYPES.contains(&&*ty.name) { return Ok(()); } @@ -461,7 +276,7 @@ fn generate_type_from_kcl(ty: &TyData, file_name: String, example_name: String) let data = json!({ "name": ty.qual_name(), - "definition": ty.alias.as_ref().map(|t| cleanup_sig(format!("type {} = {t}", ty.preferred_name), ty.referenced_types.iter().filter(|t| !DECLARED_TYPES.contains(&&***t)))), + "definition": ty.alias.as_ref().map(|t| format!("type {} = {t}", ty.preferred_name)), "summary": ty.summary, "description": ty.description, "deprecated": ty.properties.deprecated, @@ -469,16 +284,13 @@ fn generate_type_from_kcl(ty: &TyData, file_name: String, example_name: String) }); let output = hbs.render("kclType", &data)?; - let output = cleanup_type_links( - &output, - ty.referenced_types.iter().filter(|t| !DECLARED_TYPES.contains(&&***t)), - ); + let output = cleanup_types(&output); expectorate::assert_contents(format!("../../docs/kcl/{}.md", file_name), &output); Ok(()) } -fn generate_function_from_kcl(function: &FnData, file_name: String) -> Result<()> { +fn generate_function_from_kcl(function: &FnData, file_name: String, example_name: String) -> Result<()> { if function.properties.doc_hidden { return Ok(()); } @@ -489,7 +301,7 @@ fn generate_function_from_kcl(function: &FnData, file_name: String) -> Result<() .examples .iter() .enumerate() - .filter_map(|(index, example)| generate_example(index, &example.0, &example.1, &file_name)) + .filter_map(|(index, example)| generate_example(index, &example.0, &example.1, &example_name)) .collect(); let data = json!({ @@ -497,10 +309,7 @@ fn generate_function_from_kcl(function: &FnData, file_name: String) -> Result<() "summary": function.summary, "description": function.description, "deprecated": function.properties.deprecated, - "fn_signature": cleanup_sig(function.preferred_name.clone() + &function.fn_signature(), function - .referenced_types - .iter() - .filter(|t| !DECLARED_TYPES.contains(&&***t))), + "fn_signature": function.preferred_name.clone() + &function.fn_signature(), "tags": [], "examples": examples, "is_utilities": false, @@ -521,14 +330,8 @@ fn generate_function_from_kcl(function: &FnData, file_name: String) -> Result<() }); let output = hbs.render("function", &data)?; - let output = cleanup_type_links( - &output, - function - .referenced_types - .iter() - .filter(|t| !DECLARED_TYPES.contains(&&***t)), - ); - expectorate::assert_contents(format!("../../docs/kcl/{}.md", file_name), &output); + let output = &cleanup_types(&output); + expectorate::assert_contents(format!("../../docs/kcl/{}.md", file_name), output); Ok(()) } @@ -562,11 +365,11 @@ fn generate_const_from_kcl(cnst: &ConstData, file_name: String, example_name: St Ok(()) } -fn generate_function(internal_fn: Box) -> Result> { +fn generate_function(internal_fn: Box) -> Result<()> { let hbs = init_handlebars()?; if internal_fn.unpublished() { - return Ok(BTreeMap::new()); + return Ok(()); } let fn_name = internal_fn.name(); @@ -598,48 +401,26 @@ fn generate_function(internal_fn: Box) -> Result>(), "return_value": internal_fn.return_value(false).map(|ret| { json!({ - "type_": ret.type_, + "type_": rename_type(&ret.type_), "description": ret.description(), }) }), @@ -647,295 +428,170 @@ fn generate_function(internal_fn: Box) -> Result(output: &str, types: impl Iterator) -> String { - let mut cleaned_output = output.to_string(); - - // Cleanup our weird number arrays. - // TODO: This is a hack for the handlebars template being too complex. - cleaned_output = cleaned_output.replace("`[, `number`, `number`]`", "`[number, number]`"); - cleaned_output = cleaned_output.replace("`[, `number`, `number`, `number`]`", "`[number, number, number]`"); - - // Fix the links to the types. - for type_name in types.map(|s| &**s).chain(DECLARED_TYPES) { - if type_name == "TagDeclarator" || type_name == "TagIdentifier" || type_name == "TagNode" || type_name == "tag" - { - continue; - } else { - let link = format!("(/docs/kcl/types/{})", type_name); - cleaned_output = - cleaned_output.replace(&format!("`{}`", type_name), &format!("[`{}`]{}", type_name, &link)); - // Do the same for the type with brackets. - cleaned_output = - cleaned_output.replace(&format!("`[{}]`", type_name), &format!("[`[{}]`]{}", type_name, link)); - } - } - - // TODO handle union types generically rather than special casing them. - cleaned_output = cleaned_output.replace( - "`Sketch | Plane | Face`", - "[`Sketch`](/docs/kcl/types/Sketch) or [`Plane`](/docs/kcl/types/Plane) or [`Face`](/docs/kcl/types/Face)", - ); - cleaned_output = cleaned_output.replace( - "`Axis3d | Edge`", - "[`Axis3d`](/docs/kcl/types/Axis3d) or [`Edge`](/docs/kcl/types/Edge)", - ); - cleaned_output = cleaned_output.replace( - "`Axis2d | Edge`", - "[`Axis2d`](/docs/kcl/types/Axis2d) or [`Edge`](/docs/kcl/types/Edge)", - ); - - // Fix the links to the types. - // Gross hack for the stupid alias types. - cleaned_output = cleaned_output.replace("TagNode", "TagDeclarator"); - - let link = "[`TagDeclarator`](/docs/kcl/types#tag-declaration)"; - cleaned_output = cleaned_output.replace("`TagDeclarator`", link); - let link = "[`TagIdentifier`](/docs/kcl/types#tag-identifier)"; - cleaned_output = cleaned_output.replace("`TagIdentifier`", link); - - cleaned_output -} - -// TODO total code dup with `cleanup_type_links`, just this version doesn't have the backticks. :-( -fn cleanup_sig<'a>(input: String, types: impl Iterator) -> String { - let mut cleaned_output = input; - - // Fix the links to the types. - for type_name in types.map(|s| &**s).chain(DECLARED_TYPES) { - if type_name == "TagDeclarator" || type_name == "TagIdentifier" || type_name == "TagNode" || type_name == "tag" - { - continue; - } else { - let link = format!("(/docs/kcl/types/{})", type_name); - // Do the same for the type with brackets. - cleaned_output = cleaned_output.replace(&format!("[{}]", type_name), &format!("[[{}]]{}", type_name, link)); - cleaned_output = cleaned_output.replace(type_name, &format!("[{}]{}", type_name, &link)); - } - } - - // TODO handle union types generically rather than special casing them. - cleaned_output = cleaned_output.replace( - "Sketch | Plane | Face", - "[Sketch](/docs/kcl/types/Sketch) | [Plane](/docs/kcl/types/Plane) | [Face](/docs/kcl/types/Face)", - ); - cleaned_output = cleaned_output.replace( - "Axis3d | Edge", - "[Axis3d](/docs/kcl/types/Axis3d) | [Edge](/docs/kcl/types/Edge)", - ); - cleaned_output = cleaned_output.replace( - "Axis2d | Edge", - "[Axis2d](/docs/kcl/types/Axis2d) | [Edge](/docs/kcl/types/Edge)", - ); - - // Fix the links to the types. - // Gross hack for the stupid alias types. - cleaned_output = cleaned_output.replace("TagNode", "TagDeclarator"); - - let link = "[TagDeclarator](/docs/kcl/types#tag-declaration)"; - cleaned_output = cleaned_output.replace("TagDeclarator", link); - let link = "[TagIdentifier](/docs/kcl/types#tag-identifier)"; - cleaned_output = cleaned_output.replace("TagIdentifier", link); - - cleaned_output -} - -fn add_to_types( - name: &str, - schema: &schemars::schema::Schema, - types: &mut BTreeMap, -) -> Result<()> { - if name.is_empty() { - return Err(anyhow::anyhow!("Empty type name")); - } - - if DECLARED_TYPES.contains(&name) || name == "TyF64" { - return Ok(()); - } - - if name.starts_with("number(") { - panic!("uom number"); - } - - let schemars::schema::Schema::Object(o) = schema else { - return Err(anyhow::anyhow!( - "Failed to get object schema, should have not been a primitive" - )); - }; - - if name == "SourceRange" { - types.insert(name.to_string(), schema.clone()); - return Ok(()); - } - - // If we have an array we want to generate the type markdown files for each item in the - // array. - if let Some(array) = &o.array { - // Recursively generate the type markdown files for each item in the array. - if let Some(items) = &array.items { - match items { - schemars::schema::SingleOrVec::Single(item) => { - if is_primitive(item)?.is_some() { - return Ok(()); - } - return add_to_types(name.trim_start_matches('[').trim_end_matches(']'), item, types); - } - schemars::schema::SingleOrVec::Vec(items) => { - for item in items { - if is_primitive(item)?.is_some() { - continue; - } - add_to_types(name.trim_start_matches('[').trim_end_matches(']'), item, types)?; - } - } - } - } else { - return Err(anyhow::anyhow!("Failed to get array items")); - } - } - - types.insert(name.to_string(), schema.clone()); - Ok(()) } -fn generate_type( - name: &str, - schema: &schemars::schema::Schema, - types: &BTreeMap, -) -> Result<()> { - if name.is_empty() { - return Err(anyhow::anyhow!("Empty type name")); +fn cleanup_types(input: &str) -> String { + #[derive(Copy, Clone, Eq, PartialEq, Debug)] + enum State { + Text, + PreCodeBlock, + CodeBlock, + CodeBlockType, + Slash, + Comment, } - // Skip over TagDeclarator and TagIdentifier since they have custom docs. - if name == "TagDeclarator" || name == "TagIdentifier" || name == "TagNode" || name == "TyF64" { - return Ok(()); - } + let mut output = String::new(); + let mut code_annot = String::new(); + let mut code = String::new(); + let mut code_type = String::new(); + let mut state = State::Text; + let mut ticks = 0; - let schemars::schema::Schema::Object(o) = schema else { - return Err(anyhow::anyhow!( - "Failed to get object schema, should have not been a primitive" - )); - }; - - // If we have an array we want to generate the type markdown files for each item in the - // array. - if let Some(array) = &o.array { - // Recursively generate the type markdown files for each item in the array. - if let Some(items) = &array.items { - match items { - schemars::schema::SingleOrVec::Single(item) => { - if is_primitive(item)?.is_some() { - return Ok(()); - } - return generate_type(name.trim_start_matches('[').trim_end_matches(']'), item, types); + for c in input.chars() { + if state == State::CodeBlockType { + if ['`', ',', '\n', ')', '/'].contains(&c) { + if code_type.starts_with(' ') { + code.push(' '); } - schemars::schema::SingleOrVec::Vec(items) => { - for item in items { - if is_primitive(item)?.is_some() { - continue; - } - generate_type(name.trim_start_matches('[').trim_end_matches(']'), item, types)?; + code.push_str(&cleanup_type_string(code_type.trim(), false)); + if code_type.ends_with(' ') { + code.push(' '); + } + + code_type = String::new(); + state = State::CodeBlock; + } else { + code_type.push(c); + continue; + } + } + if c == '`' { + if state == State::Comment { + code.push(c); + } else { + if state == State::Slash { + state = State::CodeBlock; + } + + ticks += 1; + if ticks == 3 { + if state == State::Text { + state = State::PreCodeBlock; + } else { + output.push_str("```"); + output.push_str(&code_annot); + output.push_str(&code); + // `code` includes the first two of three backticks + output.push('`'); + state = State::Text; + code_annot = String::new(); + code = String::new(); } - return Ok(()); + ticks = 0; + } else if state == State::Text && ticks == 2 && !code.is_empty() { + output.push_str(&cleanup_type_string(&code, true)); + code = String::new(); + ticks = 0; + } else if state == State::CodeBlock { + code.push(c); } } } else { - return Err(anyhow::anyhow!("Failed to get array items")); + if ticks == 2 { + // Empty code block + ticks = 0; + } + + if c == '\n' && (state == State::PreCodeBlock || state == State::Comment) { + state = State::CodeBlock; + } + + if c == '/' { + match state { + State::CodeBlock => state = State::Slash, + State::Slash => state = State::Comment, + _ => {} + } + } else if state == State::Slash { + state = State::CodeBlock; + } + + match state { + State::Text if ticks == 0 => output.push(c), + State::Text if ticks == 1 => code.push(c), + State::Text => unreachable!(), + State::PreCodeBlock => code_annot.push(c), + State::CodeBlock | State::Slash | State::Comment => code.push(c), + State::CodeBlockType => unreachable!(), + } + + if c == ':' && state == State::CodeBlock { + state = State::CodeBlockType; + } } } - // Make sure the name is pascal cased. - if !(name.is_case(convert_case::Case::Pascal) - || name == "Point3d" - || name == "Point2d" - || name == "CircularPattern2dData" - || name == "CircularPattern3dData" - || name == "LinearPattern2dData" - || name == "LinearPattern3dData" - || name == "Mirror2dData" - || name == "Axis2dOrEdgeReference" - || name == "Axis3dOrEdgeReference" - || name == "AxisAndOrigin2d" - || name == "AxisAndOrigin3d") - { - return Err(anyhow::anyhow!("Type name is not pascal cased: {}", name)); - } - - let cleaned_schema = recurse_and_create_references(name, schema, types)?; - - let schemars::schema::Schema::Object(o) = cleaned_schema else { - return Err(anyhow::anyhow!( - "Failed to get object schema, should have not been a primitive" - )); - }; - - let hbs = init_handlebars()?; - - // Add the name as the title. - let mut object = o.clone(); - if let Some(metadata) = object.metadata.as_mut() { - metadata.title = Some(name.to_string()); - } else { - object.metadata = Some(Box::new(schemars::schema::Metadata { - title: Some(name.to_string()), - ..Default::default() - })); - } - - // Cleanup the description. - let object = cleanup_type_description(&object) - .map_err(|e| anyhow::anyhow!("Failed to cleanup type description for type `{}`: {}", name, e))?; - - let data = json!(schemars::schema::Schema::Object(object)); - - let mut output = hbs.render("type", &data)?; - // Fix the links to the types. - output = cleanup_type_links(&output, types.keys()); - expectorate::assert_contents(format!("{}/{}.md", TYPES_DIR, name), &output); - - Ok(()) + output } -fn cleanup_type_description(object: &schemars::schema::SchemaObject) -> Result { - let mut object = object.clone(); - if let Some(metadata) = object.metadata.as_mut() { - if let Some(description) = metadata.description.as_mut() { - // Find any ```kcl code blocks and format the code. - // Parse any code blocks from the doc string. - let mut code_blocks = Vec::new(); - let d = description.clone(); - for line in d.lines() { - if line.starts_with("```kcl") && line.ends_with("```") { - code_blocks.push(line); +fn cleanup_type_string(input: &str, fmt_for_text: bool) -> String { + assert!( + !(input.starts_with('[') && input.ends_with(']') && input.contains('|')), + "Arrays of unions are not supported" + ); + + let input = rename_type(input); + + let tys: Vec<_> = input + .split('|') + .map(|ty| { + let ty = ty.trim(); + + let mut prefix = String::new(); + let mut suffix = String::new(); + + if fmt_for_text { + prefix.push('`'); + suffix.push('`'); + } + + let ty = if ty.starts_with('[') { + if ty.ends_with("; 1+]") { + prefix = format!("{prefix}["); + suffix = format!("; 1+]{suffix}"); + &ty[1..ty.len() - 5] + } else if ty.ends_with(']') { + prefix = format!("{prefix}["); + suffix = format!("]{suffix}"); + &ty[1..ty.len() - 1] + } else { + ty } + } else { + ty + }; + + // TODO markdown links in code blocks are not turned into links by our website stack. + // If we can handle signatures more manually we could get highlighting and links and + // we might want to restore the links by not checking `fmt_for_text` here. + + if fmt_for_text && SPECIAL_TYPES.contains(&ty) { + format!("[{prefix}{ty}{suffix}](/docs/kcl/types#{ty})") + } else if fmt_for_text && DECLARED_TYPES.contains(&ty) { + format!("[{prefix}{ty}{suffix}](/docs/kcl/types/std-types-{ty})") + } else { + format!("{prefix}{ty}{suffix}") } + }) + .collect(); - // Parse the kcl and recast it. - for code_block in &code_blocks { - let trimmed = code_block.trim_start_matches("```kcl").trim_end_matches("```"); - let program = crate::Program::parse_no_errs(trimmed)?; - - let options = crate::parsing::ast::types::FormatOptions { - insert_final_newline: false, - ..Default::default() - }; - let cleaned = program.ast.recast(&options, 0); - - *description = description.replace(code_block, &format!("```kcl\n{}\n```", cleaned)); - } - } - } - - Ok(object) + tys.join(if fmt_for_text { " or " } else { " | " }) } fn clean_function_name(name: &str) -> String { @@ -946,14 +602,6 @@ fn clean_function_name(name: &str) -> String { fn_name = fn_name.replace("last_seg_", "last_segment_"); } else if fn_name.contains("_2_d") { fn_name = fn_name.replace("_2_d", "_2d"); - } else if fn_name.contains("_greater_than_or_eq") { - fn_name = fn_name.replace("_greater_than_or_eq", "_gte"); - } else if fn_name.contains("_less_than_or_eq") { - fn_name = fn_name.replace("_less_than_or_eq", "_lte"); - } else if fn_name.contains("_greater_than") { - fn_name = fn_name.replace("_greater_than", "_gt"); - } else if fn_name.contains("_less_than") { - fn_name = fn_name.replace("_less_than", "_lt"); } else if fn_name.contains("_3_d") { fn_name = fn_name.replace("_3_d", "_3d"); } else if fn_name == "seg_ang" { @@ -962,172 +610,11 @@ fn clean_function_name(name: &str) -> String { fn_name = "segment_length".to_string(); } else if fn_name.starts_with("seg_") { fn_name = fn_name.replace("seg_", "segment_"); - } else if fn_name.starts_with("log_") { - fn_name = fn_name.replace("log_", "log"); - } else if fn_name.ends_with("tan_2") { - fn_name = fn_name.replace("tan_2", "tan2"); } fn_name } -/// Recursively create references for types we already know about. -fn recurse_and_create_references( - name: &str, - schema: &schemars::schema::Schema, - types: &BTreeMap, -) -> Result { - if DECLARED_TYPES.contains(&name) || name == "TyF64" { - return Ok(schema.clone()); - } - - let schemars::schema::Schema::Object(o) = schema else { - return Err(anyhow::anyhow!( - "Failed to get object schema, should have not been a primitive" - )); - }; - - // If we already have a reference add the metadata to the reference if it has none. - if let Some(reference) = &o.reference { - let mut obj = o.clone(); - let reference = reference.trim_start_matches("#/components/schemas/"); - if DECLARED_TYPES.contains(&reference) || reference == "TyF64" { - return Ok(schema.clone()); - } - - let t = types - .get(reference) - .ok_or_else(|| anyhow::anyhow!("Failed to get type: {} {:?}", reference, types.keys()))?; - - let schemars::schema::Schema::Object(to) = t else { - return Err(anyhow::anyhow!( - "Failed to get object schema, should have not been a primitive" - )); - }; - - // If this is a primitive just use the primitive. - if to.subschemas.is_none() && to.object.is_none() && to.reference.is_none() { - return Ok(t.clone()); - } - - // Otherwise append the metadata to our reference. - if let Some(metadata) = obj.metadata.as_mut() { - if metadata.description.is_none() { - metadata.description = to.metadata.as_ref().and_then(|m| m.description.clone()); - } - } else { - obj.metadata = to.metadata.clone(); - } - - let obj = cleanup_type_description(&obj) - .map_err(|e| anyhow::anyhow!("Failed to cleanup type description for type `{}`: {}", name, e))?; - return Ok(schemars::schema::Schema::Object(obj)); - } - - let mut obj = o.clone(); - - // If we have an object iterate over the properties and recursively create references. - if let Some(object) = &mut obj.object { - for (_, value) in object.properties.iter_mut() { - let new_value = recurse_and_create_references(name, value, types)?; - *value = new_value; - } - } - - // If we have an array iterate over the items and recursively create references. - if let Some(array) = &mut obj.array { - if let Some(items) = &mut array.items { - match items { - schemars::schema::SingleOrVec::Single(item) => { - let new_item = recurse_and_create_references(name, item, types)?; - *item = Box::new(new_item); - } - schemars::schema::SingleOrVec::Vec(items) => { - for item in items { - let new_item = recurse_and_create_references(name, item, types)?; - *item = new_item; - } - } - } - } - } - - // If we have subschemas iterate over them and recursively create references. - if let Some(subschema) = &mut obj.subschemas { - // Do anyOf. - if let Some(any_of) = &mut subschema.any_of { - // If we only have one item in anyOf we can just return that item. - if any_of.len() == 1 { - let mut new_item = recurse_and_create_references(name, &any_of[0], types)?; - if let schemars::schema::Schema::Object(new_obj) = &mut new_item { - if let Some(metadata) = new_obj.metadata.as_mut() { - metadata.description = obj.metadata.as_ref().and_then(|m| m.description.clone()); - } else { - new_obj.metadata = obj.metadata.clone(); - } - } - return Ok(new_item); - } - for item in any_of { - let new_item = recurse_and_create_references(name, item, types)?; - *item = new_item; - } - } - - // Do allOf. - if let Some(all_of) = &mut subschema.all_of { - // If we only have one item in allOf we can just return that item. - if all_of.len() == 1 { - let mut new_item = recurse_and_create_references(name, &all_of[0], types)?; - if let schemars::schema::Schema::Object(new_obj) = &mut new_item { - if let Some(metadata) = new_obj.metadata.as_mut() { - metadata.description = obj.metadata.as_ref().and_then(|m| m.description.clone()); - } else { - new_obj.metadata = obj.metadata.clone(); - } - } - return Ok(new_item); - } - for item in all_of { - let new_item = recurse_and_create_references(name, item, types)?; - *item = new_item; - } - } - - // Do oneOf. - if let Some(one_of) = &mut subschema.one_of { - // If we only have one item in oneOf we can just return that item. - if one_of.len() == 1 { - let mut new_item = recurse_and_create_references(name, &one_of[0], types)?; - if let schemars::schema::Schema::Object(new_obj) = &mut new_item { - if let Some(metadata) = new_obj.metadata.as_mut() { - metadata.description = obj.metadata.as_ref().and_then(|m| m.description.clone()); - } else { - new_obj.metadata = obj.metadata.clone(); - } - } - return Ok(new_item); - } - for item in one_of { - let new_item = recurse_and_create_references(name, item, types)?; - *item = new_item; - } - } - - if subschema.one_of.is_none() && subschema.all_of.is_none() && subschema.any_of.is_none() && obj.array.is_none() - { - if let Some(SingleOrVec::Single(_)) = &o.instance_type { - return Ok(schema.clone()); - } - } - } - - let obj = cleanup_type_description(&obj) - .map_err(|e| anyhow::anyhow!("Failed to cleanup type description for type `{}`: {}", name, e))?; - - Ok(schemars::schema::Schema::Object(obj.clone())) -} - #[test] fn test_generate_stdlib_markdown_docs() { let stdlib = StdLib::new(); @@ -1137,25 +624,24 @@ fn test_generate_stdlib_markdown_docs() { // Generate the index which is the table of contents. generate_index(&combined, &kcl_std).unwrap(); - let mut types = BTreeMap::new(); for key in combined.keys().sorted() { let internal_fn = combined.get(key).unwrap(); - let fn_types = generate_function(internal_fn.clone()).unwrap(); - types.extend(fn_types); - } - - // Generate the type markdown files. - for (name, schema) in &types { - generate_type(name, schema, &types).unwrap(); + generate_function(internal_fn.clone()).unwrap(); } for d in &kcl_std { match d { - DocData::Fn(f) => generate_function_from_kcl(f, d.file_name()).unwrap(), + DocData::Fn(f) => generate_function_from_kcl(f, d.file_name(), d.example_name()).unwrap(), DocData::Const(c) => generate_const_from_kcl(c, d.file_name(), d.example_name()).unwrap(), DocData::Ty(t) => generate_type_from_kcl(t, d.file_name(), d.example_name()).unwrap(), } } + + // Copy manually written docs to the output directory. + for entry in fs::read_dir("../../docs/kcl-src").unwrap() { + let path = entry.unwrap().path(); + fs::copy(&path, Path::new("../../docs/kcl").join(path.file_name().unwrap())).unwrap(); + } } #[test] @@ -1185,8 +671,7 @@ fn test_generate_stdlib_json_schema() { async fn test_code_in_topics() { let mut join_set = JoinSet::new(); for name in LANG_TOPICS { - let filename = - format!("../../docs/kcl/{}.md", name.to_lowercase().replace(' ', "-")).replace("constants", "consts"); + let filename = format!("../../docs/kcl/{}.md", name.to_lowercase().replace(' ', "-")); let mut file = File::open(&filename).unwrap(); let mut text = String::new(); file.read_to_string(&mut text).unwrap(); diff --git a/rust/kcl-lib/src/docs/kcl_doc.rs b/rust/kcl-lib/src/docs/kcl_doc.rs index a36ecde75..e01e8b72b 100644 --- a/rust/kcl-lib/src/docs/kcl_doc.rs +++ b/rust/kcl-lib/src/docs/kcl_doc.rs @@ -1,8 +1,4 @@ -use std::{ - collections::{HashMap, HashSet}, - fmt, - str::FromStr, -}; +use std::{collections::HashMap, fmt, str::FromStr}; use regex::Regex; use tower_lsp::lsp_types::{ @@ -13,7 +9,7 @@ use tower_lsp::lsp_types::{ use crate::{ execution::annotations, parsing::{ - ast::types::{Annotation, ImportSelector, ItemVisibility, Node, PrimitiveType, Type, VariableKind}, + ast::types::{Annotation, ImportSelector, ItemVisibility, Node, VariableKind}, token::NumericSuffix, }, ModuleId, @@ -159,6 +155,15 @@ impl DocData { } } + #[allow(dead_code)] + pub fn preferred_name(&self) -> &str { + match self { + DocData::Fn(f) => &f.preferred_name, + DocData::Const(c) => &c.preferred_name, + DocData::Ty(t) => &t.preferred_name, + } + } + pub fn qual_name(&self) -> &str { match self { DocData::Fn(f) => &f.qual_name, @@ -180,18 +185,18 @@ impl DocData { #[allow(dead_code)] pub fn file_name(&self) -> String { match self { - DocData::Fn(f) => f.qual_name.replace("::", "-"), + DocData::Fn(f) => format!("functions/{}", f.qual_name.replace("::", "-")), DocData::Const(c) => format!("consts/{}", c.qual_name.replace("::", "-")), - DocData::Ty(t) => format!("types/{}", t.name.clone()), + DocData::Ty(t) => format!("types/{}", t.qual_name.replace("::", "-")), } } #[allow(dead_code)] pub fn example_name(&self) -> String { match self { - DocData::Fn(f) => f.qual_name.replace("::", "-"), + DocData::Fn(f) => format!("fn_{}", f.qual_name.replace("::", "-")), DocData::Const(c) => format!("const_{}", c.qual_name.replace("::", "-")), - DocData::Ty(t) => t.name.clone(), + DocData::Ty(t) => format!("ty_{}", t.qual_name.replace("::", "-")), } } @@ -400,8 +405,6 @@ pub struct FnData { /// Code examples. /// These are tested and we know they compile and execute. pub examples: Vec<(String, ExampleProperties)>, - #[allow(dead_code)] - pub referenced_types: Vec, pub module_name: String, } @@ -420,16 +423,6 @@ impl FnData { let name = var.declaration.id.name.clone(); qual_name.push_str(&name); - let mut referenced_types = HashSet::new(); - if let Some(t) = &expr.return_type { - collect_type_names(&mut referenced_types, t); - } - for p in &expr.params { - if let Some(t) = &p.type_ { - collect_type_names(&mut referenced_types, t); - } - } - FnData { preferred_name: format!("{preferred_prefix}{name}"), name, @@ -445,7 +438,6 @@ impl FnData { summary: None, description: None, examples: Vec::new(), - referenced_types: referenced_types.into_iter().collect(), module_name: module_name.to_owned(), } } @@ -726,8 +718,6 @@ pub struct TyData { /// Code examples. /// These are tested and we know they compile and execute. pub examples: Vec<(String, ExampleProperties)>, - #[allow(dead_code)] - pub referenced_types: Vec, pub module_name: String, } @@ -741,10 +731,6 @@ impl TyData { ) -> Self { let name = ty.name.name.clone(); qual_name.push_str(&name); - let mut referenced_types = HashSet::new(); - if let Some(t) = &ty.alias { - collect_type_names(&mut referenced_types, t); - } TyData { preferred_name: format!("{preferred_prefix}{name}"), @@ -760,7 +746,6 @@ impl TyData { summary: None, description: None, examples: Vec::new(), - referenced_types: referenced_types.into_iter().collect(), module_name: module_name.to_owned(), } } @@ -1056,35 +1041,6 @@ impl ApplyMeta for ArgData { } } -fn collect_type_names(acc: &mut HashSet, ty: &Type) { - match ty { - Type::Primitive(primitive_type) => { - acc.insert(collect_type_names_from_primitive(primitive_type)); - } - Type::Array { ty, .. } => { - collect_type_names(acc, ty); - } - Type::Union { tys } => tys.iter().for_each(|t| { - acc.insert(collect_type_names_from_primitive(t)); - }), - Type::Object { properties } => properties.iter().for_each(|p| { - if let Some(t) = &p.type_ { - collect_type_names(acc, t) - } - }), - } -} - -fn collect_type_names_from_primitive(ty: &PrimitiveType) -> String { - match ty { - PrimitiveType::String => "string".to_owned(), - PrimitiveType::Number(_) => "number".to_owned(), - PrimitiveType::Boolean => "bool".to_owned(), - PrimitiveType::Tag => "tag".to_owned(), - PrimitiveType::Named(id) => id.name.clone(), - } -} - #[cfg(test)] mod test { use kcl_derive_docs::for_each_std_mod; diff --git a/rust/kcl-lib/src/docs/templates/array.hbs b/rust/kcl-lib/src/docs/templates/array.hbs deleted file mode 100644 index 3a1fcc1d5..000000000 --- a/rust/kcl-lib/src/docs/templates/array.hbs +++ /dev/null @@ -1 +0,0 @@ -{{~ #if maxItems ~}}{{~ #if (lte maxItems 3) ~}}`[{{#times maxItems ~}}{{~ #if @first ~}}{{else ~}}, {{/if ~}}{{> propertyType ../items}}{{/times}}]`{{else ~}}`[` {{ > propertyType items }} `]`{{~ /if ~}}{{else ~}}`[` {{ > propertyType items }} `]`{{~ /if ~}} diff --git a/rust/kcl-lib/src/docs/templates/consts-index.hbs b/rust/kcl-lib/src/docs/templates/consts-index.hbs deleted file mode 100644 index b489921d5..000000000 --- a/rust/kcl-lib/src/docs/templates/consts-index.hbs +++ /dev/null @@ -1,17 +0,0 @@ ---- -title: "KCL Constants" -excerpt: "Documentation for the KCL constants." -layout: manual ---- - -## Table of Contents - -{{#each consts}} - -### `{{name}}` - -{{#each consts}} -- [`{{name}}`](/docs/kcl/{{file_name}}) -{{/each}} -{{/each}} - diff --git a/rust/kcl-lib/src/docs/templates/index.hbs b/rust/kcl-lib/src/docs/templates/index.hbs index 40cfc6e09..f03800824 100644 --- a/rust/kcl-lib/src/docs/templates/index.hbs +++ b/rust/kcl-lib/src/docs/templates/index.hbs @@ -12,11 +12,31 @@ layout: manual * [`{{name}}`](kcl/{{file_name}}) {{/each}} -### Standard library +### Functions -{{#each modules}} -* **{{name}}** {{#each functions}} +* **{{name}}** +{{#each items}} * [`{{name}}`](kcl/{{file_name}}) {{/each}} {{/each}} + +### Constants + +{{#each consts}} +* **{{name}}** +{{#each items}} + * [`{{name}}`](kcl/{{file_name}}) +{{/each}} +{{/each}} + +### Types + +See also the [types overview](types) + +{{#each types}} +* **{{name}}** +{{#each items}} + * [`{{name}}`](kcl/{{file_name}}) +{{/each}} +{{/each}} \ No newline at end of file diff --git a/rust/kcl-lib/src/docs/templates/properties.hbs b/rust/kcl-lib/src/docs/templates/properties.hbs deleted file mode 100644 index 283f68456..000000000 --- a/rust/kcl-lib/src/docs/templates/properties.hbs +++ /dev/null @@ -1,13 +0,0 @@ -{{#if properties}} -{{#if @root.inDefinition}} -#### Properties -{{else}} -## Properties -{{/if}} - -| Property | Type | Description | Required | -|----------|------|-------------|----------| -{{#each properties}} -| `{{@key}}` | {{~ > propertyType this ~}} | {{{firstLine this.description}}} | {{#if (lookup ../required @key)}}Yes{{else}}No{{/if}} | -{{/each}} -{{/if}} diff --git a/rust/kcl-lib/src/docs/templates/propertyType.hbs b/rust/kcl-lib/src/docs/templates/propertyType.hbs deleted file mode 100644 index 1c7064831..000000000 --- a/rust/kcl-lib/src/docs/templates/propertyType.hbs +++ /dev/null @@ -1,11 +0,0 @@ -{{~ #if $ref ~}} -{{pretty_ref $ref}}{{else if anyOf ~}} -**anyOf:** {{#each anyOf}}{{> propertyType this}}{{#unless @last}} **OR** {{/unless}}{{/each}}{{else if oneOf ~}} -**oneOf:** {{#each oneOf}}{{> propertyType this}}{{#unless @last}} **OR** {{/unless}}{{/each}}{{else if allOf ~}} -**allOf:** {{#each allOf}}{{> propertyType this}}{{#unless @last}} **OR** {{/unless}}{{/each}}{{else if enum ~}} -enum: {{pretty_enum enum}}{{else if items ~}} -{{~ >array ~}}{{else ~}} -`{{type}}{{~ #if format }}{{#if neq format "double" }} ({{format}}){{~/if ~}} -{{~ /if ~}}` -{{~ #if maximum }} (**maximum:** {{maximum}}){{~/if~}}{{~ #if minimum }} (**minimum:** {{minimum}}){{~/if~}} -{{~ /if ~}} diff --git a/rust/kcl-lib/src/docs/templates/schema.hbs b/rust/kcl-lib/src/docs/templates/schema.hbs deleted file mode 100644 index 6dca717f5..000000000 --- a/rust/kcl-lib/src/docs/templates/schema.hbs +++ /dev/null @@ -1,70 +0,0 @@ -{{#if description}} -{{{description}}} -{{/if}} - -{{#if $ref}} -{{pretty_ref $ref}} -{{else if enum}} -**enum:** {{pretty_enum enum}} -{{else if type}} -**Type:** `{{type}}`{{~ #if format }} (`{{format}}`){{~/if ~}}{{~ #if maximum }} (**maximum:** {{maximum}}){{~/if~}}{{~ #if minimum }} (**minimum:** {{minimum}}){{~/if~}} -{{else}} -{{/if}} - -{{#if $schema}} -**Schema:** `{{$schema}}` -{{/if}} - -{{#if items}} -{{>array}} -{{/if}} - -{{#if anyOf}} -**This schema accepts any of the following:** - -{{#each anyOf}} -{{> schema this}} ----- -{{/each}} -{{/if}} - -{{#if oneOf}} -**This schema accepts exactly one of the following:** - -{{#each oneOf}} -{{> schema this}} ----- -{{/each}} -{{/if}} - -{{#if allOf}} -**This schema requires all of the following:** - -{{#each allOf}} -{{> schema this}} ----- -{{/each}} -{{/if}} - -{{> properties}} - -{{#if definitions}} -## Definitions - -{{#each definitions}} -### {{@key}} - -{{> schemaType this}} - -{{/each}} -{{/if}} - -{{#if examples}} -## Examples - -{{#each examples}} -```json -{{{json this}}} -``` -{{/each}} -{{/if}} diff --git a/rust/kcl-lib/src/docs/templates/schemaType.hbs b/rust/kcl-lib/src/docs/templates/schemaType.hbs deleted file mode 100644 index b28637518..000000000 --- a/rust/kcl-lib/src/docs/templates/schemaType.hbs +++ /dev/null @@ -1,19 +0,0 @@ -{{#if $ref}} -{{pretty_ref $ref}} -{{else if anyOf}} -**anyOf** -{{else if oneOf}} -**oneOf** -{{else if allOf}} -**allOf** -{{else if enum}} -**enum:** {{pretty_enum enum}} -{{else}} -`{{type}}`{{ -#if - format}} (`{{format}}`){{ -/if -}} -{{ -/if -}} diff --git a/rust/kcl-lib/src/docs/templates/type.hbs b/rust/kcl-lib/src/docs/templates/type.hbs deleted file mode 100644 index 0a1050857..000000000 --- a/rust/kcl-lib/src/docs/templates/type.hbs +++ /dev/null @@ -1,7 +0,0 @@ ---- -title: "{{title}}" -excerpt: "{{safe_yaml description}}" -layout: manual ---- - -{{> schema this}} diff --git a/rust/kcl-lib/src/execution/artifact.rs b/rust/kcl-lib/src/execution/artifact.rs index 1bfa8f2d6..07e26df39 100644 --- a/rust/kcl-lib/src/execution/artifact.rs +++ b/rust/kcl-lib/src/execution/artifact.rs @@ -15,7 +15,7 @@ use uuid::Uuid; use crate::{ errors::KclErrorDetails, parsing::ast::types::{Node, Program}, - KclError, SourceRange, + KclError, NodePath, SourceRange, }; #[cfg(test)] @@ -120,6 +120,7 @@ where #[serde(rename_all = "camelCase")] pub struct CodeRef { pub range: SourceRange, + pub node_path: NodePath, // TODO: We should implement this in Rust. #[serde(default, serialize_with = "serialize_dummy_path_to_node")] #[ts(type = "Array<[string | number, string]>")] @@ -130,6 +131,7 @@ impl CodeRef { pub fn placeholder(range: SourceRange) -> Self { Self { range, + node_path: Default::default(), path_to_node: Vec::new(), } } @@ -780,6 +782,7 @@ fn flatten_modeling_command_responses( | OkWebSocketResponseData::Export { .. } | OkWebSocketResponseData::MetricsRequest { .. } | OkWebSocketResponseData::ModelingSessionData { .. } + | OkWebSocketResponseData::Debug { .. } | OkWebSocketResponseData::Pong { .. } => {} } } @@ -824,15 +827,21 @@ fn artifacts_to_update( artifact_command: &ArtifactCommand, responses: &FnvHashMap, path_to_plane_id_map: &FnvHashMap, - _ast: &Node, + ast: &Node, exec_artifacts: &IndexMap, ) -> Result, KclError> { // TODO: Build path-to-node from artifact_command source range. Right now, // we're serializing an empty array, and the TS wrapper fills it in with the - // correct value. + // correct value based on NodePath. let path_to_node = Vec::new(); - let range = artifact_command.range; + let node_path = NodePath::from_range(ast, range).unwrap_or_default(); + let code_ref = CodeRef { + range, + node_path, + path_to_node, + }; + let uuid = artifact_command.cmd_id; let id = ArtifactId::new(uuid); @@ -854,7 +863,7 @@ fn artifacts_to_update( return Ok(vec![Artifact::Plane(Plane { id, path_ids: Vec::new(), - code_ref: CodeRef { range, path_to_node }, + code_ref, })]); } ModelingCmd::EnableSketchMode(EnableSketchMode { entity_id, .. }) => { @@ -890,7 +899,7 @@ fn artifacts_to_update( return Ok(vec![Artifact::Plane(Plane { id: entity_id.into(), path_ids, - code_ref: CodeRef { range, path_to_node }, + code_ref, })]); } } @@ -911,15 +920,15 @@ fn artifacts_to_update( seg_ids: Vec::new(), sweep_id: None, solid2d_id: None, - code_ref: CodeRef { range, path_to_node }, + code_ref, })); let plane = artifacts.get(&ArtifactId::new(*current_plane_id)); if let Some(Artifact::Plane(plane)) = plane { - let code_ref = plane.code_ref.clone(); + let plane_code_ref = plane.code_ref.clone(); return_arr.push(Artifact::Plane(Plane { id: (*current_plane_id).into(), path_ids: vec![id], - code_ref, + code_ref: plane_code_ref, })); } if let Some(Artifact::Wall(wall)) = plane { @@ -959,7 +968,7 @@ fn artifacts_to_update( surface_id: None, edge_ids: Vec::new(), edge_cut_id: None, - code_ref: CodeRef { range, path_to_node }, + code_ref, common_surface_ids: Vec::new(), })); let path = artifacts.get(&path_id); @@ -1000,7 +1009,7 @@ fn artifacts_to_update( path_id: target, surface_ids: Vec::new(), edge_ids: Vec::new(), - code_ref: CodeRef { range, path_to_node }, + code_ref, })); let path = artifacts.get(&target); if let Some(Artifact::Path(path)) = path { @@ -1028,7 +1037,7 @@ fn artifacts_to_update( })?), surface_ids: Vec::new(), edge_ids: Vec::new(), - code_ref: CodeRef { range, path_to_node }, + code_ref, })); for section_id in &loft_cmd.section_ids { let path = artifacts.get(&ArtifactId::new(*section_id)); @@ -1094,6 +1103,7 @@ fn artifacts_to_update( path_ids: Vec::new(), face_code_ref: CodeRef { range: sketch_on_face_source_range, + node_path: NodePath::from_range(ast, sketch_on_face_source_range).unwrap_or_default(), path_to_node: Vec::new(), }, cmd_id: artifact_command.cmd_id, @@ -1146,6 +1156,7 @@ fn artifacts_to_update( path_ids: Vec::new(), face_code_ref: CodeRef { range: sketch_on_face_source_range, + node_path: NodePath::from_range(ast, sketch_on_face_source_range).unwrap_or_default(), path_to_node: Vec::new(), }, cmd_id: artifact_command.cmd_id, @@ -1254,7 +1265,7 @@ fn artifacts_to_update( consumed_edge_id: cmd.edge_id.into(), edge_ids: Vec::new(), surface_id: None, - code_ref: CodeRef { range, path_to_node }, + code_ref, })); let consumed_edge = artifacts.get(&ArtifactId::new(cmd.edge_id)); if let Some(Artifact::Segment(consumed_edge)) = consumed_edge { @@ -1270,7 +1281,7 @@ fn artifacts_to_update( let return_arr = vec![Artifact::Helix(Helix { id, axis_id: None, - code_ref: CodeRef { range, path_to_node }, + code_ref, })]; return Ok(return_arr); } @@ -1279,7 +1290,7 @@ fn artifacts_to_update( let return_arr = vec![Artifact::Helix(Helix { id, axis_id: Some(edge_id), - code_ref: CodeRef { range, path_to_node }, + code_ref, })]; // We could add the reverse graph edge connecting from the edge to // the helix here, but it's not useful right now. @@ -1356,10 +1367,7 @@ fn artifacts_to_update( sub_type, solid_ids: solid_ids.clone(), tool_ids: tool_ids.clone(), - code_ref: CodeRef { - range, - path_to_node: path_to_node.clone(), - }, + code_ref: code_ref.clone(), }) }) .collect::>(); diff --git a/rust/kcl-lib/src/execution/exec_ast.rs b/rust/kcl-lib/src/execution/exec_ast.rs index e703bedb3..b6533fd11 100644 --- a/rust/kcl-lib/src/execution/exec_ast.rs +++ b/rust/kcl-lib/src/execution/exec_ast.rs @@ -2187,7 +2187,15 @@ fn assign_args_to_params_kw( .mut_stack() .add(param.identifier.name.clone(), arg_val, (¶m.identifier).into())?; } else { - let Some(unlabeled) = args.unlabeled.take() else { + // TODO: Get the actual source range. + // Part of https://github.com/KittyCAD/modeling-app/issues/6613 + let pipe_value_source_range = Default::default(); + let default_unlabeled = exec_state + .mod_local + .pipe_value + .clone() + .map(|val| Arg::new(val, pipe_value_source_range)); + let Some(unlabeled) = args.unlabeled.take().or(default_unlabeled) else { let param_name = ¶m.identifier.name; return Err(if args.labeled.contains_key(param_name) { KclError::Semantic(KclErrorDetails { diff --git a/rust/kcl-lib/src/execution/geometry.rs b/rust/kcl-lib/src/execution/geometry.rs index 6aeaed19c..5385addac 100644 --- a/rust/kcl-lib/src/execution/geometry.rs +++ b/rust/kcl-lib/src/execution/geometry.rs @@ -8,12 +8,11 @@ use parse_display::{Display, FromStr}; use schemars::JsonSchema; use serde::{Deserialize, Serialize}; -use crate::engine::{PlaneName, DEFAULT_PLANE_INFO}; -use crate::errors::KclErrorDetails; #[cfg(feature = "artifact-graph")] use crate::execution::ArtifactId; use crate::{ - errors::KclError, + engine::{PlaneName, DEFAULT_PLANE_INFO}, + errors::{KclError, KclErrorDetails}, execution::{types::NumericType, ExecState, ExecutorContext, Metadata, TagEngineInfo, TagIdentifier, UnitLen}, parsing::ast::types::{Node, NodeRef, TagDeclarator, TagNode}, std::{args::TyF64, sketch::PlaneData}, diff --git a/rust/kcl-lib/src/execution/mod.rs b/rust/kcl-lib/src/execution/mod.rs index 5bd51ef47..d9686ec1c 100644 --- a/rust/kcl-lib/src/execution/mod.rs +++ b/rust/kcl-lib/src/execution/mod.rs @@ -1298,16 +1298,16 @@ mod tests { #[tokio::test(flavor = "multi_thread")] async fn test_execute_fn_definitions() { - let ast = r#"fn def(x) { + let ast = r#"fn def(@x) { return x } -fn ghi(x) { +fn ghi(@x) { return x } -fn jkl(x) { +fn jkl(@x) { return x } -fn hmm(x) { +fn hmm(@x) { return x } @@ -1408,7 +1408,7 @@ firstExtrude = startSketchOn(XY) l = 8 h = 10 -fn thing(x) { +fn thing(@x) { return -x } @@ -1429,7 +1429,7 @@ firstExtrude = startSketchOn(XY) l = 8 h = 10 -fn thing(x) { +fn thing(@x) { return [0, -x] } @@ -1450,11 +1450,11 @@ firstExtrude = startSketchOn(XY) l = 8 h = 10 -fn other_thing(y) { +fn other_thing(@y) { return -y } -fn thing(x) { +fn thing(@x) { return other_thing(x) } @@ -1483,14 +1483,14 @@ firstExtrude = startSketchOn(XY) return myBox } -fnBox = box(3, 6, 10)"#; +fnBox = box(h = 3, l = 6, w = 10)"#; parse_execute(ast).await.unwrap(); } #[tokio::test(flavor = "multi_thread")] async fn test_get_member_of_object_with_function_period() { - let ast = r#"fn box(obj) { + let ast = r#"fn box(@obj) { myBox = startSketchOn(XY) |> startProfile(at = obj.start) |> line(end = [0, obj.l]) @@ -1577,7 +1577,7 @@ for var in [[3, 6, 10, [0,0]], [1.5, 3, 5, [-10,-10]]] { #[tokio::test(flavor = "multi_thread")] async fn test_get_member_of_array_with_function() { - let ast = r#"fn box(arr) { + let ast = r#"fn box(@arr) { myBox =startSketchOn(XY) |> startProfile(at = arr[0]) |> line(end = [0, arr[1]]) @@ -1623,7 +1623,7 @@ answer = returnX()"#; #[tokio::test(flavor = "multi_thread")] async fn type_aliases() { let text = r#"type MyTy = [number; 2] -fn foo(x: MyTy) { +fn foo(@x: MyTy) { return x[0] } @@ -1783,7 +1783,7 @@ fn check(x) { assertIs(!x, error = "expected argument to be false") return true } -check(false) +check(x = false) "#; let result = parse_execute(ast).await.unwrap(); assert_eq!( @@ -1961,7 +1961,7 @@ bracket = startSketchOn(XY) #[tokio::test(flavor = "multi_thread")] async fn test_execute_function_no_return() { - let ast = r#"fn test(origin) { + let ast = r#"fn test(@origin) { origin } @@ -2154,7 +2154,7 @@ w = f() + f() #[tokio::test(flavor = "multi_thread")] async fn read_tag_version() { - let ast = r#"fn bar(t) { + let ast = r#"fn bar(@t) { return startSketchOn(XY) |> startProfile(at = [0,0]) |> angledLine( diff --git a/rust/kcl-lib/src/lib.rs b/rust/kcl-lib/src/lib.rs index b801ff322..9c6302e67 100644 --- a/rust/kcl-lib/src/lib.rs +++ b/rust/kcl-lib/src/lib.rs @@ -95,7 +95,7 @@ pub use lsp::{ kcl::{Backend as KclLspBackend, Server as KclLspServerSubCommand}, }; pub use modules::ModuleId; -pub use parsing::ast::types::FormatOptions; +pub use parsing::ast::types::{FormatOptions, NodePath}; pub use settings::types::{project::ProjectConfiguration, Configuration, UnitLength}; pub use source_range::SourceRange; #[cfg(not(target_arch = "wasm32"))] @@ -236,6 +236,10 @@ impl Program { self.ast.lint(rule) } + pub fn node_path_from_range(&self, range: SourceRange) -> Option { + NodePath::from_range(&self.ast, range) + } + pub fn recast(&self) -> String { // Use the default options until we integrate into the UI the ability to change them. self.ast.recast(&Default::default(), 0) diff --git a/rust/kcl-lib/src/lint/checks/default_plane.rs b/rust/kcl-lib/src/lint/checks/default_plane.rs index 90b18f6d4..267cb971e 100644 --- a/rust/kcl-lib/src/lint/checks/default_plane.rs +++ b/rust/kcl-lib/src/lint/checks/default_plane.rs @@ -2,13 +2,14 @@ use anyhow::Result; use crate::{ errors::Suggestion, - lint::rule::{def_finding, Discovered, Finding}, + lint::{ + checks::offset_plane::start_sketch_on_check_specific_plane, + rule::{def_finding, Discovered, Finding}, + }, parsing::ast::types::{Node as AstNode, Program}, walk::Node, }; -use super::offset_plane::start_sketch_on_check_specific_plane; - def_finding!( Z0002, "default plane should be called versus explicitly defined", diff --git a/rust/kcl-lib/src/lint/checks/offset_plane.rs b/rust/kcl-lib/src/lint/checks/offset_plane.rs index fa5d670bd..67f7d49d1 100644 --- a/rust/kcl-lib/src/lint/checks/offset_plane.rs +++ b/rust/kcl-lib/src/lint/checks/offset_plane.rs @@ -5,7 +5,10 @@ use crate::{ errors::Suggestion, execution::{types::UnitLen, PlaneInfo, Point3d}, lint::rule::{def_finding, Discovered, Finding}, - parsing::ast::types::{BinaryPart, Expr, LiteralValue, Node as AstNode, ObjectExpression, Program, UnaryOperator}, + parsing::ast::types::{ + BinaryPart, CallExpression, CallExpressionKw, Expr, LiteralValue, Node as AstNode, ObjectExpression, Program, + UnaryOperator, + }, walk::Node, SourceRange, }; @@ -124,10 +127,16 @@ fn get_offset(info: &PlaneInfo) -> Option { } pub fn start_sketch_on_check_specific_plane(node: Node) -> Result> { - let Node::CallExpression(call) = node else { - return Ok(None); - }; + match node { + Node::CallExpression(node) => start_sketch_on_check_specific_plane_pos(node), + Node::CallExpressionKw(node) => start_sketch_on_check_specific_plane_kw(node), + _ => Ok(None), + } +} +pub fn start_sketch_on_check_specific_plane_pos( + call: &AstNode, +) -> Result> { if call.inner.callee.inner.name.name != "startSketchOn" { return Ok(None); } @@ -147,7 +156,34 @@ pub fn start_sketch_on_check_specific_plane(node: Node) -> Result, +) -> Result> { + if call.inner.callee.inner.name.name != "startSketchOn" { + return Ok(None); + } + + let Some(ref unlabeled) = call.inner.unlabeled else { + // we only look for single-argument object patterns, if there's more + // than that we don't have a plane decl + return Ok(None); + }; + + let call_source_range = SourceRange::new(unlabeled.start(), unlabeled.end(), unlabeled.module_id()); + + let Expr::ObjectExpression(arg) = &unlabeled else { + return Ok(None); + }; + common(arg, call_source_range) +} + +pub fn common( + arg: &AstNode, + call_source_range: SourceRange, +) -> Result> { let mut origin: Option = None; let mut x_vec: Option = None; let mut y_vec: Option = None; diff --git a/rust/kcl-lib/src/lsp/kcl/mod.rs b/rust/kcl-lib/src/lsp/kcl/mod.rs index 9f46643b4..90b09e802 100644 --- a/rust/kcl-lib/src/lsp/kcl/mod.rs +++ b/rust/kcl-lib/src/lsp/kcl/mod.rs @@ -18,23 +18,24 @@ use tower_lsp::{ jsonrpc::Result as RpcResult, lsp_types::{ CodeAction, CodeActionKind, CodeActionOptions, CodeActionOrCommand, CodeActionParams, - CodeActionProviderCapability, CodeActionResponse, CompletionItem, CompletionItemKind, CompletionOptions, - CompletionParams, CompletionResponse, CreateFilesParams, DeleteFilesParams, Diagnostic, DiagnosticOptions, + CodeActionProviderCapability, CodeActionResponse, ColorInformation, ColorPresentation, ColorPresentationParams, + ColorProviderCapability, CompletionItem, CompletionItemKind, CompletionOptions, CompletionParams, + CompletionResponse, CreateFilesParams, DeleteFilesParams, Diagnostic, DiagnosticOptions, DiagnosticServerCapabilities, DiagnosticSeverity, DidChangeConfigurationParams, DidChangeTextDocumentParams, DidChangeWatchedFilesParams, DidChangeWorkspaceFoldersParams, DidCloseTextDocumentParams, - DidOpenTextDocumentParams, DidSaveTextDocumentParams, DocumentDiagnosticParams, DocumentDiagnosticReport, - DocumentDiagnosticReportResult, DocumentFilter, DocumentFormattingParams, DocumentSymbol, DocumentSymbolParams, - DocumentSymbolResponse, Documentation, FoldingRange, FoldingRangeParams, FoldingRangeProviderCapability, - FullDocumentDiagnosticReport, Hover as LspHover, HoverContents, HoverParams, HoverProviderCapability, - InitializeParams, InitializeResult, InitializedParams, InlayHint, InlayHintParams, InsertTextFormat, - MarkupContent, MarkupKind, MessageType, OneOf, Position, RelatedFullDocumentDiagnosticReport, - RenameFilesParams, RenameParams, SemanticToken, SemanticTokenModifier, SemanticTokenType, SemanticTokens, - SemanticTokensFullOptions, SemanticTokensLegend, SemanticTokensOptions, SemanticTokensParams, - SemanticTokensRegistrationOptions, SemanticTokensResult, SemanticTokensServerCapabilities, ServerCapabilities, - SignatureHelp, SignatureHelpOptions, SignatureHelpParams, StaticRegistrationOptions, TextDocumentItem, - TextDocumentRegistrationOptions, TextDocumentSyncCapability, TextDocumentSyncKind, TextDocumentSyncOptions, - TextEdit, WorkDoneProgressOptions, WorkspaceEdit, WorkspaceFolder, WorkspaceFoldersServerCapabilities, - WorkspaceServerCapabilities, + DidOpenTextDocumentParams, DidSaveTextDocumentParams, DocumentColorParams, DocumentDiagnosticParams, + DocumentDiagnosticReport, DocumentDiagnosticReportResult, DocumentFilter, DocumentFormattingParams, + DocumentSymbol, DocumentSymbolParams, DocumentSymbolResponse, Documentation, FoldingRange, FoldingRangeParams, + FoldingRangeProviderCapability, FullDocumentDiagnosticReport, Hover as LspHover, HoverContents, HoverParams, + HoverProviderCapability, InitializeParams, InitializeResult, InitializedParams, InlayHint, InlayHintParams, + InsertTextFormat, MarkupContent, MarkupKind, MessageType, OneOf, Position, PrepareRenameResponse, + RelatedFullDocumentDiagnosticReport, RenameFilesParams, RenameParams, SemanticToken, SemanticTokenModifier, + SemanticTokenType, SemanticTokens, SemanticTokensFullOptions, SemanticTokensLegend, SemanticTokensOptions, + SemanticTokensParams, SemanticTokensRegistrationOptions, SemanticTokensResult, + SemanticTokensServerCapabilities, ServerCapabilities, SignatureHelp, SignatureHelpOptions, SignatureHelpParams, + StaticRegistrationOptions, TextDocumentItem, TextDocumentPositionParams, TextDocumentRegistrationOptions, + TextDocumentSyncCapability, TextDocumentSyncKind, TextDocumentSyncOptions, TextEdit, WorkDoneProgressOptions, + WorkspaceEdit, WorkspaceFolder, WorkspaceFoldersServerCapabilities, WorkspaceServerCapabilities, }, Client, LanguageServer, }; @@ -532,6 +533,23 @@ impl Backend { return Ok(false); } } + crate::walk::Node::CallExpressionKw(call_expr) => { + let sr: SourceRange = (&call_expr.callee).into(); + if sr.contains(source_range.start()) { + let mut ti = token_index.lock().map_err(|_| anyhow::anyhow!("mutex"))?; + *ti = match self.get_semantic_token_type_index(&SemanticTokenType::FUNCTION) { + Some(index) => index, + None => token_type_index, + }; + + if self.stdlib_completions.contains_key(&call_expr.callee.name.name) { + // This is a stdlib function. + return get_modifier(vec![SemanticTokenModifier::DEFAULT_LIBRARY]); + } + + return Ok(false); + } + } _ => {} } Ok(true) @@ -827,6 +845,39 @@ impl Backend { Ok(custom_notifications::UpdateCanExecuteResponse {}) } + + /// Returns the new string for the code after rename. + pub fn inner_prepare_rename( + &self, + params: &TextDocumentPositionParams, + new_name: &str, + ) -> RpcResult> { + let filename = params.text_document.uri.to_string(); + + let Some(current_code) = self.code_map.get(&filename) else { + return Ok(None); + }; + let Ok(current_code) = std::str::from_utf8(¤t_code) else { + return Ok(None); + }; + + // Parse the ast. + // I don't know if we need to do this again since it should be updated in the context. + // But I figure better safe than sorry since this will write back out to the file. + let module_id = ModuleId::default(); + let Ok(mut ast) = crate::parsing::parse_str(current_code, module_id).parse_errs_as_err() else { + return Ok(None); + }; + + // Let's convert the position to a character index. + let pos = position_to_char_index(params.position, current_code); + // Now let's perform the rename on the ast. + ast.rename_symbol(new_name, pos); + // Now recast it. + let recast = ast.recast(&Default::default(), 0); + + Ok(Some((current_code.to_string(), recast))) + } } #[tower_lsp::async_trait] @@ -838,6 +889,7 @@ impl LanguageServer for Backend { Ok(InitializeResult { capabilities: ServerCapabilities { + color_provider: Some(ColorProviderCapability::Simple(true)), code_action_provider: Some(CodeActionProviderCapability::Options(CodeActionOptions { code_action_kinds: Some(vec![CodeActionKind::QUICKFIX]), resolve_provider: Some(false), @@ -1459,36 +1511,19 @@ impl LanguageServer for Backend { } async fn rename(&self, params: RenameParams) -> RpcResult> { - let filename = params.text_document_position.text_document.uri.to_string(); - - let Some(current_code) = self.code_map.get(&filename) else { - return Ok(None); - }; - let Ok(current_code) = std::str::from_utf8(¤t_code) else { + let Some((current_code, new_code)) = + self.inner_prepare_rename(¶ms.text_document_position, ¶ms.new_name)? + else { return Ok(None); }; - // Parse the ast. - // I don't know if we need to do this again since it should be updated in the context. - // But I figure better safe than sorry since this will write back out to the file. - let module_id = ModuleId::default(); - let Ok(mut ast) = crate::parsing::parse_str(current_code, module_id).parse_errs_as_err() else { - return Ok(None); - }; - - // Let's convert the position to a character index. - let pos = position_to_char_index(params.text_document_position.position, current_code); - // Now let's perform the rename on the ast. - ast.rename_symbol(¶ms.new_name, pos); - // Now recast it. - let recast = ast.recast(&Default::default(), 0); - let source_range = SourceRange::new(0, current_code.len(), module_id); - let range = source_range.to_lsp_range(current_code); + let source_range = SourceRange::new(0, current_code.len(), ModuleId::default()); + let range = source_range.to_lsp_range(¤t_code); Ok(Some(WorkspaceEdit { changes: Some(HashMap::from([( params.text_document_position.text_document.uri, vec![TextEdit { - new_text: recast, + new_text: new_code, range, }], )])), @@ -1497,6 +1532,18 @@ impl LanguageServer for Backend { })) } + async fn prepare_rename(&self, params: TextDocumentPositionParams) -> RpcResult> { + if self + .inner_prepare_rename(¶ms, "someNameNoOneInTheirRightMindWouldEverUseForTesting")? + .is_none() + { + return Ok(None); + } + + // Return back to the client, that it is safe to use the rename behavior. + Ok(Some(PrepareRenameResponse::DefaultBehavior { default_behavior: true })) + } + async fn folding_range(&self, params: FoldingRangeParams) -> RpcResult>> { let filename = params.text_document.uri.to_string(); @@ -1552,6 +1599,55 @@ impl LanguageServer for Backend { Ok(Some(actions)) } + + async fn document_color(&self, params: DocumentColorParams) -> RpcResult> { + let filename = params.text_document.uri.to_string(); + + let Some(current_code) = self.code_map.get(&filename) else { + return Ok(vec![]); + }; + let Ok(current_code) = std::str::from_utf8(¤t_code) else { + return Ok(vec![]); + }; + + // Get the ast from our map. + let Some(ast) = self.ast_map.get(&filename) else { + return Ok(vec![]); + }; + + // Get the colors from the ast. + let Ok(colors) = ast.ast.document_color(current_code) else { + return Ok(vec![]); + }; + + Ok(colors) + } + + async fn color_presentation(&self, params: ColorPresentationParams) -> RpcResult> { + let filename = params.text_document.uri.to_string(); + + let Some(current_code) = self.code_map.get(&filename) else { + return Ok(vec![]); + }; + let Ok(current_code) = std::str::from_utf8(¤t_code) else { + return Ok(vec![]); + }; + + // Get the ast from our map. + let Some(ast) = self.ast_map.get(&filename) else { + return Ok(vec![]); + }; + + let pos_start = position_to_char_index(params.range.start, current_code); + let pos_end = position_to_char_index(params.range.end, current_code); + + // Get the colors from the ast. + let Ok(Some(presentation)) = ast.ast.color_presentation(¶ms.color, pos_start, pos_end) else { + return Ok(vec![]); + }; + + Ok(vec![presentation]) + } } /// Get completions from our stdlib. @@ -1662,3 +1758,48 @@ async fn with_cached_var(name: &str, f: impl Fn(&KclValue) -> T) -> Option Some(f(value)) } + +#[cfg(test)] +mod tests { + use pretty_assertions::assert_eq; + + use super::*; + + #[test] + fn test_position_to_char_index_first_line() { + let code = r#"def foo(): +return 42"#; + let position = Position::new(0, 3); + let index = position_to_char_index(position, code); + assert_eq!(index, 3); + } + + #[test] + fn test_position_to_char_index() { + let code = r#"def foo(): +return 42"#; + let position = Position::new(1, 4); + let index = position_to_char_index(position, code); + assert_eq!(index, 15); + } + + #[test] + fn test_position_to_char_index_with_newline() { + let code = r#"def foo(): + +return 42"#; + let position = Position::new(2, 0); + let index = position_to_char_index(position, code); + assert_eq!(index, 12); + } + + #[test] + fn test_position_to_char_at_end() { + let code = r#"def foo(): +return 42"#; + + let position = Position::new(1, 8); + let index = position_to_char_index(position, code); + assert_eq!(index, 19); + } +} diff --git a/rust/kcl-lib/src/lsp/tests.rs b/rust/kcl-lib/src/lsp/tests.rs index 0883fa059..3c659a7c8 100644 --- a/rust/kcl-lib/src/lsp/tests.rs +++ b/rust/kcl-lib/src/lsp/tests.rs @@ -3,8 +3,8 @@ use std::collections::{BTreeMap, HashMap}; use pretty_assertions::assert_eq; use tower_lsp::{ lsp_types::{ - CodeActionKind, CodeActionOrCommand, Diagnostic, SemanticTokenModifier, SemanticTokenType, TextEdit, - WorkspaceEdit, + CodeActionKind, CodeActionOrCommand, Diagnostic, PrepareRenameResponse, SemanticTokenModifier, + SemanticTokenType, TextEdit, WorkspaceEdit, }, LanguageServer, }; @@ -895,7 +895,7 @@ async fn test_kcl_lsp_on_hover() { foo = 42 foo -fn bar(x: string): string { +fn bar(@x: string): string { return x } @@ -971,7 +971,7 @@ startSketchOn(XY) match hover.unwrap().contents { tower_lsp::lsp_types::HoverContents::Markup(tower_lsp::lsp_types::MarkupContent { value, .. }) => { - assert!(value.contains("bar(x: string): string")); + assert!(value.contains("bar(@x: string): string")); } _ => unreachable!(), } @@ -1016,7 +1016,7 @@ startSketchOn(XY) match hover.unwrap().contents { tower_lsp::lsp_types::HoverContents::Markup(tower_lsp::lsp_types::MarkupContent { value, .. }) => { - assert!(value.contains("end?: [number]")); + assert!(value.contains("end?: Point2d")); assert!(value.contains("How far away (along the X and Y axes) should this line go?")); } _ => unreachable!(), @@ -2027,7 +2027,7 @@ insideRevolve = startSketchOn(XZ) |> line(end = [0, -thickness]) |> line(end = [-overHangLength, 0]) |> close() - |> revolve({ axis = Y }, %) + |> revolve(axis = Y) // Sketch and revolve one of the balls and duplicate it using a circular pattern. (This is currently a workaround, we have a bug with rotating on a sketch that touches the rotation axis) sphere = startSketchOn(XZ) @@ -2035,7 +2035,7 @@ sphere = startSketchOn(XZ) |> line(end = [sphereDia - 0.1, 0]) |> arc(angle_start = 0, angle_end = -180, radius = sphereDia / 2 - 0.05) |> close() - |> revolve({ axis = X }, %) + |> revolve(axis = X) |> patternCircular3d( axis = [0, 0, 1], center = [0, 0, 0], @@ -2056,7 +2056,7 @@ outsideRevolve = startSketchOn(XZ) |> line(end = [0, thickness]) |> line(end = [overHangLength - thickness, 0]) |> close() - |> revolve({ axis = Y }, %)"# + |> revolve(axis = Y)"# .to_string(), }, }) @@ -2090,7 +2090,7 @@ outsideRevolve = startSketchOn(XZ) start: tower_lsp::lsp_types::Position { line: 0, character: 0 }, end: tower_lsp::lsp_types::Position { line: 50, - character: 29 + character: 22 } } ); @@ -2117,7 +2117,7 @@ insideRevolve = startSketchOn(XZ) |> line(end = [0, -thickness]) |> line(end = [-overHangLength, 0]) |> close() - |> revolve({ axis = Y }, %) + |> revolve(axis = Y) // Sketch and revolve one of the balls and duplicate it using a circular pattern. (This is currently a workaround, we have a bug with rotating on a sketch that touches the rotation axis) sphere = startSketchOn(XZ) @@ -2128,7 +2128,7 @@ sphere = startSketchOn(XZ) |> line(end = [sphereDia - 0.1, 0]) |> arc(angle_start = 0, angle_end = -180, radius = sphereDia / 2 - 0.05) |> close() - |> revolve({ axis = X }, %) + |> revolve(axis = X) |> patternCircular3d( axis = [0, 0, 1], center = [0, 0, 0], @@ -2152,7 +2152,7 @@ outsideRevolve = startSketchOn(XZ) |> line(end = [0, thickness]) |> line(end = [overHangLength - thickness, 0]) |> close() - |> revolve({ axis = Y }, %)"# + |> revolve(axis = Y)"# ); } @@ -3891,7 +3891,7 @@ async fn test_kcl_lsp_on_hover_untitled_file_scheme() { foo = 42 foo -fn bar(x: string): string { +fn bar(@x: string): string { return x } @@ -3967,7 +3967,7 @@ startSketchOn(XY) match hover.unwrap().contents { tower_lsp::lsp_types::HoverContents::Markup(tower_lsp::lsp_types::MarkupContent { value, .. }) => { - assert!(value.contains("bar(x: string): string")); + assert!(value.contains("bar(@x: string): string")); } _ => unreachable!(), } @@ -4012,7 +4012,7 @@ startSketchOn(XY) match hover.unwrap().contents { tower_lsp::lsp_types::HoverContents::Markup(tower_lsp::lsp_types::MarkupContent { value, .. }) => { - assert!(value.contains("end?: [number]")); + assert!(value.contains("end?: Point2d")); assert!(value.contains("How far away (along the X and Y axes) should this line go?")); } _ => unreachable!(), @@ -4146,3 +4146,173 @@ async fn kcl_test_kcl_lsp_code_actions_lint_offset_planes() { }) ); } + +#[tokio::test(flavor = "multi_thread")] +async fn test_kcl_lsp_prepare_rename() { + let server = kcl_lsp_server(false).await.unwrap(); + + // Send open file. + server + .did_open(tower_lsp::lsp_types::DidOpenTextDocumentParams { + text_document: tower_lsp::lsp_types::TextDocumentItem { + uri: "file:///test.kcl".try_into().unwrap(), + language_id: "kcl".to_string(), + version: 1, + text: r#"thing= 1"#.to_string(), + }, + }) + .await; + + // Send rename request. + let result = server + .prepare_rename(tower_lsp::lsp_types::TextDocumentPositionParams { + text_document: tower_lsp::lsp_types::TextDocumentIdentifier { + uri: "file:///test.kcl".try_into().unwrap(), + }, + position: tower_lsp::lsp_types::Position { line: 0, character: 2 }, + }) + .await + .unwrap() + .unwrap(); + + // Check the result. + assert_eq!( + result, + PrepareRenameResponse::DefaultBehavior { default_behavior: true } + ); +} + +#[tokio::test(flavor = "multi_thread")] +async fn test_kcl_lsp_document_color() { + let server = kcl_lsp_server(false).await.unwrap(); + + // Send open file. + server + .did_open(tower_lsp::lsp_types::DidOpenTextDocumentParams { + text_document: tower_lsp::lsp_types::TextDocumentItem { + uri: "file:///test.kcl".try_into().unwrap(), + language_id: "kcl".to_string(), + version: 1, + text: r#"// Add color to a revolved solid. +sketch001 = startSketchOn(XY) + |> circle(center = [15, 0], radius = 5) + |> revolve(angle = 360, axis = Y) + |> appearance(color = '#ff0000', metalness = 90, roughness = 90)"# + .to_string(), + }, + }) + .await; + + // Send document color request. + let result = server + .document_color(tower_lsp::lsp_types::DocumentColorParams { + text_document: tower_lsp::lsp_types::TextDocumentIdentifier { + uri: "file:///test.kcl".try_into().unwrap(), + }, + work_done_progress_params: Default::default(), + partial_result_params: Default::default(), + }) + .await + .unwrap(); + + // Check the result. + assert_eq!( + result, + vec![tower_lsp::lsp_types::ColorInformation { + range: tower_lsp::lsp_types::Range { + start: tower_lsp::lsp_types::Position { line: 4, character: 24 }, + end: tower_lsp::lsp_types::Position { line: 4, character: 33 }, + }, + color: tower_lsp::lsp_types::Color { + red: 1.0, + green: 0.0, + blue: 0.0, + alpha: 1.0, + }, + }] + ); +} + +#[tokio::test(flavor = "multi_thread")] +async fn test_kcl_lsp_color_presentation() { + let server = kcl_lsp_server(false).await.unwrap(); + + let text = r#"// Add color to a revolved solid. +sketch001 = startSketchOn(XY) + |> circle(center = [15, 0], radius = 5) + |> revolve(angle = 360, axis = Y) + |> appearance(color = '#ff0000', metalness = 90, roughness = 90)"#; + + // Send open file. + server + .did_open(tower_lsp::lsp_types::DidOpenTextDocumentParams { + text_document: tower_lsp::lsp_types::TextDocumentItem { + uri: "file:///test.kcl".try_into().unwrap(), + language_id: "kcl".to_string(), + version: 1, + text: text.to_string(), + }, + }) + .await; + + // Send document color request. + let result = server + .document_color(tower_lsp::lsp_types::DocumentColorParams { + text_document: tower_lsp::lsp_types::TextDocumentIdentifier { + uri: "file:///test.kcl".try_into().unwrap(), + }, + work_done_progress_params: Default::default(), + partial_result_params: Default::default(), + }) + .await + .unwrap(); + + // Check the result. + assert_eq!( + result, + vec![tower_lsp::lsp_types::ColorInformation { + range: tower_lsp::lsp_types::Range { + start: tower_lsp::lsp_types::Position { line: 4, character: 24 }, + end: tower_lsp::lsp_types::Position { line: 4, character: 33 }, + }, + color: tower_lsp::lsp_types::Color { + red: 1.0, + green: 0.0, + blue: 0.0, + alpha: 1.0, + }, + }] + ); + + // Send color presentation request. + let result = server + .color_presentation(tower_lsp::lsp_types::ColorPresentationParams { + text_document: tower_lsp::lsp_types::TextDocumentIdentifier { + uri: "file:///test.kcl".try_into().unwrap(), + }, + range: tower_lsp::lsp_types::Range { + start: tower_lsp::lsp_types::Position { line: 4, character: 24 }, + end: tower_lsp::lsp_types::Position { line: 4, character: 33 }, + }, + color: tower_lsp::lsp_types::Color { + red: 1.0, + green: 0.0, + blue: 1.0, + alpha: 1.0, + }, + work_done_progress_params: Default::default(), + partial_result_params: Default::default(), + }) + .await + .unwrap(); + + // Check the result. + assert_eq!( + result, + vec![tower_lsp::lsp_types::ColorPresentation { + label: "#ff00ff".to_string(), + text_edit: None, + additional_text_edits: None, + }] + ); +} diff --git a/rust/kcl-lib/src/parsing/ast/digest.rs b/rust/kcl-lib/src/parsing/ast/digest.rs index f2d27661e..96bceee1e 100644 --- a/rust/kcl-lib/src/parsing/ast/digest.rs +++ b/rust/kcl-lib/src/parsing/ast/digest.rs @@ -529,13 +529,13 @@ mod test { async fn test_parse_digest() { let prog1_string = r#"startSketchOn(XY) |> startProfile(at = [0, 0]) - |> line([5, 5], %) + |> line([5, 5]) "#; let prog1_digest = crate::parsing::top_level_parse(prog1_string).unwrap().compute_digest(); let prog2_string = r#"startSketchOn(XY) |> startProfile(at = [0, 2]) - |> line([5, 5], %) + |> line([5, 5]) "#; let prog2_digest = crate::parsing::top_level_parse(prog2_string).unwrap().compute_digest(); @@ -543,7 +543,7 @@ mod test { let prog3_string = r#"startSketchOn(XY) |> startProfile(at = [0, 0]) - |> line([5, 5], %) + |> line([5, 5]) "#; let prog3_digest = crate::parsing::top_level_parse(prog3_string).unwrap().compute_digest(); diff --git a/rust/kcl-lib/src/parsing/ast/types/literal_value.rs b/rust/kcl-lib/src/parsing/ast/types/literal_value.rs index 4b0304603..acd753a79 100644 --- a/rust/kcl-lib/src/parsing/ast/types/literal_value.rs +++ b/rust/kcl-lib/src/parsing/ast/types/literal_value.rs @@ -1,4 +1,4 @@ -use std::fmt; +use std::{fmt, str::FromStr}; use schemars::JsonSchema; use serde::{Deserialize, Serialize}; @@ -32,6 +32,21 @@ impl LiteralValue { _ => None, } } + + pub fn is_color(&self) -> Option { + if let Self::String(s) = self { + // Check if the string is a color. + if s.starts_with('#') && s.len() == 7 { + let Ok(c) = csscolorparser::Color::from_str(s) else { + return None; + }; + + return Some(c); + } + } + + None + } } impl fmt::Display for LiteralValue { diff --git a/rust/kcl-lib/src/parsing/ast/types/mod.rs b/rust/kcl-lib/src/parsing/ast/types/mod.rs index 73b3bca13..7da4e0631 100644 --- a/rust/kcl-lib/src/parsing/ast/types/mod.rs +++ b/rust/kcl-lib/src/parsing/ast/types/mod.rs @@ -11,10 +11,12 @@ use std::{ use anyhow::Result; use parse_display::{Display, FromStr}; +pub use path::NodePath; use schemars::JsonSchema; use serde::{Deserialize, Serialize}; use tower_lsp::lsp_types::{ - CompletionItem, CompletionItemKind, DocumentSymbol, FoldingRange, FoldingRangeKind, SymbolKind, + Color, ColorInformation, ColorPresentation, CompletionItem, CompletionItemKind, DocumentSymbol, FoldingRange, + FoldingRangeKind, SymbolKind, }; pub use crate::parsing::ast::types::{ @@ -34,6 +36,7 @@ use crate::{ mod condition; mod literal_value; mod none; +mod path; #[derive(Debug)] pub enum Definition<'a> { @@ -158,6 +161,10 @@ impl Node { self.start <= pos && pos <= self.end } + pub(crate) fn contains_range(&self, range: &SourceRange) -> bool { + self.as_source_range().contains_range(range) + } + pub fn map(self, f: impl Fn(T) -> U) -> Node { Node { inner: f(self.inner), @@ -389,6 +396,99 @@ impl Node { true } + + /// Find all the color strings in the program. + /// For example `appearance(color = "#ff0000")` + /// This is to fulfill the `documentColor` request in LSP. + pub fn document_color<'a>(&'a self, code: &str) -> Result> { + let colors = Rc::new(RefCell::new(vec![])); + + let add_color = |literal: &Node| { + // Check if the string is a color. + if let Some(c) = literal.value.is_color() { + let color = ColorInformation { + range: literal.as_source_range().to_lsp_range(code), + color: tower_lsp::lsp_types::Color { + red: c.r, + green: c.g, + blue: c.b, + alpha: c.a, + }, + }; + if colors.borrow().iter().any(|c| *c == color) { + return; + } + colors.borrow_mut().push(color); + } + }; + + // The position must be within the variable declaration. + crate::walk::walk(self, |node: crate::walk::Node<'a>| { + match node { + crate::walk::Node::CallExpressionKw(call) => { + if call.inner.callee.inner.name.inner.name == "appearance" { + for arg in &call.arguments { + if arg.label.inner.name == "color" { + // Get the value of the argument. + if let Expr::Literal(literal) = &arg.arg { + add_color(literal); + } + } + } + } + } + crate::walk::Node::Literal(literal) => { + // Check if the literal is a color. + add_color(literal); + } + _ => { + // Do nothing. + } + } + Ok::(true) + })?; + + let colors = colors.take(); + Ok(colors) + } + + /// This is to fulfill the `colorPresentation` request in LSP. + pub fn color_presentation<'a>( + &'a self, + color: &Color, + pos_start: usize, + pos_end: usize, + ) -> Result> { + let found = Rc::new(RefCell::new(false)); + // Find the literal with the same start and end. + crate::walk::walk(self, |node: crate::walk::Node<'a>| { + match node { + crate::walk::Node::Literal(literal) => { + if literal.start == pos_start && literal.end == pos_end && literal.value.is_color().is_some() { + found.replace(true); + return Ok(true); + } + } + _ => { + // Do nothing. + } + } + Ok::(true) + })?; + + let found = found.take(); + if !found { + return Ok(None); + } + + let new_color = csscolorparser::Color::new(color.red, color.green, color.blue, color.alpha); + Ok(Some(ColorPresentation { + // The label will be what they replace the color with. + label: new_color.to_hex_string(), + text_edit: None, + additional_text_edits: None, + })) + } } impl Program { @@ -724,6 +824,11 @@ impl BodyItem { } } + pub(crate) fn contains_range(&self, range: &SourceRange) -> bool { + let item_range = SourceRange::from(self); + item_range.contains_range(range) + } + pub(crate) fn set_attrs(&mut self, attr: NodeList) { match self { BodyItem::ImportStatement(node) => node.outer_attrs = attr, @@ -951,6 +1056,11 @@ impl Expr { } } + fn contains_range(&self, range: &SourceRange) -> bool { + let expr_range = SourceRange::from(self); + expr_range.contains_range(range) + } + /// Rename all identifiers that have the old name to the new given name. fn rename_identifiers(&mut self, old_name: &str, new_name: &str) { match self { @@ -1068,6 +1178,21 @@ impl From<&Expr> for SourceRange { } } +impl From<&BinaryPart> for Expr { + fn from(value: &BinaryPart) -> Self { + match value { + BinaryPart::Literal(literal) => Expr::Literal(literal.clone()), + BinaryPart::Name(name) => Expr::Name(name.clone()), + BinaryPart::BinaryExpression(binary_expression) => Expr::BinaryExpression(binary_expression.clone()), + BinaryPart::CallExpression(call_expression) => Expr::CallExpression(call_expression.clone()), + BinaryPart::CallExpressionKw(call_expression) => Expr::CallExpressionKw(call_expression.clone()), + BinaryPart::UnaryExpression(unary_expression) => Expr::UnaryExpression(unary_expression.clone()), + BinaryPart::MemberExpression(member_expression) => Expr::MemberExpression(member_expression.clone()), + BinaryPart::IfExpression(e) => Expr::IfExpression(e.clone()), + } + } +} + #[derive(Debug, Clone, Deserialize, Serialize, PartialEq, ts_rs::TS, JsonSchema)] #[ts(export)] #[serde(tag = "type")] @@ -2701,6 +2826,11 @@ impl MemberObject { MemberObject::Identifier(identifier) => identifier.end, } } + + pub(crate) fn contains_range(&self, range: &SourceRange) -> bool { + let sr = SourceRange::from(self); + sr.contains_range(range) + } } impl From for SourceRange { @@ -2737,6 +2867,11 @@ impl LiteralIdentifier { LiteralIdentifier::Literal(literal) => literal.end, } } + + pub(crate) fn contains_range(&self, range: &SourceRange) -> bool { + let sr = SourceRange::from(self); + sr.contains_range(range) + } } impl From for SourceRange { @@ -3255,6 +3390,11 @@ impl Parameter { pub fn optional(&self) -> bool { self.default_value.is_some() } + + pub(crate) fn contains_range(&self, range: &SourceRange) -> bool { + let sr = SourceRange::from(self); + sr.contains_range(range) + } } impl From<&Parameter> for SourceRange { @@ -3645,11 +3785,11 @@ mod tests { fn test_get_lsp_folding_ranges() { let code = r#"part001 = startSketchOn(XY) |> startProfile(at = [0.0000000000, 5.0000000000]) - |> line([0.4900857016, -0.0240763666], %) + |> line([0.4900857016, -0.0240763666]) startSketchOn(XY) |> startProfile(at = [0.0000000000, 5.0000000000]) - |> line([0.4900857016, -0.0240763666], %) + |> line([0.4900857016, -0.0240763666]) part002 = "part002" things = [part001, 0.0] @@ -3657,7 +3797,7 @@ blah = 1 foo = false baz = {a = 1, b = "thing"} -fn ghi(x) { +fn ghi(@x) { return x } @@ -3667,24 +3807,24 @@ ghi("things") let folding_ranges = program.get_lsp_folding_ranges(); assert_eq!(folding_ranges.len(), 3); assert_eq!(folding_ranges[0].start_line, 27); - assert_eq!(folding_ranges[0].end_line, 126); + assert_eq!(folding_ranges[0].end_line, 123); assert_eq!( folding_ranges[0].collapsed_text, Some("part001 = startSketchOn(XY)".to_string()) ); - assert_eq!(folding_ranges[1].start_line, 145); - assert_eq!(folding_ranges[1].end_line, 244); + assert_eq!(folding_ranges[1].start_line, 142); + assert_eq!(folding_ranges[1].end_line, 238); assert_eq!(folding_ranges[1].collapsed_text, Some("startSketchOn(XY)".to_string())); - assert_eq!(folding_ranges[2].start_line, 350); - assert_eq!(folding_ranges[2].end_line, 363); - assert_eq!(folding_ranges[2].collapsed_text, Some("fn ghi(x) {".to_string())); + assert_eq!(folding_ranges[2].start_line, 345); + assert_eq!(folding_ranges[2].end_line, 358); + assert_eq!(folding_ranges[2].collapsed_text, Some("fn ghi(@x) {".to_string())); } #[test] fn test_get_lsp_symbols() { let code = r#"part001 = startSketchOn(XY) |> startProfile(at = [0.0000000000, 5.0000000000]) - |> line([0.4900857016, -0.0240763666], %) + |> line([0.4900857016, -0.0240763666]) part002 = "part002" things = [part001, 0.0] @@ -3710,12 +3850,12 @@ h = 30 cylinder = startSketchOn(-XZ) |> startProfile(at = [50, 0]) - |> arc({ + |> arc( angle_end = 360, angle_start = 0, radius = r - }, %) - |> extrude(h, %) + ) + |> extrude(h) "#; let program = crate::parsing::top_level_parse(some_program_string).unwrap(); @@ -3731,12 +3871,12 @@ h = 30 cylinder = startSketchOn(-XZ) |> startProfile(at = [50, 0]) // comment - |> arc({ + |> arc( angle_end= 360, angle_start= 0, radius= r - }, %) - |> extrude(h, %) + ) + |> extrude(h) "#; let program = crate::parsing::top_level_parse(some_program_string).unwrap(); @@ -4011,7 +4151,7 @@ cylinder = startSketchOn(-XZ) #[tokio::test(flavor = "multi_thread")] async fn test_parse_object_bool() { - let some_program_string = r#"some_func({thing: true, other_thing: false})"#; + let some_program_string = r#"some_func({thing = true, other_thing = false})"#; let program = crate::parsing::top_level_parse(some_program_string).unwrap(); // We want to get the bool and verify it is a bool. @@ -4029,14 +4169,22 @@ cylinder = startSketchOn(-XZ) panic!("expected a function!"); }; - let Expr::CallExpression(ce) = expression else { - panic!("expected a function!"); - }; + let oe = match expression { + Expr::CallExpressionKw(ce) => { + assert!(ce.unlabeled.is_some()); - assert!(!ce.arguments.is_empty()); - - let Expr::ObjectExpression(oe) = ce.arguments.first().unwrap() else { - panic!("expected a object!"); + let Expr::ObjectExpression(oe) = ce.unlabeled.as_ref().unwrap() else { + panic!("expected a object!"); + }; + oe + } + Expr::CallExpression(ce) => { + let Expr::ObjectExpression(ref oe) = (ce.arguments).first().unwrap() else { + panic!("expected an object!"); + }; + oe + } + other => panic!("expected a Call or CallKw, found {other:?}"), }; assert_eq!(oe.properties.len(), 2); diff --git a/rust/kcl-lib/src/parsing/ast/types/path.rs b/rust/kcl-lib/src/parsing/ast/types/path.rs new file mode 100644 index 000000000..931c05a60 --- /dev/null +++ b/rust/kcl-lib/src/parsing/ast/types/path.rs @@ -0,0 +1,406 @@ +use serde::Serialize; + +use super::{BodyItem, Expr, MemberObject, Node, Program}; +use crate::SourceRange; + +/// A traversal path through the AST to a node. +/// +/// Similar to the idea of a `NodeId`, a `NodePath` uniquely identifies a node, +/// assuming you know the root node. +/// +/// The implementation doesn't cover all parts of the tree. It currently only +/// works on parts of the tree that the frontend uses. +#[derive(Debug, Default, Clone, Serialize, PartialEq, Eq, Hash, ts_rs::TS)] +#[ts(export_to = "NodePath.ts")] +pub struct NodePath { + pub steps: Vec, +} + +#[derive(Debug, Clone, Serialize, PartialEq, Eq, Hash, ts_rs::TS)] +#[ts(export_to = "NodePath.ts")] +#[serde(tag = "type")] +pub enum Step { + ProgramBodyItem { index: usize }, + CallCallee, + CallArg { index: usize }, + CallKwCallee, + CallKwUnlabeledArg, + CallKwArg { index: usize }, + BinaryLeft, + BinaryRight, + UnaryArg, + PipeBodyItem { index: usize }, + ArrayElement { index: usize }, + ArrayRangeStart, + ArrayRangeEnd, + ObjectProperty { index: usize }, + ObjectPropertyKey, + ObjectPropertyValue, + ExpressionStatementExpr, + VariableDeclarationDeclaration, + VariableDeclarationInit, + FunctionExpressionParam { index: usize }, + FunctionExpressionBody, + FunctionExpressionBodyItem { index: usize }, + ReturnStatementArg, + MemberExpressionObject, + MemberExpressionProperty, + IfExpressionCondition, + IfExpressionThen, + IfExpressionElseIf { index: usize }, + IfExpressionElseIfCond, + IfExpressionElseIfBody, + IfExpressionElse, + ImportStatementItem { index: usize }, + ImportStatementItemName, + ImportStatementItemAlias, + LabeledExpressionExpr, + LabeledExpressionLabel, + AscribedExpressionExpr, +} + +impl NodePath { + /// Given a program and a [`SourceRange`], return the path to the node that + /// contains the range. + pub(crate) fn from_range(program: &Node, range: SourceRange) -> Option { + Self::from_body(&program.body, range, NodePath::default()) + } + + fn from_body(body: &[BodyItem], range: SourceRange, mut path: NodePath) -> Option { + for (i, item) in body.iter().enumerate() { + if item.contains_range(&range) { + path.push(Step::ProgramBodyItem { index: i }); + return Self::from_body_item(item, range, path); + } + } + + None + } + + fn from_body_item(body_item: &BodyItem, range: SourceRange, mut path: NodePath) -> Option { + match body_item { + BodyItem::ImportStatement(node) => match &node.selector { + super::ImportSelector::List { items } => { + for (i, item) in items.iter().enumerate() { + if item.contains_range(&range) { + path.push(Step::ImportStatementItem { index: i }); + if item.name.contains_range(&range) { + path.push(Step::ImportStatementItemName); + return Some(path); + } + if let Some(alias) = &item.alias { + if alias.contains_range(&range) { + path.push(Step::ImportStatementItemAlias); + return Some(path); + } + } + return Some(path); + } + } + } + super::ImportSelector::Glob(_) => { + // TODO: Handle glob imports. + } + super::ImportSelector::None { .. } => { + // TODO: Handle whole-module imports. + } + }, + BodyItem::ExpressionStatement(node) => { + path.push(Step::ExpressionStatementExpr); + return Self::from_expr(&node.expression, range, path); + } + BodyItem::VariableDeclaration(node) => { + if node.declaration.contains_range(&range) { + path.push(Step::VariableDeclarationDeclaration); + if node.declaration.init.contains_range(&range) { + path.push(Step::VariableDeclarationInit); + return Self::from_expr(&node.declaration.init, range, path); + } + } + } + BodyItem::TypeDeclaration(_) => {} + BodyItem::ReturnStatement(node) => { + if node.argument.contains_range(&range) { + path.push(Step::ReturnStatementArg); + return Self::from_expr(&node.argument, range, path); + } + } + } + + Some(path) + } + + fn from_expr(expr: &Expr, range: SourceRange, mut path: NodePath) -> Option { + match expr { + Expr::Literal(node) => { + if node.contains_range(&range) { + return Some(path); + } + } + Expr::Name(node) => { + if node.contains_range(&range) { + return Some(path); + } + } + Expr::TagDeclarator(node) => { + if node.contains_range(&range) { + return Some(path); + } + } + Expr::BinaryExpression(node) => { + let left = Expr::from(&node.left); + if left.contains_range(&range) { + path.push(Step::BinaryLeft); + return Self::from_expr(&left, range, path); + } + let right = Expr::from(&node.right); + if right.contains_range(&range) { + path.push(Step::BinaryRight); + return Self::from_expr(&right, range, path); + } + } + Expr::FunctionExpression(node) => { + for (i, param) in node.params.iter().enumerate() { + // TODO: Check the type annotation and default value. + if param.contains_range(&range) { + path.push(Step::FunctionExpressionParam { index: i }); + return Some(path); + } + } + if node.body.contains_range(&range) { + path.push(Step::FunctionExpressionBody); + for (i, item) in node.body.body.iter().enumerate() { + if item.contains_range(&range) { + path.push(Step::FunctionExpressionBodyItem { index: i }); + return Self::from_body_item(item, range, path); + } + } + } + } + Expr::CallExpression(node) => { + if node.callee.contains_range(&range) { + path.push(Step::CallCallee); + return Some(path); + } + for (i, arg) in node.arguments.iter().enumerate() { + if arg.contains_range(&range) { + path.push(Step::CallArg { index: i }); + return Self::from_expr(arg, range, path); + } + } + } + Expr::CallExpressionKw(node) => { + if node.callee.contains_range(&range) { + path.push(Step::CallKwCallee); + return Some(path); + } + if let Some(unlabeled) = &node.unlabeled { + if unlabeled.contains_range(&range) { + path.push(Step::CallKwUnlabeledArg); + return Self::from_expr(unlabeled, range, path); + } + } + for (i, arg) in node.arguments.iter().enumerate() { + if arg.arg.contains_range(&range) { + path.push(Step::CallKwArg { index: i }); + return Self::from_expr(&arg.arg, range, path); + } + } + } + Expr::PipeExpression(node) => { + for (i, expr) in node.body.iter().enumerate() { + if expr.contains_range(&range) { + path.push(Step::PipeBodyItem { index: i }); + return Self::from_expr(expr, range, path); + } + } + } + Expr::PipeSubstitution(_) => {} + Expr::ArrayExpression(node) => { + for (i, element) in node.elements.iter().enumerate() { + if element.contains_range(&range) { + path.push(Step::ArrayElement { index: i }); + return Self::from_expr(element, range, path); + } + } + } + Expr::ArrayRangeExpression(node) => { + if node.start_element.contains_range(&range) { + path.push(Step::ArrayRangeStart); + return Self::from_expr(&node.start_element, range, path); + } + if node.end_element.contains_range(&range) { + path.push(Step::ArrayRangeEnd); + return Self::from_expr(&node.end_element, range, path); + } + } + Expr::ObjectExpression(node) => { + for (i, property) in node.properties.iter().enumerate() { + if property.contains_range(&range) { + path.push(Step::ObjectProperty { index: i }); + if property.key.contains_range(&range) { + path.push(Step::ObjectPropertyKey); + return Some(path); + } + if property.value.contains_range(&range) { + path.push(Step::ObjectPropertyValue); + return Self::from_expr(&property.value, range, path); + } + return Some(path); + } + } + } + Expr::MemberExpression(node) => { + if node.object.contains_range(&range) { + path.push(Step::MemberExpressionObject); + return Self::from_member_expr_object(&node.object, range, path); + } + if node.property.contains_range(&range) { + path.push(Step::MemberExpressionProperty); + return Some(path); + } + } + Expr::UnaryExpression(node) => { + let arg = Expr::from(&node.argument); + if arg.contains_range(&range) { + path.push(Step::UnaryArg); + return Self::from_expr(&arg, range, path); + } + } + Expr::IfExpression(node) => { + if node.cond.contains_range(&range) { + path.push(Step::IfExpressionCondition); + return Self::from_expr(&node.cond, range, path); + } + if node.then_val.contains_range(&range) { + path.push(Step::IfExpressionThen); + return Self::from_body(&node.then_val.body, range, path); + } + for else_if in &node.else_ifs { + if else_if.contains_range(&range) { + path.push(Step::IfExpressionElseIf { index: 0 }); + if else_if.cond.contains_range(&range) { + path.push(Step::IfExpressionElseIfCond); + return Self::from_expr(&else_if.cond, range, path); + } + if else_if.then_val.contains_range(&range) { + path.push(Step::IfExpressionElseIfBody); + return Self::from_body(&else_if.then_val.body, range, path); + } + return Some(path); + } + } + if node.final_else.contains_range(&range) { + path.push(Step::IfExpressionElse); + return Self::from_body(&node.final_else.body, range, path); + } + } + Expr::LabelledExpression(node) => { + if node.expr.contains_range(&range) { + path.push(Step::LabeledExpressionExpr); + return Self::from_expr(&node.expr, range, path); + } + if node.label.contains_range(&range) { + path.push(Step::LabeledExpressionLabel); + return Some(path); + } + } + Expr::AscribedExpression(node) => { + if node.expr.contains_range(&range) { + path.push(Step::AscribedExpressionExpr); + return Self::from_expr(&node.expr, range, path); + } + // TODO: Check the type annotation. + } + Expr::None(_) => {} + } + + Some(path) + } + + fn from_member_expr_object(mut expr: &MemberObject, range: SourceRange, mut path: NodePath) -> Option { + while let MemberObject::MemberExpression(node) = expr { + if !node.object.contains_range(&range) { + break; + } + path.push(Step::MemberExpressionObject); + expr = &node.object; + } + + Some(path) + } + + fn push(&mut self, step: Step) { + self.steps.push(step); + } +} + +#[cfg(test)] +mod tests { + use super::*; + use crate::ModuleId; + + fn range(start: usize, end: usize) -> SourceRange { + SourceRange::new(start, end, ModuleId::default()) + } + + #[test] + fn test_node_path_from_range() { + // Read the contents of the file. + let contents = std::fs::read_to_string("tests/misc/cube.kcl").unwrap(); + let program = crate::Program::parse_no_errs(&contents).unwrap(); + + // fn cube(sideLength, center) { + // ^^^^ + assert_eq!( + NodePath::from_range(&program.ast, range(38, 42)).unwrap(), + NodePath { + steps: vec![Step::ProgramBodyItem { index: 0 }, Step::VariableDeclarationDeclaration], + } + ); + // fn cube(sideLength, center) { + // ^^^^^^ + assert_eq!( + NodePath::from_range(&program.ast, range(55, 61)).unwrap(), + NodePath { + steps: vec![ + Step::ProgramBodyItem { index: 0 }, + Step::VariableDeclarationDeclaration, + Step::VariableDeclarationInit, + Step::FunctionExpressionParam { index: 1 } + ], + } + ); + // |> line(endAbsolute = p1) + // ^^ + assert_eq!( + NodePath::from_range(&program.ast, range(293, 295)).unwrap(), + NodePath { + steps: vec![ + Step::ProgramBodyItem { index: 0 }, + Step::VariableDeclarationDeclaration, + Step::VariableDeclarationInit, + Step::FunctionExpressionBody, + Step::FunctionExpressionBodyItem { index: 7 }, + Step::ReturnStatementArg, + Step::PipeBodyItem { index: 2 }, + Step::CallKwArg { index: 0 }, + ], + } + ); + // myCube = cube(sideLength = 40, center = [0, 0]) + // ^ + assert_eq!( + NodePath::from_range(&program.ast, range(485, 486)).unwrap(), + NodePath { + steps: vec![ + Step::ProgramBodyItem { index: 1 }, + Step::VariableDeclarationDeclaration, + Step::VariableDeclarationInit, + Step::CallKwArg { index: 1 }, + Step::ArrayElement { index: 1 } + ], + } + ); + } +} diff --git a/rust/kcl-lib/src/parsing/parser.rs b/rust/kcl-lib/src/parsing/parser.rs index 5b1291975..edd47d47e 100644 --- a/rust/kcl-lib/src/parsing/parser.rs +++ b/rust/kcl-lib/src/parsing/parser.rs @@ -14,7 +14,7 @@ use winnow::{ }; use super::{ - ast::types::{AscribedExpression, ImportPath, LabelledExpression}, + ast::types::{AscribedExpression, CallExpression, ImportPath, LabelledExpression}, token::{NumericSuffix, RESERVED_WORDS}, DeprecationKind, }; @@ -24,13 +24,12 @@ use crate::{ parsing::{ ast::types::{ Annotation, ArrayExpression, ArrayRangeExpression, BinaryExpression, BinaryOperator, BinaryPart, BodyItem, - BoxNode, CallExpression, CallExpressionKw, CommentStyle, DefaultParamVal, ElseIf, Expr, - ExpressionStatement, FunctionExpression, Identifier, IfExpression, ImportItem, ImportSelector, - ImportStatement, ItemVisibility, LabeledArg, Literal, LiteralIdentifier, LiteralValue, MemberExpression, - MemberObject, Name, Node, NodeList, NonCodeMeta, NonCodeNode, NonCodeValue, ObjectExpression, - ObjectProperty, Parameter, PipeExpression, PipeSubstitution, PrimitiveType, Program, ReturnStatement, - Shebang, TagDeclarator, Type, TypeDeclaration, UnaryExpression, UnaryOperator, VariableDeclaration, - VariableDeclarator, VariableKind, + BoxNode, CallExpressionKw, CommentStyle, DefaultParamVal, ElseIf, Expr, ExpressionStatement, + FunctionExpression, Identifier, IfExpression, ImportItem, ImportSelector, ImportStatement, ItemVisibility, + LabeledArg, Literal, LiteralIdentifier, LiteralValue, MemberExpression, MemberObject, Name, Node, NodeList, + NonCodeMeta, NonCodeNode, NonCodeValue, ObjectExpression, ObjectProperty, Parameter, PipeExpression, + PipeSubstitution, PrimitiveType, Program, ReturnStatement, Shebang, TagDeclarator, Type, TypeDeclaration, + UnaryExpression, UnaryOperator, VariableDeclaration, VariableDeclarator, VariableKind, }, math::BinaryExpressionToken, token::{Token, TokenSlice, TokenType}, @@ -3047,6 +3046,46 @@ fn fn_call_kw(i: &mut TokenSlice) -> PResult> { let _ = open_paren.parse_next(i)?; ignore_whitespace(i); + // Special case: no args + let early_close = peek(close_paren).parse_next(i); + if early_close.is_ok() { + let cl = close_paren.parse_next(i)?; + let result = Node::new_node( + fn_name.start, + cl.end, + fn_name.module_id, + CallExpressionKw { + callee: fn_name, + unlabeled: Default::default(), + arguments: Default::default(), + digest: None, + non_code_meta: Default::default(), + }, + ); + return Ok(result); + } + + // Special case: one arg (unlabeled) + let early_close = peek((expression, opt(whitespace), close_paren)).parse_next(i); + if early_close.is_ok() { + let first_expression = expression.parse_next(i)?; + ignore_whitespace(i); + let end = close_paren.parse_next(i)?.end; + let result = Node::new_node( + fn_name.start, + end, + fn_name.module_id, + CallExpressionKw { + callee: fn_name, + unlabeled: Some(first_expression), + arguments: Default::default(), + digest: None, + non_code_meta: Default::default(), + }, + ); + return Ok(result); + } + #[allow(clippy::large_enum_variant)] enum ArgPlace { NonCode(Node), @@ -3834,7 +3873,7 @@ mySk1 = startSketchOn(XY) #[test] fn pipes_on_pipes_minimal() { let test_program = r#"startSketchOn(XY) - |> startProfileAt([0, 0], %) + |> startProfile(at = [0, 0]) |> line(endAbsolute = [0, -0]) // MoveRelative "#; @@ -4105,7 +4144,7 @@ mySk1 = startSketchOn(XY) fn test_parse_half_pipe_small() { assert_err_contains( "secondExtrude = startSketchOn(XY) - |> startProfileAt([0,0], %) + |> startProfile(at = [0,0]) |", "Unexpected token: |", ); @@ -4169,7 +4208,7 @@ height = [obj["a"] -1, 0]"#; #[test] fn test_anon_fn() { - crate::parsing::top_level_parse("foo(42, fn(x) { return x + 1 })").unwrap(); + crate::parsing::top_level_parse("foo(num=42, closure=fn(x) { return x + 1 })").unwrap(); } #[test] @@ -4198,15 +4237,15 @@ height = [obj["a"] -1, 0]"#; let code = "height = 10 firstExtrude = startSketchOn(XY) - |> startProfileAt([0,0], %) - |> line([0, 8], %) - |> line([20, 0], %) - |> line([0, -8], %) + |> startProfile(at = [0,0]) + |> line(at = [0, 8]) + |> line(at = [20, 0]) + |> line(at = [0, -8]) |> close() |> extrude(length=2) secondExtrude = startSketchOn(XY) - |> startProfileAt([0,0], %) + |> startProfile(at = [0,0]) |"; assert_err_contains(code, "Unexpected token: |"); } @@ -4477,7 +4516,7 @@ e /// /// ``` /// exampleSketch = startSketchOn(XZ) -/// |> startProfileAt([0, 0], %) +/// |> startProfile(at = [0, 0]) /// |> angledLine( /// angle = 30, /// length = 3 / cos(toRadians(30)), @@ -4517,7 +4556,7 @@ export fn cos(num: number(rad)): number(_) {}"#; #[test] fn error_underscore() { - let (_, errs) = assert_no_fatal("_foo(_blah, _)"); + let (_, errs) = assert_no_fatal("_foo(a=_blah, b=_)"); assert_eq!(errs.len(), 3, "found: {errs:#?}"); } @@ -4629,11 +4668,11 @@ thing(false) #[test] fn random_words_fail() { let test_program = r#"part001 = startSketchOn(-XZ) - |> startProfileAt([8.53, 11.8], %) + |> startProfile(at = [8.53, 11.8]) asdasd asdasd - |> line([11.12, -14.82], %) - |> line([-13.27, -6.98], %) - |> line([-5.09, 12.33], %) + |> line(at = [11.12, -14.82]) + |> line(at = [-13.27, -6.98]) + |> line(at = [-5.09, 12.33]) asdasd "#; let _ = crate::parsing::top_level_parse(test_program).unwrap_errs(); @@ -4643,16 +4682,16 @@ thing(false) fn test_member_expression_sketch() { let some_program_string = r#"fn cube(pos, scale) { sg = startSketchOn(XY) - |> startProfileAt(pos, %) - |> line([0, scale], %) - |> line([scale, 0], %) - |> line([0, -scale], %) + |> startProfile(pos) + |> line(at = [0, scale]) + |> line(at = [scale, 0]) + |> line(at = [0, -scale]) return sg } -b1 = cube([0,0], 10) -b2 = cube([3,3], 4) +b1 = cube(pos=[0,0], scale=10) +b2 = cube(pos=[3,3], scale=4) pt1 = b1[0] pt2 = b2[0] @@ -4671,16 +4710,16 @@ let other_thing = 2 * cos(3)"#; fn test_negative_arguments() { let some_program_string = r#"fn box(p, h, l, w) { myBox = startSketchOn(XY) - |> startProfileAt(p, %) - |> line([0, l], %) - |> line([w, 0], %) - |> line([0, -l], %) + |> startProfile(p) + |> line(at = [0, l]) + |> line(at = [w, 0]) + |> line(at = [0, -l]) |> close() |> extrude(length=h) return myBox } -let myBox = box([0,0], -3, -16, -10) +let myBox = box(p=[0,0], h=-3, l=-16, w=-10) "#; crate::parsing::top_level_parse(some_program_string).unwrap(); } @@ -4697,20 +4736,20 @@ let myBox = box([0,0], -3, -16, -10) #[test] fn test_parse_tag_named_std_lib() { let some_program_string = r#"startSketchOn(XY) - |> startProfileAt([0, 0], %) - |> line([5, 5], %, $xLine) + |> startProfile(at = [0, 0]) + |> line(%, end = [5, 5], tag = $xLine) "#; assert_err( some_program_string, "Cannot assign a tag to a reserved keyword: xLine", - [74, 80], + [86, 92], ); } #[test] fn test_parse_empty_tag_brace() { let some_program_string = r#"startSketchOn(XY) - |> startProfileAt([0, 0], %) + |> startProfile(at = [0, 0]) |> line(%, $) "#; assert_err(some_program_string, "Tag names must not be empty", [67, 68]); @@ -4718,7 +4757,7 @@ let myBox = box([0,0], -3, -16, -10) #[test] fn test_parse_empty_tag_whitespace() { let some_program_string = r#"startSketchOn(XY) - |> startProfileAt([0, 0], %) + |> startProfile(at = [0, 0]) |> line(%, $ ,01) "#; assert_err(some_program_string, "Tag names must not be empty", [67, 68]); @@ -4727,7 +4766,7 @@ let myBox = box([0,0], -3, -16, -10) #[test] fn test_parse_empty_tag_comma() { let some_program_string = r#"startSketchOn(XY) - |> startProfileAt([0, 0], %) + |> startProfile(at = [0, 0]) |> line(%, $,) "#; assert_err(some_program_string, "Tag names must not be empty", [67, 68]); @@ -4736,7 +4775,7 @@ let myBox = box([0,0], -3, -16, -10) fn test_parse_tag_starting_with_digit() { let some_program_string = r#" startSketchOn(XY) - |> startProfileAt([0, 0], %) + |> startProfile(at = [0, 0]) |> line(%, $01)"#; assert_err( some_program_string, @@ -4748,14 +4787,14 @@ let myBox = box([0,0], -3, -16, -10) fn test_parse_tag_including_digit() { let some_program_string = r#" startSketchOn(XY) - |> startProfileAt([0, 0], %) - |> line(%, $var01)"#; + |> startProfile(at = [0, 0]) + |> line(%, tag = $var01)"#; assert_no_err(some_program_string); } #[test] fn test_parse_tag_starting_with_bang() { let some_program_string = r#"startSketchOn(XY) - |> startProfileAt([0, 0], %) + |> startProfile(at = [0, 0]) |> line(%, $!var,01) "#; assert_err(some_program_string, "Tag names must not start with a bang", [67, 68]); @@ -4763,7 +4802,7 @@ let myBox = box([0,0], -3, -16, -10) #[test] fn test_parse_tag_starting_with_dollar() { let some_program_string = r#"startSketchOn(XY) - |> startProfileAt([0, 0], %) + |> startProfile(at = [0, 0]) |> line(%, $$,01) "#; assert_err(some_program_string, "Tag names must not start with a dollar", [67, 68]); @@ -4771,7 +4810,7 @@ let myBox = box([0,0], -3, -16, -10) #[test] fn test_parse_tag_starting_with_fn() { let some_program_string = r#"startSketchOn(XY) - |> startProfileAt([0, 0], %) + |> startProfile(at = [0, 0]) |> line(%, $fn,01) "#; assert_err(some_program_string, "Tag names must not start with a keyword", [67, 69]); @@ -4779,7 +4818,7 @@ let myBox = box([0,0], -3, -16, -10) #[test] fn test_parse_tag_starting_with_a_comment() { let some_program_string = r#"startSketchOn(XY) - |> startProfileAt([0, 0], %) + |> startProfile(at = [0, 0]) |> line(%, $// ,01) "#; @@ -4794,8 +4833,8 @@ let myBox = box([0,0], -3, -16, -10) fn test_parse_tag_with_reserved_in_middle_works() { let some_program_string = r#" startSketchOn(XY) - |> startProfileAt([0, 0], %) - |> line([5, 5], %, $sketching) + |> startProfile(at = [0, 0]) + |> line(end = [5, 5], tag = $sketching) "#; assert_no_err(some_program_string); } @@ -4803,21 +4842,21 @@ let myBox = box([0,0], -3, -16, -10) #[test] fn test_parse_array_missing_closing_bracket() { let some_program_string = r#" -sketch001 = startSketchOn(XZ) |> startProfileAt([90.45, 119.09, %)"#; +sketch001 = startSketchOn(XZ) |> startProfile(at = [90.45, 119.09)"#; assert_err( some_program_string, "Encountered an unexpected character(s) before finding a closing bracket(`]`) for the array", - [49, 65], + [52, 60], ); } #[test] fn test_parse_array_missing_comma() { let some_program_string = r#" -sketch001 = startSketchOn(XZ) |> startProfileAt([90.45 119.09], %)"#; +sketch001 = startSketchOn(XZ) |> startProfile(at = [90.45 119.09])"#; assert_err( some_program_string, "Unexpected character encountered. You might be missing a comma in between elements.", - [50, 63], + [53, 66], ); } #[test] @@ -4825,21 +4864,21 @@ sketch001 = startSketchOn(XZ) |> startProfileAt([90.45 119.09], %)"#; // since there is an early exit if encountering a reserved word, the error should be about // that and not the missing comma let some_program_string = r#" -sketch001 = startSketchOn(XZ) |> startProfileAt([90.45 $struct], %)"#; +sketch001 = startSketchOn(XZ) |> startProfile(at = [90.45 $struct])"#; assert_err( some_program_string, "Encountered an unexpected character(s) before finding a closing bracket(`]`) for the array", - [49, 50], + [52, 53], ); } #[test] fn test_parse_array_random_brace() { let some_program_string = r#" -sketch001 = startSketchOn(XZ) |> startProfileAt([}], %)"#; +sketch001 = startSketchOn(XZ) |> startProfile(at = [}])"#; assert_err( some_program_string, "Encountered an unexpected character(s) before finding a closing bracket(`]`) for the array", - [49, 50], + [52, 53], ); } @@ -5075,17 +5114,17 @@ mod snapshot_tests { snapshot_test!( a, r#"boxSketch = startSketchOn(XY) - |> startProfileAt([0, 0], %) - |> line([0, 10], %) - |> tangentialArc([-5, 5], %) - |> line([5, -15], %) + |> startProfileAt(at = [0, 0]) + |> line(at = [0, 10]) + |> tangentialArc(end = [-5, 5]) + |> line(at = [5, -15]) |> extrude(length=10) "# ); - snapshot_test!(b, "myVar = min(5 , -legLen(5, 4))"); // Space before comma + snapshot_test!(b, "myVar = min(x=5 , y=-legLen(5, z=4))"); // Space before comma - snapshot_test!(c, "myVar = min(-legLen(5, 4), 5)"); - snapshot_test!(d, "myVar = 5 + 6 |> myFunc(45, %)"); + snapshot_test!(c, "myVar = min(x=-legLen(a=5, b=4), y=5)"); + snapshot_test!(d, "myVar = 5 + 6 |> myFunc(45)"); snapshot_test!(e, "x = 1 * (3 - 4)"); snapshot_test!(f, r#"x = 1 // this is an inline comment"#); snapshot_test!( @@ -5141,11 +5180,11 @@ mod snapshot_tests { snapshot_test!(v, r#"pt1 = b1[0]"#); snapshot_test!(w, r#"pt1 = b1['zero']"#); snapshot_test!(x, r#"pt1 = b1.zero"#); - snapshot_test!(y, r#"sg = startSketchOn(XY) |> startProfileAt(pos, %)"#); + snapshot_test!(y, r#"sg = startSketchOn(XY) |> startProfile(pos)"#); snapshot_test!( z, "sg = startSketchOn(XY) - |> startProfileAt(pos) |> line([0, -scale], %)" + |> startProfile(pos) |> line([0, -scale])" ); snapshot_test!(aa, r#"sg = -scale"#); snapshot_test!(ab, "line(endAbsolute = [0, -1])"); @@ -5168,7 +5207,7 @@ mod snapshot_tests { snapshot_test!( af, r#"mySketch = startSketchOn(XY) - |> startProfileAt([0,0], %) + |> startProfile(at = [0,0]) |> line(endAbsolute = [0, 1], tag = $myPath) |> line(endAbsolute = [1, 1]) |> line(endAbsolute = [1, 0], tag = $rightPath) @@ -5176,21 +5215,21 @@ mod snapshot_tests { ); snapshot_test!( ag, - "mySketch = startSketchOn(XY) |> startProfileAt([0,0], %) |> line(endAbsolute = [1, 1]) |> close()" + "mySketch = startSketchOn(XY) |> startProfile(at = [0,0]) |> line(endAbsolute = [1, 1]) |> close()" ); - snapshot_test!(ah, "myBox = startSketchOn(XY) |> startProfileAt(p, %)"); - snapshot_test!(ai, r#"myBox = f(1) |> g(2, %)"#); + snapshot_test!(ah, "myBox = startSketchOn(XY) |> startProfile(at = p)"); + snapshot_test!(ai, r#"myBox = f(1) |> g(2)"#); snapshot_test!( aj, - r#"myBox = startSketchOn(XY) |> startProfileAt(p, %) |> line(end = [0, l])"# + r#"myBox = startSketchOn(XY) |> startProfile(at = p) |> line(end = [0, l])"# ); snapshot_test!(ak, "line(endAbsolute = [0, 1])"); - snapshot_test!(ap, "mySketch = startSketchOn(XY) |> startProfileAt([0,0], %)"); - snapshot_test!(aq, "log(5, \"hello\", aIdentifier)"); + snapshot_test!(ap, "mySketch = startSketchOn(XY) |> startProfile(at = [0,0])"); + snapshot_test!(aq, "log(number = 5, msg = \"hello\", id=aIdentifier)"); snapshot_test!(ar, r#"5 + "a""#); - snapshot_test!(at, "line([0, l], %)"); + snapshot_test!(at, "line([0, l])"); snapshot_test!(au, include_str!("../../e2e/executor/inputs/cylinder.kcl")); - snapshot_test!(av, "fn f(angle?) { return default(angle, 360) }"); + snapshot_test!(av, "fn f(angle?) { return default(maybe=angle, otherwise=360) }"); snapshot_test!( aw, "numbers = [ diff --git a/rust/kcl-lib/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_tests__a.snap b/rust/kcl-lib/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_tests__a.snap index d79784b2a..f95faad91 100644 --- a/rust/kcl-lib/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_tests__a.snap +++ b/rust/kcl-lib/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_tests__a.snap @@ -8,7 +8,7 @@ expression: actual "commentStart": 0, "declaration": { "commentStart": 0, - "end": 170, + "end": 179, "id": { "commentStart": 0, "end": 9, @@ -61,44 +61,47 @@ expression: actual { "arguments": [ { - "commentStart": 52, - "elements": [ - { - "commentStart": 53, - "end": 54, - "raw": "0", - "start": 53, - "type": "Literal", - "type": "Literal", - "value": { - "value": 0.0, - "suffix": "None" + "type": "LabeledArg", + "label": { + "commentStart": 52, + "end": 54, + "name": "at", + "start": 52, + "type": "Identifier" + }, + "arg": { + "commentStart": 57, + "elements": [ + { + "commentStart": 58, + "end": 59, + "raw": "0", + "start": 58, + "type": "Literal", + "type": "Literal", + "value": { + "value": 0.0, + "suffix": "None" + } + }, + { + "commentStart": 61, + "end": 62, + "raw": "0", + "start": 61, + "type": "Literal", + "type": "Literal", + "value": { + "value": 0.0, + "suffix": "None" + } } - }, - { - "commentStart": 56, - "end": 57, - "raw": "0", - "start": 56, - "type": "Literal", - "type": "Literal", - "value": { - "value": 0.0, - "suffix": "None" - } - } - ], - "end": 58, - "start": 52, - "type": "ArrayExpression", - "type": "ArrayExpression" - }, - { - "commentStart": 60, - "end": 61, - "start": 60, - "type": "PipeSubstitution", - "type": "PipeSubstitution" + ], + "end": 63, + "start": 57, + "type": "ArrayExpression", + "type": "ArrayExpression" + } } ], "callee": { @@ -117,86 +120,175 @@ expression: actual "type": "Name" }, "commentStart": 37, - "end": 62, + "end": 64, "start": 37, - "type": "CallExpression", - "type": "CallExpression" + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null }, { "arguments": [ { - "commentStart": 75, - "elements": [ - { - "commentStart": 76, - "end": 77, - "raw": "0", - "start": 76, - "type": "Literal", - "type": "Literal", - "value": { - "value": 0.0, - "suffix": "None" + "type": "LabeledArg", + "label": { + "commentStart": 77, + "end": 79, + "name": "at", + "start": 77, + "type": "Identifier" + }, + "arg": { + "commentStart": 82, + "elements": [ + { + "commentStart": 83, + "end": 84, + "raw": "0", + "start": 83, + "type": "Literal", + "type": "Literal", + "value": { + "value": 0.0, + "suffix": "None" + } + }, + { + "commentStart": 86, + "end": 88, + "raw": "10", + "start": 86, + "type": "Literal", + "type": "Literal", + "value": { + "value": 10.0, + "suffix": "None" + } } - }, - { - "commentStart": 79, - "end": 81, - "raw": "10", - "start": 79, - "type": "Literal", - "type": "Literal", - "value": { - "value": 10.0, - "suffix": "None" - } - } - ], - "end": 82, - "start": 75, - "type": "ArrayExpression", - "type": "ArrayExpression" - }, - { - "commentStart": 84, - "end": 85, - "start": 84, - "type": "PipeSubstitution", - "type": "PipeSubstitution" + ], + "end": 89, + "start": 82, + "type": "ArrayExpression", + "type": "ArrayExpression" + } } ], "callee": { "abs_path": false, - "commentStart": 70, - "end": 74, + "commentStart": 72, + "end": 76, "name": { - "commentStart": 70, - "end": 74, + "commentStart": 72, + "end": 76, "name": "line", - "start": 70, + "start": 72, "type": "Identifier" }, "path": [], - "start": 70, + "start": 72, "type": "Name" }, - "commentStart": 70, - "end": 86, - "start": 70, - "type": "CallExpression", - "type": "CallExpression" + "commentStart": 72, + "end": 90, + "start": 72, + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null }, { "arguments": [ { - "commentStart": 108, - "elements": [ - { - "argument": { - "commentStart": 110, - "end": 111, + "type": "LabeledArg", + "label": { + "commentStart": 112, + "end": 115, + "name": "end", + "start": 112, + "type": "Identifier" + }, + "arg": { + "commentStart": 118, + "elements": [ + { + "argument": { + "commentStart": 120, + "end": 121, + "raw": "5", + "start": 120, + "type": "Literal", + "type": "Literal", + "value": { + "value": 5.0, + "suffix": "None" + } + }, + "commentStart": 119, + "end": 121, + "operator": "-", + "start": 119, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "commentStart": 123, + "end": 124, "raw": "5", - "start": 110, + "start": 123, + "type": "Literal", + "type": "Literal", + "value": { + "value": 5.0, + "suffix": "None" + } + } + ], + "end": 125, + "start": 118, + "type": "ArrayExpression", + "type": "ArrayExpression" + } + } + ], + "callee": { + "abs_path": false, + "commentStart": 98, + "end": 111, + "name": { + "commentStart": 98, + "end": 111, + "name": "tangentialArc", + "start": 98, + "type": "Identifier" + }, + "path": [], + "start": 98, + "type": "Name" + }, + "commentStart": 98, + "end": 126, + "start": 98, + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null + }, + { + "arguments": [ + { + "type": "LabeledArg", + "label": { + "commentStart": 139, + "end": 141, + "name": "at", + "start": 139, + "type": "Identifier" + }, + "arg": { + "commentStart": 144, + "elements": [ + { + "commentStart": 145, + "end": 146, + "raw": "5", + "start": 145, "type": "Literal", "type": "Literal", "value": { @@ -204,148 +296,72 @@ expression: actual "suffix": "None" } }, - "commentStart": 109, - "end": 111, - "operator": "-", - "start": 109, - "type": "UnaryExpression", - "type": "UnaryExpression" - }, - { - "commentStart": 113, - "end": 114, - "raw": "5", - "start": 113, - "type": "Literal", - "type": "Literal", - "value": { - "value": 5.0, - "suffix": "None" + { + "argument": { + "commentStart": 149, + "end": 151, + "raw": "15", + "start": 149, + "type": "Literal", + "type": "Literal", + "value": { + "value": 15.0, + "suffix": "None" + } + }, + "commentStart": 148, + "end": 151, + "operator": "-", + "start": 148, + "type": "UnaryExpression", + "type": "UnaryExpression" } - } - ], - "end": 115, - "start": 108, - "type": "ArrayExpression", - "type": "ArrayExpression" - }, - { - "commentStart": 117, - "end": 118, - "start": 117, - "type": "PipeSubstitution", - "type": "PipeSubstitution" + ], + "end": 152, + "start": 144, + "type": "ArrayExpression", + "type": "ArrayExpression" + } } ], "callee": { "abs_path": false, - "commentStart": 94, - "end": 107, + "commentStart": 134, + "end": 138, "name": { - "commentStart": 94, - "end": 107, - "name": "tangentialArc", - "start": 94, - "type": "Identifier" - }, - "path": [], - "start": 94, - "type": "Name" - }, - "commentStart": 94, - "end": 119, - "start": 94, - "type": "CallExpression", - "type": "CallExpression" - }, - { - "arguments": [ - { - "commentStart": 132, - "elements": [ - { - "commentStart": 133, - "end": 134, - "raw": "5", - "start": 133, - "type": "Literal", - "type": "Literal", - "value": { - "value": 5.0, - "suffix": "None" - } - }, - { - "argument": { - "commentStart": 137, - "end": 139, - "raw": "15", - "start": 137, - "type": "Literal", - "type": "Literal", - "value": { - "value": 15.0, - "suffix": "None" - } - }, - "commentStart": 136, - "end": 139, - "operator": "-", - "start": 136, - "type": "UnaryExpression", - "type": "UnaryExpression" - } - ], - "end": 140, - "start": 132, - "type": "ArrayExpression", - "type": "ArrayExpression" - }, - { - "commentStart": 142, - "end": 143, - "start": 142, - "type": "PipeSubstitution", - "type": "PipeSubstitution" - } - ], - "callee": { - "abs_path": false, - "commentStart": 127, - "end": 131, - "name": { - "commentStart": 127, - "end": 131, + "commentStart": 134, + "end": 138, "name": "line", - "start": 127, + "start": 134, "type": "Identifier" }, "path": [], - "start": 127, + "start": 134, "type": "Name" }, - "commentStart": 127, - "end": 144, - "start": 127, - "type": "CallExpression", - "type": "CallExpression" + "commentStart": 134, + "end": 153, + "start": 134, + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null }, { "arguments": [ { "type": "LabeledArg", "label": { - "commentStart": 160, - "end": 166, + "commentStart": 169, + "end": 175, "name": "length", - "start": 160, + "start": 169, "type": "Identifier" }, "arg": { - "commentStart": 167, - "end": 169, + "commentStart": 176, + "end": 178, "raw": "10", - "start": 167, + "start": 176, "type": "Literal", "type": "Literal", "value": { @@ -357,29 +373,29 @@ expression: actual ], "callee": { "abs_path": false, - "commentStart": 152, - "end": 159, + "commentStart": 161, + "end": 168, "name": { - "commentStart": 152, - "end": 159, + "commentStart": 161, + "end": 168, "name": "extrude", - "start": 152, + "start": 161, "type": "Identifier" }, "path": [], - "start": 152, + "start": 161, "type": "Name" }, - "commentStart": 152, - "end": 170, - "start": 152, + "commentStart": 161, + "end": 179, + "start": 161, "type": "CallExpressionKw", "type": "CallExpressionKw", "unlabeled": null } ], "commentStart": 12, - "end": 170, + "end": 179, "start": 12, "type": "PipeExpression", "type": "PipeExpression" @@ -387,7 +403,7 @@ expression: actual "start": 0, "type": "VariableDeclarator" }, - "end": 170, + "end": 179, "kind": "const", "start": 0, "type": "VariableDeclaration", @@ -395,6 +411,6 @@ expression: actual } ], "commentStart": 0, - "end": 171, + "end": 180, "start": 0 } diff --git a/rust/kcl-lib/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_tests__af.snap b/rust/kcl-lib/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_tests__af.snap index 51382f2a7..8b47a911b 100644 --- a/rust/kcl-lib/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_tests__af.snap +++ b/rust/kcl-lib/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_tests__af.snap @@ -61,54 +61,57 @@ expression: actual { "arguments": [ { - "commentStart": 55, - "elements": [ - { - "commentStart": 56, - "end": 57, - "raw": "0", - "start": 56, - "type": "Literal", - "type": "Literal", - "value": { - "value": 0.0, - "suffix": "None" + "type": "LabeledArg", + "label": { + "commentStart": 53, + "end": 55, + "name": "at", + "start": 53, + "type": "Identifier" + }, + "arg": { + "commentStart": 58, + "elements": [ + { + "commentStart": 59, + "end": 60, + "raw": "0", + "start": 59, + "type": "Literal", + "type": "Literal", + "value": { + "value": 0.0, + "suffix": "None" + } + }, + { + "commentStart": 61, + "end": 62, + "raw": "0", + "start": 61, + "type": "Literal", + "type": "Literal", + "value": { + "value": 0.0, + "suffix": "None" + } } - }, - { - "commentStart": 58, - "end": 59, - "raw": "0", - "start": 58, - "type": "Literal", - "type": "Literal", - "value": { - "value": 0.0, - "suffix": "None" - } - } - ], - "end": 60, - "start": 55, - "type": "ArrayExpression", - "type": "ArrayExpression" - }, - { - "commentStart": 62, - "end": 63, - "start": 62, - "type": "PipeSubstitution", - "type": "PipeSubstitution" + ], + "end": 63, + "start": 58, + "type": "ArrayExpression", + "type": "ArrayExpression" + } } ], "callee": { "abs_path": false, "commentStart": 40, - "end": 54, + "end": 52, "name": { "commentStart": 40, - "end": 54, - "name": "startProfileAt", + "end": 52, + "name": "startProfile", "start": 40, "type": "Identifier" }, @@ -119,8 +122,9 @@ expression: actual "commentStart": 40, "end": 64, "start": 40, - "type": "CallExpression", - "type": "CallExpression" + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null }, { "arguments": [ diff --git a/rust/kcl-lib/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_tests__ag.snap b/rust/kcl-lib/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_tests__ag.snap index 23bcb687d..bc65025da 100644 --- a/rust/kcl-lib/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_tests__ag.snap +++ b/rust/kcl-lib/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_tests__ag.snap @@ -61,54 +61,57 @@ expression: actual { "arguments": [ { - "commentStart": 47, - "elements": [ - { - "commentStart": 48, - "end": 49, - "raw": "0", - "start": 48, - "type": "Literal", - "type": "Literal", - "value": { - "value": 0.0, - "suffix": "None" + "type": "LabeledArg", + "label": { + "commentStart": 45, + "end": 47, + "name": "at", + "start": 45, + "type": "Identifier" + }, + "arg": { + "commentStart": 50, + "elements": [ + { + "commentStart": 51, + "end": 52, + "raw": "0", + "start": 51, + "type": "Literal", + "type": "Literal", + "value": { + "value": 0.0, + "suffix": "None" + } + }, + { + "commentStart": 53, + "end": 54, + "raw": "0", + "start": 53, + "type": "Literal", + "type": "Literal", + "value": { + "value": 0.0, + "suffix": "None" + } } - }, - { - "commentStart": 50, - "end": 51, - "raw": "0", - "start": 50, - "type": "Literal", - "type": "Literal", - "value": { - "value": 0.0, - "suffix": "None" - } - } - ], - "end": 52, - "start": 47, - "type": "ArrayExpression", - "type": "ArrayExpression" - }, - { - "commentStart": 54, - "end": 55, - "start": 54, - "type": "PipeSubstitution", - "type": "PipeSubstitution" + ], + "end": 55, + "start": 50, + "type": "ArrayExpression", + "type": "ArrayExpression" + } } ], "callee": { "abs_path": false, "commentStart": 32, - "end": 46, + "end": 44, "name": { "commentStart": 32, - "end": 46, - "name": "startProfileAt", + "end": 44, + "name": "startProfile", "start": 32, "type": "Identifier" }, @@ -119,8 +122,9 @@ expression: actual "commentStart": 32, "end": 56, "start": 32, - "type": "CallExpression", - "type": "CallExpression" + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null }, { "arguments": [ diff --git a/rust/kcl-lib/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_tests__ah.snap b/rust/kcl-lib/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_tests__ah.snap index c1a92e028..5f0163dc0 100644 --- a/rust/kcl-lib/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_tests__ah.snap +++ b/rust/kcl-lib/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_tests__ah.snap @@ -61,37 +61,40 @@ expression: actual { "arguments": [ { - "abs_path": false, - "commentStart": 44, - "end": 45, - "name": { - "commentStart": 44, - "end": 45, - "name": "p", - "start": 44, + "type": "LabeledArg", + "label": { + "commentStart": 42, + "end": 44, + "name": "at", + "start": 42, "type": "Identifier" }, - "path": [], - "start": 44, - "type": "Name", - "type": "Name" - }, - { - "commentStart": 47, - "end": 48, - "start": 47, - "type": "PipeSubstitution", - "type": "PipeSubstitution" + "arg": { + "abs_path": false, + "commentStart": 47, + "end": 48, + "name": { + "commentStart": 47, + "end": 48, + "name": "p", + "start": 47, + "type": "Identifier" + }, + "path": [], + "start": 47, + "type": "Name", + "type": "Name" + } } ], "callee": { "abs_path": false, "commentStart": 29, - "end": 43, + "end": 41, "name": { "commentStart": 29, - "end": 43, - "name": "startProfileAt", + "end": 41, + "name": "startProfile", "start": 29, "type": "Identifier" }, @@ -102,8 +105,9 @@ expression: actual "commentStart": 29, "end": 49, "start": 29, - "type": "CallExpression", - "type": "CallExpression" + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null } ], "commentStart": 8, diff --git a/rust/kcl-lib/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_tests__ai.snap b/rust/kcl-lib/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_tests__ai.snap index a0898409f..e1c34d5a5 100644 --- a/rust/kcl-lib/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_tests__ai.snap +++ b/rust/kcl-lib/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_tests__ai.snap @@ -8,7 +8,7 @@ expression: actual "commentStart": 0, "declaration": { "commentStart": 0, - "end": 23, + "end": 20, "id": { "commentStart": 0, "end": 5, @@ -67,13 +67,6 @@ expression: actual "value": 2.0, "suffix": "None" } - }, - { - "commentStart": 21, - "end": 22, - "start": 21, - "type": "PipeSubstitution", - "type": "PipeSubstitution" } ], "callee": { @@ -92,14 +85,14 @@ expression: actual "type": "Name" }, "commentStart": 16, - "end": 23, + "end": 20, "start": 16, "type": "CallExpression", "type": "CallExpression" } ], "commentStart": 8, - "end": 23, + "end": 20, "start": 8, "type": "PipeExpression", "type": "PipeExpression" @@ -107,7 +100,7 @@ expression: actual "start": 0, "type": "VariableDeclarator" }, - "end": 23, + "end": 20, "kind": "const", "start": 0, "type": "VariableDeclaration", @@ -115,6 +108,6 @@ expression: actual } ], "commentStart": 0, - "end": 23, + "end": 20, "start": 0 } diff --git a/rust/kcl-lib/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_tests__aj.snap b/rust/kcl-lib/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_tests__aj.snap index 91ca51649..fd35296e0 100644 --- a/rust/kcl-lib/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_tests__aj.snap +++ b/rust/kcl-lib/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_tests__aj.snap @@ -61,37 +61,40 @@ expression: actual { "arguments": [ { - "abs_path": false, - "commentStart": 44, - "end": 45, - "name": { - "commentStart": 44, - "end": 45, - "name": "p", - "start": 44, + "type": "LabeledArg", + "label": { + "commentStart": 42, + "end": 44, + "name": "at", + "start": 42, "type": "Identifier" }, - "path": [], - "start": 44, - "type": "Name", - "type": "Name" - }, - { - "commentStart": 47, - "end": 48, - "start": 47, - "type": "PipeSubstitution", - "type": "PipeSubstitution" + "arg": { + "abs_path": false, + "commentStart": 47, + "end": 48, + "name": { + "commentStart": 47, + "end": 48, + "name": "p", + "start": 47, + "type": "Identifier" + }, + "path": [], + "start": 47, + "type": "Name", + "type": "Name" + } } ], "callee": { "abs_path": false, "commentStart": 29, - "end": 43, + "end": 41, "name": { "commentStart": 29, - "end": 43, - "name": "startProfileAt", + "end": 41, + "name": "startProfile", "start": 29, "type": "Identifier" }, @@ -102,8 +105,9 @@ expression: actual "commentStart": 29, "end": 49, "start": 29, - "type": "CallExpression", - "type": "CallExpression" + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null }, { "arguments": [ diff --git a/rust/kcl-lib/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_tests__ap.snap b/rust/kcl-lib/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_tests__ap.snap index cd59ac65a..54f7e9385 100644 --- a/rust/kcl-lib/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_tests__ap.snap +++ b/rust/kcl-lib/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_tests__ap.snap @@ -61,54 +61,57 @@ expression: actual { "arguments": [ { - "commentStart": 47, - "elements": [ - { - "commentStart": 48, - "end": 49, - "raw": "0", - "start": 48, - "type": "Literal", - "type": "Literal", - "value": { - "value": 0.0, - "suffix": "None" + "type": "LabeledArg", + "label": { + "commentStart": 45, + "end": 47, + "name": "at", + "start": 45, + "type": "Identifier" + }, + "arg": { + "commentStart": 50, + "elements": [ + { + "commentStart": 51, + "end": 52, + "raw": "0", + "start": 51, + "type": "Literal", + "type": "Literal", + "value": { + "value": 0.0, + "suffix": "None" + } + }, + { + "commentStart": 53, + "end": 54, + "raw": "0", + "start": 53, + "type": "Literal", + "type": "Literal", + "value": { + "value": 0.0, + "suffix": "None" + } } - }, - { - "commentStart": 50, - "end": 51, - "raw": "0", - "start": 50, - "type": "Literal", - "type": "Literal", - "value": { - "value": 0.0, - "suffix": "None" - } - } - ], - "end": 52, - "start": 47, - "type": "ArrayExpression", - "type": "ArrayExpression" - }, - { - "commentStart": 54, - "end": 55, - "start": 54, - "type": "PipeSubstitution", - "type": "PipeSubstitution" + ], + "end": 55, + "start": 50, + "type": "ArrayExpression", + "type": "ArrayExpression" + } } ], "callee": { "abs_path": false, "commentStart": 32, - "end": 46, + "end": 44, "name": { "commentStart": 32, - "end": 46, - "name": "startProfileAt", + "end": 44, + "name": "startProfile", "start": 32, "type": "Identifier" }, @@ -119,8 +122,9 @@ expression: actual "commentStart": 32, "end": 56, "start": 32, - "type": "CallExpression", - "type": "CallExpression" + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null } ], "commentStart": 11, diff --git a/rust/kcl-lib/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_tests__aq.snap b/rust/kcl-lib/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_tests__aq.snap index 2f2aa09a5..e6c992d7a 100644 --- a/rust/kcl-lib/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_tests__aq.snap +++ b/rust/kcl-lib/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_tests__aq.snap @@ -6,45 +6,75 @@ expression: actual "body": [ { "commentStart": 0, - "end": 28, + "end": 46, "expression": { "arguments": [ { - "commentStart": 4, - "end": 5, - "raw": "5", - "start": 4, - "type": "Literal", - "type": "Literal", - "value": { - "value": 5.0, - "suffix": "None" + "type": "LabeledArg", + "label": { + "commentStart": 4, + "end": 10, + "name": "number", + "start": 4, + "type": "Identifier" + }, + "arg": { + "commentStart": 13, + "end": 14, + "raw": "5", + "start": 13, + "type": "Literal", + "type": "Literal", + "value": { + "value": 5.0, + "suffix": "None" + } } }, { - "commentStart": 7, - "end": 14, - "raw": "\"hello\"", - "start": 7, - "type": "Literal", - "type": "Literal", - "value": "hello" - }, - { - "abs_path": false, - "commentStart": 16, - "end": 27, - "name": { + "type": "LabeledArg", + "label": { "commentStart": 16, - "end": 27, - "name": "aIdentifier", + "end": 19, + "name": "msg", "start": 16, "type": "Identifier" }, - "path": [], - "start": 16, - "type": "Name", - "type": "Name" + "arg": { + "commentStart": 22, + "end": 29, + "raw": "\"hello\"", + "start": 22, + "type": "Literal", + "type": "Literal", + "value": "hello" + } + }, + { + "type": "LabeledArg", + "label": { + "commentStart": 31, + "end": 33, + "name": "id", + "start": 31, + "type": "Identifier" + }, + "arg": { + "abs_path": false, + "commentStart": 34, + "end": 45, + "name": { + "commentStart": 34, + "end": 45, + "name": "aIdentifier", + "start": 34, + "type": "Identifier" + }, + "path": [], + "start": 34, + "type": "Name", + "type": "Name" + } } ], "callee": { @@ -63,10 +93,11 @@ expression: actual "type": "Name" }, "commentStart": 0, - "end": 28, + "end": 46, "start": 0, - "type": "CallExpression", - "type": "CallExpression" + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null }, "start": 0, "type": "ExpressionStatement", @@ -74,6 +105,6 @@ expression: actual } ], "commentStart": 0, - "end": 28, + "end": 46, "start": 0 } diff --git a/rust/kcl-lib/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_tests__at.snap b/rust/kcl-lib/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_tests__at.snap index 5a61f2013..c306ce489 100644 --- a/rust/kcl-lib/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_tests__at.snap +++ b/rust/kcl-lib/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_tests__at.snap @@ -6,7 +6,7 @@ expression: actual "body": [ { "commentStart": 0, - "end": 15, + "end": 12, "expression": { "arguments": [ { @@ -45,13 +45,6 @@ expression: actual "start": 5, "type": "ArrayExpression", "type": "ArrayExpression" - }, - { - "commentStart": 13, - "end": 14, - "start": 13, - "type": "PipeSubstitution", - "type": "PipeSubstitution" } ], "callee": { @@ -70,7 +63,7 @@ expression: actual "type": "Name" }, "commentStart": 0, - "end": 15, + "end": 12, "start": 0, "type": "CallExpression", "type": "CallExpression" @@ -81,6 +74,6 @@ expression: actual } ], "commentStart": 0, - "end": 15, + "end": 12, "start": 0 } diff --git a/rust/kcl-lib/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_tests__av.snap b/rust/kcl-lib/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_tests__av.snap index 7999d6c3a..36f5156e3 100644 --- a/rust/kcl-lib/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_tests__av.snap +++ b/rust/kcl-lib/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_tests__av.snap @@ -8,7 +8,7 @@ expression: actual "commentStart": 0, "declaration": { "commentStart": 3, - "end": 43, + "end": 59, "id": { "commentStart": 3, "end": 4, @@ -23,31 +23,51 @@ expression: actual "argument": { "arguments": [ { - "abs_path": false, - "commentStart": 30, - "end": 35, - "name": { + "type": "LabeledArg", + "label": { "commentStart": 30, "end": 35, - "name": "angle", + "name": "maybe", "start": 30, "type": "Identifier" }, - "path": [], - "start": 30, - "type": "Name", - "type": "Name" + "arg": { + "abs_path": false, + "commentStart": 36, + "end": 41, + "name": { + "commentStart": 36, + "end": 41, + "name": "angle", + "start": 36, + "type": "Identifier" + }, + "path": [], + "start": 36, + "type": "Name", + "type": "Name" + } }, { - "commentStart": 37, - "end": 40, - "raw": "360", - "start": 37, - "type": "Literal", - "type": "Literal", - "value": { - "value": 360.0, - "suffix": "None" + "type": "LabeledArg", + "label": { + "commentStart": 43, + "end": 52, + "name": "otherwise", + "start": 43, + "type": "Identifier" + }, + "arg": { + "commentStart": 53, + "end": 56, + "raw": "360", + "start": 53, + "type": "Literal", + "type": "Literal", + "value": { + "value": 360.0, + "suffix": "None" + } } } ], @@ -67,24 +87,25 @@ expression: actual "type": "Name" }, "commentStart": 22, - "end": 41, + "end": 57, "start": 22, - "type": "CallExpression", - "type": "CallExpression" + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null }, "commentStart": 15, - "end": 41, + "end": 57, "start": 15, "type": "ReturnStatement", "type": "ReturnStatement" } ], "commentStart": 13, - "end": 43, + "end": 59, "start": 13 }, "commentStart": 4, - "end": 43, + "end": 59, "params": [ { "type": "Parameter", @@ -109,7 +130,7 @@ expression: actual "start": 3, "type": "VariableDeclarator" }, - "end": 43, + "end": 59, "kind": "fn", "start": 0, "type": "VariableDeclaration", @@ -117,6 +138,6 @@ expression: actual } ], "commentStart": 0, - "end": 43, + "end": 59, "start": 0 } diff --git a/rust/kcl-lib/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_tests__b.snap b/rust/kcl-lib/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_tests__b.snap index 95c1d7b7f..9a99bf254 100644 --- a/rust/kcl-lib/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_tests__b.snap +++ b/rust/kcl-lib/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_tests__b.snap @@ -8,7 +8,7 @@ expression: actual "commentStart": 0, "declaration": { "commentStart": 0, - "end": 30, + "end": 36, "id": { "commentStart": 0, "end": 5, @@ -19,72 +19,102 @@ expression: actual "init": { "arguments": [ { - "commentStart": 12, - "end": 13, - "raw": "5", - "start": 12, - "type": "Literal", - "type": "Literal", - "value": { - "value": 5.0, - "suffix": "None" + "type": "LabeledArg", + "label": { + "commentStart": 12, + "end": 13, + "name": "x", + "start": 12, + "type": "Identifier" + }, + "arg": { + "commentStart": 14, + "end": 15, + "raw": "5", + "start": 14, + "type": "Literal", + "type": "Literal", + "value": { + "value": 5.0, + "suffix": "None" + } } }, { - "argument": { - "arguments": [ - { - "commentStart": 24, - "end": 25, + "type": "LabeledArg", + "label": { + "commentStart": 18, + "end": 19, + "name": "y", + "start": 18, + "type": "Identifier" + }, + "arg": { + "argument": { + "arguments": [ + { + "type": "LabeledArg", + "label": { + "commentStart": 31, + "end": 32, + "name": "z", + "start": 31, + "type": "Identifier" + }, + "arg": { + "commentStart": 33, + "end": 34, + "raw": "4", + "start": 33, + "type": "Literal", + "type": "Literal", + "value": { + "value": 4.0, + "suffix": "None" + } + } + } + ], + "callee": { + "abs_path": false, + "commentStart": 21, + "end": 27, + "name": { + "commentStart": 21, + "end": 27, + "name": "legLen", + "start": 21, + "type": "Identifier" + }, + "path": [], + "start": 21, + "type": "Name" + }, + "commentStart": 21, + "end": 35, + "start": 21, + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": { + "commentStart": 28, + "end": 29, "raw": "5", - "start": 24, + "start": 28, "type": "Literal", "type": "Literal", "value": { "value": 5.0, "suffix": "None" } - }, - { - "commentStart": 27, - "end": 28, - "raw": "4", - "start": 27, - "type": "Literal", - "type": "Literal", - "value": { - "value": 4.0, - "suffix": "None" - } } - ], - "callee": { - "abs_path": false, - "commentStart": 17, - "end": 23, - "name": { - "commentStart": 17, - "end": 23, - "name": "legLen", - "start": 17, - "type": "Identifier" - }, - "path": [], - "start": 17, - "type": "Name" }, - "commentStart": 17, - "end": 29, - "start": 17, - "type": "CallExpression", - "type": "CallExpression" - }, - "commentStart": 16, - "end": 29, - "operator": "-", - "start": 16, - "type": "UnaryExpression", - "type": "UnaryExpression" + "commentStart": 20, + "end": 35, + "operator": "-", + "start": 20, + "type": "UnaryExpression", + "type": "UnaryExpression" + } } ], "callee": { @@ -103,15 +133,16 @@ expression: actual "type": "Name" }, "commentStart": 8, - "end": 30, + "end": 36, "start": 8, - "type": "CallExpression", - "type": "CallExpression" + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null }, "start": 0, "type": "VariableDeclarator" }, - "end": 30, + "end": 36, "kind": "const", "start": 0, "type": "VariableDeclaration", @@ -119,6 +150,6 @@ expression: actual } ], "commentStart": 0, - "end": 30, + "end": 36, "start": 0 } diff --git a/rust/kcl-lib/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_tests__c.snap b/rust/kcl-lib/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_tests__c.snap index cab23fa89..da9677ce2 100644 --- a/rust/kcl-lib/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_tests__c.snap +++ b/rust/kcl-lib/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_tests__c.snap @@ -8,7 +8,7 @@ expression: actual "commentStart": 0, "declaration": { "commentStart": 0, - "end": 29, + "end": 37, "id": { "commentStart": 0, "end": 5, @@ -19,71 +19,112 @@ expression: actual "init": { "arguments": [ { - "argument": { - "arguments": [ - { - "commentStart": 20, - "end": 21, - "raw": "5", - "start": 20, - "type": "Literal", - "type": "Literal", - "value": { - "value": 5.0, - "suffix": "None" - } - }, - { - "commentStart": 23, - "end": 24, - "raw": "4", - "start": 23, - "type": "Literal", - "type": "Literal", - "value": { - "value": 4.0, - "suffix": "None" - } - } - ], - "callee": { - "abs_path": false, - "commentStart": 13, - "end": 19, - "name": { - "commentStart": 13, - "end": 19, - "name": "legLen", - "start": 13, - "type": "Identifier" - }, - "path": [], - "start": 13, - "type": "Name" - }, - "commentStart": 13, - "end": 25, - "start": 13, - "type": "CallExpression", - "type": "CallExpression" + "type": "LabeledArg", + "label": { + "commentStart": 12, + "end": 13, + "name": "x", + "start": 12, + "type": "Identifier" }, - "commentStart": 12, - "end": 25, - "operator": "-", - "start": 12, - "type": "UnaryExpression", - "type": "UnaryExpression" + "arg": { + "argument": { + "arguments": [ + { + "type": "LabeledArg", + "label": { + "commentStart": 22, + "end": 23, + "name": "a", + "start": 22, + "type": "Identifier" + }, + "arg": { + "commentStart": 24, + "end": 25, + "raw": "5", + "start": 24, + "type": "Literal", + "type": "Literal", + "value": { + "value": 5.0, + "suffix": "None" + } + } + }, + { + "type": "LabeledArg", + "label": { + "commentStart": 27, + "end": 28, + "name": "b", + "start": 27, + "type": "Identifier" + }, + "arg": { + "commentStart": 29, + "end": 30, + "raw": "4", + "start": 29, + "type": "Literal", + "type": "Literal", + "value": { + "value": 4.0, + "suffix": "None" + } + } + } + ], + "callee": { + "abs_path": false, + "commentStart": 15, + "end": 21, + "name": { + "commentStart": 15, + "end": 21, + "name": "legLen", + "start": 15, + "type": "Identifier" + }, + "path": [], + "start": 15, + "type": "Name" + }, + "commentStart": 15, + "end": 31, + "start": 15, + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null + }, + "commentStart": 14, + "end": 31, + "operator": "-", + "start": 14, + "type": "UnaryExpression", + "type": "UnaryExpression" + } }, { - "commentStart": 27, - "end": 28, - "raw": "5", - "start": 27, - "type": "Literal", - "type": "Literal", - "value": { - "value": 5.0, - "suffix": "None" + "type": "LabeledArg", + "label": { + "commentStart": 33, + "end": 34, + "name": "y", + "start": 33, + "type": "Identifier" + }, + "arg": { + "commentStart": 35, + "end": 36, + "raw": "5", + "start": 35, + "type": "Literal", + "type": "Literal", + "value": { + "value": 5.0, + "suffix": "None" + } } } ], @@ -103,15 +144,16 @@ expression: actual "type": "Name" }, "commentStart": 8, - "end": 29, + "end": 37, "start": 8, - "type": "CallExpression", - "type": "CallExpression" + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null }, "start": 0, "type": "VariableDeclarator" }, - "end": 29, + "end": 37, "kind": "const", "start": 0, "type": "VariableDeclaration", @@ -119,6 +161,6 @@ expression: actual } ], "commentStart": 0, - "end": 29, + "end": 37, "start": 0 } diff --git a/rust/kcl-lib/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_tests__d.snap b/rust/kcl-lib/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_tests__d.snap index ce5ecb940..ed8ee2e44 100644 --- a/rust/kcl-lib/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_tests__d.snap +++ b/rust/kcl-lib/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_tests__d.snap @@ -8,7 +8,7 @@ expression: actual "commentStart": 0, "declaration": { "commentStart": 0, - "end": 30, + "end": 27, "id": { "commentStart": 0, "end": 5, @@ -63,13 +63,6 @@ expression: actual "value": 45.0, "suffix": "None" } - }, - { - "commentStart": 28, - "end": 29, - "start": 28, - "type": "PipeSubstitution", - "type": "PipeSubstitution" } ], "callee": { @@ -88,14 +81,14 @@ expression: actual "type": "Name" }, "commentStart": 17, - "end": 30, + "end": 27, "start": 17, "type": "CallExpression", "type": "CallExpression" } ], "commentStart": 8, - "end": 30, + "end": 27, "start": 8, "type": "PipeExpression", "type": "PipeExpression" @@ -103,7 +96,7 @@ expression: actual "start": 0, "type": "VariableDeclarator" }, - "end": 30, + "end": 27, "kind": "const", "start": 0, "type": "VariableDeclaration", @@ -111,6 +104,6 @@ expression: actual } ], "commentStart": 0, - "end": 30, + "end": 27, "start": 0 } diff --git a/rust/kcl-lib/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_tests__y.snap b/rust/kcl-lib/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_tests__y.snap index b803ffe2c..21fc852c7 100644 --- a/rust/kcl-lib/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_tests__y.snap +++ b/rust/kcl-lib/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_tests__y.snap @@ -8,7 +8,7 @@ expression: actual "commentStart": 0, "declaration": { "commentStart": 0, - "end": 48, + "end": 43, "id": { "commentStart": 0, "end": 2, @@ -62,36 +62,29 @@ expression: actual "arguments": [ { "abs_path": false, - "commentStart": 41, - "end": 44, + "commentStart": 39, + "end": 42, "name": { - "commentStart": 41, - "end": 44, + "commentStart": 39, + "end": 42, "name": "pos", - "start": 41, + "start": 39, "type": "Identifier" }, "path": [], - "start": 41, + "start": 39, "type": "Name", "type": "Name" - }, - { - "commentStart": 46, - "end": 47, - "start": 46, - "type": "PipeSubstitution", - "type": "PipeSubstitution" } ], "callee": { "abs_path": false, "commentStart": 26, - "end": 40, + "end": 38, "name": { "commentStart": 26, - "end": 40, - "name": "startProfileAt", + "end": 38, + "name": "startProfile", "start": 26, "type": "Identifier" }, @@ -100,14 +93,14 @@ expression: actual "type": "Name" }, "commentStart": 26, - "end": 48, + "end": 43, "start": 26, "type": "CallExpression", "type": "CallExpression" } ], "commentStart": 5, - "end": 48, + "end": 43, "start": 5, "type": "PipeExpression", "type": "PipeExpression" @@ -115,7 +108,7 @@ expression: actual "start": 0, "type": "VariableDeclarator" }, - "end": 48, + "end": 43, "kind": "const", "start": 0, "type": "VariableDeclaration", @@ -123,6 +116,6 @@ expression: actual } ], "commentStart": 0, - "end": 48, + "end": 43, "start": 0 } diff --git a/rust/kcl-lib/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_tests__z.snap b/rust/kcl-lib/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_tests__z.snap index 0693edc13..7ba69bb3a 100644 --- a/rust/kcl-lib/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_tests__z.snap +++ b/rust/kcl-lib/src/parsing/snapshots/kcl_lib__parsing__parser__snapshot_tests__z.snap @@ -8,7 +8,7 @@ expression: actual "commentStart": 0, "declaration": { "commentStart": 0, - "end": 73, + "end": 68, "id": { "commentStart": 0, "end": 2, @@ -62,17 +62,17 @@ expression: actual "arguments": [ { "abs_path": false, - "commentStart": 45, - "end": 48, + "commentStart": 43, + "end": 46, "name": { - "commentStart": 45, - "end": 48, + "commentStart": 43, + "end": 46, "name": "pos", - "start": 45, + "start": 43, "type": "Identifier" }, "path": [], - "start": 45, + "start": 43, "type": "Name", "type": "Name" } @@ -80,11 +80,11 @@ expression: actual "callee": { "abs_path": false, "commentStart": 30, - "end": 44, + "end": 42, "name": { "commentStart": 30, - "end": 44, - "name": "startProfileAt", + "end": 42, + "name": "startProfile", "start": 30, "type": "Identifier" }, @@ -93,7 +93,7 @@ expression: actual "type": "Name" }, "commentStart": 30, - "end": 49, + "end": 47, "start": 30, "type": "CallExpression", "type": "CallExpression" @@ -101,13 +101,13 @@ expression: actual { "arguments": [ { - "commentStart": 58, + "commentStart": 56, "elements": [ { - "commentStart": 59, - "end": 60, + "commentStart": 57, + "end": 58, "raw": "0", - "start": 59, + "start": 57, "type": "Literal", "type": "Literal", "value": { @@ -118,65 +118,58 @@ expression: actual { "argument": { "abs_path": false, - "commentStart": 63, - "end": 68, + "commentStart": 61, + "end": 66, "name": { - "commentStart": 63, - "end": 68, + "commentStart": 61, + "end": 66, "name": "scale", - "start": 63, + "start": 61, "type": "Identifier" }, "path": [], - "start": 63, + "start": 61, "type": "Name", "type": "Name" }, - "commentStart": 62, - "end": 68, + "commentStart": 60, + "end": 66, "operator": "-", - "start": 62, + "start": 60, "type": "UnaryExpression", "type": "UnaryExpression" } ], - "end": 69, - "start": 58, + "end": 67, + "start": 56, "type": "ArrayExpression", "type": "ArrayExpression" - }, - { - "commentStart": 71, - "end": 72, - "start": 71, - "type": "PipeSubstitution", - "type": "PipeSubstitution" } ], "callee": { "abs_path": false, - "commentStart": 53, - "end": 57, + "commentStart": 51, + "end": 55, "name": { - "commentStart": 53, - "end": 57, + "commentStart": 51, + "end": 55, "name": "line", - "start": 53, + "start": 51, "type": "Identifier" }, "path": [], - "start": 53, + "start": 51, "type": "Name" }, - "commentStart": 53, - "end": 73, - "start": 53, + "commentStart": 51, + "end": 68, + "start": 51, "type": "CallExpression", "type": "CallExpression" } ], "commentStart": 5, - "end": 73, + "end": 68, "start": 5, "type": "PipeExpression", "type": "PipeExpression" @@ -184,7 +177,7 @@ expression: actual "start": 0, "type": "VariableDeclarator" }, - "end": 73, + "end": 68, "kind": "const", "start": 0, "type": "VariableDeclaration", @@ -192,6 +185,6 @@ expression: actual } ], "commentStart": 0, - "end": 73, + "end": 68, "start": 0 } diff --git a/rust/kcl-lib/src/settings/generate_settings_docs.rs b/rust/kcl-lib/src/settings/generate_settings_docs.rs index 3e484349e..20695567e 100644 --- a/rust/kcl-lib/src/settings/generate_settings_docs.rs +++ b/rust/kcl-lib/src/settings/generate_settings_docs.rs @@ -39,8 +39,8 @@ base_unit = "mm" text_wrapping = false "#; -const PROJECT_SETTINGS_DOC_PATH: &str = "../../docs/kcl/settings/project.md"; -const USER_SETTINGS_DOC_PATH: &str = "../../docs/kcl/settings/user.md"; +const PROJECT_SETTINGS_DOC_PATH: &str = "../../docs/kcl/settings-project.md"; +const USER_SETTINGS_DOC_PATH: &str = "../../docs/kcl/settings-user.md"; fn init_handlebars() -> handlebars::Handlebars<'static> { let mut hbs = handlebars::Handlebars::new(); diff --git a/rust/kcl-lib/src/settings/types/mod.rs b/rust/kcl-lib/src/settings/types/mod.rs index babf53996..0437d4b02 100644 --- a/rust/kcl-lib/src/settings/types/mod.rs +++ b/rust/kcl-lib/src/settings/types/mod.rs @@ -527,6 +527,9 @@ pub enum OnboardingStatus { #[serde(rename = "/export")] #[display("/export")] Export, + #[serde(rename = "/move")] + #[display("/move")] + Move, #[serde(rename = "/sketching")] #[display("/sketching")] Sketching, diff --git a/rust/kcl-lib/src/simulation_tests.rs b/rust/kcl-lib/src/simulation_tests.rs index c286bfb9f..39ff5c393 100644 --- a/rust/kcl-lib/src/simulation_tests.rs +++ b/rust/kcl-lib/src/simulation_tests.rs @@ -282,6 +282,7 @@ fn assert_common_snapshots( insta::assert_json_snapshot!("ops", operations, { "[].unlabeledArg.*.value.**[].from[]" => rounded_redaction(4), "[].unlabeledArg.*.value.**[].to[]" => rounded_redaction(4), + "[].*.unlabeledArg.value.value" => rounded_redaction(4), "[].labeledArgs.*.value.**[].from[]" => rounded_redaction(4), "[].labeledArgs.*.value.**[].to[]" => rounded_redaction(4), ".**.sourceRange" => Vec::new(), diff --git a/rust/kcl-lib/src/simulation_tests/kcl_samples.rs b/rust/kcl-lib/src/simulation_tests/kcl_samples.rs index 2f3b590ca..67e1438eb 100644 --- a/rust/kcl-lib/src/simulation_tests/kcl_samples.rs +++ b/rust/kcl-lib/src/simulation_tests/kcl_samples.rs @@ -51,6 +51,7 @@ async fn unparse_test(test: &Test) { .map(|file| { tokio::spawn(async move { let contents = tokio::fs::read_to_string(&file).await.unwrap(); + eprintln!("{}", file.display()); let program = crate::Program::parse_no_errs(&contents).unwrap(); let recast = program.recast_with_options(&Default::default()); diff --git a/rust/kcl-lib/src/source_range.rs b/rust/kcl-lib/src/source_range.rs index f554655c0..96d893247 100644 --- a/rust/kcl-lib/src/source_range.rs +++ b/rust/kcl-lib/src/source_range.rs @@ -99,6 +99,11 @@ impl SourceRange { pos >= self.start() && pos <= self.end() } + /// Check if the range contains another range. Modules must match. + pub(crate) fn contains_range(&self, other: &Self) -> bool { + self.module_id() == other.module_id() && self.start() <= other.start() && self.end() >= other.end() + } + pub fn start_to_lsp_position(&self, code: &str) -> LspPosition { // Calculate the line and column of the error from the source range. // Lines are zero indexed in vscode so we need to subtract 1. diff --git a/rust/kcl-lib/src/std/appearance.rs b/rust/kcl-lib/src/std/appearance.rs index 57c552766..d0cecaa5f 100644 --- a/rust/kcl-lib/src/std/appearance.rs +++ b/rust/kcl-lib/src/std/appearance.rs @@ -91,9 +91,9 @@ pub async fn appearance(exec_state: &mut ExecState, args: Args) -> Result extrude(length = 10) /// } /// -/// example0 = cube([0, 0]) -/// example1 = cube([20, 0]) -/// example2 = cube([40, 0]) +/// example0 = cube(center = [0, 0]) +/// example1 = cube(center = [20, 0]) +/// example2 = cube(center = [40, 0]) /// /// appearance([example0, example1], color='#ff0000', metalness=50, roughness=50) /// appearance(example2, color='#00ff00', metalness=50, roughness=50) diff --git a/rust/kcl-lib/src/std/array.rs b/rust/kcl-lib/src/std/array.rs index efa0195e2..43ff7839f 100644 --- a/rust/kcl-lib/src/std/array.rs +++ b/rust/kcl-lib/src/std/array.rs @@ -26,7 +26,7 @@ pub async fn map(exec_state: &mut ExecState, args: Args) -> Result circle( center= [id * 2 * r, 0], radius= r) /// } @@ -110,7 +110,7 @@ pub async fn reduce(exec_state: &mut ExecState, args: Args) -> Result Result Result extrude(length = 10) /// } /// -/// part001 = cube([0, 0], 10) -/// part002 = cube([7, 3], 5) +/// part001 = cube(center = [0, 0], size = 10) +/// part002 = cube(center = [7, 3], size = 5) /// |> translate(z = 1) /// /// unionedPart = union([part001, part002]) @@ -71,8 +71,8 @@ pub async fn union(exec_state: &mut ExecState, args: Args) -> Result extrude(length = 10) /// } /// -/// part001 = cube([0, 0], 10) -/// part002 = cube([7, 3], 5) +/// part001 = cube(center = [0, 0], size = 10) +/// part002 = cube(center = [7, 3], size = 5) /// |> translate(z = 1) /// /// // This is the equivalent of: union([part001, part002]) @@ -94,8 +94,8 @@ pub async fn union(exec_state: &mut ExecState, args: Args) -> Result extrude(length = 10) /// } /// -/// part001 = cube([0, 0], 10) -/// part002 = cube([7, 3], 5) +/// part001 = cube(center = [0, 0], size = 10) +/// part002 = cube(center = [7, 3], size = 5) /// |> translate(z = 1) /// /// // This is the equivalent of: union([part001, part002]) @@ -199,8 +199,8 @@ pub async fn intersect(exec_state: &mut ExecState, args: Args) -> Result extrude(length = 10) /// } /// -/// part001 = cube([0, 0], 10) -/// part002 = cube([7, 3], 5) +/// part001 = cube(center = [0, 0], size = 10) +/// part002 = cube(center = [7, 3], size = 5) /// |> translate(z = 1) /// /// intersectedPart = intersect([part001, part002]) @@ -221,8 +221,8 @@ pub async fn intersect(exec_state: &mut ExecState, args: Args) -> Result extrude(length = 10) /// } /// -/// part001 = cube([0, 0], 10) -/// part002 = cube([7, 3], 5) +/// part001 = cube(center = [0, 0], size = 10) +/// part002 = cube(center = [7, 3], size = 5) /// |> translate(z = 1) /// /// // This is the equivalent of: intersect([part001, part002]) @@ -332,8 +332,8 @@ pub async fn subtract(exec_state: &mut ExecState, args: Args) -> Result extrude(length = 10) /// } /// -/// part001 = cube([0, 0], 10) -/// part002 = cube([7, 3], 5) +/// part001 = cube(center = [0, 0], size = 10) +/// part002 = cube(center = [7, 3], size = 5) /// |> translate(z = 1) /// /// subtractedPart = subtract([part001], tools=[part002]) @@ -354,8 +354,8 @@ pub async fn subtract(exec_state: &mut ExecState, args: Args) -> Result extrude(length = 10) /// } /// -/// part001 = cube([0, 0], 10) -/// part002 = cube([7, 3], 5) +/// part001 = cube(center = [0, 0], size = 10) +/// part002 = cube(center = [7, 3], size = 5) /// |> translate(z = 1) /// /// // This is the equivalent of: subtract([part001], tools=[part002]) diff --git a/rust/kcl-lib/src/std/patterns.rs b/rust/kcl-lib/src/std/patterns.rs index b64033d40..ca94e2e55 100644 --- a/rust/kcl-lib/src/std/patterns.rs +++ b/rust/kcl-lib/src/std/patterns.rs @@ -96,7 +96,7 @@ pub async fn pattern_transform_2d(exec_state: &mut ExecState, args: Args) -> Res /// /// ```no_run /// // Each instance will be shifted along the X axis. -/// fn transform(id) { +/// fn transform(@id) { /// return { translate = [4 * id, 0, 0] } /// } /// @@ -110,7 +110,7 @@ pub async fn pattern_transform_2d(exec_state: &mut ExecState, args: Args) -> Res /// // Each instance will be shifted along the X axis, /// // with a gap between the original (at x = 0) and the first replica /// // (at x = 8). This is because `id` starts at 1. -/// fn transform(id) { +/// fn transform(@id) { /// return { translate = [4 * (1+id), 0, 0] } /// } /// @@ -140,7 +140,7 @@ pub async fn pattern_transform_2d(exec_state: &mut ExecState, args: Args) -> Res /// } /// /// width = 20 -/// fn transform(i) { +/// fn transform(@i) { /// return { /// // Move down each time. /// translate = [0, 0, -i * width], @@ -155,7 +155,7 @@ pub async fn pattern_transform_2d(exec_state: &mut ExecState, args: Args) -> Res /// } /// /// myCubes = -/// cube(width, [100,0]) +/// cube(length = width, center = [100,0]) /// |> patternTransform(instances = 25, transform = transform) /// ``` /// @@ -180,7 +180,7 @@ pub async fn pattern_transform_2d(exec_state: &mut ExecState, args: Args) -> Res /// } /// /// width = 20 -/// fn transform(i) { +/// fn transform(@i) { /// return { /// translate = [0, 0, -i * width], /// rotation = { @@ -191,7 +191,7 @@ pub async fn pattern_transform_2d(exec_state: &mut ExecState, args: Args) -> Res /// } /// } /// myCubes = -/// cube(width, [100,100]) +/// cube(length = width, center = [100,100]) /// |> patternTransform(instances = 4, transform = transform) /// ``` /// ```no_run @@ -201,7 +201,7 @@ pub async fn pattern_transform_2d(exec_state: &mut ExecState, args: Args) -> Res /// t = 0.005 // taper factor [0-1) /// // Defines how to modify each layer of the vase. /// // Each replica is shifted up the Z axis, and has a smoothly-varying radius -/// fn transform(replicaId) { +/// fn transform(@replicaId) { /// scale = r * abs(1 - (t * replicaId)) * (5 + cos((replicaId / 8): number(rad))) /// return { /// translate = [0, 0, replicaId * 10], @@ -219,7 +219,7 @@ pub async fn pattern_transform_2d(exec_state: &mut ExecState, args: Args) -> Res /// vase = layer() |> patternTransform(instances = 100, transform = transform) /// ``` /// ``` -/// fn transform(i) { +/// fn transform(@i) { /// // Transform functions can return multiple transforms. They'll be applied in order. /// return [ /// { translate = [30 * i, 0, 0] }, @@ -282,7 +282,7 @@ async fn inner_pattern_transform<'a>( /// Just like patternTransform, but works on 2D sketches not 3D solids. /// ```no_run /// // Each instance will be shifted along the X axis. -/// fn transform(id) { +/// fn transform(@id) { /// return { translate = [4 * id, 0] } /// } /// diff --git a/rust/kcl-lib/src/std/segment.rs b/rust/kcl-lib/src/std/segment.rs index 8a97e02e0..eb4acf9e8 100644 --- a/rust/kcl-lib/src/std/segment.rs +++ b/rust/kcl-lib/src/std/segment.rs @@ -42,10 +42,10 @@ pub async fn segment_end(exec_state: &mut ExecState, args: Args) -> Result extrude(length = radius) /// } /// -/// cylinder(1, line1) -/// cylinder(2, line2) -/// cylinder(3, line3) -/// cylinder(4, line4) +/// cylinder(radius = 1, tag = line1) +/// cylinder(radius = 2, tag = line2) +/// cylinder(radius = 3, tag = line3) +/// cylinder(radius = 4, tag = line4) /// ``` #[stdlib { name = "segEnd", @@ -178,10 +178,10 @@ pub async fn segment_start(exec_state: &mut ExecState, args: Args) -> Result extrude(length = radius) /// } /// -/// cylinder(1, line1) -/// cylinder(2, line2) -/// cylinder(3, line3) -/// cylinder(4, line4) +/// cylinder(radius = 1, tag = line1) +/// cylinder(radius = 2, tag = line2) +/// cylinder(radius = 3, tag = line3) +/// cylinder(radius = 4, tag = line4) /// ``` #[stdlib { name = "segStart", diff --git a/rust/kcl-lib/src/std/transform.rs b/rust/kcl-lib/src/std/transform.rs index b7d4bcdfa..b364e9270 100644 --- a/rust/kcl-lib/src/std/transform.rs +++ b/rust/kcl-lib/src/std/transform.rs @@ -326,7 +326,7 @@ pub async fn translate(exec_state: &mut ExecState, args: Args) -> Result startProfileAt([x, y], %) + |> startProfile(at = [x, y]) |> xLine(length = w) |> yLine(length = h) |> xLine(length = -w) |> close() - |> extrude(d, %) + |> extrude(d) } fn quad(x1, y1, x2, y2, x3, y3, x4, y4) { startSketchOn(XY) - |> startProfileAt([x1, y1], %) + |> startProfile(at = [x1, y1]) |> line(endAbsolute = [x2, y2]) |> line(endAbsolute = [x3, y3]) |> line(endAbsolute = [x4, y4]) |> close() - |> extrude(d, %) + |> extrude(d) } fn crosshair(x, y) { startSketchOn(XY) - |> startProfileAt([x, y], %) + |> startProfile(at = [x, y]) |> yLine(length = 1) |> yLine(length = -2) |> yLine(length = 1) @@ -1159,11 +1159,30 @@ fn z(z_x, z_y) { z_corner = s * 2 z_w = z_end_w + 2 * z_corner z_h = z_w * 1.08130081300813 - rect(z_x, z_y, z_end_w, -z_end_h) - rect(z_x + z_w, z_y, -z_corner, -z_corner) - rect(z_x + z_w, z_y - z_h, -z_end_w, z_end_h) - rect(z_x, z_y - z_h, z_corner, z_corner) - quad(z_x, z_y - z_h + z_corner, z_x + z_w - z_corner, z_y, z_x + z_w, z_y - z_corner, z_x + z_corner, z_y - z_h) + rect( + z_x, + a = z_y, + b = z_end_w, + c = -z_end_h, + ) + rect( + z_x + z_w, + a = z_y, + b = -z_corner, + c = -z_corner, + ) + rect( + z_x + z_w, + a = z_y - z_h, + b = -z_end_w, + c = z_end_h, + ) + rect( + z_x, + a = z_y - z_h, + b = z_corner, + c = z_corner, + ) } fn o(c_x, c_y) { @@ -1175,61 +1194,45 @@ fn o(c_x, c_y) { a = 7 // Start point for the top sketch - o_x1 = c_x + o_r * cos((45 + a) / 360 * tau()) - o_y1 = c_y + o_r * sin((45 + a) / 360 * tau()) + o_x1 = c_x + o_r * cos((45 + a) / 360 * TAU) + o_y1 = c_y + o_r * sin((45 + a) / 360 * TAU) // Start point for the bottom sketch - o_x2 = c_x + o_r * cos((225 + a) / 360 * tau()) - o_y2 = c_y + o_r * sin((225 + a) / 360 * tau()) + o_x2 = c_x + o_r * cos((225 + a) / 360 * TAU) + o_y2 = c_y + o_r * sin((225 + a) / 360 * TAU) // End point for the bottom startSketch - o_x3 = c_x + o_r * cos((45 - a) / 360 * tau()) - o_y3 = c_y + o_r * sin((45 - a) / 360 * tau()) + o_x3 = c_x + o_r * cos((45 - a) / 360 * TAU) + o_y3 = c_y + o_r * sin((45 - a) / 360 * TAU) // Where is the center? // crosshair(c_x, c_y) startSketchOn(XY) - |> startProfileAt([o_x1, o_y1], %) - |> arc({ - radius = o_r, - angle_start = 45 + a, - angle_end = 225 - a - }, %) + |> startProfile(at = [o_x1, o_y1]) + |> arc(radius = o_r, angle_start = 45 + a, angle_end = 225 - a) |> angledLine(angle = 45, length = o_r - i_r) - |> arc({ - radius = i_r, - angle_start = 225 - a, - angle_end = 45 + a - }, %) + |> arc(radius = i_r, angle_start = 225 - a, angle_end = 45 + a) |> close() - |> extrude(d, %) + |> extrude(d) startSketchOn(XY) - |> startProfileAt([o_x2, o_y2], %) - |> arc({ - radius = o_r, - angle_start = 225 + a, - angle_end = 360 + 45 - a - }, %) + |> startProfile(at = [o_x2, o_y2]) + |> arc(radius = o_r, angle_start = 225 + a, angle_end = 360 + 45 - a) |> angledLine(angle = 225, length = o_r - i_r) - |> arc({ - radius = i_r, - angle_start = 45 - a, - angle_end = 225 + a - 360 - }, %) + |> arc(radius = i_r, angle_start = 45 - a, angle_end = 225 + a - 360) |> close() - |> extrude(d, %) + |> extrude(d) } fn zoo(x0, y0) { - z(x0, y0) - o(x0 + s * 20, y0 - (s * 6.7)) - o(x0 + s * 35, y0 - (s * 6.7)) + z(x = x0, y = y0) + o(x = x0 + s * 20, y = y0 - (s * 6.7)) + o(x = x0 + s * 35, y = y0 - (s * 6.7)) } -zoo(zoo_x, zoo_y) +zoo(x = zoo_x, y = zoo_y) "#; let program = crate::parsing::top_level_parse(some_program_string).unwrap(); @@ -1250,32 +1253,32 @@ overHangLength = .4 // Sketch and revolve the inside bearing piece insideRevolve = startSketchOn(XZ) - |> startProfileAt([insideDia / 2, 0], %) - |> line([0, thickness + sphereDia / 2], %) - |> line([overHangLength, 0], %) - |> line([0, -thickness], %) - |> line([-overHangLength + thickness, 0], %) - |> line([0, -sphereDia], %) - |> line([overHangLength - thickness, 0], %) - |> line([0, -thickness], %) - |> line([-overHangLength, 0], %) + |> startProfile(at = [insideDia / 2, 0]) + |> line(end = [0, thickness + sphereDia / 2]) + |> line(end = [overHangLength, 0]) + |> line(end = [0, -thickness]) + |> line(end = [-overHangLength + thickness, 0]) + |> line(end = [0, -sphereDia]) + |> line(end = [overHangLength - thickness, 0]) + |> line(end = [0, -thickness]) + |> line(end = [-overHangLength, 0]) |> close() - |> revolve({ axis = Y }, %) + |> revolve(axis = Y) // Sketch and revolve one of the balls and duplicate it using a circular pattern. (This is currently a workaround, we have a bug with rotating on a sketch that touches the rotation axis) sphere = startSketchOn(XZ) - |> startProfileAt([ + |> startProfile(at = [ 0.05 + insideDia / 2 + thickness, 0 - 0.05 - ], %) - |> line([sphereDia - 0.1, 0], %) - |> arc({ + ]) + |> line(end = [sphereDia - 0.1, 0]) + |> arc( angle_start = 0, angle_end = -180, radius = sphereDia / 2 - 0.05 - }, %) + ) |> close() - |> revolve({ axis = X }, %) + |> revolve(axis = X) |> patternCircular3d( axis = [0, 0, 1], center = [0, 0, 0], @@ -1286,20 +1289,21 @@ sphere = startSketchOn(XZ) // Sketch and revolve the outside bearing outsideRevolve = startSketchOn(XZ) - |> startProfileAt([ + |> startProfile(at = [ insideDia / 2 + thickness + sphereDia, 0 - ], %) - |> line([0, sphereDia / 2], %) - |> line([-overHangLength + thickness, 0], %) - |> line([0, thickness], %) - |> line([overHangLength, 0], %) - |> line([0, -2 * thickness - sphereDia], %) - |> line([-overHangLength, 0], %) - |> line([0, thickness], %) - |> line([overHangLength - thickness, 0], %) + ] + ) + |> line(end = [0, sphereDia / 2]) + |> line(end = [-overHangLength + thickness, 0]) + |> line(end = [0, thickness]) + |> line(end = [overHangLength, 0]) + |> line(end = [0, -2 * thickness - sphereDia]) + |> line(end = [-overHangLength, 0]) + |> line(end = [0, thickness]) + |> line(end = [overHangLength - thickness, 0]) |> close() - |> revolve({ axis = Y }, %)"#; + |> revolve(axis = Y)"#; let program = crate::parsing::top_level_parse(some_program_string).unwrap(); let recasted = program.recast(&Default::default(), 0); @@ -1316,32 +1320,28 @@ overHangLength = .4 // Sketch and revolve the inside bearing piece insideRevolve = startSketchOn(XZ) - |> startProfileAt([insideDia / 2, 0], %) - |> line([0, thickness + sphereDia / 2], %) - |> line([overHangLength, 0], %) - |> line([0, -thickness], %) - |> line([-overHangLength + thickness, 0], %) - |> line([0, -sphereDia], %) - |> line([overHangLength - thickness, 0], %) - |> line([0, -thickness], %) - |> line([-overHangLength, 0], %) + |> startProfile(at = [insideDia / 2, 0]) + |> line(end = [0, thickness + sphereDia / 2]) + |> line(end = [overHangLength, 0]) + |> line(end = [0, -thickness]) + |> line(end = [-overHangLength + thickness, 0]) + |> line(end = [0, -sphereDia]) + |> line(end = [overHangLength - thickness, 0]) + |> line(end = [0, -thickness]) + |> line(end = [-overHangLength, 0]) |> close() - |> revolve({ axis = Y }, %) + |> revolve(axis = Y) // Sketch and revolve one of the balls and duplicate it using a circular pattern. (This is currently a workaround, we have a bug with rotating on a sketch that touches the rotation axis) sphere = startSketchOn(XZ) - |> startProfileAt([ + |> startProfile(at = [ 0.05 + insideDia / 2 + thickness, 0 - 0.05 - ], %) - |> line([sphereDia - 0.1, 0], %) - |> arc({ - angle_start = 0, - angle_end = -180, - radius = sphereDia / 2 - 0.05 - }, %) + ]) + |> line(end = [sphereDia - 0.1, 0]) + |> arc(angle_start = 0, angle_end = -180, radius = sphereDia / 2 - 0.05) |> close() - |> revolve({ axis = X }, %) + |> revolve(axis = X) |> patternCircular3d( axis = [0, 0, 1], center = [0, 0, 0], @@ -1352,20 +1352,20 @@ sphere = startSketchOn(XZ) // Sketch and revolve the outside bearing outsideRevolve = startSketchOn(XZ) - |> startProfileAt([ + |> startProfile(at = [ insideDia / 2 + thickness + sphereDia, 0 - ], %) - |> line([0, sphereDia / 2], %) - |> line([-overHangLength + thickness, 0], %) - |> line([0, thickness], %) - |> line([overHangLength, 0], %) - |> line([0, -2 * thickness - sphereDia], %) - |> line([-overHangLength, 0], %) - |> line([0, thickness], %) - |> line([overHangLength - thickness, 0], %) + ]) + |> line(end = [0, sphereDia / 2]) + |> line(end = [-overHangLength + thickness, 0]) + |> line(end = [0, thickness]) + |> line(end = [overHangLength, 0]) + |> line(end = [0, -2 * thickness - sphereDia]) + |> line(end = [-overHangLength, 0]) + |> line(end = [0, thickness]) + |> line(end = [overHangLength - thickness, 0]) |> close() - |> revolve({ axis = Y }, %) + |> revolve(axis = Y) "# ); } @@ -1458,7 +1458,7 @@ f = [1, 2, 3]: [number; 1+] let some_program_string = r#"bing = { yo = 55 } myNestedVar = [ { - prop: line([bing.yo, 21], sketch001) + prop: line(a = [bing.yo, 21], b = sketch001) } ] "#; @@ -1470,7 +1470,7 @@ myNestedVar = [ r#"bing = { yo = 55 } myNestedVar = [ { - prop = line([bing.yo, 21], sketch001) + prop = line(a = [bing.yo, 21], b = sketch001) } ] "# @@ -1502,10 +1502,10 @@ myNestedVar = [ fn test_recast_shebang() { let some_program_string = r#"#!/usr/local/env zoo kcl part001 = startSketchOn(XY) - |> startProfileAt([-10, -10], %) - |> line([20, 0], %) - |> line([0, 20], %) - |> line([-20, 0], %) + |> startProfile(at = [-10, -10]) + |> line(end = [20, 0]) + |> line(end = [0, 20]) + |> line(end = [-20, 0]) |> close() "#; @@ -1517,10 +1517,10 @@ part001 = startSketchOn(XY) r#"#!/usr/local/env zoo kcl part001 = startSketchOn(XY) - |> startProfileAt([-10, -10], %) - |> line([20, 0], %) - |> line([0, 20], %) - |> line([-20, 0], %) + |> startProfile(at = [-10, -10]) + |> line(end = [20, 0]) + |> line(end = [0, 20]) + |> line(end = [-20, 0]) |> close() "# ); @@ -1533,10 +1533,10 @@ part001 = startSketchOn(XY) part001 = startSketchOn(XY) - |> startProfileAt([-10, -10], %) - |> line([20, 0], %) - |> line([0, 20], %) - |> line([-20, 0], %) + |> startProfile(at = [-10, -10]) + |> line(end = [20, 0]) + |> line(end = [0, 20]) + |> line(end = [-20, 0]) |> close() "#; @@ -1548,10 +1548,10 @@ part001 = startSketchOn(XY) r#"#!/usr/local/env zoo kcl part001 = startSketchOn(XY) - |> startProfileAt([-10, -10], %) - |> line([20, 0], %) - |> line([0, 20], %) - |> line([-20, 0], %) + |> startProfile(at = [-10, -10]) + |> line(end = [20, 0]) + |> line(end = [0, 20]) + |> line(end = [-20, 0]) |> close() "# ); @@ -1563,10 +1563,10 @@ part001 = startSketchOn(XY) // Yo yo my comments. part001 = startSketchOn(XY) - |> startProfileAt([-10, -10], %) - |> line([20, 0], %) - |> line([0, 20], %) - |> line([-20, 0], %) + |> startProfile(at = [-10, -10]) + |> line(end = [20, 0]) + |> line(end = [0, 20]) + |> line(end = [-20, 0]) |> close() "#; @@ -1579,10 +1579,10 @@ part001 = startSketchOn(XY) // Yo yo my comments. part001 = startSketchOn(XY) - |> startProfileAt([-10, -10], %) - |> line([20, 0], %) - |> line([0, 20], %) - |> line([-20, 0], %) + |> startProfile(at = [-10, -10]) + |> line(end = [20, 0]) + |> line(end = [0, 20]) + |> line(end = [-20, 0]) |> close() "# ); @@ -1613,7 +1613,7 @@ hole_diam = 5 // define a rectangular shape func fn rectShape(pos, w, l) { rr = startSketchOn(XY) - |> startProfileAt([pos[0] - (w / 2), pos[1] - (l / 2)], %) + |> startProfile(at = [pos[0] - (w / 2), pos[1] - (l / 2)]) |> line(endAbsolute = [pos[0] + w / 2, pos[1] - (l / 2)], tag = $edge1) |> line(endAbsolute = [pos[0] + w / 2, pos[1] + l / 2], tag = $edge2) |> line(endAbsolute = [pos[0] - (w / 2), pos[1] + l / 2], tag = $edge3) @@ -1622,8 +1622,8 @@ fn rectShape(pos, w, l) { } // build the body of the focusrite scarlett solo gen 4 // only used for visualization -scarlett_body = rectShape([0, 0], width, length) - |> extrude(depth, %) +scarlett_body = rectShape(pos = [0, 0], w = width, l = length) + |> extrude(depth) |> fillet( radius = radius, tags = [ @@ -1636,14 +1636,14 @@ scarlett_body = rectShape([0, 0], width, length) // build the bracket sketch around the body fn bracketSketch(w, d, t) { s = startSketchOn({ - plane: { + plane = { origin = { x = 0, y = length / 2 + thk, z = 0 }, x_axis = { x = 1, y = 0, z = 0 }, y_axis = { x = 0, y = 0, z = 1 }, z_axis = { x = 0, y = 1, z = 0 } } }) - |> startProfileAt([-w / 2 - t, d + t], %) + |> startProfile(at = [-w / 2 - t, d + t]) |> line(endAbsolute = [-w / 2 - t, -t], tag = $edge1) |> line(endAbsolute = [w / 2 + t, -t], tag = $edge2) |> line(endAbsolute = [w / 2 + t, d + t], tag = $edge3) @@ -1655,8 +1655,8 @@ fn bracketSketch(w, d, t) { return s } // build the body of the bracket -bracket_body = bracketSketch(width, depth, thk) - |> extrude(length + 10, %) +bracket_body = bracketSketch(w = width, d = depth, t = thk) + |> extrude(length + 10) |> fillet( radius = radius, tags = [ @@ -1668,26 +1668,26 @@ bracket_body = bracketSketch(width, depth, thk) ) // build the tabs of the mounting bracket (right side) tabs_r = startSketchOn({ - plane: { + plane = { origin = { x = 0, y = 0, z = depth + thk }, x_axis = { x = 1, y = 0, z = 0 }, y_axis = { x = 0, y = 1, z = 0 }, z_axis = { x = 0, y = 0, z = 1 } } }) - |> startProfileAt([width / 2 + thk, length / 2 + thk], %) - |> line([10, -5], %) - |> line([0, -10], %) - |> line([-10, -5], %) + |> startProfile(at = [width / 2 + thk, length / 2 + thk]) + |> line(end = [10, -5]) + |> line(end = [0, -10]) + |> line(end = [-10, -5]) |> close() - |> hole(circle( + |> subtract2d(tool = circle( center = [ width / 2 + thk + hole_diam, length / 2 - hole_diam ], radius = hole_diam / 2 - ), %) - |> extrude(-thk, %) + )) + |> extrude(-thk) |> patternLinear3d( axis = [0, -1, 0], repetitions = 1, @@ -1695,26 +1695,26 @@ tabs_r = startSketchOn({ ) // build the tabs of the mounting bracket (left side) tabs_l = startSketchOn({ - plane: { + plane = { origin = { x = 0, y = 0, z = depth + thk }, x_axis = { x = 1, y = 0, z = 0 }, y_axis = { x = 0, y = 1, z = 0 }, z_axis = { x = 0, y = 0, z = 1 } } }) - |> startProfileAt([-width / 2 - thk, length / 2 + thk], %) - |> line([-10, -5], %) - |> line([0, -10], %) - |> line([10, -5], %) + |> startProfile(at = [-width / 2 - thk, length / 2 + thk]) + |> line(end = [-10, -5]) + |> line(end = [0, -10]) + |> line(end = [10, -5]) |> close() - |> hole(circle( + |> subtract2d(tool = circle( center = [ -width / 2 - thk - hole_diam, length / 2 - hole_diam ], radius = hole_diam / 2 - ), %) - |> extrude(-thk, %) + )) + |> extrude(-thk) |> patternLinear3d(axis = [0, -1, 0], repetitions = 1, distance = length - 10ft) "#; let program = crate::parsing::top_level_parse(some_program_string).unwrap(); @@ -1735,7 +1735,7 @@ hole_diam = 5 // define a rectangular shape func fn rectShape(pos, w, l) { rr = startSketchOn(XY) - |> startProfileAt([pos[0] - (w / 2), pos[1] - (l / 2)], %) + |> startProfile(at = [pos[0] - (w / 2), pos[1] - (l / 2)]) |> line(endAbsolute = [pos[0] + w / 2, pos[1] - (l / 2)], tag = $edge1) |> line(endAbsolute = [pos[0] + w / 2, pos[1] + l / 2], tag = $edge2) |> line(endAbsolute = [pos[0] - (w / 2), pos[1] + l / 2], tag = $edge3) @@ -1744,8 +1744,8 @@ fn rectShape(pos, w, l) { } // build the body of the focusrite scarlett solo gen 4 // only used for visualization -scarlett_body = rectShape([0, 0], width, length) - |> extrude(depth, %) +scarlett_body = rectShape(pos = [0, 0], w = width, l = length) + |> extrude(depth) |> fillet( radius = radius, tags = [ @@ -1765,7 +1765,7 @@ fn bracketSketch(w, d, t) { z_axis = { x = 0, y = 1, z = 0 } } }) - |> startProfileAt([-w / 2 - t, d + t], %) + |> startProfile(at = [-w / 2 - t, d + t]) |> line(endAbsolute = [-w / 2 - t, -t], tag = $edge1) |> line(endAbsolute = [w / 2 + t, -t], tag = $edge2) |> line(endAbsolute = [w / 2 + t, d + t], tag = $edge3) @@ -1777,8 +1777,8 @@ fn bracketSketch(w, d, t) { return s } // build the body of the bracket -bracket_body = bracketSketch(width, depth, thk) - |> extrude(length + 10, %) +bracket_body = bracketSketch(w = width, d = depth, t = thk) + |> extrude(length + 10) |> fillet( radius = radius, tags = [ @@ -1797,19 +1797,19 @@ tabs_r = startSketchOn({ z_axis = { x = 0, y = 0, z = 1 } } }) - |> startProfileAt([width / 2 + thk, length / 2 + thk], %) - |> line([10, -5], %) - |> line([0, -10], %) - |> line([-10, -5], %) + |> startProfile(at = [width / 2 + thk, length / 2 + thk]) + |> line(end = [10, -5]) + |> line(end = [0, -10]) + |> line(end = [-10, -5]) |> close() - |> hole(circle( + |> subtract2d(tool = circle( center = [ width / 2 + thk + hole_diam, length / 2 - hole_diam ], radius = hole_diam / 2, - ), %) - |> extrude(-thk, %) + )) + |> extrude(-thk) |> patternLinear3d(axis = [0, -1, 0], repetitions = 1, distance = length - 10) // build the tabs of the mounting bracket (left side) tabs_l = startSketchOn({ @@ -1820,19 +1820,19 @@ tabs_l = startSketchOn({ z_axis = { x = 0, y = 0, z = 1 } } }) - |> startProfileAt([-width / 2 - thk, length / 2 + thk], %) - |> line([-10, -5], %) - |> line([0, -10], %) - |> line([10, -5], %) + |> startProfile(at = [-width / 2 - thk, length / 2 + thk]) + |> line(end = [-10, -5]) + |> line(end = [0, -10]) + |> line(end = [10, -5]) |> close() - |> hole(circle( + |> subtract2d(tool = circle( center = [ -width / 2 - thk - hole_diam, length / 2 - hole_diam ], radius = hole_diam / 2, - ), %) - |> extrude(-thk, %) + )) + |> extrude(-thk) |> patternLinear3d(axis = [0, -1, 0], repetitions = 1, distance = length - 10ft) "# ); @@ -1842,12 +1842,12 @@ tabs_l = startSketchOn({ fn test_recast_nested_var_declaration_in_fn_body() { let some_program_string = r#"fn cube(pos, scale) { sg = startSketchOn(XY) - |> startProfileAt(pos, %) - |> line([0, scale], %) - |> line([scale, 0], %) - |> line([0, -scale], %) + |> startProfile(at = pos) + |> line(end = [0, scale]) + |> line(end = [scale, 0]) + |> line(end = [0, -scale]) |> close() - |> extrude(scale, %) + |> extrude(scale) }"#; let program = crate::parsing::top_level_parse(some_program_string).unwrap(); @@ -1856,12 +1856,12 @@ tabs_l = startSketchOn({ recasted, r#"fn cube(pos, scale) { sg = startSketchOn(XY) - |> startProfileAt(pos, %) - |> line([0, scale], %) - |> line([scale, 0], %) - |> line([0, -scale], %) + |> startProfile(at = pos) + |> line(end = [0, scale]) + |> line(end = [scale, 0]) + |> line(end = [0, -scale]) |> close() - |> extrude(scale, %) + |> extrude(scale) } "# ); @@ -1873,15 +1873,15 @@ tabs_l = startSketchOn({ x = dfsfs + dfsfsd as y sg = startSketchOn(XY) - |> startProfileAt(pos, %) as foo - |> line([0, scale], %) - |> line([scale, 0], %) as bar - |> line([0 as baz, -scale] as qux, %) + |> startProfile(at = pos) as foo + |> line([0, scale]) + |> line([scale, 0]) as bar + |> line([0 as baz, -scale] as qux) |> close() - |> extrude(scale, %) + |> extrude(length = scale) } -cube(0, 0) as cub +cube(pos = 0, scale = 0) as cub "#; let program = crate::parsing::top_level_parse(some_program_string).unwrap(); @@ -1892,18 +1892,18 @@ cube(0, 0) as cub #[test] fn test_recast_with_bad_indentation() { let some_program_string = r#"part001 = startSketchOn(XY) - |> startProfileAt([0.0, 5.0], %) - |> line([0.4900857016, -0.0240763666], %) - |> line([0.6804562304, 0.9087880491], %)"#; + |> startProfile(at = [0.0, 5.0]) + |> line(end = [0.4900857016, -0.0240763666]) + |> line(end = [0.6804562304, 0.9087880491])"#; let program = crate::parsing::top_level_parse(some_program_string).unwrap(); let recasted = program.recast(&Default::default(), 0); assert_eq!( recasted, r#"part001 = startSketchOn(XY) - |> startProfileAt([0.0, 5.0], %) - |> line([0.4900857016, -0.0240763666], %) - |> line([0.6804562304, 0.9087880491], %) + |> startProfile(at = [0.0, 5.0]) + |> line(end = [0.4900857016, -0.0240763666]) + |> line(end = [0.6804562304, 0.9087880491]) "# ); } @@ -1911,38 +1911,38 @@ cube(0, 0) as cub #[test] fn test_recast_with_bad_indentation_and_inline_comment() { let some_program_string = r#"part001 = startSketchOn(XY) - |> startProfileAt([0.0, 5.0], %) - |> line([0.4900857016, -0.0240763666], %) // hello world - |> line([0.6804562304, 0.9087880491], %)"#; + |> startProfile(at = [0.0, 5.0]) + |> line(end = [0.4900857016, -0.0240763666]) // hello world + |> line(end = [0.6804562304, 0.9087880491])"#; let program = crate::parsing::top_level_parse(some_program_string).unwrap(); let recasted = program.recast(&Default::default(), 0); assert_eq!( recasted, r#"part001 = startSketchOn(XY) - |> startProfileAt([0.0, 5.0], %) - |> line([0.4900857016, -0.0240763666], %) // hello world - |> line([0.6804562304, 0.9087880491], %) + |> startProfile(at = [0.0, 5.0]) + |> line(end = [0.4900857016, -0.0240763666]) // hello world + |> line(end = [0.6804562304, 0.9087880491]) "# ); } #[test] fn test_recast_with_bad_indentation_and_line_comment() { let some_program_string = r#"part001 = startSketchOn(XY) - |> startProfileAt([0.0, 5.0], %) - |> line([0.4900857016, -0.0240763666], %) + |> startProfile(at = [0.0, 5.0]) + |> line(end = [0.4900857016, -0.0240763666]) // hello world - |> line([0.6804562304, 0.9087880491], %)"#; + |> line(end = [0.6804562304, 0.9087880491])"#; let program = crate::parsing::top_level_parse(some_program_string).unwrap(); let recasted = program.recast(&Default::default(), 0); assert_eq!( recasted, r#"part001 = startSketchOn(XY) - |> startProfileAt([0.0, 5.0], %) - |> line([0.4900857016, -0.0240763666], %) + |> startProfile(at = [0.0, 5.0]) + |> line(end = [0.4900857016, -0.0240763666]) // hello world - |> line([0.6804562304, 0.9087880491], %) + |> line(end = [0.6804562304, 0.9087880491]) "# ); } @@ -2085,7 +2085,7 @@ thing = 'foo' /* comment at start */ mySk1 = startSketchOn(XY) - |> startProfileAt([0, 0], %)"#; + |> startProfile(at = [0, 0])"#; let program = crate::parsing::top_level_parse(test_program).unwrap(); let recasted = program.recast(&Default::default(), 0); @@ -2094,7 +2094,7 @@ mySk1 = startSketchOn(XY) r#"/* comment at start */ mySk1 = startSketchOn(XY) - |> startProfileAt([0, 0], %) + |> startProfile(at = [0, 0]) "# ); } @@ -2103,7 +2103,7 @@ mySk1 = startSketchOn(XY) fn test_recast_lots_of_comments() { let some_program_string = r#"// comment at start mySk1 = startSketchOn(XY) - |> startProfileAt([0, 0], %) + |> startProfile(at = [0, 0]) |> line(endAbsolute = [1, 1]) // comment here |> line(endAbsolute = [0, 1], tag = $myTag) @@ -2112,10 +2112,10 @@ mySk1 = startSketchOn(XY) here */ // a comment between pipe expression statements - |> rx(90, %) + |> rx(90) // and another with just white space between others below - |> ry(45, %) - |> rx(45, %) + |> ry(45) + |> rx(45) // one more for good measure"#; let program = crate::parsing::top_level_parse(some_program_string).unwrap(); @@ -2124,7 +2124,7 @@ mySk1 = startSketchOn(XY) recasted, r#"// comment at start mySk1 = startSketchOn(XY) - |> startProfileAt([0, 0], %) + |> startProfile(at = [0, 0]) |> line(endAbsolute = [1, 1]) // comment here |> line(endAbsolute = [0, 1], tag = $myTag) @@ -2132,10 +2132,10 @@ mySk1 = startSketchOn(XY) /* and here */ // a comment between pipe expression statements - |> rx(90, %) + |> rx(90) // and another with just white space between others below - |> ry(45, %) - |> rx(45, %) + |> ry(45) + |> rx(45) // one more for good measure "# ); @@ -2223,10 +2223,10 @@ myVar3 = 6 myAng = 40 myAng2 = 134 part001 = startSketchOn(XY) - |> startProfileAt([0, 0], %) - |> line([1, 3.82], %, $seg01) // ln-should-get-tag - |> angledLine(angle = -foo(seg01, myVar, %), length = myVar) // ln-lineTo-xAbsolute should use angleToMatchLengthX helper - |> angledLine(angle = -bar(seg01, myVar, %), length = myVar) // ln-lineTo-yAbsolute should use angleToMatchLengthY helper"#; + |> startProfile(at = [0, 0]) + |> line(end = [1, 3.82], tag = $seg01) // ln-should-get-tag + |> angledLine(angle = -foo(x = seg01, y = myVar, z = %), length = myVar) // ln-lineTo-xAbsolute should use angleToMatchLengthX helper + |> angledLine(angle = -bar(x = seg01, y = myVar, z = %), length = myVar) // ln-lineTo-yAbsolute should use angleToMatchLengthY helper"#; let program = crate::parsing::top_level_parse(some_program_string).unwrap(); let recasted = program.recast(&Default::default(), 0); @@ -2241,10 +2241,10 @@ myVar3 = 6 myAng = 40 myAng2 = 134 part001 = startSketchOn(XY) - |> startProfileAt([0, 0], %) - |> line([1, 3.82], %, $seg01) // ln-should-get-tag - |> angledLine(angle = -foo(seg01, myVar, %), length = myVar) // ln-lineTo-xAbsolute should use angleToMatchLengthX helper - |> angledLine(angle = -bar(seg01, myVar, %), length = myVar) // ln-lineTo-yAbsolute should use angleToMatchLengthY helper + |> startProfile(at = [0, 0]) + |> line(end = [1, 3.82], tag = $seg01) // ln-should-get-tag + |> angledLine(angle = -foo(x = seg01, y = myVar, z = %), length = myVar) // ln-lineTo-xAbsolute should use angleToMatchLengthX helper + |> angledLine(angle = -bar(x = seg01, y = myVar, z = %), length = myVar) // ln-lineTo-yAbsolute should use angleToMatchLengthY helper "#; let program = crate::parsing::top_level_parse(some_program_string).unwrap(); @@ -2262,8 +2262,8 @@ part001 = startSketchOn(XY) #[test] fn test_recast_after_rename_std() { let some_program_string = r#"part001 = startSketchOn(XY) - |> startProfileAt([0.0000000000, 5.0000000000], %) - |> line([0.4900857016, -0.0240763666], %) + |> startProfile(at = [0.0000000000, 5.0000000000]) + |> line(end = [0.4900857016, -0.0240763666]) part002 = "part002" things = [part001, 0.0] @@ -2282,8 +2282,8 @@ fn ghi(part001) { assert_eq!( recasted, r#"mySuperCoolPart = startSketchOn(XY) - |> startProfileAt([0.0, 5.0], %) - |> line([0.4900857016, -0.0240763666], %) + |> startProfile(at = [0.0, 5.0]) + |> line(end = [0.4900857016, -0.0240763666]) part002 = "part002" things = [mySuperCoolPart, 0.0] @@ -2319,24 +2319,24 @@ fn ghi(part001) { #[test] fn test_recast_trailing_comma() { let some_program_string = r#"startSketchOn(XY) - |> startProfileAt([0, 0], %) + |> startProfile(at = [0, 0]) |> arc({ radius = 1, angle_start = 0, angle_end = 180, - }, %)"#; + })"#; let program = crate::parsing::top_level_parse(some_program_string).unwrap(); let recasted = program.recast(&Default::default(), 0); assert_eq!( recasted, r#"startSketchOn(XY) - |> startProfileAt([0, 0], %) + |> startProfile(at = [0, 0]) |> arc({ radius = 1, angle_start = 0, angle_end = 180 - }, %) + }) "# ); } @@ -2348,12 +2348,12 @@ l = 8 h = 10 firstExtrude = startSketchOn(XY) - |> startProfileAt([0,0], %) - |> line([0, l], %) - |> line([w, 0], %) - |> line([0, -l], %) + |> startProfile(at = [0,0]) + |> line(end = [0, l]) + |> line(end = [w, 0]) + |> line(end = [0, -l]) |> close() - |> extrude(h, %) + |> extrude(h) "#; let program = crate::parsing::top_level_parse(some_program_string).unwrap(); @@ -2365,12 +2365,12 @@ l = 8 h = 10 firstExtrude = startSketchOn(XY) - |> startProfileAt([0, 0], %) - |> line([0, l], %) - |> line([w, 0], %) - |> line([0, -l], %) + |> startProfile(at = [0, 0]) + |> line(end = [0, l]) + |> line(end = [w, 0]) + |> line(end = [0, -l]) |> close() - |> extrude(h, %) + |> extrude(h) "# ); } @@ -2385,12 +2385,12 @@ h = 10 // It has multiple lines // And it's really long firstExtrude = startSketchOn(XY) - |> startProfileAt([0,0], %) - |> line([0, l], %) - |> line([w, 0], %) - |> line([0, -l], %) + |> startProfile(at = [0,0]) + |> line(end = [0, l]) + |> line(end = [w, 0]) + |> line(end = [0, -l]) |> close() - |> extrude(h, %) + |> extrude(h) "#; let program = crate::parsing::top_level_parse(some_program_string).unwrap(); @@ -2405,12 +2405,12 @@ h = 10 // It has multiple lines // And it's really long firstExtrude = startSketchOn(XY) - |> startProfileAt([0, 0], %) - |> line([0, l], %) - |> line([w, 0], %) - |> line([0, -l], %) + |> startProfile(at = [0, 0]) + |> line(end = [0, l]) + |> line(end = [w, 0]) + |> line(end = [0, -l]) |> close() - |> extrude(h, %) + |> extrude(h) "# ); } @@ -2430,11 +2430,11 @@ firstExtrude = startSketchOn(XY) thickness = 0.5 startSketchOn(XY) - |> startProfileAt([0, 0], %) - |> line([0, -(wallMountL - thickness)], %) - |> line([0, -(5 - thickness)], %) - |> line([0, -(5 - 1)], %) - |> line([0, -(-5 - 1)], %)"#; + |> startProfile(at = [0, 0]) + |> line(end = [0, -(wallMountL - thickness)]) + |> line(end = [0, -(5 - thickness)]) + |> line(end = [0, -(5 - 1)]) + |> line(end = [0, -(-5 - 1)])"#; let program = crate::parsing::top_level_parse(some_program_string).unwrap(); let recasted = program.recast(&Default::default(), 0); @@ -2560,9 +2560,13 @@ sketch002 = startSketchOn({ #[test] fn unparse_fn_unnamed() { - let input = r#"squares_out = reduce(arr, 0: number, fn(i, squares) { - return 1 -}) + let input = r#"squares_out = reduce( + arr, + n = 0: number, + f = fn(i, squares) { + return 1 + }, +) "#; let ast = crate::parsing::top_level_parse(input).unwrap(); let actual = ast.recast(&FormatOptions::new(), 0); diff --git a/rust/kcl-lib/std/solid.kcl b/rust/kcl-lib/std/solid.kcl index b9e589858..ad51dee73 100644 --- a/rust/kcl-lib/std/solid.kcl +++ b/rust/kcl-lib/std/solid.kcl @@ -117,7 +117,7 @@ export fn fillet( /// return sg /// } /// -/// part001 = cube([0,0], 20) +/// part001 = cube(pos = [0,0], scale = 20) /// |> close(tag = $line1) /// |> extrude(length = 20) /// // We tag the chamfer to reference it later. diff --git a/rust/kcl-lib/std/types.kcl b/rust/kcl-lib/std/types.kcl index 995221bb3..64c45b3c3 100644 --- a/rust/kcl-lib/std/types.kcl +++ b/rust/kcl-lib/std/types.kcl @@ -1,6 +1,10 @@ @no_std @settings(defaultLengthUnit = mm) +/// Any value. +@(impl = primitive) +export type any + /// A number /// /// May be signed or unsigned, an integer or decimal value. @@ -84,8 +88,8 @@ export type string /// |> close() /// } /// -/// rect([0, 0]) -/// rect([20, 0]) +/// rect(origin = [0, 0]) +/// rect(origin = [20, 0]) /// ``` /// /// Those tags would only be available in the `rect` function and not globally. @@ -112,8 +116,8 @@ export type string /// |> close() /// } /// -/// rect([0, 0]) -/// myRect = rect([20, 0]) +/// rect(origin = [0, 0]) +/// myRect = rect(origin = [20, 0]) /// /// myRect /// |> extrude(length = 10) diff --git a/rust/kcl-lib/tests/add_lots/ast.snap b/rust/kcl-lib/tests/add_lots/ast.snap index 267a77e27..0c13597e8 100644 --- a/rust/kcl-lib/tests/add_lots/ast.snap +++ b/rust/kcl-lib/tests/add_lots/ast.snap @@ -79,7 +79,8 @@ description: Result of parsing add_lots.kcl "name": "i", "start": 0, "type": "Identifier" - } + }, + "labeled": false } ], "start": 0, diff --git a/rust/kcl-lib/tests/add_lots/input.kcl b/rust/kcl-lib/tests/add_lots/input.kcl index 9908919ea..b57329a2f 100644 --- a/rust/kcl-lib/tests/add_lots/input.kcl +++ b/rust/kcl-lib/tests/add_lots/input.kcl @@ -1,4 +1,4 @@ -fn f(i) { +fn f(@i) { return i * 2 } diff --git a/rust/kcl-lib/tests/add_lots/unparsed.snap b/rust/kcl-lib/tests/add_lots/unparsed.snap index 5fe7fdfe8..54d33f03a 100644 --- a/rust/kcl-lib/tests/add_lots/unparsed.snap +++ b/rust/kcl-lib/tests/add_lots/unparsed.snap @@ -2,7 +2,7 @@ source: kcl-lib/src/simulation_tests.rs description: Result of unparsing add_lots.kcl --- -fn f(i) { +fn f(@i) { return i * 2 } diff --git a/rust/kcl-lib/tests/argument_error/ast.snap b/rust/kcl-lib/tests/argument_error/ast.snap index 6c71a2c73..db4f99689 100644 --- a/rust/kcl-lib/tests/argument_error/ast.snap +++ b/rust/kcl-lib/tests/argument_error/ast.snap @@ -55,7 +55,8 @@ description: Result of parsing argument_error.kcl "name": "i", "start": 0, "type": "Identifier" - } + }, + "labeled": false } ], "start": 0, @@ -77,53 +78,47 @@ description: Result of parsing argument_error.kcl "expression": { "arguments": [ { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { + "type": "LabeledArg", + "label": { "commentStart": 0, "end": 0, "name": "f", "start": 0, "type": "Identifier" }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - { - "commentStart": 0, - "elements": [ - { - "commentStart": 0, - "end": 0, - "raw": "0", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 0.0, - "suffix": "None" + "arg": { + "commentStart": 0, + "elements": [ + { + "commentStart": 0, + "end": 0, + "raw": "0", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 0.0, + "suffix": "None" + } + }, + { + "commentStart": 0, + "end": 0, + "raw": "1", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 1.0, + "suffix": "None" + } } - }, - { - "commentStart": 0, - "end": 0, - "raw": "1", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 1.0, - "suffix": "None" - } - } - ], - "end": 0, - "start": 0, - "type": "ArrayExpression", - "type": "ArrayExpression" + ], + "end": 0, + "start": 0, + "type": "ArrayExpression", + "type": "ArrayExpression" + } } ], "callee": { @@ -144,8 +139,24 @@ description: Result of parsing argument_error.kcl "commentStart": 0, "end": 0, "start": 0, - "type": "CallExpression", - "type": "CallExpression" + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "f", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } }, "start": 0, "type": "ExpressionStatement", diff --git a/rust/kcl-lib/tests/argument_error/execution_error.snap b/rust/kcl-lib/tests/argument_error/execution_error.snap index e16a1568f..45f8382ea 100644 --- a/rust/kcl-lib/tests/argument_error/execution_error.snap +++ b/rust/kcl-lib/tests/argument_error/execution_error.snap @@ -8,7 +8,7 @@ KCL Semantic error │ Vec but it's actually of type Function ╭─[5:5] 4 │ - 5 │ map(f, [0, 1]) + 5 │ map(f, f = [0, 1]) · ┬ · ╰── tests/argument_error/input.kcl ╰──── diff --git a/rust/kcl-lib/tests/argument_error/input.kcl b/rust/kcl-lib/tests/argument_error/input.kcl index e9d750548..5443dce2c 100644 --- a/rust/kcl-lib/tests/argument_error/input.kcl +++ b/rust/kcl-lib/tests/argument_error/input.kcl @@ -1,5 +1,5 @@ -fn f(i) { +fn f(@i) { return 5 } -map(f, [0, 1]) +map(f, f = [0, 1]) diff --git a/rust/kcl-lib/tests/argument_error/unparsed.snap b/rust/kcl-lib/tests/argument_error/unparsed.snap index 464ef539e..b85dd2120 100644 --- a/rust/kcl-lib/tests/argument_error/unparsed.snap +++ b/rust/kcl-lib/tests/argument_error/unparsed.snap @@ -2,8 +2,8 @@ source: kcl-lib/src/simulation_tests.rs description: Result of unparsing argument_error.kcl --- -fn f(i) { +fn f(@i) { return 5 } -map(f, [0, 1]) +map(f, f = [0, 1]) diff --git a/rust/kcl-lib/tests/bad_units_in_annotation/ast.snap b/rust/kcl-lib/tests/bad_units_in_annotation/ast.snap index f4488027b..4376cdf07 100644 --- a/rust/kcl-lib/tests/bad_units_in_annotation/ast.snap +++ b/rust/kcl-lib/tests/bad_units_in_annotation/ast.snap @@ -422,53 +422,73 @@ description: Result of parsing bad_units_in_annotation.kcl "init": { "arguments": [ { - "commentStart": 0, - "elements": [ - { - "commentStart": 0, - "end": 0, - "raw": "0", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 0.0, - "suffix": "None" - } - }, - { - "commentStart": 0, - "end": 0, - "raw": "0", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 0.0, - "suffix": "None" - } - } - ], - "end": 0, - "start": 0, - "type": "ArrayExpression", - "type": "ArrayExpression" - }, - { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { + "type": "LabeledArg", + "label": { "commentStart": 0, "end": 0, - "name": "oxygenRadius", + "name": "center", "start": 0, "type": "Identifier" }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" + "arg": { + "commentStart": 0, + "elements": [ + { + "commentStart": 0, + "end": 0, + "raw": "0", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 0.0, + "suffix": "None" + } + }, + { + "commentStart": 0, + "end": 0, + "raw": "0", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 0.0, + "suffix": "None" + } + } + ], + "end": 0, + "start": 0, + "type": "ArrayExpression", + "type": "ArrayExpression" + } + }, + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "radius", + "start": 0, + "type": "Identifier" + }, + "arg": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "oxygenRadius", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } } ], "callee": { @@ -489,8 +509,9 @@ description: Result of parsing bad_units_in_annotation.kcl "commentStart": 0, "end": 0, "start": 0, - "type": "CallExpression", - "type": "CallExpression" + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null }, "start": 0, "type": "VariableDeclarator" @@ -784,61 +805,81 @@ description: Result of parsing bad_units_in_annotation.kcl "init": { "arguments": [ { - "commentStart": 0, - "elements": [ - { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "hydrogenOffsetX", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "hydrogenOffsetY", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - } - ], - "end": 0, - "start": 0, - "type": "ArrayExpression", - "type": "ArrayExpression" - }, - { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { + "type": "LabeledArg", + "label": { "commentStart": 0, "end": 0, - "name": "hydrogenRadius", + "name": "center", "start": 0, "type": "Identifier" }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" + "arg": { + "commentStart": 0, + "elements": [ + { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "hydrogenOffsetX", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + }, + { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "hydrogenOffsetY", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } + ], + "end": 0, + "start": 0, + "type": "ArrayExpression", + "type": "ArrayExpression" + } + }, + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "radius", + "start": 0, + "type": "Identifier" + }, + "arg": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "hydrogenRadius", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } } ], "callee": { @@ -859,8 +900,9 @@ description: Result of parsing bad_units_in_annotation.kcl "commentStart": 0, "end": 0, "start": 0, - "type": "CallExpression", - "type": "CallExpression" + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null }, "start": 0, "type": "VariableDeclarator" @@ -891,17 +933,49 @@ description: Result of parsing bad_units_in_annotation.kcl "init": { "arguments": [ { - "commentStart": 0, - "elements": [ - { - "argument": { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "center", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "elements": [ + { + "argument": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "hydrogenOffsetX", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + }, + "commentStart": 0, + "end": 0, + "operator": "-", + "start": 0, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { "abs_path": false, "commentStart": 0, "end": 0, "name": { "commentStart": 0, "end": 0, - "name": "hydrogenOffsetX", + "name": "hydrogenOffsetY", "start": 0, "type": "Identifier" }, @@ -909,51 +983,39 @@ description: Result of parsing bad_units_in_annotation.kcl "start": 0, "type": "Name", "type": "Name" - }, - "commentStart": 0, - "end": 0, - "operator": "-", - "start": 0, - "type": "UnaryExpression", - "type": "UnaryExpression" - }, - { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "hydrogenOffsetY", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - } - ], - "end": 0, - "start": 0, - "type": "ArrayExpression", - "type": "ArrayExpression" + } + ], + "end": 0, + "start": 0, + "type": "ArrayExpression", + "type": "ArrayExpression" + } }, { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { + "type": "LabeledArg", + "label": { "commentStart": 0, "end": 0, - "name": "hydrogenRadius", + "name": "radius", "start": 0, "type": "Identifier" }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" + "arg": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "hydrogenRadius", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } } ], "callee": { @@ -974,8 +1036,9 @@ description: Result of parsing bad_units_in_annotation.kcl "commentStart": 0, "end": 0, "start": 0, - "type": "CallExpression", - "type": "CallExpression" + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null }, "start": 0, "type": "VariableDeclarator" diff --git a/rust/kcl-lib/tests/bad_units_in_annotation/input.kcl b/rust/kcl-lib/tests/bad_units_in_annotation/input.kcl index e5fbde6a9..b23019562 100644 --- a/rust/kcl-lib/tests/bad_units_in_annotation/input.kcl +++ b/rust/kcl-lib/tests/bad_units_in_annotation/input.kcl @@ -17,12 +17,12 @@ fn createAtom(center, radius) { } // Create the oxygen atom at the origin -oxygenAtom = createAtom([0, 0], oxygenRadius) +oxygenAtom = createAtom(center = [0, 0], radius = oxygenRadius) // Calculate the positions of the hydrogen atoms hydrogenOffsetX = oxygenHydrogenDistance * cos(toRadians(bondAngle / 2)) hydrogenOffsetY = oxygenHydrogenDistance * sin(toRadians(bondAngle / 2)) // Create the hydrogen atoms -hydrogenAtom1 = createAtom([hydrogenOffsetX, hydrogenOffsetY], hydrogenRadius) -hydrogenAtom2 = createAtom([-hydrogenOffsetX, hydrogenOffsetY], hydrogenRadius) +hydrogenAtom1 = createAtom(center = [hydrogenOffsetX, hydrogenOffsetY], radius = hydrogenRadius) +hydrogenAtom2 = createAtom(center = [-hydrogenOffsetX, hydrogenOffsetY], radius = hydrogenRadius) diff --git a/rust/kcl-lib/tests/bad_units_in_annotation/unparsed.snap b/rust/kcl-lib/tests/bad_units_in_annotation/unparsed.snap index e9551f5ce..6e34a1483 100644 --- a/rust/kcl-lib/tests/bad_units_in_annotation/unparsed.snap +++ b/rust/kcl-lib/tests/bad_units_in_annotation/unparsed.snap @@ -21,12 +21,12 @@ fn createAtom(center, radius) { } // Create the oxygen atom at the origin -oxygenAtom = createAtom([0, 0], oxygenRadius) +oxygenAtom = createAtom(center = [0, 0], radius = oxygenRadius) // Calculate the positions of the hydrogen atoms hydrogenOffsetX = oxygenHydrogenDistance * cos(toRadians(bondAngle / 2)) hydrogenOffsetY = oxygenHydrogenDistance * sin(toRadians(bondAngle / 2)) // Create the hydrogen atoms -hydrogenAtom1 = createAtom([hydrogenOffsetX, hydrogenOffsetY], hydrogenRadius) -hydrogenAtom2 = createAtom([-hydrogenOffsetX, hydrogenOffsetY], hydrogenRadius) +hydrogenAtom1 = createAtom(center = [hydrogenOffsetX, hydrogenOffsetY], radius = hydrogenRadius) +hydrogenAtom2 = createAtom(center = [-hydrogenOffsetX, hydrogenOffsetY], radius = hydrogenRadius) diff --git a/rust/kcl-lib/tests/cube_with_error/ast.snap b/rust/kcl-lib/tests/cube_with_error/ast.snap index bbdd37fea..ee0652279 100644 --- a/rust/kcl-lib/tests/cube_with_error/ast.snap +++ b/rust/kcl-lib/tests/cube_with_error/ast.snap @@ -1105,49 +1105,69 @@ description: Result of parsing cube_with_error.kcl "init": { "arguments": [ { - "commentStart": 0, - "end": 0, - "raw": "40", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 40.0, - "suffix": "None" + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "length", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "end": 0, + "raw": "40", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 40.0, + "suffix": "None" + } } }, { - "commentStart": 0, - "elements": [ - { - "commentStart": 0, - "end": 0, - "raw": "0", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 0.0, - "suffix": "None" + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "center", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "elements": [ + { + "commentStart": 0, + "end": 0, + "raw": "0", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 0.0, + "suffix": "None" + } + }, + { + "commentStart": 0, + "end": 0, + "raw": "0", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 0.0, + "suffix": "None" + } } - }, - { - "commentStart": 0, - "end": 0, - "raw": "0", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 0.0, - "suffix": "None" - } - } - ], - "end": 0, - "start": 0, - "type": "ArrayExpression", - "type": "ArrayExpression" + ], + "end": 0, + "start": 0, + "type": "ArrayExpression", + "type": "ArrayExpression" + } } ], "callee": { @@ -1168,8 +1188,9 @@ description: Result of parsing cube_with_error.kcl "commentStart": 0, "end": 0, "start": 0, - "type": "CallExpression", - "type": "CallExpression" + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null }, "start": 0, "type": "VariableDeclarator" diff --git a/rust/kcl-lib/tests/cube_with_error/input.kcl b/rust/kcl-lib/tests/cube_with_error/input.kcl index 0331a1285..176b01a01 100644 --- a/rust/kcl-lib/tests/cube_with_error/input.kcl +++ b/rust/kcl-lib/tests/cube_with_error/input.kcl @@ -17,7 +17,7 @@ fn cube(length, center) { |> extrude(length = length) } -myCube = cube(40, [0, 0]) +myCube = cube(length = 40, center = [0, 0]) // Error, after creating meaningful output. foo diff --git a/rust/kcl-lib/tests/cube_with_error/ops.snap b/rust/kcl-lib/tests/cube_with_error/ops.snap index 756b2d2d3..2895df93a 100644 --- a/rust/kcl-lib/tests/cube_with_error/ops.snap +++ b/rust/kcl-lib/tests/cube_with_error/ops.snap @@ -57,7 +57,58 @@ description: Operations executed cube_with_error.kcl "name": "cube", "functionSourceRange": [], "unlabeledArg": null, - "labeledArgs": {} + "labeledArgs": { + "center": { + "value": { + "type": "Array", + "value": [ + { + "type": "Number", + "value": 0.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + { + "type": "Number", + "value": 0.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + } + ] + }, + "sourceRange": [] + }, + "length": { + "value": { + "type": "Number", + "value": 40.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + } + } }, "sourceRange": [] }, diff --git a/rust/kcl-lib/tests/cube_with_error/unparsed.snap b/rust/kcl-lib/tests/cube_with_error/unparsed.snap index 4ff3a9e1b..b308dd42e 100644 --- a/rust/kcl-lib/tests/cube_with_error/unparsed.snap +++ b/rust/kcl-lib/tests/cube_with_error/unparsed.snap @@ -21,7 +21,7 @@ fn cube(length, center) { |> extrude(length = length) } -myCube = cube(40, [0, 0]) +myCube = cube(length = 40, center = [0, 0]) // Error, after creating meaningful output. foo diff --git a/rust/kcl-lib/tests/double_map_fn/ast.snap b/rust/kcl-lib/tests/double_map_fn/ast.snap index abdb0c8a9..00e28c89b 100644 --- a/rust/kcl-lib/tests/double_map_fn/ast.snap +++ b/rust/kcl-lib/tests/double_map_fn/ast.snap @@ -79,7 +79,8 @@ description: Result of parsing double_map_fn.kcl "name": "i", "start": 0, "type": "Identifier" - } + }, + "labeled": false } ], "start": 0, diff --git a/rust/kcl-lib/tests/double_map_fn/input.kcl b/rust/kcl-lib/tests/double_map_fn/input.kcl index 1d3594a4a..bf1407ac9 100644 --- a/rust/kcl-lib/tests/double_map_fn/input.kcl +++ b/rust/kcl-lib/tests/double_map_fn/input.kcl @@ -1,4 +1,4 @@ -fn increment(i) { +fn increment(@i) { return i + 1 } diff --git a/rust/kcl-lib/tests/double_map_fn/unparsed.snap b/rust/kcl-lib/tests/double_map_fn/unparsed.snap index 38c716766..1382ce73d 100644 --- a/rust/kcl-lib/tests/double_map_fn/unparsed.snap +++ b/rust/kcl-lib/tests/double_map_fn/unparsed.snap @@ -2,7 +2,7 @@ source: kcl-lib/src/simulation_tests.rs description: Result of unparsing double_map_fn.kcl --- -fn increment(i) { +fn increment(@i) { return i + 1 } diff --git a/rust/kcl-lib/tests/fillet-and-shell/ast.snap b/rust/kcl-lib/tests/fillet-and-shell/ast.snap index c1a4013c0..ba795a618 100644 --- a/rust/kcl-lib/tests/fillet-and-shell/ast.snap +++ b/rust/kcl-lib/tests/fillet-and-shell/ast.snap @@ -2558,132 +2558,21 @@ description: Result of parsing fillet-and-shell.kcl "expression": { "arguments": [ { - "commentStart": 0, - "end": 0, - "left": { + "type": "LabeledArg", + "label": { "commentStart": 0, "end": 0, - "left": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "border", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - "operator": "+", - "right": { - "commentStart": 0, - "end": 0, - "left": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "rpizWidth", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - "operator": "/", - "right": { - "commentStart": 0, - "end": 0, - "raw": "2", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 2.0, - "suffix": "None" - } - }, - "start": 0, - "type": "BinaryExpression", - "type": "BinaryExpression" - }, + "name": "x", "start": 0, - "type": "BinaryExpression", - "type": "BinaryExpression" + "type": "Identifier" }, - "operator": "-", - "right": { - "commentStart": 0, - "end": 0, - "left": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "widthBetweenScrews", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - "operator": "/", - "right": { - "commentStart": 0, - "end": 0, - "raw": "2", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 2.0, - "suffix": "None" - } - }, - "start": 0, - "type": "BinaryExpression", - "type": "BinaryExpression" - }, - "start": 0, - "type": "BinaryExpression", - "type": "BinaryExpression" - }, - { - "commentStart": 0, - "end": 0, - "left": { + "arg": { "commentStart": 0, "end": 0, "left": { "commentStart": 0, "end": 0, "left": { - "commentStart": 0, - "end": 0, - "raw": "0", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 0.0, - "suffix": "None" - } - }, - "operator": "+", - "right": { "abs_path": false, "commentStart": 0, "end": 0, @@ -2699,11 +2588,48 @@ description: Result of parsing fillet-and-shell.kcl "type": "Name", "type": "Name" }, + "operator": "+", + "right": { + "commentStart": 0, + "end": 0, + "left": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "rpizWidth", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + }, + "operator": "/", + "right": { + "commentStart": 0, + "end": 0, + "raw": "2", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 2.0, + "suffix": "None" + } + }, + "start": 0, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, "start": 0, "type": "BinaryExpression", "type": "BinaryExpression" }, - "operator": "+", + "operator": "-", "right": { "commentStart": 0, "end": 0, @@ -2714,7 +2640,7 @@ description: Result of parsing fillet-and-shell.kcl "name": { "commentStart": 0, "end": 0, - "name": "rpizLength", + "name": "widthBetweenScrews", "start": 0, "type": "Identifier" }, @@ -2743,63 +2669,167 @@ description: Result of parsing fillet-and-shell.kcl "start": 0, "type": "BinaryExpression", "type": "BinaryExpression" + } + }, + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "y", + "start": 0, + "type": "Identifier" }, - "operator": "-", - "right": { + "arg": { "commentStart": 0, "end": 0, "left": { - "abs_path": false, "commentStart": 0, "end": 0, - "name": { + "left": { "commentStart": 0, "end": 0, - "name": "lengthBetweenScrews", + "left": { + "commentStart": 0, + "end": 0, + "raw": "0", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 0.0, + "suffix": "None" + } + }, + "operator": "+", + "right": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "border", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + }, "start": 0, - "type": "Identifier" + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "operator": "+", + "right": { + "commentStart": 0, + "end": 0, + "left": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "rpizLength", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + }, + "operator": "/", + "right": { + "commentStart": 0, + "end": 0, + "raw": "2", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 2.0, + "suffix": "None" + } + }, + "start": 0, + "type": "BinaryExpression", + "type": "BinaryExpression" }, - "path": [], "start": 0, - "type": "Name", - "type": "Name" + "type": "BinaryExpression", + "type": "BinaryExpression" }, - "operator": "/", + "operator": "-", "right": { "commentStart": 0, "end": 0, - "raw": "2", + "left": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "lengthBetweenScrews", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + }, + "operator": "/", + "right": { + "commentStart": 0, + "end": 0, + "raw": "2", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 2.0, + "suffix": "None" + } + }, "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 2.0, - "suffix": "None" - } + "type": "BinaryExpression", + "type": "BinaryExpression" }, "start": 0, "type": "BinaryExpression", "type": "BinaryExpression" - }, - "start": 0, - "type": "BinaryExpression", - "type": "BinaryExpression" + } }, { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { + "type": "LabeledArg", + "label": { "commentStart": 0, "end": 0, - "name": "screwHeight", + "name": "height", "start": 0, "type": "Identifier" }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" + "arg": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "screwHeight", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } } ], "callee": { @@ -2820,8 +2850,9 @@ description: Result of parsing fillet-and-shell.kcl "commentStart": 0, "end": 0, "start": 0, - "type": "CallExpression", - "type": "CallExpression" + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null }, "start": 0, "type": "ExpressionStatement", @@ -2833,132 +2864,21 @@ description: Result of parsing fillet-and-shell.kcl "expression": { "arguments": [ { - "commentStart": 0, - "end": 0, - "left": { + "type": "LabeledArg", + "label": { "commentStart": 0, "end": 0, - "left": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "border", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - "operator": "+", - "right": { - "commentStart": 0, - "end": 0, - "left": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "rpizWidth", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - "operator": "/", - "right": { - "commentStart": 0, - "end": 0, - "raw": "2", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 2.0, - "suffix": "None" - } - }, - "start": 0, - "type": "BinaryExpression", - "type": "BinaryExpression" - }, + "name": "x", "start": 0, - "type": "BinaryExpression", - "type": "BinaryExpression" + "type": "Identifier" }, - "operator": "-", - "right": { - "commentStart": 0, - "end": 0, - "left": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "widthBetweenScrews", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - "operator": "/", - "right": { - "commentStart": 0, - "end": 0, - "raw": "2", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 2.0, - "suffix": "None" - } - }, - "start": 0, - "type": "BinaryExpression", - "type": "BinaryExpression" - }, - "start": 0, - "type": "BinaryExpression", - "type": "BinaryExpression" - }, - { - "commentStart": 0, - "end": 0, - "left": { + "arg": { "commentStart": 0, "end": 0, "left": { "commentStart": 0, "end": 0, "left": { - "commentStart": 0, - "end": 0, - "raw": "0", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 0.0, - "suffix": "None" - } - }, - "operator": "+", - "right": { "abs_path": false, "commentStart": 0, "end": 0, @@ -2974,11 +2894,48 @@ description: Result of parsing fillet-and-shell.kcl "type": "Name", "type": "Name" }, + "operator": "+", + "right": { + "commentStart": 0, + "end": 0, + "left": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "rpizWidth", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + }, + "operator": "/", + "right": { + "commentStart": 0, + "end": 0, + "raw": "2", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 2.0, + "suffix": "None" + } + }, + "start": 0, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, "start": 0, "type": "BinaryExpression", "type": "BinaryExpression" }, - "operator": "+", + "operator": "-", "right": { "commentStart": 0, "end": 0, @@ -2989,7 +2946,7 @@ description: Result of parsing fillet-and-shell.kcl "name": { "commentStart": 0, "end": 0, - "name": "rpizLength", + "name": "widthBetweenScrews", "start": 0, "type": "Identifier" }, @@ -3018,63 +2975,167 @@ description: Result of parsing fillet-and-shell.kcl "start": 0, "type": "BinaryExpression", "type": "BinaryExpression" + } + }, + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "y", + "start": 0, + "type": "Identifier" }, - "operator": "+", - "right": { + "arg": { "commentStart": 0, "end": 0, "left": { - "abs_path": false, "commentStart": 0, "end": 0, - "name": { + "left": { "commentStart": 0, "end": 0, - "name": "lengthBetweenScrews", + "left": { + "commentStart": 0, + "end": 0, + "raw": "0", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 0.0, + "suffix": "None" + } + }, + "operator": "+", + "right": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "border", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + }, "start": 0, - "type": "Identifier" + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "operator": "+", + "right": { + "commentStart": 0, + "end": 0, + "left": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "rpizLength", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + }, + "operator": "/", + "right": { + "commentStart": 0, + "end": 0, + "raw": "2", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 2.0, + "suffix": "None" + } + }, + "start": 0, + "type": "BinaryExpression", + "type": "BinaryExpression" }, - "path": [], "start": 0, - "type": "Name", - "type": "Name" + "type": "BinaryExpression", + "type": "BinaryExpression" }, - "operator": "/", + "operator": "+", "right": { "commentStart": 0, "end": 0, - "raw": "2", + "left": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "lengthBetweenScrews", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + }, + "operator": "/", + "right": { + "commentStart": 0, + "end": 0, + "raw": "2", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 2.0, + "suffix": "None" + } + }, "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 2.0, - "suffix": "None" - } + "type": "BinaryExpression", + "type": "BinaryExpression" }, "start": 0, "type": "BinaryExpression", "type": "BinaryExpression" - }, - "start": 0, - "type": "BinaryExpression", - "type": "BinaryExpression" + } }, { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { + "type": "LabeledArg", + "label": { "commentStart": 0, "end": 0, - "name": "screwHeight", + "name": "height", "start": 0, "type": "Identifier" }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" + "arg": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "screwHeight", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } } ], "callee": { @@ -3095,8 +3156,9 @@ description: Result of parsing fillet-and-shell.kcl "commentStart": 0, "end": 0, "start": 0, - "type": "CallExpression", - "type": "CallExpression" + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null }, "start": 0, "type": "ExpressionStatement", @@ -3108,132 +3170,21 @@ description: Result of parsing fillet-and-shell.kcl "expression": { "arguments": [ { - "commentStart": 0, - "end": 0, - "left": { + "type": "LabeledArg", + "label": { "commentStart": 0, "end": 0, - "left": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "border", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - "operator": "+", - "right": { - "commentStart": 0, - "end": 0, - "left": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "rpizWidth", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - "operator": "/", - "right": { - "commentStart": 0, - "end": 0, - "raw": "2", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 2.0, - "suffix": "None" - } - }, - "start": 0, - "type": "BinaryExpression", - "type": "BinaryExpression" - }, + "name": "x", "start": 0, - "type": "BinaryExpression", - "type": "BinaryExpression" + "type": "Identifier" }, - "operator": "+", - "right": { - "commentStart": 0, - "end": 0, - "left": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "widthBetweenScrews", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - "operator": "/", - "right": { - "commentStart": 0, - "end": 0, - "raw": "2", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 2.0, - "suffix": "None" - } - }, - "start": 0, - "type": "BinaryExpression", - "type": "BinaryExpression" - }, - "start": 0, - "type": "BinaryExpression", - "type": "BinaryExpression" - }, - { - "commentStart": 0, - "end": 0, - "left": { + "arg": { "commentStart": 0, "end": 0, "left": { "commentStart": 0, "end": 0, "left": { - "commentStart": 0, - "end": 0, - "raw": "0", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 0.0, - "suffix": "None" - } - }, - "operator": "+", - "right": { "abs_path": false, "commentStart": 0, "end": 0, @@ -3249,6 +3200,43 @@ description: Result of parsing fillet-and-shell.kcl "type": "Name", "type": "Name" }, + "operator": "+", + "right": { + "commentStart": 0, + "end": 0, + "left": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "rpizWidth", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + }, + "operator": "/", + "right": { + "commentStart": 0, + "end": 0, + "raw": "2", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 2.0, + "suffix": "None" + } + }, + "start": 0, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, "start": 0, "type": "BinaryExpression", "type": "BinaryExpression" @@ -3264,7 +3252,7 @@ description: Result of parsing fillet-and-shell.kcl "name": { "commentStart": 0, "end": 0, - "name": "rpizLength", + "name": "widthBetweenScrews", "start": 0, "type": "Identifier" }, @@ -3293,63 +3281,167 @@ description: Result of parsing fillet-and-shell.kcl "start": 0, "type": "BinaryExpression", "type": "BinaryExpression" + } + }, + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "y", + "start": 0, + "type": "Identifier" }, - "operator": "+", - "right": { + "arg": { "commentStart": 0, "end": 0, "left": { - "abs_path": false, "commentStart": 0, "end": 0, - "name": { + "left": { "commentStart": 0, "end": 0, - "name": "lengthBetweenScrews", + "left": { + "commentStart": 0, + "end": 0, + "raw": "0", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 0.0, + "suffix": "None" + } + }, + "operator": "+", + "right": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "border", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + }, "start": 0, - "type": "Identifier" + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "operator": "+", + "right": { + "commentStart": 0, + "end": 0, + "left": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "rpizLength", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + }, + "operator": "/", + "right": { + "commentStart": 0, + "end": 0, + "raw": "2", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 2.0, + "suffix": "None" + } + }, + "start": 0, + "type": "BinaryExpression", + "type": "BinaryExpression" }, - "path": [], "start": 0, - "type": "Name", - "type": "Name" + "type": "BinaryExpression", + "type": "BinaryExpression" }, - "operator": "/", + "operator": "+", "right": { "commentStart": 0, "end": 0, - "raw": "2", + "left": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "lengthBetweenScrews", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + }, + "operator": "/", + "right": { + "commentStart": 0, + "end": 0, + "raw": "2", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 2.0, + "suffix": "None" + } + }, "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 2.0, - "suffix": "None" - } + "type": "BinaryExpression", + "type": "BinaryExpression" }, "start": 0, "type": "BinaryExpression", "type": "BinaryExpression" - }, - "start": 0, - "type": "BinaryExpression", - "type": "BinaryExpression" + } }, { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { + "type": "LabeledArg", + "label": { "commentStart": 0, "end": 0, - "name": "screwHeight", + "name": "height", "start": 0, "type": "Identifier" }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" + "arg": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "screwHeight", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } } ], "callee": { @@ -3370,8 +3462,9 @@ description: Result of parsing fillet-and-shell.kcl "commentStart": 0, "end": 0, "start": 0, - "type": "CallExpression", - "type": "CallExpression" + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null }, "start": 0, "type": "ExpressionStatement", @@ -3383,132 +3476,21 @@ description: Result of parsing fillet-and-shell.kcl "expression": { "arguments": [ { - "commentStart": 0, - "end": 0, - "left": { + "type": "LabeledArg", + "label": { "commentStart": 0, "end": 0, - "left": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "border", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - "operator": "+", - "right": { - "commentStart": 0, - "end": 0, - "left": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "rpizWidth", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - "operator": "/", - "right": { - "commentStart": 0, - "end": 0, - "raw": "2", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 2.0, - "suffix": "None" - } - }, - "start": 0, - "type": "BinaryExpression", - "type": "BinaryExpression" - }, + "name": "x", "start": 0, - "type": "BinaryExpression", - "type": "BinaryExpression" + "type": "Identifier" }, - "operator": "+", - "right": { - "commentStart": 0, - "end": 0, - "left": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "widthBetweenScrews", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - "operator": "/", - "right": { - "commentStart": 0, - "end": 0, - "raw": "2", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 2.0, - "suffix": "None" - } - }, - "start": 0, - "type": "BinaryExpression", - "type": "BinaryExpression" - }, - "start": 0, - "type": "BinaryExpression", - "type": "BinaryExpression" - }, - { - "commentStart": 0, - "end": 0, - "left": { + "arg": { "commentStart": 0, "end": 0, "left": { "commentStart": 0, "end": 0, "left": { - "commentStart": 0, - "end": 0, - "raw": "0", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 0.0, - "suffix": "None" - } - }, - "operator": "+", - "right": { "abs_path": false, "commentStart": 0, "end": 0, @@ -3524,6 +3506,43 @@ description: Result of parsing fillet-and-shell.kcl "type": "Name", "type": "Name" }, + "operator": "+", + "right": { + "commentStart": 0, + "end": 0, + "left": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "rpizWidth", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + }, + "operator": "/", + "right": { + "commentStart": 0, + "end": 0, + "raw": "2", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 2.0, + "suffix": "None" + } + }, + "start": 0, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, "start": 0, "type": "BinaryExpression", "type": "BinaryExpression" @@ -3539,7 +3558,7 @@ description: Result of parsing fillet-and-shell.kcl "name": { "commentStart": 0, "end": 0, - "name": "rpizLength", + "name": "widthBetweenScrews", "start": 0, "type": "Identifier" }, @@ -3568,63 +3587,167 @@ description: Result of parsing fillet-and-shell.kcl "start": 0, "type": "BinaryExpression", "type": "BinaryExpression" + } + }, + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "y", + "start": 0, + "type": "Identifier" }, - "operator": "-", - "right": { + "arg": { "commentStart": 0, "end": 0, "left": { - "abs_path": false, "commentStart": 0, "end": 0, - "name": { + "left": { "commentStart": 0, "end": 0, - "name": "lengthBetweenScrews", + "left": { + "commentStart": 0, + "end": 0, + "raw": "0", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 0.0, + "suffix": "None" + } + }, + "operator": "+", + "right": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "border", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + }, "start": 0, - "type": "Identifier" + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "operator": "+", + "right": { + "commentStart": 0, + "end": 0, + "left": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "rpizLength", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + }, + "operator": "/", + "right": { + "commentStart": 0, + "end": 0, + "raw": "2", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 2.0, + "suffix": "None" + } + }, + "start": 0, + "type": "BinaryExpression", + "type": "BinaryExpression" }, - "path": [], "start": 0, - "type": "Name", - "type": "Name" + "type": "BinaryExpression", + "type": "BinaryExpression" }, - "operator": "/", + "operator": "-", "right": { "commentStart": 0, "end": 0, - "raw": "2", + "left": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "lengthBetweenScrews", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + }, + "operator": "/", + "right": { + "commentStart": 0, + "end": 0, + "raw": "2", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 2.0, + "suffix": "None" + } + }, "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 2.0, - "suffix": "None" - } + "type": "BinaryExpression", + "type": "BinaryExpression" }, "start": 0, "type": "BinaryExpression", "type": "BinaryExpression" - }, - "start": 0, - "type": "BinaryExpression", - "type": "BinaryExpression" + } }, { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { + "type": "LabeledArg", + "label": { "commentStart": 0, "end": 0, - "name": "screwHeight", + "name": "height", "start": 0, "type": "Identifier" }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" + "arg": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "screwHeight", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } } ], "callee": { @@ -3645,8 +3768,9 @@ description: Result of parsing fillet-and-shell.kcl "commentStart": 0, "end": 0, "start": 0, - "type": "CallExpression", - "type": "CallExpression" + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null }, "start": 0, "type": "ExpressionStatement", @@ -3879,39 +4003,6 @@ description: Result of parsing fillet-and-shell.kcl } } ], - "19": [ - { - "commentStart": 0, - "end": 0, - "start": 0, - "type": "NonCodeNode", - "value": { - "type": "newLine" - } - } - ], - "20": [ - { - "commentStart": 0, - "end": 0, - "start": 0, - "type": "NonCodeNode", - "value": { - "type": "newLine" - } - } - ], - "21": [ - { - "commentStart": 0, - "end": 0, - "start": 0, - "type": "NonCodeNode", - "value": { - "type": "newLine" - } - } - ], "22": [ { "commentStart": 0, diff --git a/rust/kcl-lib/tests/fillet-and-shell/input.kcl b/rust/kcl-lib/tests/fillet-and-shell/input.kcl index 7de92cbe2..09b685b46 100644 --- a/rust/kcl-lib/tests/fillet-and-shell/input.kcl +++ b/rust/kcl-lib/tests/fillet-and-shell/input.kcl @@ -64,12 +64,9 @@ fn m25Screw(x, y, height) { return screw } -m25Screw(border + rpizWidth / 2 - (widthBetweenScrews / 2), 0 + border + rpizLength / 2 - (lengthBetweenScrews / 2), screwHeight) - -m25Screw(border + rpizWidth / 2 - (widthBetweenScrews / 2), 0 + border + rpizLength / 2 + lengthBetweenScrews / 2, screwHeight) - -m25Screw(border + rpizWidth / 2 + widthBetweenScrews / 2, 0 + border + rpizLength / 2 + lengthBetweenScrews / 2, screwHeight) - -m25Screw(border + rpizWidth / 2 + widthBetweenScrews / 2, 0 + border + rpizLength / 2 - (lengthBetweenScrews / 2), screwHeight) +m25Screw(x = border + rpizWidth / 2 - (widthBetweenScrews / 2), y = 0 + border + rpizLength / 2 - (lengthBetweenScrews / 2), height = screwHeight) +m25Screw(x = border + rpizWidth / 2 - (widthBetweenScrews / 2), y = 0 + border + rpizLength / 2 + lengthBetweenScrews / 2, height = screwHeight) +m25Screw(x = border + rpizWidth / 2 + widthBetweenScrews / 2, y = 0 + border + rpizLength / 2 + lengthBetweenScrews / 2, height = screwHeight) +m25Screw(x = border + rpizWidth / 2 + widthBetweenScrews / 2, y = 0 + border + rpizLength / 2 - (lengthBetweenScrews / 2), height = screwHeight) shell(case, faces = ['end'], thickness = caseThickness) diff --git a/rust/kcl-lib/tests/fillet-and-shell/ops.snap b/rust/kcl-lib/tests/fillet-and-shell/ops.snap index 14173443e..58e96ec21 100644 --- a/rust/kcl-lib/tests/fillet-and-shell/ops.snap +++ b/rust/kcl-lib/tests/fillet-and-shell/ops.snap @@ -416,7 +416,56 @@ description: Operations executed fillet-and-shell.kcl "name": "m25Screw", "functionSourceRange": [], "unlabeledArg": null, - "labeledArgs": {} + "labeledArgs": { + "height": { + "value": { + "type": "Number", + "value": 4.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "x": { + "value": { + "type": "Number", + "value": 7.5, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "y": { + "value": { + "type": "Number", + "value": 7.5, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + } + } }, "sourceRange": [] }, @@ -427,7 +476,56 @@ description: Operations executed fillet-and-shell.kcl "name": "m25Screw", "functionSourceRange": [], "unlabeledArg": null, - "labeledArgs": {} + "labeledArgs": { + "height": { + "value": { + "type": "Number", + "value": 4.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "x": { + "value": { + "type": "Number", + "value": 7.5, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "y": { + "value": { + "type": "Number", + "value": 65.5, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + } + } }, "sourceRange": [] }, @@ -438,7 +536,56 @@ description: Operations executed fillet-and-shell.kcl "name": "m25Screw", "functionSourceRange": [], "unlabeledArg": null, - "labeledArgs": {} + "labeledArgs": { + "height": { + "value": { + "type": "Number", + "value": 4.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "x": { + "value": { + "type": "Number", + "value": 30.5, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "y": { + "value": { + "type": "Number", + "value": 65.5, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + } + } }, "sourceRange": [] }, @@ -449,7 +596,56 @@ description: Operations executed fillet-and-shell.kcl "name": "m25Screw", "functionSourceRange": [], "unlabeledArg": null, - "labeledArgs": {} + "labeledArgs": { + "height": { + "value": { + "type": "Number", + "value": 4.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "x": { + "value": { + "type": "Number", + "value": 30.5, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "y": { + "value": { + "type": "Number", + "value": 7.5, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + } + } }, "sourceRange": [] }, diff --git a/rust/kcl-lib/tests/fillet-and-shell/unparsed.snap b/rust/kcl-lib/tests/fillet-and-shell/unparsed.snap index c8ff7b04b..3390e7062 100644 --- a/rust/kcl-lib/tests/fillet-and-shell/unparsed.snap +++ b/rust/kcl-lib/tests/fillet-and-shell/unparsed.snap @@ -71,12 +71,9 @@ fn m25Screw(x, y, height) { return screw } -m25Screw(border + rpizWidth / 2 - (widthBetweenScrews / 2), 0 + border + rpizLength / 2 - (lengthBetweenScrews / 2), screwHeight) - -m25Screw(border + rpizWidth / 2 - (widthBetweenScrews / 2), 0 + border + rpizLength / 2 + lengthBetweenScrews / 2, screwHeight) - -m25Screw(border + rpizWidth / 2 + widthBetweenScrews / 2, 0 + border + rpizLength / 2 + lengthBetweenScrews / 2, screwHeight) - -m25Screw(border + rpizWidth / 2 + widthBetweenScrews / 2, 0 + border + rpizLength / 2 - (lengthBetweenScrews / 2), screwHeight) +m25Screw(x = border + rpizWidth / 2 - (widthBetweenScrews / 2), y = 0 + border + rpizLength / 2 - (lengthBetweenScrews / 2), height = screwHeight) +m25Screw(x = border + rpizWidth / 2 - (widthBetweenScrews / 2), y = 0 + border + rpizLength / 2 + lengthBetweenScrews / 2, height = screwHeight) +m25Screw(x = border + rpizWidth / 2 + widthBetweenScrews / 2, y = 0 + border + rpizLength / 2 + lengthBetweenScrews / 2, height = screwHeight) +m25Screw(x = border + rpizWidth / 2 + widthBetweenScrews / 2, y = 0 + border + rpizLength / 2 - (lengthBetweenScrews / 2), height = screwHeight) shell(case, faces = [END], thickness = caseThickness) diff --git a/rust/kcl-lib/tests/function_sketch/ast.snap b/rust/kcl-lib/tests/function_sketch/ast.snap index b36376bfb..65d15bbea 100644 --- a/rust/kcl-lib/tests/function_sketch/ast.snap +++ b/rust/kcl-lib/tests/function_sketch/ast.snap @@ -570,39 +570,69 @@ description: Result of parsing function_sketch.kcl "init": { "arguments": [ { - "commentStart": 0, - "end": 0, - "raw": "3", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 3.0, - "suffix": "None" + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "h", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "end": 0, + "raw": "3", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 3.0, + "suffix": "None" + } } }, { - "commentStart": 0, - "end": 0, - "raw": "6", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 6.0, - "suffix": "None" + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "l", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "end": 0, + "raw": "6", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 6.0, + "suffix": "None" + } } }, { - "commentStart": 0, - "end": 0, - "raw": "10", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 10.0, - "suffix": "None" + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "w", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "end": 0, + "raw": "10", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 10.0, + "suffix": "None" + } } } ], @@ -624,8 +654,9 @@ description: Result of parsing function_sketch.kcl "commentStart": 0, "end": 0, "start": 0, - "type": "CallExpression", - "type": "CallExpression" + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null }, "start": 0, "type": "VariableDeclarator" diff --git a/rust/kcl-lib/tests/function_sketch/input.kcl b/rust/kcl-lib/tests/function_sketch/input.kcl index 8e32a5e27..87127e2b7 100644 --- a/rust/kcl-lib/tests/function_sketch/input.kcl +++ b/rust/kcl-lib/tests/function_sketch/input.kcl @@ -10,4 +10,4 @@ fn box(h, l, w) { return myBox } -fnBox = box(3, 6, 10) +fnBox = box(h = 3, l = 6, w = 10) diff --git a/rust/kcl-lib/tests/function_sketch/ops.snap b/rust/kcl-lib/tests/function_sketch/ops.snap index 230898ba1..712a5a388 100644 --- a/rust/kcl-lib/tests/function_sketch/ops.snap +++ b/rust/kcl-lib/tests/function_sketch/ops.snap @@ -57,7 +57,56 @@ description: Operations executed function_sketch.kcl "name": "box", "functionSourceRange": [], "unlabeledArg": null, - "labeledArgs": {} + "labeledArgs": { + "h": { + "value": { + "type": "Number", + "value": 3.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "l": { + "value": { + "type": "Number", + "value": 6.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "w": { + "value": { + "type": "Number", + "value": 10.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + } + } }, "sourceRange": [] }, diff --git a/rust/kcl-lib/tests/function_sketch/unparsed.snap b/rust/kcl-lib/tests/function_sketch/unparsed.snap index ad3e8ad12..73447b494 100644 --- a/rust/kcl-lib/tests/function_sketch/unparsed.snap +++ b/rust/kcl-lib/tests/function_sketch/unparsed.snap @@ -14,4 +14,4 @@ fn box(h, l, w) { return myBox } -fnBox = box(3, 6, 10) +fnBox = box(h = 3, l = 6, w = 10) diff --git a/rust/kcl-lib/tests/function_sketch_with_position/ast.snap b/rust/kcl-lib/tests/function_sketch_with_position/ast.snap index b1ad9322f..8392cf01c 100644 --- a/rust/kcl-lib/tests/function_sketch_with_position/ast.snap +++ b/rust/kcl-lib/tests/function_sketch_with_position/ast.snap @@ -563,72 +563,112 @@ description: Result of parsing function_sketch_with_position.kcl "init": { "arguments": [ { - "commentStart": 0, - "elements": [ - { - "commentStart": 0, - "end": 0, - "raw": "0", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 0.0, - "suffix": "None" - } - }, - { - "commentStart": 0, - "end": 0, - "raw": "0", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 0.0, - "suffix": "None" + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "p", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "elements": [ + { + "commentStart": 0, + "end": 0, + "raw": "0", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 0.0, + "suffix": "None" + } + }, + { + "commentStart": 0, + "end": 0, + "raw": "0", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 0.0, + "suffix": "None" + } } + ], + "end": 0, + "start": 0, + "type": "ArrayExpression", + "type": "ArrayExpression" + } + }, + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "h", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "end": 0, + "raw": "3", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 3.0, + "suffix": "None" } - ], - "end": 0, - "start": 0, - "type": "ArrayExpression", - "type": "ArrayExpression" - }, - { - "commentStart": 0, - "end": 0, - "raw": "3", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 3.0, - "suffix": "None" } }, { - "commentStart": 0, - "end": 0, - "raw": "6", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 6.0, - "suffix": "None" + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "l", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "end": 0, + "raw": "6", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 6.0, + "suffix": "None" + } } }, { - "commentStart": 0, - "end": 0, - "raw": "10", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 10.0, - "suffix": "None" + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "w", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "end": 0, + "raw": "10", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 10.0, + "suffix": "None" + } } } ], @@ -650,8 +690,9 @@ description: Result of parsing function_sketch_with_position.kcl "commentStart": 0, "end": 0, "start": 0, - "type": "CallExpression", - "type": "CallExpression" + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null }, "start": 0, "type": "VariableDeclarator" diff --git a/rust/kcl-lib/tests/function_sketch_with_position/input.kcl b/rust/kcl-lib/tests/function_sketch_with_position/input.kcl index 648433121..7a670b662 100644 --- a/rust/kcl-lib/tests/function_sketch_with_position/input.kcl +++ b/rust/kcl-lib/tests/function_sketch_with_position/input.kcl @@ -10,4 +10,4 @@ fn box(p, h, l, w) { return myBox } -thing = box([0, 0], 3, 6, 10) +thing = box(p = [0, 0], h = 3, l = 6, w = 10) diff --git a/rust/kcl-lib/tests/function_sketch_with_position/ops.snap b/rust/kcl-lib/tests/function_sketch_with_position/ops.snap index c9fd15a78..cc8fced1b 100644 --- a/rust/kcl-lib/tests/function_sketch_with_position/ops.snap +++ b/rust/kcl-lib/tests/function_sketch_with_position/ops.snap @@ -57,7 +57,90 @@ description: Operations executed function_sketch_with_position.kcl "name": "box", "functionSourceRange": [], "unlabeledArg": null, - "labeledArgs": {} + "labeledArgs": { + "h": { + "value": { + "type": "Number", + "value": 3.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "l": { + "value": { + "type": "Number", + "value": 6.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "p": { + "value": { + "type": "Array", + "value": [ + { + "type": "Number", + "value": 0.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + { + "type": "Number", + "value": 0.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + } + ] + }, + "sourceRange": [] + }, + "w": { + "value": { + "type": "Number", + "value": 10.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + } + } }, "sourceRange": [] }, diff --git a/rust/kcl-lib/tests/function_sketch_with_position/unparsed.snap b/rust/kcl-lib/tests/function_sketch_with_position/unparsed.snap index ffa71009e..569af5f11 100644 --- a/rust/kcl-lib/tests/function_sketch_with_position/unparsed.snap +++ b/rust/kcl-lib/tests/function_sketch_with_position/unparsed.snap @@ -14,4 +14,9 @@ fn box(p, h, l, w) { return myBox } -thing = box([0, 0], 3, 6, 10) +thing = box( + p = [0, 0], + h = 3, + l = 6, + w = 10, +) diff --git a/rust/kcl-lib/tests/intersect_cubes/artifact_graph_flowchart.snap.md b/rust/kcl-lib/tests/intersect_cubes/artifact_graph_flowchart.snap.md index 236ebe28b..332772bd5 100644 --- a/rust/kcl-lib/tests/intersect_cubes/artifact_graph_flowchart.snap.md +++ b/rust/kcl-lib/tests/intersect_cubes/artifact_graph_flowchart.snap.md @@ -20,7 +20,7 @@ flowchart LR 2["Plane
[33, 50, 0]"] 15["Sweep Extrusion
[328, 354, 0]"] 16["Sweep Extrusion
[328, 354, 0]"] - 17["CompositeSolid Intersect
[448, 477, 0]"] + 17["CompositeSolid Intersect
[480, 509, 0]"] 18[Wall] 19[Wall] 20[Wall] diff --git a/rust/kcl-lib/tests/intersect_cubes/ast.snap b/rust/kcl-lib/tests/intersect_cubes/ast.snap index 0920666c6..a84ec9b1b 100644 --- a/rust/kcl-lib/tests/intersect_cubes/ast.snap +++ b/rust/kcl-lib/tests/intersect_cubes/ast.snap @@ -819,48 +819,68 @@ description: Result of parsing intersect_cubes.kcl "init": { "arguments": [ { - "commentStart": 0, - "elements": [ - { - "commentStart": 0, - "end": 0, - "raw": "0", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 0.0, - "suffix": "None" + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "center", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "elements": [ + { + "commentStart": 0, + "end": 0, + "raw": "0", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 0.0, + "suffix": "None" + } + }, + { + "commentStart": 0, + "end": 0, + "raw": "0", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 0.0, + "suffix": "None" + } } - }, - { - "commentStart": 0, - "end": 0, - "raw": "0", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 0.0, - "suffix": "None" - } - } - ], - "end": 0, - "start": 0, - "type": "ArrayExpression", - "type": "ArrayExpression" + ], + "end": 0, + "start": 0, + "type": "ArrayExpression", + "type": "ArrayExpression" + } }, { - "commentStart": 0, - "end": 0, - "raw": "10", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 10.0, - "suffix": "None" + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "size", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "end": 0, + "raw": "10", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 10.0, + "suffix": "None" + } } } ], @@ -882,8 +902,9 @@ description: Result of parsing intersect_cubes.kcl "commentStart": 0, "end": 0, "start": 0, - "type": "CallExpression", - "type": "CallExpression" + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null }, "start": 0, "type": "VariableDeclarator" @@ -911,48 +932,68 @@ description: Result of parsing intersect_cubes.kcl { "arguments": [ { - "commentStart": 0, - "elements": [ - { - "commentStart": 0, - "end": 0, - "raw": "7", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 7.0, - "suffix": "None" + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "center", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "elements": [ + { + "commentStart": 0, + "end": 0, + "raw": "7", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 7.0, + "suffix": "None" + } + }, + { + "commentStart": 0, + "end": 0, + "raw": "3", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 3.0, + "suffix": "None" + } } - }, - { - "commentStart": 0, - "end": 0, - "raw": "3", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 3.0, - "suffix": "None" - } - } - ], - "end": 0, - "start": 0, - "type": "ArrayExpression", - "type": "ArrayExpression" + ], + "end": 0, + "start": 0, + "type": "ArrayExpression", + "type": "ArrayExpression" + } }, { - "commentStart": 0, - "end": 0, - "raw": "5", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 5.0, - "suffix": "None" + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "size", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "end": 0, + "raw": "5", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 5.0, + "suffix": "None" + } } } ], @@ -974,8 +1015,9 @@ description: Result of parsing intersect_cubes.kcl "commentStart": 0, "end": 0, "start": 0, - "type": "CallExpression", - "type": "CallExpression" + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null }, { "arguments": [ diff --git a/rust/kcl-lib/tests/intersect_cubes/input.kcl b/rust/kcl-lib/tests/intersect_cubes/input.kcl index ec430fd43..2554ea55d 100644 --- a/rust/kcl-lib/tests/intersect_cubes/input.kcl +++ b/rust/kcl-lib/tests/intersect_cubes/input.kcl @@ -8,8 +8,8 @@ fn cube(center, size) { |> extrude(length = 2 * size) } -part001 = cube([0, 0], 10) -part002 = cube([7, 3], 5) +part001 = cube(center = [0, 0], size = 10) +part002 = cube(center = [7, 3], size = 5) |> translate(z = 1) fullPart = intersect([part001, part002]) diff --git a/rust/kcl-lib/tests/intersect_cubes/ops.snap b/rust/kcl-lib/tests/intersect_cubes/ops.snap index 205968529..9b09eb6d1 100644 --- a/rust/kcl-lib/tests/intersect_cubes/ops.snap +++ b/rust/kcl-lib/tests/intersect_cubes/ops.snap @@ -104,7 +104,58 @@ description: Operations executed intersect_cubes.kcl "name": "cube", "functionSourceRange": [], "unlabeledArg": null, - "labeledArgs": {} + "labeledArgs": { + "center": { + "value": { + "type": "Array", + "value": [ + { + "type": "Number", + "value": 0.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + { + "type": "Number", + "value": 0.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + } + ] + }, + "sourceRange": [] + }, + "size": { + "value": { + "type": "Number", + "value": 10.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + } + } }, "sourceRange": [] }, @@ -115,7 +166,58 @@ description: Operations executed intersect_cubes.kcl "name": "cube", "functionSourceRange": [], "unlabeledArg": null, - "labeledArgs": {} + "labeledArgs": { + "center": { + "value": { + "type": "Array", + "value": [ + { + "type": "Number", + "value": 7.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + { + "type": "Number", + "value": 3.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + } + ] + }, + "sourceRange": [] + }, + "size": { + "value": { + "type": "Number", + "value": 5.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + } + } }, "sourceRange": [] }, diff --git a/rust/kcl-lib/tests/intersect_cubes/unparsed.snap b/rust/kcl-lib/tests/intersect_cubes/unparsed.snap index cdb0aadae..50fe3af4b 100644 --- a/rust/kcl-lib/tests/intersect_cubes/unparsed.snap +++ b/rust/kcl-lib/tests/intersect_cubes/unparsed.snap @@ -12,8 +12,8 @@ fn cube(center, size) { |> extrude(length = 2 * size) } -part001 = cube([0, 0], 10) -part002 = cube([7, 3], 5) +part001 = cube(center = [0, 0], size = 10) +part002 = cube(center = [7, 3], size = 5) |> translate(z = 1) fullPart = intersect([part001, part002]) diff --git a/rust/kcl-lib/tests/kcl_samples/80-20-rail/ast.snap b/rust/kcl-lib/tests/kcl_samples/80-20-rail/ast.snap index e3f073482..c9d7cf90f 100644 --- a/rust/kcl-lib/tests/kcl_samples/80-20-rail/ast.snap +++ b/rust/kcl-lib/tests/kcl_samples/80-20-rail/ast.snap @@ -9474,60 +9474,90 @@ description: Result of parsing 80-20-rail.kcl "expression": { "arguments": [ { - "commentStart": 0, - "elements": [ - { - "commentStart": 0, - "end": 0, - "raw": "0", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 0.0, - "suffix": "None" + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "originStart", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "elements": [ + { + "commentStart": 0, + "end": 0, + "raw": "0", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 0.0, + "suffix": "None" + } + }, + { + "commentStart": 0, + "end": 0, + "raw": "0", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 0.0, + "suffix": "None" + } } - }, - { - "commentStart": 0, - "end": 0, - "raw": "0", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 0.0, - "suffix": "None" - } - } - ], - "end": 0, - "start": 0, - "type": "ArrayExpression", - "type": "ArrayExpression" - }, - { - "commentStart": 0, - "end": 0, - "raw": "1.5", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 1.5, - "suffix": "None" + ], + "end": 0, + "start": 0, + "type": "ArrayExpression", + "type": "ArrayExpression" } }, { - "commentStart": 0, - "end": 0, - "raw": "48", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 48.0, - "suffix": "None" + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "railHeight", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "end": 0, + "raw": "1.5", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 1.5, + "suffix": "None" + } + } + }, + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "railLength", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "end": 0, + "raw": "48", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 48.0, + "suffix": "None" + } } } ], @@ -9549,8 +9579,9 @@ description: Result of parsing 80-20-rail.kcl "commentStart": 0, "end": 0, "start": 0, - "type": "CallExpression", - "type": "CallExpression" + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null }, "preComments": [ "", diff --git a/rust/kcl-lib/tests/kcl_samples/80-20-rail/ops.snap b/rust/kcl-lib/tests/kcl_samples/80-20-rail/ops.snap index 6f8db391b..895eeadd7 100644 --- a/rust/kcl-lib/tests/kcl_samples/80-20-rail/ops.snap +++ b/rust/kcl-lib/tests/kcl_samples/80-20-rail/ops.snap @@ -290,7 +290,74 @@ description: Operations executed 80-20-rail.kcl "name": "rail8020", "functionSourceRange": [], "unlabeledArg": null, - "labeledArgs": {} + "labeledArgs": { + "originStart": { + "value": { + "type": "Array", + "value": [ + { + "type": "Number", + "value": 0.0, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + { + "type": "Number", + "value": 0.0, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + } + ] + }, + "sourceRange": [] + }, + "railHeight": { + "value": { + "type": "Number", + "value": 1.5, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "railLength": { + "value": { + "type": "Number", + "value": 48.0, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + } + } }, "sourceRange": [] }, diff --git a/rust/kcl-lib/tests/kcl_samples/axial-fan/artifact_graph_flowchart.snap.md b/rust/kcl-lib/tests/kcl_samples/axial-fan/artifact_graph_flowchart.snap.md index 1c1175c73..3a0811db8 100644 --- a/rust/kcl-lib/tests/kcl_samples/axial-fan/artifact_graph_flowchart.snap.md +++ b/rust/kcl-lib/tests/kcl_samples/axial-fan/artifact_graph_flowchart.snap.md @@ -177,7 +177,7 @@ flowchart LR 129["Sweep Extrusion
[333, 353, 10]"] 130["Sweep Extrusion
[543, 564, 10]"] 131["Sweep Revolve
[764, 846, 11]"] - 132["Sweep Loft
[2259, 2379, 11]"] + 132["Sweep Loft
[2454, 2473, 11]"] 133[Wall] 134[Wall] 135[Wall] @@ -605,19 +605,19 @@ flowchart LR 84 --- 147 84 --- 233 87 --- 169 - 87 x--> 183 + 87 x--> 184 87 --- 212 87 --- 257 89 --- 168 - 89 x--> 183 + 89 x--> 184 89 --- 214 89 --- 258 90 --- 167 - 90 x--> 183 + 90 x--> 184 90 --- 211 90 --- 256 92 --- 166 - 92 x--> 183 + 92 x--> 184 92 --- 213 92 --- 259 119 --- 162 @@ -865,10 +865,10 @@ flowchart LR 221 <--x 181 222 <--x 181 193 <--x 182 - 211 <--x 184 - 212 <--x 184 - 213 <--x 184 - 214 <--x 184 + 211 <--x 183 + 212 <--x 183 + 213 <--x 183 + 214 <--x 183 203 <--x 186 204 <--x 186 205 <--x 186 diff --git a/rust/kcl-lib/tests/kcl_samples/bench/artifact_graph_flowchart.snap.md b/rust/kcl-lib/tests/kcl_samples/bench/artifact_graph_flowchart.snap.md index 4ee7e0899..7db77e92a 100644 --- a/rust/kcl-lib/tests/kcl_samples/bench/artifact_graph_flowchart.snap.md +++ b/rust/kcl-lib/tests/kcl_samples/bench/artifact_graph_flowchart.snap.md @@ -1,275 +1,275 @@ ```mermaid flowchart LR subgraph path24 [Path] - 24["Path
[361, 394, 8]"] - 44["Segment
[402, 428, 8]"] - 49["Segment
[436, 498, 8]"] - 57["Segment
[506, 568, 8]"] - 62["Segment
[576, 639, 8]"] - 69["Segment
[647, 672, 8]"] - 70["Segment
[680, 700, 8]"] - 79["Segment
[708, 732, 8]"] - 84["Segment
[740, 802, 8]"] - 88["Segment
[810, 835, 8]"] - 98["Segment
[843, 863, 8]"] - 104["Segment
[871, 895, 8]"] - 107["Segment
[903, 964, 8]"] - 112["Segment
[972, 1033, 8]"] - 122["Segment
[1041, 1066, 8]"] - 129["Segment
[1074, 1098, 8]"] - 133["Segment
[1106, 1168, 8]"] - 141["Segment
[1176, 1201, 8]"] - 144["Segment
[1209, 1236, 8]"] - 149["Segment
[1244, 1305, 8]"] - 155["Segment
[1313, 1357, 8]"] - 160["Segment
[1365, 1372, 8]"] + 24["Path
[362, 395, 8]"] + 44["Segment
[403, 429, 8]"] + 49["Segment
[437, 499, 8]"] + 57["Segment
[507, 569, 8]"] + 62["Segment
[577, 640, 8]"] + 69["Segment
[648, 673, 8]"] + 70["Segment
[681, 701, 8]"] + 79["Segment
[709, 733, 8]"] + 84["Segment
[741, 803, 8]"] + 88["Segment
[811, 836, 8]"] + 98["Segment
[844, 864, 8]"] + 104["Segment
[872, 896, 8]"] + 107["Segment
[904, 965, 8]"] + 112["Segment
[973, 1034, 8]"] + 122["Segment
[1042, 1067, 8]"] + 129["Segment
[1075, 1099, 8]"] + 133["Segment
[1107, 1169, 8]"] + 141["Segment
[1177, 1202, 8]"] + 144["Segment
[1210, 1237, 8]"] + 149["Segment
[1245, 1306, 8]"] + 155["Segment
[1314, 1358, 8]"] + 160["Segment
[1366, 1373, 8]"] 212[Solid2d] end subgraph path25 [Path] - 25["Path
[361, 394, 8]"] - 40["Segment
[402, 428, 8]"] - 51["Segment
[436, 498, 8]"] - 56["Segment
[506, 568, 8]"] - 59["Segment
[576, 639, 8]"] - 67["Segment
[647, 672, 8]"] - 74["Segment
[680, 700, 8]"] - 81["Segment
[708, 732, 8]"] - 82["Segment
[740, 802, 8]"] - 90["Segment
[810, 835, 8]"] - 99["Segment
[843, 863, 8]"] - 105["Segment
[871, 895, 8]"] - 109["Segment
[903, 964, 8]"] - 113["Segment
[972, 1033, 8]"] - 119["Segment
[1041, 1066, 8]"] - 124["Segment
[1074, 1098, 8]"] - 132["Segment
[1106, 1168, 8]"] - 140["Segment
[1176, 1201, 8]"] - 143["Segment
[1209, 1236, 8]"] - 150["Segment
[1244, 1305, 8]"] - 154["Segment
[1313, 1357, 8]"] - 164["Segment
[1365, 1372, 8]"] + 25["Path
[362, 395, 8]"] + 40["Segment
[403, 429, 8]"] + 51["Segment
[437, 499, 8]"] + 56["Segment
[507, 569, 8]"] + 59["Segment
[577, 640, 8]"] + 67["Segment
[648, 673, 8]"] + 74["Segment
[681, 701, 8]"] + 81["Segment
[709, 733, 8]"] + 82["Segment
[741, 803, 8]"] + 90["Segment
[811, 836, 8]"] + 99["Segment
[844, 864, 8]"] + 105["Segment
[872, 896, 8]"] + 109["Segment
[904, 965, 8]"] + 113["Segment
[973, 1034, 8]"] + 119["Segment
[1042, 1067, 8]"] + 124["Segment
[1075, 1099, 8]"] + 132["Segment
[1107, 1169, 8]"] + 140["Segment
[1177, 1202, 8]"] + 143["Segment
[1210, 1237, 8]"] + 150["Segment
[1245, 1306, 8]"] + 154["Segment
[1314, 1358, 8]"] + 164["Segment
[1366, 1373, 8]"] 217[Solid2d] end subgraph path26 [Path] - 26["Path
[361, 394, 8]"] - 43["Segment
[402, 428, 8]"] - 50["Segment
[436, 498, 8]"] - 54["Segment
[506, 568, 8]"] - 61["Segment
[576, 639, 8]"] - 65["Segment
[647, 672, 8]"] - 71["Segment
[680, 700, 8]"] - 80["Segment
[708, 732, 8]"] - 87["Segment
[740, 802, 8]"] - 92["Segment
[810, 835, 8]"] - 94["Segment
[843, 863, 8]"] - 101["Segment
[871, 895, 8]"] - 111["Segment
[903, 964, 8]"] - 117["Segment
[972, 1033, 8]"] - 123["Segment
[1041, 1066, 8]"] - 125["Segment
[1074, 1098, 8]"] - 134["Segment
[1106, 1168, 8]"] - 136["Segment
[1176, 1201, 8]"] - 147["Segment
[1209, 1236, 8]"] - 148["Segment
[1244, 1305, 8]"] - 156["Segment
[1313, 1357, 8]"] - 165["Segment
[1365, 1372, 8]"] + 26["Path
[362, 395, 8]"] + 43["Segment
[403, 429, 8]"] + 50["Segment
[437, 499, 8]"] + 54["Segment
[507, 569, 8]"] + 61["Segment
[577, 640, 8]"] + 65["Segment
[648, 673, 8]"] + 71["Segment
[681, 701, 8]"] + 80["Segment
[709, 733, 8]"] + 87["Segment
[741, 803, 8]"] + 92["Segment
[811, 836, 8]"] + 94["Segment
[844, 864, 8]"] + 101["Segment
[872, 896, 8]"] + 111["Segment
[904, 965, 8]"] + 117["Segment
[973, 1034, 8]"] + 123["Segment
[1042, 1067, 8]"] + 125["Segment
[1075, 1099, 8]"] + 134["Segment
[1107, 1169, 8]"] + 136["Segment
[1177, 1202, 8]"] + 147["Segment
[1210, 1237, 8]"] + 148["Segment
[1245, 1306, 8]"] + 156["Segment
[1314, 1358, 8]"] + 165["Segment
[1366, 1373, 8]"] 218[Solid2d] end subgraph path27 [Path] - 27["Path
[361, 394, 8]"] - 42["Segment
[402, 428, 8]"] - 47["Segment
[436, 498, 8]"] - 53["Segment
[506, 568, 8]"] - 58["Segment
[576, 639, 8]"] - 68["Segment
[647, 672, 8]"] - 73["Segment
[680, 700, 8]"] - 77["Segment
[708, 732, 8]"] - 83["Segment
[740, 802, 8]"] - 91["Segment
[810, 835, 8]"] - 95["Segment
[843, 863, 8]"] - 100["Segment
[871, 895, 8]"] - 108["Segment
[903, 964, 8]"] - 114["Segment
[972, 1033, 8]"] - 120["Segment
[1041, 1066, 8]"] - 126["Segment
[1074, 1098, 8]"] - 135["Segment
[1106, 1168, 8]"] - 139["Segment
[1176, 1201, 8]"] - 142["Segment
[1209, 1236, 8]"] - 151["Segment
[1244, 1305, 8]"] - 157["Segment
[1313, 1357, 8]"] - 161["Segment
[1365, 1372, 8]"] + 27["Path
[362, 395, 8]"] + 42["Segment
[403, 429, 8]"] + 47["Segment
[437, 499, 8]"] + 53["Segment
[507, 569, 8]"] + 58["Segment
[577, 640, 8]"] + 68["Segment
[648, 673, 8]"] + 73["Segment
[681, 701, 8]"] + 77["Segment
[709, 733, 8]"] + 83["Segment
[741, 803, 8]"] + 91["Segment
[811, 836, 8]"] + 95["Segment
[844, 864, 8]"] + 100["Segment
[872, 896, 8]"] + 108["Segment
[904, 965, 8]"] + 114["Segment
[973, 1034, 8]"] + 120["Segment
[1042, 1067, 8]"] + 126["Segment
[1075, 1099, 8]"] + 135["Segment
[1107, 1169, 8]"] + 139["Segment
[1177, 1202, 8]"] + 142["Segment
[1210, 1237, 8]"] + 151["Segment
[1245, 1306, 8]"] + 157["Segment
[1314, 1358, 8]"] + 161["Segment
[1366, 1373, 8]"] 219[Solid2d] end subgraph path28 [Path] - 28["Path
[361, 394, 8]"] - 45["Segment
[402, 428, 8]"] - 46["Segment
[436, 498, 8]"] - 52["Segment
[506, 568, 8]"] - 63["Segment
[576, 639, 8]"] - 66["Segment
[647, 672, 8]"] - 72["Segment
[680, 700, 8]"] - 78["Segment
[708, 732, 8]"] - 86["Segment
[740, 802, 8]"] - 89["Segment
[810, 835, 8]"] - 96["Segment
[843, 863, 8]"] - 102["Segment
[871, 895, 8]"] - 106["Segment
[903, 964, 8]"] - 116["Segment
[972, 1033, 8]"] - 118["Segment
[1041, 1066, 8]"] - 128["Segment
[1074, 1098, 8]"] - 130["Segment
[1106, 1168, 8]"] - 137["Segment
[1176, 1201, 8]"] - 145["Segment
[1209, 1236, 8]"] - 152["Segment
[1244, 1305, 8]"] - 158["Segment
[1313, 1357, 8]"] - 162["Segment
[1365, 1372, 8]"] + 28["Path
[362, 395, 8]"] + 45["Segment
[403, 429, 8]"] + 46["Segment
[437, 499, 8]"] + 52["Segment
[507, 569, 8]"] + 63["Segment
[577, 640, 8]"] + 66["Segment
[648, 673, 8]"] + 72["Segment
[681, 701, 8]"] + 78["Segment
[709, 733, 8]"] + 86["Segment
[741, 803, 8]"] + 89["Segment
[811, 836, 8]"] + 96["Segment
[844, 864, 8]"] + 102["Segment
[872, 896, 8]"] + 106["Segment
[904, 965, 8]"] + 116["Segment
[973, 1034, 8]"] + 118["Segment
[1042, 1067, 8]"] + 128["Segment
[1075, 1099, 8]"] + 130["Segment
[1107, 1169, 8]"] + 137["Segment
[1177, 1202, 8]"] + 145["Segment
[1210, 1237, 8]"] + 152["Segment
[1245, 1306, 8]"] + 158["Segment
[1314, 1358, 8]"] + 162["Segment
[1366, 1373, 8]"] 220[Solid2d] end subgraph path29 [Path] - 29["Path
[361, 394, 8]"] - 41["Segment
[402, 428, 8]"] - 48["Segment
[436, 498, 8]"] - 55["Segment
[506, 568, 8]"] - 60["Segment
[576, 639, 8]"] - 64["Segment
[647, 672, 8]"] - 75["Segment
[680, 700, 8]"] - 76["Segment
[708, 732, 8]"] - 85["Segment
[740, 802, 8]"] - 93["Segment
[810, 835, 8]"] - 97["Segment
[843, 863, 8]"] - 103["Segment
[871, 895, 8]"] - 110["Segment
[903, 964, 8]"] - 115["Segment
[972, 1033, 8]"] - 121["Segment
[1041, 1066, 8]"] - 127["Segment
[1074, 1098, 8]"] - 131["Segment
[1106, 1168, 8]"] - 138["Segment
[1176, 1201, 8]"] - 146["Segment
[1209, 1236, 8]"] - 153["Segment
[1244, 1305, 8]"] - 159["Segment
[1313, 1357, 8]"] - 163["Segment
[1365, 1372, 8]"] + 29["Path
[362, 395, 8]"] + 41["Segment
[403, 429, 8]"] + 48["Segment
[437, 499, 8]"] + 55["Segment
[507, 569, 8]"] + 60["Segment
[577, 640, 8]"] + 64["Segment
[648, 673, 8]"] + 75["Segment
[681, 701, 8]"] + 76["Segment
[709, 733, 8]"] + 85["Segment
[741, 803, 8]"] + 93["Segment
[811, 836, 8]"] + 97["Segment
[844, 864, 8]"] + 103["Segment
[872, 896, 8]"] + 110["Segment
[904, 965, 8]"] + 115["Segment
[973, 1034, 8]"] + 121["Segment
[1042, 1067, 8]"] + 127["Segment
[1075, 1099, 8]"] + 131["Segment
[1107, 1169, 8]"] + 138["Segment
[1177, 1202, 8]"] + 146["Segment
[1210, 1237, 8]"] + 153["Segment
[1245, 1306, 8]"] + 159["Segment
[1314, 1358, 8]"] + 163["Segment
[1366, 1373, 8]"] 221[Solid2d] end subgraph path30 [Path] - 30["Path
[1762, 1786, 8]"] + 30["Path
[1765, 1789, 8]"] end subgraph path31 [Path] - 31["Path
[1762, 1786, 8]"] + 31["Path
[1765, 1789, 8]"] end subgraph path32 [Path] - 32["Path
[1794, 1920, 8]"] - 169["Segment
[1794, 1920, 8]"] - 170["Segment
[1794, 1920, 8]"] - 171["Segment
[1794, 1920, 8]"] - 172["Segment
[1794, 1920, 8]"] - 176["Segment
[1794, 1920, 8]"] - 178["Segment
[1794, 1920, 8]"] - 179["Segment
[1794, 1920, 8]"] + 32["Path
[1797, 1923, 8]"] + 169["Segment
[1797, 1923, 8]"] + 170["Segment
[1797, 1923, 8]"] + 171["Segment
[1797, 1923, 8]"] + 172["Segment
[1797, 1923, 8]"] + 176["Segment
[1797, 1923, 8]"] + 178["Segment
[1797, 1923, 8]"] + 179["Segment
[1797, 1923, 8]"] 215[Solid2d] end subgraph path33 [Path] - 33["Path
[1794, 1920, 8]"] - 166["Segment
[1794, 1920, 8]"] - 167["Segment
[1794, 1920, 8]"] - 168["Segment
[1794, 1920, 8]"] - 173["Segment
[1794, 1920, 8]"] - 174["Segment
[1794, 1920, 8]"] - 175["Segment
[1794, 1920, 8]"] - 177["Segment
[1794, 1920, 8]"] + 33["Path
[1797, 1923, 8]"] + 166["Segment
[1797, 1923, 8]"] + 167["Segment
[1797, 1923, 8]"] + 168["Segment
[1797, 1923, 8]"] + 173["Segment
[1797, 1923, 8]"] + 174["Segment
[1797, 1923, 8]"] + 175["Segment
[1797, 1923, 8]"] + 177["Segment
[1797, 1923, 8]"] 222[Solid2d] end subgraph path34 [Path] - 34["Path
[2196, 2223, 8]"] - 180["Segment
[2231, 2253, 8]"] - 181["Segment
[2261, 2283, 8]"] - 182["Segment
[2291, 2313, 8]"] - 183["Segment
[2321, 2344, 8]"] - 184["Segment
[2352, 2375, 8]"] - 185["Segment
[2383, 2418, 8]"] - 186["Segment
[2426, 2433, 8]"] + 34["Path
[2217, 2244, 8]"] + 180["Segment
[2252, 2274, 8]"] + 181["Segment
[2282, 2304, 8]"] + 182["Segment
[2312, 2334, 8]"] + 183["Segment
[2342, 2365, 8]"] + 184["Segment
[2373, 2396, 8]"] + 185["Segment
[2404, 2439, 8]"] + 186["Segment
[2447, 2454, 8]"] 223[Solid2d] end subgraph path35 [Path] - 35["Path
[2705, 2734, 8]"] - 187["Segment
[2742, 2777, 8]"] - 188["Segment
[2785, 2810, 8]"] - 189["Segment
[2818, 2854, 8]"] - 190["Segment
[2862, 2886, 8]"] - 191["Segment
[2894, 2928, 8]"] - 192["Segment
[2936, 2971, 8]"] - 193["Segment
[2979, 2986, 8]"] + 35["Path
[2728, 2757, 8]"] + 187["Segment
[2765, 2800, 8]"] + 188["Segment
[2808, 2833, 8]"] + 189["Segment
[2841, 2877, 8]"] + 190["Segment
[2885, 2909, 8]"] + 191["Segment
[2917, 2951, 8]"] + 192["Segment
[2959, 2994, 8]"] + 193["Segment
[3002, 3009, 8]"] 214[Solid2d] end subgraph path36 [Path] - 36["Path
[3261, 3288, 8]"] - 195["Segment
[3296, 3315, 8]"] - 197["Segment
[3323, 3372, 8]"] + 36["Path
[3286, 3313, 8]"] + 195["Segment
[3321, 3340, 8]"] + 197["Segment
[3348, 3397, 8]"] end subgraph path37 [Path] - 37["Path
[3261, 3288, 8]"] - 194["Segment
[3296, 3315, 8]"] - 196["Segment
[3323, 3372, 8]"] + 37["Path
[3286, 3313, 8]"] + 194["Segment
[3321, 3340, 8]"] + 196["Segment
[3348, 3397, 8]"] end subgraph path38 [Path] - 38["Path
[3472, 3505, 8]"] - 199["Segment
[3513, 3532, 8]"] - 200["Segment
[3540, 3562, 8]"] - 202["Segment
[3570, 3593, 8]"] - 204["Segment
[3601, 3621, 8]"] - 206["Segment
[3629, 3653, 8]"] - 209["Segment
[3661, 3684, 8]"] - 211["Segment
[3692, 3699, 8]"] + 38["Path
[3498, 3531, 8]"] + 199["Segment
[3539, 3558, 8]"] + 200["Segment
[3566, 3588, 8]"] + 202["Segment
[3596, 3619, 8]"] + 204["Segment
[3627, 3647, 8]"] + 206["Segment
[3655, 3679, 8]"] + 209["Segment
[3687, 3710, 8]"] + 211["Segment
[3718, 3725, 8]"] 213[Solid2d] end subgraph path39 [Path] - 39["Path
[3472, 3505, 8]"] - 198["Segment
[3513, 3532, 8]"] - 201["Segment
[3540, 3562, 8]"] - 203["Segment
[3570, 3593, 8]"] - 205["Segment
[3601, 3621, 8]"] - 207["Segment
[3629, 3653, 8]"] - 208["Segment
[3661, 3684, 8]"] - 210["Segment
[3692, 3699, 8]"] + 39["Path
[3498, 3531, 8]"] + 198["Segment
[3539, 3558, 8]"] + 201["Segment
[3566, 3588, 8]"] + 203["Segment
[3596, 3619, 8]"] + 205["Segment
[3627, 3647, 8]"] + 207["Segment
[3655, 3679, 8]"] + 208["Segment
[3687, 3710, 8]"] + 210["Segment
[3718, 3725, 8]"] 216[Solid2d] end 1["Plane
[823, 864, 0]"] 2["Plane
[874, 916, 0]"] 3["Plane
[975, 1017, 0]"] - 4["Plane
[1068, 1135, 0]"] - 5["Plane
[1205, 1272, 0]"] - 6["Plane
[333, 353, 8]"] - 7["Plane
[333, 353, 8]"] - 8["Plane
[3780, 3815, 8]"] - 9["Plane
[3780, 3815, 8]"] - 10["Plane
[3846, 3875, 8]"] - 11["Plane
[3846, 3875, 8]"] - 12["StartSketchOnPlane
[2677, 2697, 8]"] - 13["StartSketchOnPlane
[1734, 1754, 8]"] - 14["StartSketchOnPlane
[3233, 3253, 8]"] - 15["StartSketchOnPlane
[1734, 1754, 8]"] - 16["StartSketchOnPlane
[333, 353, 8]"] - 17["StartSketchOnPlane
[3444, 3464, 8]"] - 18["StartSketchOnPlane
[3444, 3464, 8]"] - 19["StartSketchOnPlane
[333, 353, 8]"] - 20["StartSketchOnPlane
[333, 353, 8]"] - 21["StartSketchOnPlane
[3233, 3253, 8]"] - 22["StartSketchOnPlane
[333, 353, 8]"] - 23["StartSketchOnPlane
[2168, 2188, 8]"] - 224["Sweep Extrusion
[1460, 1498, 8]"] - 225["Sweep Extrusion
[1460, 1498, 8]"] - 226["Sweep Extrusion
[1460, 1498, 8]"] - 227["Sweep Extrusion
[1536, 1575, 8]"] - 228["Sweep Extrusion
[1536, 1575, 8]"] - 229["Sweep Extrusion
[1536, 1575, 8]"] - 230["Sweep Extrusion
[2022, 2046, 8]"] - 231["Sweep Extrusion
[2088, 2112, 8]"] - 232["Sweep Extrusion
[2596, 2620, 8]"] - 233["Sweep Extrusion
[2596, 2620, 8]"] - 234["Sweep Extrusion
[2596, 2620, 8]"] - 235["Sweep Extrusion
[3156, 3180, 8]"] - 236["Sweep Extrusion
[3156, 3180, 8]"] - 237["Sweep Sweep
[3888, 3915, 8]"] - 238["Sweep Sweep
[3888, 3915, 8]"] + 4["Plane
[1077, 1144, 0]"] + 5["Plane
[1223, 1290, 0]"] + 6["Plane
[334, 354, 8]"] + 7["Plane
[334, 354, 8]"] + 8["Plane
[3807, 3842, 8]"] + 9["Plane
[3807, 3842, 8]"] + 10["Plane
[3873, 3902, 8]"] + 11["Plane
[3873, 3902, 8]"] + 12["StartSketchOnPlane
[2700, 2720, 8]"] + 13["StartSketchOnPlane
[1737, 1757, 8]"] + 14["StartSketchOnPlane
[3258, 3278, 8]"] + 15["StartSketchOnPlane
[1737, 1757, 8]"] + 16["StartSketchOnPlane
[334, 354, 8]"] + 17["StartSketchOnPlane
[3470, 3490, 8]"] + 18["StartSketchOnPlane
[3470, 3490, 8]"] + 19["StartSketchOnPlane
[334, 354, 8]"] + 20["StartSketchOnPlane
[334, 354, 8]"] + 21["StartSketchOnPlane
[3258, 3278, 8]"] + 22["StartSketchOnPlane
[334, 354, 8]"] + 23["StartSketchOnPlane
[2189, 2209, 8]"] + 224["Sweep Extrusion
[1462, 1500, 8]"] + 225["Sweep Extrusion
[1462, 1500, 8]"] + 226["Sweep Extrusion
[1462, 1500, 8]"] + 227["Sweep Extrusion
[1538, 1577, 8]"] + 228["Sweep Extrusion
[1538, 1577, 8]"] + 229["Sweep Extrusion
[1538, 1577, 8]"] + 230["Sweep Extrusion
[2034, 2058, 8]"] + 231["Sweep Extrusion
[2108, 2132, 8]"] + 232["Sweep Extrusion
[2618, 2642, 8]"] + 233["Sweep Extrusion
[2618, 2642, 8]"] + 234["Sweep Extrusion
[2618, 2642, 8]"] + 235["Sweep Extrusion
[3180, 3204, 8]"] + 236["Sweep Extrusion
[3180, 3204, 8]"] + 237["Sweep Sweep
[3924, 3951, 8]"] + 238["Sweep Sweep
[3924, 3951, 8]"] 239[Wall] 240[Wall] 241[Wall] diff --git a/rust/kcl-lib/tests/kcl_samples/bench/ast.snap b/rust/kcl-lib/tests/kcl_samples/bench/ast.snap index 55c770099..5bf496b5b 100644 --- a/rust/kcl-lib/tests/kcl_samples/bench/ast.snap +++ b/rust/kcl-lib/tests/kcl_samples/bench/ast.snap @@ -526,17 +526,247 @@ description: Result of parsing bench.kcl "expression": { "arguments": [ { - "arguments": [ - { - "type": "LabeledArg", - "label": { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "length", + "start": 0, + "type": "Identifier" + }, + "arg": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "benchLength", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } + } + ], + "callee": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "connector", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name" + }, + "commentStart": 0, + "end": 0, + "start": 0, + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": { + "arguments": [ + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "offset", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "end": 0, + "left": { + "argument": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "benchLength", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + }, "commentStart": 0, "end": 0, - "name": "offset", + "operator": "-", + "start": 0, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + "operator": "/", + "right": { + "commentStart": 0, + "end": 0, + "raw": "2", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 2.0, + "suffix": "None" + } + }, + "start": 0, + "type": "BinaryExpression", + "type": "BinaryExpression" + } + } + ], + "callee": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "offsetPlane", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name" + }, + "commentStart": 0, + "end": 0, + "start": 0, + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "YZ", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } + } + }, + "preComments": [ + "", + "", + "// Create the connectors to join the dividers" + ], + "start": 0, + "type": "ExpressionStatement", + "type": "ExpressionStatement" + }, + { + "commentStart": 0, + "end": 0, + "expression": { + "arguments": [ + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "length", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "end": 0, + "left": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "benchLength", "start": 0, "type": "Identifier" }, - "arg": { + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + }, + "operator": "+", + "right": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "dividerThickness", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + }, + "start": 0, + "type": "BinaryExpression", + "type": "BinaryExpression" + } + } + ], + "callee": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "seatSlats", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name" + }, + "commentStart": 0, + "end": 0, + "start": 0, + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": { + "arguments": [ + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "offset", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "end": 0, + "left": { "commentStart": 0, "end": 0, "left": { @@ -579,54 +809,78 @@ description: Result of parsing bench.kcl "start": 0, "type": "BinaryExpression", "type": "BinaryExpression" - } + }, + "operator": "-", + "right": { + "commentStart": 0, + "end": 0, + "left": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "dividerThickness", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + }, + "operator": "/", + "right": { + "commentStart": 0, + "end": 0, + "raw": "2", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 2.0, + "suffix": "None" + } + }, + "start": 0, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "start": 0, + "type": "BinaryExpression", + "type": "BinaryExpression" } - ], - "callee": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "offsetPlane", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name" - }, - "commentStart": 0, - "end": 0, - "start": 0, - "type": "CallExpressionKw", - "type": "CallExpressionKw", - "unlabeled": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "YZ", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" } - }, - { + ], + "callee": { "abs_path": false, "commentStart": 0, "end": 0, "name": { "commentStart": 0, "end": 0, - "name": "benchLength", + "name": "offsetPlane", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name" + }, + "commentStart": 0, + "end": 0, + "start": 0, + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "YZ", "start": 0, "type": "Identifier" }, @@ -635,241 +889,7 @@ description: Result of parsing bench.kcl "type": "Name", "type": "Name" } - ], - "callee": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "connector", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name" - }, - "commentStart": 0, - "end": 0, - "start": 0, - "type": "CallExpression", - "type": "CallExpression" - }, - "preComments": [ - "", - "", - "// Create the connectors to join the dividers" - ], - "start": 0, - "type": "ExpressionStatement", - "type": "ExpressionStatement" - }, - { - "commentStart": 0, - "end": 0, - "expression": { - "arguments": [ - { - "arguments": [ - { - "type": "LabeledArg", - "label": { - "commentStart": 0, - "end": 0, - "name": "offset", - "start": 0, - "type": "Identifier" - }, - "arg": { - "commentStart": 0, - "end": 0, - "left": { - "commentStart": 0, - "end": 0, - "left": { - "argument": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "benchLength", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - "commentStart": 0, - "end": 0, - "operator": "-", - "start": 0, - "type": "UnaryExpression", - "type": "UnaryExpression" - }, - "operator": "/", - "right": { - "commentStart": 0, - "end": 0, - "raw": "2", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 2.0, - "suffix": "None" - } - }, - "start": 0, - "type": "BinaryExpression", - "type": "BinaryExpression" - }, - "operator": "-", - "right": { - "commentStart": 0, - "end": 0, - "left": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "dividerThickness", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - "operator": "/", - "right": { - "commentStart": 0, - "end": 0, - "raw": "2", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 2.0, - "suffix": "None" - } - }, - "start": 0, - "type": "BinaryExpression", - "type": "BinaryExpression" - }, - "start": 0, - "type": "BinaryExpression", - "type": "BinaryExpression" - } - } - ], - "callee": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "offsetPlane", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name" - }, - "commentStart": 0, - "end": 0, - "start": 0, - "type": "CallExpressionKw", - "type": "CallExpressionKw", - "unlabeled": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "YZ", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - } - }, - { - "commentStart": 0, - "end": 0, - "left": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "benchLength", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - "operator": "+", - "right": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "dividerThickness", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - "start": 0, - "type": "BinaryExpression", - "type": "BinaryExpression" - } - ], - "callee": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "seatSlats", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name" - }, - "commentStart": 0, - "end": 0, - "start": 0, - "type": "CallExpression", - "type": "CallExpression" + } }, "preComments": [ "", @@ -886,182 +906,54 @@ description: Result of parsing bench.kcl "expression": { "arguments": [ { - "arguments": [ - { - "type": "LabeledArg", - "label": { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "length", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "end": 0, + "left": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { "commentStart": 0, "end": 0, - "name": "offset", + "name": "benchLength", "start": 0, "type": "Identifier" }, - "arg": { + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + }, + "operator": "+", + "right": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { "commentStart": 0, "end": 0, - "left": { - "commentStart": 0, - "end": 0, - "left": { - "argument": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "benchLength", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - "commentStart": 0, - "end": 0, - "operator": "-", - "start": 0, - "type": "UnaryExpression", - "type": "UnaryExpression" - }, - "operator": "/", - "right": { - "commentStart": 0, - "end": 0, - "raw": "2", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 2.0, - "suffix": "None" - } - }, - "start": 0, - "type": "BinaryExpression", - "type": "BinaryExpression" - }, - "operator": "-", - "right": { - "commentStart": 0, - "end": 0, - "left": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "dividerThickness", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - "operator": "/", - "right": { - "commentStart": 0, - "end": 0, - "raw": "2", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 2.0, - "suffix": "None" - } - }, - "start": 0, - "type": "BinaryExpression", - "type": "BinaryExpression" - }, + "name": "dividerThickness", "start": 0, - "type": "BinaryExpression", - "type": "BinaryExpression" - } - } - ], - "callee": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "offsetPlane", + "type": "Identifier" + }, + "path": [], "start": 0, - "type": "Identifier" + "type": "Name", + "type": "Name" }, - "path": [], "start": 0, - "type": "Name" - }, - "commentStart": 0, - "end": 0, - "start": 0, - "type": "CallExpressionKw", - "type": "CallExpressionKw", - "unlabeled": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "YZ", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" + "type": "BinaryExpression", + "type": "BinaryExpression" } - }, - { - "commentStart": 0, - "end": 0, - "left": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "benchLength", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - "operator": "+", - "right": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "dividerThickness", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - "start": 0, - "type": "BinaryExpression", - "type": "BinaryExpression" } ], "callee": { @@ -1082,8 +974,146 @@ description: Result of parsing bench.kcl "commentStart": 0, "end": 0, "start": 0, - "type": "CallExpression", - "type": "CallExpression" + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": { + "arguments": [ + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "offset", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "end": 0, + "left": { + "commentStart": 0, + "end": 0, + "left": { + "argument": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "benchLength", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + }, + "commentStart": 0, + "end": 0, + "operator": "-", + "start": 0, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + "operator": "/", + "right": { + "commentStart": 0, + "end": 0, + "raw": "2", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 2.0, + "suffix": "None" + } + }, + "start": 0, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "operator": "-", + "right": { + "commentStart": 0, + "end": 0, + "left": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "dividerThickness", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + }, + "operator": "/", + "right": { + "commentStart": 0, + "end": 0, + "raw": "2", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 2.0, + "suffix": "None" + } + }, + "start": 0, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "start": 0, + "type": "BinaryExpression", + "type": "BinaryExpression" + } + } + ], + "callee": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "offsetPlane", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name" + }, + "commentStart": 0, + "end": 0, + "start": 0, + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "YZ", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } + } }, "preComments": [ "", @@ -1100,56 +1130,50 @@ description: Result of parsing bench.kcl "expression": { "arguments": [ { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { + "type": "LabeledArg", + "label": { "commentStart": 0, "end": 0, - "name": "YZ", + "name": "offset", "start": 0, "type": "Identifier" }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - { - "commentStart": 0, - "end": 0, - "left": { - "abs_path": false, + "arg": { "commentStart": 0, "end": 0, - "name": { + "left": { + "abs_path": false, "commentStart": 0, "end": 0, - "name": "benchLength", + "name": { + "commentStart": 0, + "end": 0, + "name": "benchLength", + "start": 0, + "type": "Identifier" + }, + "path": [], "start": 0, - "type": "Identifier" + "type": "Name", + "type": "Name" + }, + "operator": "/", + "right": { + "commentStart": 0, + "end": 0, + "raw": "2", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 2.0, + "suffix": "None" + } }, - "path": [], "start": 0, - "type": "Name", - "type": "Name" - }, - "operator": "/", - "right": { - "commentStart": 0, - "end": 0, - "raw": "2", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 2.0, - "suffix": "None" - } - }, - "start": 0, - "type": "BinaryExpression", - "type": "BinaryExpression" + "type": "BinaryExpression", + "type": "BinaryExpression" + } } ], "callee": { @@ -1170,8 +1194,24 @@ description: Result of parsing bench.kcl "commentStart": 0, "end": 0, "start": 0, - "type": "CallExpression", - "type": "CallExpression" + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "YZ", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } }, "preComments": [ "", @@ -1188,64 +1228,58 @@ description: Result of parsing bench.kcl "expression": { "arguments": [ { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { + "type": "LabeledArg", + "label": { "commentStart": 0, "end": 0, - "name": "YZ", + "name": "offset", "start": 0, "type": "Identifier" }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - { - "commentStart": 0, - "end": 0, - "left": { - "argument": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { + "arg": { + "commentStart": 0, + "end": 0, + "left": { + "argument": { + "abs_path": false, "commentStart": 0, "end": 0, - "name": "benchLength", + "name": { + "commentStart": 0, + "end": 0, + "name": "benchLength", + "start": 0, + "type": "Identifier" + }, + "path": [], "start": 0, - "type": "Identifier" + "type": "Name", + "type": "Name" }, - "path": [], + "commentStart": 0, + "end": 0, + "operator": "-", "start": 0, - "type": "Name", - "type": "Name" + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + "operator": "/", + "right": { + "commentStart": 0, + "end": 0, + "raw": "2", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 2.0, + "suffix": "None" + } }, - "commentStart": 0, - "end": 0, - "operator": "-", "start": 0, - "type": "UnaryExpression", - "type": "UnaryExpression" - }, - "operator": "/", - "right": { - "commentStart": 0, - "end": 0, - "raw": "2", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 2.0, - "suffix": "None" - } - }, - "start": 0, - "type": "BinaryExpression", - "type": "BinaryExpression" + "type": "BinaryExpression", + "type": "BinaryExpression" + } } ], "callee": { @@ -1266,8 +1300,24 @@ description: Result of parsing bench.kcl "commentStart": 0, "end": 0, "start": 0, - "type": "CallExpression", - "type": "CallExpression" + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "YZ", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } }, "start": 0, "type": "ExpressionStatement", diff --git a/rust/kcl-lib/tests/kcl_samples/bench/ops.snap b/rust/kcl-lib/tests/kcl_samples/bench/ops.snap index 5446674ad..46787e6d8 100644 --- a/rust/kcl-lib/tests/kcl_samples/bench/ops.snap +++ b/rust/kcl-lib/tests/kcl_samples/bench/ops.snap @@ -111,8 +111,31 @@ description: Operations executed bench.kcl "type": "FunctionCall", "name": "connector", "functionSourceRange": [], - "unlabeledArg": null, - "labeledArgs": {} + "unlabeledArg": { + "value": { + "type": "Plane", + "artifact_id": "[uuid]" + }, + "sourceRange": [] + }, + "labeledArgs": { + "length": { + "value": { + "type": "Number", + "value": 56.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + } + } }, "sourceRange": [] }, @@ -152,8 +175,31 @@ description: Operations executed bench.kcl "type": "FunctionCall", "name": "seatSlats", "functionSourceRange": [], - "unlabeledArg": null, - "labeledArgs": {} + "unlabeledArg": { + "value": { + "type": "Plane", + "artifact_id": "[uuid]" + }, + "sourceRange": [] + }, + "labeledArgs": { + "length": { + "value": { + "type": "Number", + "value": 60.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + } + } }, "sourceRange": [] }, @@ -193,8 +239,31 @@ description: Operations executed bench.kcl "type": "FunctionCall", "name": "backSlats", "functionSourceRange": [], - "unlabeledArg": null, - "labeledArgs": {} + "unlabeledArg": { + "value": { + "type": "Plane", + "artifact_id": "[uuid]" + }, + "sourceRange": [] + }, + "labeledArgs": { + "length": { + "value": { + "type": "Number", + "value": 60.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + } + } }, "sourceRange": [] }, @@ -234,8 +303,31 @@ description: Operations executed bench.kcl "type": "FunctionCall", "name": "armRest", "functionSourceRange": [], - "unlabeledArg": null, - "labeledArgs": {} + "unlabeledArg": { + "value": { + "type": "Plane", + "artifact_id": "[uuid]" + }, + "sourceRange": [] + }, + "labeledArgs": { + "offset": { + "value": { + "type": "Number", + "value": 28.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + } + } }, "sourceRange": [] }, @@ -245,8 +337,31 @@ description: Operations executed bench.kcl "type": "FunctionCall", "name": "armRest", "functionSourceRange": [], - "unlabeledArg": null, - "labeledArgs": {} + "unlabeledArg": { + "value": { + "type": "Plane", + "artifact_id": "[uuid]" + }, + "sourceRange": [] + }, + "labeledArgs": { + "offset": { + "value": { + "type": "Number", + "value": -28.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + } + } }, "sourceRange": [] }, @@ -928,8 +1043,49 @@ description: Operations executed bench.kcl "type": "FunctionCall", "name": "connectorSketch", "functionSourceRange": [], - "unlabeledArg": null, - "labeledArgs": {} + "unlabeledArg": { + "value": { + "type": "Plane", + "artifact_id": "[uuid]" + }, + "sourceRange": [] + }, + "labeledArgs": { + "start": { + "value": { + "type": "Array", + "value": [ + { + "type": "Number", + "value": -12.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + { + "type": "Number", + "value": 8.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + } + ] + }, + "sourceRange": [] + } + } }, "sourceRange": [] }, @@ -971,8 +1127,49 @@ description: Operations executed bench.kcl "type": "FunctionCall", "name": "connectorSketch", "functionSourceRange": [], - "unlabeledArg": null, - "labeledArgs": {} + "unlabeledArg": { + "value": { + "type": "Plane", + "artifact_id": "[uuid]" + }, + "sourceRange": [] + }, + "labeledArgs": { + "start": { + "value": { + "type": "Array", + "value": [ + { + "type": "Number", + "value": 16.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + { + "type": "Number", + "value": 8.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + } + ] + }, + "sourceRange": [] + } + } }, "sourceRange": [] }, @@ -1300,8 +1497,31 @@ description: Operations executed bench.kcl "type": "FunctionCall", "name": "armRestProfile", "functionSourceRange": [], - "unlabeledArg": null, - "labeledArgs": {} + "unlabeledArg": { + "value": { + "type": "Plane", + "artifact_id": "[uuid]" + }, + "sourceRange": [] + }, + "labeledArgs": { + "offset": { + "value": { + "type": "Number", + "value": -28.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + } + } }, "sourceRange": [] }, @@ -1311,8 +1531,31 @@ description: Operations executed bench.kcl "type": "FunctionCall", "name": "armRestProfile", "functionSourceRange": [], - "unlabeledArg": null, - "labeledArgs": {} + "unlabeledArg": { + "value": { + "type": "Plane", + "artifact_id": "[uuid]" + }, + "sourceRange": [] + }, + "labeledArgs": { + "offset": { + "value": { + "type": "Number", + "value": 28.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + } + } }, "sourceRange": [] }, diff --git a/rust/kcl-lib/tests/kcl_samples/car-wheel-assembly/artifact_graph_flowchart.snap.md b/rust/kcl-lib/tests/kcl_samples/car-wheel-assembly/artifact_graph_flowchart.snap.md index 7bfdcf81c..c783af76a 100644 --- a/rust/kcl-lib/tests/kcl_samples/car-wheel-assembly/artifact_graph_flowchart.snap.md +++ b/rust/kcl-lib/tests/kcl_samples/car-wheel-assembly/artifact_graph_flowchart.snap.md @@ -67,31 +67,31 @@ flowchart LR 149[Solid2d] end subgraph path21 [Path] - 21["Path
[4279, 4374, 8]"] - 60["Segment
[4380, 4413, 8]"] - 61["Segment
[4419, 4470, 8]"] - 62["Segment
[4476, 4509, 8]"] - 63["Segment
[4515, 4565, 8]"] - 64["Segment
[4571, 4612, 8]"] - 65["Segment
[4618, 4667, 8]"] - 66["Segment
[4673, 4706, 8]"] - 67["Segment
[4712, 4746, 8]"] - 68["Segment
[4752, 4786, 8]"] - 69["Segment
[4792, 4844, 8]"] - 70["Segment
[4850, 4884, 8]"] - 71["Segment
[4890, 4966, 8]"] - 72["Segment
[4972, 5005, 8]"] - 73["Segment
[5011, 5087, 8]"] - 74["Segment
[5093, 5127, 8]"] - 75["Segment
[5133, 5207, 8]"] - 76["Segment
[5213, 5247, 8]"] - 77["Segment
[5253, 5304, 8]"] - 78["Segment
[5310, 5372, 8]"] - 79["Segment
[5378, 5429, 8]"] - 80["Segment
[5435, 5469, 8]"] - 81["Segment
[5475, 5508, 8]"] - 82["Segment
[5514, 5547, 8]"] - 83["Segment
[5553, 5560, 8]"] + 21["Path
[4361, 4456, 8]"] + 60["Segment
[4462, 4495, 8]"] + 61["Segment
[4501, 4552, 8]"] + 62["Segment
[4558, 4591, 8]"] + 63["Segment
[4597, 4647, 8]"] + 64["Segment
[4653, 4694, 8]"] + 65["Segment
[4700, 4749, 8]"] + 66["Segment
[4755, 4788, 8]"] + 67["Segment
[4794, 4828, 8]"] + 68["Segment
[4834, 4868, 8]"] + 69["Segment
[4874, 4926, 8]"] + 70["Segment
[4932, 4966, 8]"] + 71["Segment
[4972, 5048, 8]"] + 72["Segment
[5054, 5087, 8]"] + 73["Segment
[5093, 5169, 8]"] + 74["Segment
[5175, 5209, 8]"] + 75["Segment
[5215, 5289, 8]"] + 76["Segment
[5295, 5329, 8]"] + 77["Segment
[5335, 5386, 8]"] + 78["Segment
[5392, 5454, 8]"] + 79["Segment
[5460, 5511, 8]"] + 80["Segment
[5517, 5551, 8]"] + 81["Segment
[5557, 5590, 8]"] + 82["Segment
[5596, 5629, 8]"] + 83["Segment
[5635, 5642, 8]"] 158[Solid2d] end subgraph path22 [Path] @@ -204,7 +204,7 @@ flowchart LR 3["Plane
[2084, 2101, 8]"] 4["Plane
[2860, 2883, 8]"] 5["Plane
[2860, 2883, 8]"] - 6["Plane
[4256, 4273, 8]"] + 6["Plane
[4338, 4355, 8]"] 7["Plane
[548, 565, 10]"] 8["Plane
[488, 505, 11]"] 9["Plane
[659, 685, 12]"] @@ -225,7 +225,7 @@ flowchart LR 177["Sweep Revolve
[2416, 2433, 8]"] 178["Sweep Extrusion
[3799, 3845, 8]"] 179["Sweep Extrusion
[3799, 3845, 8]"] - 180["Sweep Revolve
[5566, 5583, 8]"] + 180["Sweep Revolve
[5648, 5665, 8]"] 181["Sweep Extrusion
[631, 687, 10]"] 182["Sweep Extrusion
[881, 943, 10]"] 183["Sweep Extrusion
[1198, 1277, 10]"] diff --git a/rust/kcl-lib/tests/kcl_samples/color-cube/ast.snap b/rust/kcl-lib/tests/kcl_samples/color-cube/ast.snap index fe4e47391..d4f37a9bb 100644 --- a/rust/kcl-lib/tests/kcl_samples/color-cube/ast.snap +++ b/rust/kcl-lib/tests/kcl_samples/color-cube/ast.snap @@ -1636,29 +1636,49 @@ description: Result of parsing color-cube.kcl "expression": { "arguments": [ { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { + "type": "LabeledArg", + "label": { "commentStart": 0, "end": 0, - "name": "bluePlane", + "name": "profile", "start": 0, "type": "Identifier" }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" + "arg": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "bluePlane", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } }, { - "commentStart": 0, - "end": 0, - "raw": "'#0000FF'", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": "#0000FF" + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "color", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "end": 0, + "raw": "'#0000FF'", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": "#0000FF" + } } ], "callee": { @@ -1679,8 +1699,9 @@ description: Result of parsing color-cube.kcl "commentStart": 0, "end": 0, "start": 0, - "type": "CallExpression", - "type": "CallExpression" + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null }, "preComments": [ "", @@ -1697,29 +1718,49 @@ description: Result of parsing color-cube.kcl "expression": { "arguments": [ { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { + "type": "LabeledArg", + "label": { "commentStart": 0, "end": 0, - "name": "yellowPlane", + "name": "profile", "start": 0, "type": "Identifier" }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" + "arg": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "yellowPlane", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } }, { - "commentStart": 0, - "end": 0, - "raw": "'#FFFF00'", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": "#FFFF00" + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "color", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "end": 0, + "raw": "'#FFFF00'", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": "#FFFF00" + } } ], "callee": { @@ -1740,8 +1781,9 @@ description: Result of parsing color-cube.kcl "commentStart": 0, "end": 0, "start": 0, - "type": "CallExpression", - "type": "CallExpression" + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null }, "start": 0, "type": "ExpressionStatement", @@ -1753,29 +1795,49 @@ description: Result of parsing color-cube.kcl "expression": { "arguments": [ { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { + "type": "LabeledArg", + "label": { "commentStart": 0, "end": 0, - "name": "greenPlane", + "name": "profile", "start": 0, "type": "Identifier" }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" + "arg": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "greenPlane", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } }, { - "commentStart": 0, - "end": 0, - "raw": "'#00FF00'", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": "#00FF00" + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "color", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "end": 0, + "raw": "'#00FF00'", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": "#00FF00" + } } ], "callee": { @@ -1796,8 +1858,9 @@ description: Result of parsing color-cube.kcl "commentStart": 0, "end": 0, "start": 0, - "type": "CallExpression", - "type": "CallExpression" + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null }, "start": 0, "type": "ExpressionStatement", @@ -1809,29 +1872,49 @@ description: Result of parsing color-cube.kcl "expression": { "arguments": [ { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { + "type": "LabeledArg", + "label": { "commentStart": 0, "end": 0, - "name": "redPlane", + "name": "profile", "start": 0, "type": "Identifier" }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" + "arg": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "redPlane", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } }, { - "commentStart": 0, - "end": 0, - "raw": "'#FF0000'", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": "#FF0000" + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "color", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "end": 0, + "raw": "'#FF0000'", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": "#FF0000" + } } ], "callee": { @@ -1852,8 +1935,9 @@ description: Result of parsing color-cube.kcl "commentStart": 0, "end": 0, "start": 0, - "type": "CallExpression", - "type": "CallExpression" + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null }, "start": 0, "type": "ExpressionStatement", @@ -1865,29 +1949,49 @@ description: Result of parsing color-cube.kcl "expression": { "arguments": [ { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { + "type": "LabeledArg", + "label": { "commentStart": 0, "end": 0, - "name": "tealPlane", + "name": "profile", "start": 0, "type": "Identifier" }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" + "arg": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "tealPlane", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } }, { - "commentStart": 0, - "end": 0, - "raw": "'#00FFFF'", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": "#00FFFF" + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "color", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "end": 0, + "raw": "'#00FFFF'", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": "#00FFFF" + } } ], "callee": { @@ -1908,8 +2012,9 @@ description: Result of parsing color-cube.kcl "commentStart": 0, "end": 0, "start": 0, - "type": "CallExpression", - "type": "CallExpression" + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null }, "start": 0, "type": "ExpressionStatement", @@ -1921,29 +2026,49 @@ description: Result of parsing color-cube.kcl "expression": { "arguments": [ { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { + "type": "LabeledArg", + "label": { "commentStart": 0, "end": 0, - "name": "purplePlane", + "name": "profile", "start": 0, "type": "Identifier" }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" + "arg": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "purplePlane", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } }, { - "commentStart": 0, - "end": 0, - "raw": "'#FF00FF'", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": "#FF00FF" + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "color", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "end": 0, + "raw": "'#FF00FF'", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": "#FF00FF" + } } ], "callee": { @@ -1964,8 +2089,9 @@ description: Result of parsing color-cube.kcl "commentStart": 0, "end": 0, "start": 0, - "type": "CallExpression", - "type": "CallExpression" + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null }, "start": 0, "type": "ExpressionStatement", diff --git a/rust/kcl-lib/tests/kcl_samples/color-cube/ops.snap b/rust/kcl-lib/tests/kcl_samples/color-cube/ops.snap index 34ebf684e..1e1efa4bc 100644 --- a/rust/kcl-lib/tests/kcl_samples/color-cube/ops.snap +++ b/rust/kcl-lib/tests/kcl_samples/color-cube/ops.snap @@ -382,7 +382,22 @@ description: Operations executed color-cube.kcl "name": "sketchRectangle", "functionSourceRange": [], "unlabeledArg": null, - "labeledArgs": {} + "labeledArgs": { + "color": { + "value": { + "type": "String", + "value": "#0000FF" + }, + "sourceRange": [] + }, + "profile": { + "value": { + "type": "Plane", + "artifact_id": "[uuid]" + }, + "sourceRange": [] + } + } }, "sourceRange": [] }, @@ -393,7 +408,22 @@ description: Operations executed color-cube.kcl "name": "sketchRectangle", "functionSourceRange": [], "unlabeledArg": null, - "labeledArgs": {} + "labeledArgs": { + "color": { + "value": { + "type": "String", + "value": "#FFFF00" + }, + "sourceRange": [] + }, + "profile": { + "value": { + "type": "Plane", + "artifact_id": "[uuid]" + }, + "sourceRange": [] + } + } }, "sourceRange": [] }, @@ -404,7 +434,22 @@ description: Operations executed color-cube.kcl "name": "sketchRectangle", "functionSourceRange": [], "unlabeledArg": null, - "labeledArgs": {} + "labeledArgs": { + "color": { + "value": { + "type": "String", + "value": "#00FF00" + }, + "sourceRange": [] + }, + "profile": { + "value": { + "type": "Plane", + "artifact_id": "[uuid]" + }, + "sourceRange": [] + } + } }, "sourceRange": [] }, @@ -415,7 +460,22 @@ description: Operations executed color-cube.kcl "name": "sketchRectangle", "functionSourceRange": [], "unlabeledArg": null, - "labeledArgs": {} + "labeledArgs": { + "color": { + "value": { + "type": "String", + "value": "#FF0000" + }, + "sourceRange": [] + }, + "profile": { + "value": { + "type": "Plane", + "artifact_id": "[uuid]" + }, + "sourceRange": [] + } + } }, "sourceRange": [] }, @@ -426,7 +486,22 @@ description: Operations executed color-cube.kcl "name": "sketchRectangle", "functionSourceRange": [], "unlabeledArg": null, - "labeledArgs": {} + "labeledArgs": { + "color": { + "value": { + "type": "String", + "value": "#00FFFF" + }, + "sourceRange": [] + }, + "profile": { + "value": { + "type": "Plane", + "artifact_id": "[uuid]" + }, + "sourceRange": [] + } + } }, "sourceRange": [] }, @@ -437,7 +512,22 @@ description: Operations executed color-cube.kcl "name": "sketchRectangle", "functionSourceRange": [], "unlabeledArg": null, - "labeledArgs": {} + "labeledArgs": { + "color": { + "value": { + "type": "String", + "value": "#FF00FF" + }, + "sourceRange": [] + }, + "profile": { + "value": { + "type": "Plane", + "artifact_id": "[uuid]" + }, + "sourceRange": [] + } + } }, "sourceRange": [] }, diff --git a/rust/kcl-lib/tests/kcl_samples/cycloidal-gear/artifact_graph_flowchart.snap.md b/rust/kcl-lib/tests/kcl_samples/cycloidal-gear/artifact_graph_flowchart.snap.md index e83796570..f524cb9b5 100644 --- a/rust/kcl-lib/tests/kcl_samples/cycloidal-gear/artifact_graph_flowchart.snap.md +++ b/rust/kcl-lib/tests/kcl_samples/cycloidal-gear/artifact_graph_flowchart.snap.md @@ -1,54 +1,54 @@ ```mermaid flowchart LR subgraph path7 [Path] - 7["Path
[644, 834, 0]"] - 13["Segment
[844, 928, 0]"] - 16["Segment
[938, 990, 0]"] - 17["Segment
[1000, 1047, 0]"] - 19["Segment
[1057, 1109, 0]"] - 21["Segment
[1119, 1166, 0]"] - 23["Segment
[1176, 1241, 0]"] - 27["Segment
[1251, 1259, 0]"] + 7["Path
[645, 835, 0]"] + 13["Segment
[845, 929, 0]"] + 16["Segment
[939, 991, 0]"] + 17["Segment
[1001, 1048, 0]"] + 19["Segment
[1058, 1110, 0]"] + 21["Segment
[1120, 1167, 0]"] + 23["Segment
[1177, 1242, 0]"] + 27["Segment
[1252, 1260, 0]"] 31[Solid2d] end subgraph path8 [Path] - 8["Path
[644, 834, 0]"] - 26["Segment
[1251, 1259, 0]"] + 8["Path
[645, 835, 0]"] + 26["Segment
[1252, 1260, 0]"] 32[Solid2d] end subgraph path9 [Path] - 9["Path
[644, 834, 0]"] - 14["Segment
[844, 928, 0]"] - 15["Segment
[938, 990, 0]"] - 18["Segment
[1000, 1047, 0]"] - 20["Segment
[1057, 1109, 0]"] - 22["Segment
[1119, 1166, 0]"] - 24["Segment
[1176, 1241, 0]"] - 25["Segment
[1251, 1259, 0]"] + 9["Path
[645, 835, 0]"] + 14["Segment
[845, 929, 0]"] + 15["Segment
[939, 991, 0]"] + 18["Segment
[1001, 1048, 0]"] + 20["Segment
[1058, 1110, 0]"] + 22["Segment
[1120, 1167, 0]"] + 24["Segment
[1177, 1242, 0]"] + 25["Segment
[1252, 1260, 0]"] 36[Solid2d] end subgraph path10 [Path] - 10["Path
[1287, 1337, 0]"] - 29["Segment
[1287, 1337, 0]"] + 10["Path
[1288, 1338, 0]"] + 29["Segment
[1288, 1338, 0]"] 33[Solid2d] end subgraph path11 [Path] - 11["Path
[1287, 1337, 0]"] - 30["Segment
[1287, 1337, 0]"] + 11["Path
[1288, 1338, 0]"] + 30["Segment
[1288, 1338, 0]"] 34[Solid2d] end subgraph path12 [Path] - 12["Path
[1287, 1337, 0]"] - 28["Segment
[1287, 1337, 0]"] + 12["Path
[1288, 1338, 0]"] + 28["Segment
[1288, 1338, 0]"] 35[Solid2d] end - 1["Plane
[600, 633, 0]"] - 2["Plane
[600, 633, 0]"] - 3["Plane
[600, 633, 0]"] - 4["StartSketchOnPlane
[586, 634, 0]"] - 5["StartSketchOnPlane
[586, 634, 0]"] - 6["StartSketchOnPlane
[586, 634, 0]"] - 37["Sweep Loft
[1464, 1553, 0]"] + 1["Plane
[601, 634, 0]"] + 2["Plane
[601, 634, 0]"] + 3["Plane
[601, 634, 0]"] + 4["StartSketchOnPlane
[587, 635, 0]"] + 5["StartSketchOnPlane
[587, 635, 0]"] + 6["StartSketchOnPlane
[587, 635, 0]"] + 37["Sweep Loft
[1465, 1554, 0]"] 38[Wall] 39[Wall] 40[Wall] diff --git a/rust/kcl-lib/tests/kcl_samples/cycloidal-gear/ast.snap b/rust/kcl-lib/tests/kcl_samples/cycloidal-gear/ast.snap index f8d92cbb6..e476b1877 100644 --- a/rust/kcl-lib/tests/kcl_samples/cycloidal-gear/ast.snap +++ b/rust/kcl-lib/tests/kcl_samples/cycloidal-gear/ast.snap @@ -1436,7 +1436,8 @@ description: Result of parsing cycloidal-gear.kcl "name": "gHeight", "start": 0, "type": "Identifier" - } + }, + "labeled": false } ], "start": 0, @@ -1760,60 +1761,100 @@ description: Result of parsing cycloidal-gear.kcl "expression": { "arguments": [ { - "commentStart": 0, - "end": 0, - "raw": ".3", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 0.3, - "suffix": "None" - } - }, - { - "commentStart": 0, - "end": 0, - "raw": "1.5", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 1.5, - "suffix": "None" - } - }, - { - "commentStart": 0, - "end": 0, - "raw": "0.297", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 0.297, - "suffix": "None" - } - }, - { - "argument": { + "type": "LabeledArg", + "label": { "commentStart": 0, "end": 0, - "raw": "80", + "name": "gearPitch", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "end": 0, + "raw": ".3", "start": 0, "type": "Literal", "type": "Literal", "value": { - "value": 80.0, + "value": 0.3, "suffix": "None" } + } + }, + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "gearHeight", + "start": 0, + "type": "Identifier" }, - "commentStart": 0, - "end": 0, - "operator": "-", - "start": 0, - "type": "UnaryExpression", - "type": "UnaryExpression" + "arg": { + "commentStart": 0, + "end": 0, + "raw": "1.5", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 1.5, + "suffix": "None" + } + } + }, + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "holeDiameter", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "end": 0, + "raw": "0.297", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 0.297, + "suffix": "None" + } + } + }, + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "helixAngle", + "start": 0, + "type": "Identifier" + }, + "arg": { + "argument": { + "commentStart": 0, + "end": 0, + "raw": "80", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 80.0, + "suffix": "None" + } + }, + "commentStart": 0, + "end": 0, + "operator": "-", + "start": 0, + "type": "UnaryExpression", + "type": "UnaryExpression" + } } ], "callee": { @@ -1834,8 +1875,9 @@ description: Result of parsing cycloidal-gear.kcl "commentStart": 0, "end": 0, "start": 0, - "type": "CallExpression", - "type": "CallExpression" + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null }, "preComments": [ "", diff --git a/rust/kcl-lib/tests/kcl_samples/cycloidal-gear/ops.snap b/rust/kcl-lib/tests/kcl_samples/cycloidal-gear/ops.snap index 70a1f6793..720703856 100644 --- a/rust/kcl-lib/tests/kcl_samples/cycloidal-gear/ops.snap +++ b/rust/kcl-lib/tests/kcl_samples/cycloidal-gear/ops.snap @@ -419,7 +419,72 @@ description: Operations executed cycloidal-gear.kcl "name": "cycloidalGear", "functionSourceRange": [], "unlabeledArg": null, - "labeledArgs": {} + "labeledArgs": { + "gearHeight": { + "value": { + "type": "Number", + "value": 1.5, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "gearPitch": { + "value": { + "type": "Number", + "value": 0.3, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "helixAngle": { + "value": { + "type": "Number", + "value": -80.0, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "holeDiameter": { + "value": { + "type": "Number", + "value": 0.297, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + } + } }, "sourceRange": [] }, diff --git a/rust/kcl-lib/tests/kcl_samples/dodecahedron/artifact_graph_flowchart.snap.md b/rust/kcl-lib/tests/kcl_samples/dodecahedron/artifact_graph_flowchart.snap.md index b9cd50cee..295b778fe 100644 --- a/rust/kcl-lib/tests/kcl_samples/dodecahedron/artifact_graph_flowchart.snap.md +++ b/rust/kcl-lib/tests/kcl_samples/dodecahedron/artifact_graph_flowchart.snap.md @@ -1,136 +1,136 @@ ```mermaid flowchart LR subgraph path13 [Path] - 13["Path
[496, 547, 0]"] - 31["Segment
[555, 606, 0]"] - 38["Segment
[614, 664, 0]"] - 59["Segment
[672, 723, 0]"] - 67["Segment
[731, 738, 0]"] + 13["Path
[497, 548, 0]"] + 31["Segment
[556, 607, 0]"] + 38["Segment
[615, 665, 0]"] + 59["Segment
[673, 724, 0]"] + 67["Segment
[732, 739, 0]"] 73[Solid2d] end subgraph path14 [Path] - 14["Path
[496, 547, 0]"] - 27["Segment
[555, 606, 0]"] - 45["Segment
[614, 664, 0]"] - 50["Segment
[672, 723, 0]"] - 65["Segment
[731, 738, 0]"] + 14["Path
[497, 548, 0]"] + 27["Segment
[556, 607, 0]"] + 45["Segment
[615, 665, 0]"] + 50["Segment
[673, 724, 0]"] + 65["Segment
[732, 739, 0]"] 74[Solid2d] end subgraph path15 [Path] - 15["Path
[496, 547, 0]"] - 32["Segment
[555, 606, 0]"] - 48["Segment
[614, 664, 0]"] - 51["Segment
[672, 723, 0]"] - 71["Segment
[731, 738, 0]"] + 15["Path
[497, 548, 0]"] + 32["Segment
[556, 607, 0]"] + 48["Segment
[615, 665, 0]"] + 51["Segment
[673, 724, 0]"] + 71["Segment
[732, 739, 0]"] 75[Solid2d] end subgraph path16 [Path] - 16["Path
[496, 547, 0]"] - 29["Segment
[555, 606, 0]"] - 40["Segment
[614, 664, 0]"] - 56["Segment
[672, 723, 0]"] - 69["Segment
[731, 738, 0]"] + 16["Path
[497, 548, 0]"] + 29["Segment
[556, 607, 0]"] + 40["Segment
[615, 665, 0]"] + 56["Segment
[673, 724, 0]"] + 69["Segment
[732, 739, 0]"] 76[Solid2d] end subgraph path17 [Path] - 17["Path
[496, 547, 0]"] - 26["Segment
[555, 606, 0]"] - 44["Segment
[614, 664, 0]"] - 52["Segment
[672, 723, 0]"] - 63["Segment
[731, 738, 0]"] + 17["Path
[497, 548, 0]"] + 26["Segment
[556, 607, 0]"] + 44["Segment
[615, 665, 0]"] + 52["Segment
[673, 724, 0]"] + 63["Segment
[732, 739, 0]"] 77[Solid2d] end subgraph path18 [Path] - 18["Path
[496, 547, 0]"] - 28["Segment
[555, 606, 0]"] - 47["Segment
[614, 664, 0]"] - 58["Segment
[672, 723, 0]"] - 64["Segment
[731, 738, 0]"] + 18["Path
[497, 548, 0]"] + 28["Segment
[556, 607, 0]"] + 47["Segment
[615, 665, 0]"] + 58["Segment
[673, 724, 0]"] + 64["Segment
[732, 739, 0]"] 78[Solid2d] end subgraph path19 [Path] - 19["Path
[496, 547, 0]"] - 35["Segment
[555, 606, 0]"] - 41["Segment
[614, 664, 0]"] - 57["Segment
[672, 723, 0]"] - 66["Segment
[731, 738, 0]"] + 19["Path
[497, 548, 0]"] + 35["Segment
[556, 607, 0]"] + 41["Segment
[615, 665, 0]"] + 57["Segment
[673, 724, 0]"] + 66["Segment
[732, 739, 0]"] 79[Solid2d] end subgraph path20 [Path] - 20["Path
[496, 547, 0]"] - 34["Segment
[555, 606, 0]"] - 42["Segment
[614, 664, 0]"] - 55["Segment
[672, 723, 0]"] - 68["Segment
[731, 738, 0]"] + 20["Path
[497, 548, 0]"] + 34["Segment
[556, 607, 0]"] + 42["Segment
[615, 665, 0]"] + 55["Segment
[673, 724, 0]"] + 68["Segment
[732, 739, 0]"] 80[Solid2d] end subgraph path21 [Path] - 21["Path
[496, 547, 0]"] - 30["Segment
[555, 606, 0]"] - 39["Segment
[614, 664, 0]"] - 60["Segment
[672, 723, 0]"] - 70["Segment
[731, 738, 0]"] + 21["Path
[497, 548, 0]"] + 30["Segment
[556, 607, 0]"] + 39["Segment
[615, 665, 0]"] + 60["Segment
[673, 724, 0]"] + 70["Segment
[732, 739, 0]"] 81[Solid2d] end subgraph path22 [Path] - 22["Path
[496, 547, 0]"] - 25["Segment
[555, 606, 0]"] - 46["Segment
[614, 664, 0]"] - 54["Segment
[672, 723, 0]"] - 72["Segment
[731, 738, 0]"] + 22["Path
[497, 548, 0]"] + 25["Segment
[556, 607, 0]"] + 46["Segment
[615, 665, 0]"] + 54["Segment
[673, 724, 0]"] + 72["Segment
[732, 739, 0]"] 82[Solid2d] end subgraph path23 [Path] - 23["Path
[496, 547, 0]"] - 36["Segment
[555, 606, 0]"] - 37["Segment
[614, 664, 0]"] - 49["Segment
[672, 723, 0]"] - 62["Segment
[731, 738, 0]"] + 23["Path
[497, 548, 0]"] + 36["Segment
[556, 607, 0]"] + 37["Segment
[615, 665, 0]"] + 49["Segment
[673, 724, 0]"] + 62["Segment
[732, 739, 0]"] 83[Solid2d] end subgraph path24 [Path] - 24["Path
[496, 547, 0]"] - 33["Segment
[555, 606, 0]"] - 43["Segment
[614, 664, 0]"] - 53["Segment
[672, 723, 0]"] - 61["Segment
[731, 738, 0]"] + 24["Path
[497, 548, 0]"] + 33["Segment
[556, 607, 0]"] + 43["Segment
[615, 665, 0]"] + 53["Segment
[673, 724, 0]"] + 61["Segment
[732, 739, 0]"] 84[Solid2d] end - 1["Plane
[471, 488, 0]"] - 2["Plane
[471, 488, 0]"] - 3["Plane
[471, 488, 0]"] - 4["Plane
[471, 488, 0]"] - 5["Plane
[471, 488, 0]"] - 6["Plane
[471, 488, 0]"] - 7["Plane
[471, 488, 0]"] - 8["Plane
[471, 488, 0]"] - 9["Plane
[471, 488, 0]"] - 10["Plane
[471, 488, 0]"] - 11["Plane
[471, 488, 0]"] - 12["Plane
[471, 488, 0]"] - 85["Sweep Extrusion
[752, 802, 0]"] - 86["Sweep Extrusion
[752, 802, 0]"] - 87["Sweep Extrusion
[752, 802, 0]"] - 88["Sweep Extrusion
[752, 802, 0]"] - 89["Sweep Extrusion
[752, 802, 0]"] - 90["Sweep Extrusion
[752, 802, 0]"] - 91["Sweep Extrusion
[752, 802, 0]"] - 92["Sweep Extrusion
[752, 802, 0]"] - 93["Sweep Extrusion
[752, 802, 0]"] - 94["Sweep Extrusion
[752, 802, 0]"] - 95["Sweep Extrusion
[752, 802, 0]"] - 96["Sweep Extrusion
[752, 802, 0]"] - 97["CompositeSolid Intersect
[1997, 2027, 0]"] - 98["CompositeSolid Intersect
[1997, 2027, 0]"] - 99["CompositeSolid Intersect
[1997, 2027, 0]"] - 100["CompositeSolid Intersect
[1997, 2027, 0]"] - 101["CompositeSolid Intersect
[1997, 2027, 0]"] - 102["CompositeSolid Intersect
[1997, 2027, 0]"] - 103["CompositeSolid Intersect
[1997, 2027, 0]"] - 104["CompositeSolid Intersect
[1997, 2027, 0]"] - 105["CompositeSolid Intersect
[1997, 2027, 0]"] - 106["CompositeSolid Intersect
[1997, 2027, 0]"] - 107["CompositeSolid Intersect
[1997, 2027, 0]"] + 1["Plane
[472, 489, 0]"] + 2["Plane
[472, 489, 0]"] + 3["Plane
[472, 489, 0]"] + 4["Plane
[472, 489, 0]"] + 5["Plane
[472, 489, 0]"] + 6["Plane
[472, 489, 0]"] + 7["Plane
[472, 489, 0]"] + 8["Plane
[472, 489, 0]"] + 9["Plane
[472, 489, 0]"] + 10["Plane
[472, 489, 0]"] + 11["Plane
[472, 489, 0]"] + 12["Plane
[472, 489, 0]"] + 85["Sweep Extrusion
[753, 803, 0]"] + 86["Sweep Extrusion
[753, 803, 0]"] + 87["Sweep Extrusion
[753, 803, 0]"] + 88["Sweep Extrusion
[753, 803, 0]"] + 89["Sweep Extrusion
[753, 803, 0]"] + 90["Sweep Extrusion
[753, 803, 0]"] + 91["Sweep Extrusion
[753, 803, 0]"] + 92["Sweep Extrusion
[753, 803, 0]"] + 93["Sweep Extrusion
[753, 803, 0]"] + 94["Sweep Extrusion
[753, 803, 0]"] + 95["Sweep Extrusion
[753, 803, 0]"] + 96["Sweep Extrusion
[753, 803, 0]"] + 97["CompositeSolid Intersect
[2000, 2030, 0]"] + 98["CompositeSolid Intersect
[2000, 2030, 0]"] + 99["CompositeSolid Intersect
[2000, 2030, 0]"] + 100["CompositeSolid Intersect
[2000, 2030, 0]"] + 101["CompositeSolid Intersect
[2000, 2030, 0]"] + 102["CompositeSolid Intersect
[2000, 2030, 0]"] + 103["CompositeSolid Intersect
[2000, 2030, 0]"] + 104["CompositeSolid Intersect
[2000, 2030, 0]"] + 105["CompositeSolid Intersect
[2000, 2030, 0]"] + 106["CompositeSolid Intersect
[2000, 2030, 0]"] + 107["CompositeSolid Intersect
[2000, 2030, 0]"] 108[Wall] 109[Wall] 110[Wall] diff --git a/rust/kcl-lib/tests/kcl_samples/dodecahedron/ast.snap b/rust/kcl-lib/tests/kcl_samples/dodecahedron/ast.snap index 58b8b5562..af524641d 100644 --- a/rust/kcl-lib/tests/kcl_samples/dodecahedron/ast.snap +++ b/rust/kcl-lib/tests/kcl_samples/dodecahedron/ast.snap @@ -943,7 +943,8 @@ description: Result of parsing dodecahedron.kcl "name": "dither", "start": 0, "type": "Identifier" - } + }, + "labeled": false } ], "start": 0, @@ -2501,7 +2502,8 @@ description: Result of parsing dodecahedron.kcl "name": "arr", "start": 0, "type": "Identifier" - } + }, + "labeled": false } ], "start": 0, @@ -2963,7 +2965,8 @@ description: Result of parsing dodecahedron.kcl "name": "solids", "start": 0, "type": "Identifier" - } + }, + "labeled": false } ], "start": 0, diff --git a/rust/kcl-lib/tests/kcl_samples/enclosure/artifact_graph_flowchart.snap.md b/rust/kcl-lib/tests/kcl_samples/enclosure/artifact_graph_flowchart.snap.md index cb12580a7..c55bad230 100644 --- a/rust/kcl-lib/tests/kcl_samples/enclosure/artifact_graph_flowchart.snap.md +++ b/rust/kcl-lib/tests/kcl_samples/enclosure/artifact_graph_flowchart.snap.md @@ -10,117 +10,117 @@ flowchart LR 67[Solid2d] end subgraph path9 [Path] - 9["Path
[1597, 1680, 0]"] - 33["Segment
[1597, 1680, 0]"] + 9["Path
[1598, 1681, 0]"] + 33["Segment
[1598, 1681, 0]"] 59[Solid2d] end subgraph path10 [Path] - 10["Path
[1597, 1680, 0]"] - 32["Segment
[1597, 1680, 0]"] + 10["Path
[1598, 1681, 0]"] + 32["Segment
[1598, 1681, 0]"] 60[Solid2d] end subgraph path11 [Path] - 11["Path
[1597, 1680, 0]"] - 34["Segment
[1597, 1680, 0]"] + 11["Path
[1598, 1681, 0]"] + 34["Segment
[1598, 1681, 0]"] 66[Solid2d] end subgraph path12 [Path] - 12["Path
[1597, 1680, 0]"] - 35["Segment
[1597, 1680, 0]"] + 12["Path
[1598, 1681, 0]"] + 35["Segment
[1598, 1681, 0]"] 75[Solid2d] end subgraph path13 [Path] - 13["Path
[1706, 1773, 0]"] - 37["Segment
[1706, 1773, 0]"] + 13["Path
[1707, 1774, 0]"] + 37["Segment
[1707, 1774, 0]"] 62[Solid2d] end subgraph path14 [Path] - 14["Path
[1706, 1773, 0]"] - 36["Segment
[1706, 1773, 0]"] + 14["Path
[1707, 1774, 0]"] + 36["Segment
[1707, 1774, 0]"] 70[Solid2d] end subgraph path15 [Path] - 15["Path
[1706, 1773, 0]"] - 39["Segment
[1706, 1773, 0]"] + 15["Path
[1707, 1774, 0]"] + 39["Segment
[1707, 1774, 0]"] 72[Solid2d] end subgraph path16 [Path] - 16["Path
[1706, 1773, 0]"] - 38["Segment
[1706, 1773, 0]"] + 16["Path
[1707, 1774, 0]"] + 38["Segment
[1707, 1774, 0]"] 73[Solid2d] end subgraph path17 [Path] - 17["Path
[2341, 2376, 0]"] - 40["Segment
[2382, 2448, 0]"] - 41["Segment
[2454, 2553, 0]"] - 42["Segment
[2559, 2676, 0]"] - 43["Segment
[2682, 2767, 0]"] - 44["Segment
[2773, 2780, 0]"] + 17["Path
[2342, 2377, 0]"] + 40["Segment
[2383, 2449, 0]"] + 41["Segment
[2455, 2554, 0]"] + 42["Segment
[2560, 2677, 0]"] + 43["Segment
[2683, 2768, 0]"] + 44["Segment
[2774, 2781, 0]"] 63[Solid2d] end subgraph path18 [Path] - 18["Path
[2804, 2960, 0]"] - 45["Segment
[2804, 2960, 0]"] + 18["Path
[2805, 2961, 0]"] + 45["Segment
[2805, 2961, 0]"] 74[Solid2d] end subgraph path19 [Path] - 19["Path
[2985, 3152, 0]"] - 46["Segment
[2985, 3152, 0]"] + 19["Path
[2986, 3153, 0]"] + 46["Segment
[2986, 3153, 0]"] 76[Solid2d] end subgraph path20 [Path] - 20["Path
[3177, 3335, 0]"] - 47["Segment
[3177, 3335, 0]"] + 20["Path
[3178, 3336, 0]"] + 47["Segment
[3178, 3336, 0]"] 64[Solid2d] end subgraph path21 [Path] - 21["Path
[3360, 3529, 0]"] - 48["Segment
[3360, 3529, 0]"] + 21["Path
[3361, 3530, 0]"] + 48["Segment
[3361, 3530, 0]"] 61[Solid2d] end subgraph path22 [Path] - 22["Path
[3972, 4056, 0]"] - 49["Segment
[4062, 4150, 0]"] - 50["Segment
[4156, 4277, 0]"] - 51["Segment
[4283, 4400, 0]"] - 52["Segment
[4406, 4491, 0]"] - 53["Segment
[4497, 4504, 0]"] + 22["Path
[3973, 4057, 0]"] + 49["Segment
[4063, 4151, 0]"] + 50["Segment
[4157, 4278, 0]"] + 51["Segment
[4284, 4401, 0]"] + 52["Segment
[4407, 4492, 0]"] + 53["Segment
[4498, 4505, 0]"] 65[Solid2d] end subgraph path23 [Path] - 23["Path
[4528, 4700, 0]"] - 54["Segment
[4528, 4700, 0]"] + 23["Path
[4529, 4701, 0]"] + 54["Segment
[4529, 4701, 0]"] 58[Solid2d] end subgraph path24 [Path] - 24["Path
[4725, 4908, 0]"] - 55["Segment
[4725, 4908, 0]"] + 24["Path
[4726, 4909, 0]"] + 55["Segment
[4726, 4909, 0]"] 71[Solid2d] end subgraph path25 [Path] - 25["Path
[4933, 5107, 0]"] - 56["Segment
[4933, 5107, 0]"] + 25["Path
[4934, 5108, 0]"] + 56["Segment
[4934, 5108, 0]"] 68[Solid2d] end subgraph path26 [Path] - 26["Path
[5132, 5317, 0]"] - 57["Segment
[5132, 5317, 0]"] + 26["Path
[5133, 5318, 0]"] + 57["Segment
[5133, 5318, 0]"] 69[Solid2d] end 1["Plane
[264, 281, 0]"] - 2["Plane
[1566, 1589, 0]"] - 3["Plane
[1566, 1589, 0]"] - 4["Plane
[1566, 1589, 0]"] - 5["Plane
[1566, 1589, 0]"] - 6["Plane
[2318, 2335, 0]"] - 7["StartSketchOnFace
[3929, 3966, 0]"] + 2["Plane
[1567, 1590, 0]"] + 3["Plane
[1567, 1590, 0]"] + 4["Plane
[1567, 1590, 0]"] + 5["Plane
[1567, 1590, 0]"] + 6["Plane
[2319, 2336, 0]"] + 7["StartSketchOnFace
[3930, 3967, 0]"] 77["Sweep Extrusion
[730, 765, 0]"] - 78["Sweep Extrusion
[1790, 1841, 0]"] - 79["Sweep Extrusion
[1790, 1841, 0]"] - 80["Sweep Extrusion
[1790, 1841, 0]"] - 81["Sweep Extrusion
[1790, 1841, 0]"] - 82["Sweep Extrusion
[3544, 3586, 0]"] - 83["Sweep Extrusion
[5332, 5374, 0]"] + 78["Sweep Extrusion
[1791, 1842, 0]"] + 79["Sweep Extrusion
[1791, 1842, 0]"] + 80["Sweep Extrusion
[1791, 1842, 0]"] + 81["Sweep Extrusion
[1791, 1842, 0]"] + 82["Sweep Extrusion
[3545, 3587, 0]"] + 83["Sweep Extrusion
[5333, 5375, 0]"] 84[Wall] 85[Wall] 86[Wall] @@ -187,14 +187,14 @@ flowchart LR 147["EdgeCut Fillet
[771, 1053, 0]"] 148["EdgeCut Fillet
[771, 1053, 0]"] 149["EdgeCut Fillet
[771, 1053, 0]"] - 150["EdgeCut Fillet
[3592, 3874, 0]"] - 151["EdgeCut Fillet
[3592, 3874, 0]"] - 152["EdgeCut Fillet
[3592, 3874, 0]"] - 153["EdgeCut Fillet
[3592, 3874, 0]"] - 154["EdgeCut Fillet
[5380, 5662, 0]"] - 155["EdgeCut Fillet
[5380, 5662, 0]"] - 156["EdgeCut Fillet
[5380, 5662, 0]"] - 157["EdgeCut Fillet
[5380, 5662, 0]"] + 150["EdgeCut Fillet
[3593, 3875, 0]"] + 151["EdgeCut Fillet
[3593, 3875, 0]"] + 152["EdgeCut Fillet
[3593, 3875, 0]"] + 153["EdgeCut Fillet
[3593, 3875, 0]"] + 154["EdgeCut Fillet
[5381, 5663, 0]"] + 155["EdgeCut Fillet
[5381, 5663, 0]"] + 156["EdgeCut Fillet
[5381, 5663, 0]"] + 157["EdgeCut Fillet
[5381, 5663, 0]"] 1 --- 8 2 --- 9 2 --- 14 diff --git a/rust/kcl-lib/tests/kcl_samples/enclosure/ast.snap b/rust/kcl-lib/tests/kcl_samples/enclosure/ast.snap index ca6cbd65a..3c4839dd4 100644 --- a/rust/kcl-lib/tests/kcl_samples/enclosure/ast.snap +++ b/rust/kcl-lib/tests/kcl_samples/enclosure/ast.snap @@ -2143,7 +2143,8 @@ description: Result of parsing enclosure.kcl "name": "originStart", "start": 0, "type": "Identifier" - } + }, + "labeled": false } ], "start": 0, diff --git a/rust/kcl-lib/tests/kcl_samples/enclosure/program_memory.snap b/rust/kcl-lib/tests/kcl_samples/enclosure/program_memory.snap index 3cb92e862..a5da9d76e 100644 --- a/rust/kcl-lib/tests/kcl_samples/enclosure/program_memory.snap +++ b/rust/kcl-lib/tests/kcl_samples/enclosure/program_memory.snap @@ -354,9 +354,9 @@ description: Variables in memory after executing enclosure.kcl "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 2426, - "end": 2447, - "start": 2426, + "commentStart": 2427, + "end": 2448, + "start": 2427, "type": "TagDeclarator", "value": "rectangleSegmentA002" }, @@ -367,9 +367,9 @@ description: Variables in memory after executing enclosure.kcl "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 2531, - "end": 2552, - "start": 2531, + "commentStart": 2532, + "end": 2553, + "start": 2532, "type": "TagDeclarator", "value": "rectangleSegmentB002" }, @@ -380,9 +380,9 @@ description: Variables in memory after executing enclosure.kcl "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 2654, - "end": 2675, - "start": 2654, + "commentStart": 2655, + "end": 2676, + "start": 2655, "type": "TagDeclarator", "value": "rectangleSegmentC002" }, @@ -393,9 +393,9 @@ description: Variables in memory after executing enclosure.kcl "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 2745, - "end": 2766, - "start": 2745, + "commentStart": 2746, + "end": 2767, + "start": 2746, "type": "TagDeclarator", "value": "rectangleSegmentD002" }, @@ -416,9 +416,9 @@ description: Variables in memory after executing enclosure.kcl 0.0 ], "tag": { - "commentStart": 2426, - "end": 2447, - "start": 2426, + "commentStart": 2427, + "end": 2448, + "start": 2427, "type": "TagDeclarator", "value": "rectangleSegmentA002" }, @@ -441,9 +441,9 @@ description: Variables in memory after executing enclosure.kcl 0.0 ], "tag": { - "commentStart": 2531, - "end": 2552, - "start": 2531, + "commentStart": 2532, + "end": 2553, + "start": 2532, "type": "TagDeclarator", "value": "rectangleSegmentB002" }, @@ -466,9 +466,9 @@ description: Variables in memory after executing enclosure.kcl 175.0 ], "tag": { - "commentStart": 2654, - "end": 2675, - "start": 2654, + "commentStart": 2655, + "end": 2676, + "start": 2655, "type": "TagDeclarator", "value": "rectangleSegmentC002" }, @@ -491,9 +491,9 @@ description: Variables in memory after executing enclosure.kcl 175.0 ], "tag": { - "commentStart": 2745, - "end": 2766, - "start": 2745, + "commentStart": 2746, + "end": 2767, + "start": 2746, "type": "TagDeclarator", "value": "rectangleSegmentD002" }, @@ -693,9 +693,9 @@ description: Variables in memory after executing enclosure.kcl "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 4128, - "end": 4149, - "start": 4128, + "commentStart": 4129, + "end": 4150, + "start": 4129, "type": "TagDeclarator", "value": "rectangleSegmentA003" }, @@ -706,9 +706,9 @@ description: Variables in memory after executing enclosure.kcl "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 4255, - "end": 4276, - "start": 4255, + "commentStart": 4256, + "end": 4277, + "start": 4256, "type": "TagDeclarator", "value": "rectangleSegmentB003" }, @@ -719,9 +719,9 @@ description: Variables in memory after executing enclosure.kcl "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 4378, - "end": 4399, - "start": 4378, + "commentStart": 4379, + "end": 4400, + "start": 4379, "type": "TagDeclarator", "value": "rectangleSegmentC003" }, @@ -732,9 +732,9 @@ description: Variables in memory after executing enclosure.kcl "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 4469, - "end": 4490, - "start": 4469, + "commentStart": 4470, + "end": 4491, + "start": 4470, "type": "TagDeclarator", "value": "rectangleSegmentD003" }, @@ -755,9 +755,9 @@ description: Variables in memory after executing enclosure.kcl 3.0 ], "tag": { - "commentStart": 4128, - "end": 4149, - "start": 4128, + "commentStart": 4129, + "end": 4150, + "start": 4129, "type": "TagDeclarator", "value": "rectangleSegmentA003" }, @@ -780,9 +780,9 @@ description: Variables in memory after executing enclosure.kcl 3.0 ], "tag": { - "commentStart": 4255, - "end": 4276, - "start": 4255, + "commentStart": 4256, + "end": 4277, + "start": 4256, "type": "TagDeclarator", "value": "rectangleSegmentB003" }, @@ -805,9 +805,9 @@ description: Variables in memory after executing enclosure.kcl 172.0 ], "tag": { - "commentStart": 4378, - "end": 4399, - "start": 4378, + "commentStart": 4379, + "end": 4400, + "start": 4379, "type": "TagDeclarator", "value": "rectangleSegmentC003" }, @@ -830,9 +830,9 @@ description: Variables in memory after executing enclosure.kcl 172.0 ], "tag": { - "commentStart": 4469, - "end": 4490, - "start": 4469, + "commentStart": 4470, + "end": 4491, + "start": 4470, "type": "TagDeclarator", "value": "rectangleSegmentD003" }, @@ -896,9 +896,9 @@ description: Variables in memory after executing enclosure.kcl "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 2426, - "end": 2447, - "start": 2426, + "commentStart": 2427, + "end": 2448, + "start": 2427, "type": "TagDeclarator", "value": "rectangleSegmentA002" }, @@ -909,9 +909,9 @@ description: Variables in memory after executing enclosure.kcl "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 2531, - "end": 2552, - "start": 2531, + "commentStart": 2532, + "end": 2553, + "start": 2532, "type": "TagDeclarator", "value": "rectangleSegmentB002" }, @@ -922,9 +922,9 @@ description: Variables in memory after executing enclosure.kcl "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 2654, - "end": 2675, - "start": 2654, + "commentStart": 2655, + "end": 2676, + "start": 2655, "type": "TagDeclarator", "value": "rectangleSegmentC002" }, @@ -935,9 +935,9 @@ description: Variables in memory after executing enclosure.kcl "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 2745, - "end": 2766, - "start": 2745, + "commentStart": 2746, + "end": 2767, + "start": 2746, "type": "TagDeclarator", "value": "rectangleSegmentD002" }, @@ -958,9 +958,9 @@ description: Variables in memory after executing enclosure.kcl 0.0 ], "tag": { - "commentStart": 2426, - "end": 2447, - "start": 2426, + "commentStart": 2427, + "end": 2448, + "start": 2427, "type": "TagDeclarator", "value": "rectangleSegmentA002" }, @@ -983,9 +983,9 @@ description: Variables in memory after executing enclosure.kcl 0.0 ], "tag": { - "commentStart": 2531, - "end": 2552, - "start": 2531, + "commentStart": 2532, + "end": 2553, + "start": 2532, "type": "TagDeclarator", "value": "rectangleSegmentB002" }, @@ -1008,9 +1008,9 @@ description: Variables in memory after executing enclosure.kcl 175.0 ], "tag": { - "commentStart": 2654, - "end": 2675, - "start": 2654, + "commentStart": 2655, + "end": 2676, + "start": 2655, "type": "TagDeclarator", "value": "rectangleSegmentC002" }, @@ -1033,9 +1033,9 @@ description: Variables in memory after executing enclosure.kcl 175.0 ], "tag": { - "commentStart": 2745, - "end": 2766, - "start": 2745, + "commentStart": 2746, + "end": 2767, + "start": 2746, "type": "TagDeclarator", "value": "rectangleSegmentD002" }, @@ -1668,9 +1668,9 @@ description: Variables in memory after executing enclosure.kcl 0.0 ], "tag": { - "commentStart": 2426, - "end": 2447, - "start": 2426, + "commentStart": 2427, + "end": 2448, + "start": 2427, "type": "TagDeclarator", "value": "rectangleSegmentA002" }, @@ -1693,9 +1693,9 @@ description: Variables in memory after executing enclosure.kcl 0.0 ], "tag": { - "commentStart": 2531, - "end": 2552, - "start": 2531, + "commentStart": 2532, + "end": 2553, + "start": 2532, "type": "TagDeclarator", "value": "rectangleSegmentB002" }, @@ -1718,9 +1718,9 @@ description: Variables in memory after executing enclosure.kcl 175.0 ], "tag": { - "commentStart": 2654, - "end": 2675, - "start": 2654, + "commentStart": 2655, + "end": 2676, + "start": 2655, "type": "TagDeclarator", "value": "rectangleSegmentC002" }, @@ -1743,9 +1743,9 @@ description: Variables in memory after executing enclosure.kcl 175.0 ], "tag": { - "commentStart": 2745, - "end": 2766, - "start": 2745, + "commentStart": 2746, + "end": 2767, + "start": 2746, "type": "TagDeclarator", "value": "rectangleSegmentD002" }, @@ -1867,9 +1867,9 @@ description: Variables in memory after executing enclosure.kcl 3.0 ], "tag": { - "commentStart": 4128, - "end": 4149, - "start": 4128, + "commentStart": 4129, + "end": 4150, + "start": 4129, "type": "TagDeclarator", "value": "rectangleSegmentA003" }, @@ -1892,9 +1892,9 @@ description: Variables in memory after executing enclosure.kcl 3.0 ], "tag": { - "commentStart": 4255, - "end": 4276, - "start": 4255, + "commentStart": 4256, + "end": 4277, + "start": 4256, "type": "TagDeclarator", "value": "rectangleSegmentB003" }, @@ -1917,9 +1917,9 @@ description: Variables in memory after executing enclosure.kcl 172.0 ], "tag": { - "commentStart": 4378, - "end": 4399, - "start": 4378, + "commentStart": 4379, + "end": 4400, + "start": 4379, "type": "TagDeclarator", "value": "rectangleSegmentC003" }, @@ -1942,9 +1942,9 @@ description: Variables in memory after executing enclosure.kcl 172.0 ], "tag": { - "commentStart": 4469, - "end": 4490, - "start": 4469, + "commentStart": 4470, + "end": 4491, + "start": 4470, "type": "TagDeclarator", "value": "rectangleSegmentD003" }, @@ -2008,9 +2008,9 @@ description: Variables in memory after executing enclosure.kcl "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 2426, - "end": 2447, - "start": 2426, + "commentStart": 2427, + "end": 2448, + "start": 2427, "type": "TagDeclarator", "value": "rectangleSegmentA002" }, @@ -2021,9 +2021,9 @@ description: Variables in memory after executing enclosure.kcl "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 2531, - "end": 2552, - "start": 2531, + "commentStart": 2532, + "end": 2553, + "start": 2532, "type": "TagDeclarator", "value": "rectangleSegmentB002" }, @@ -2034,9 +2034,9 @@ description: Variables in memory after executing enclosure.kcl "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 2654, - "end": 2675, - "start": 2654, + "commentStart": 2655, + "end": 2676, + "start": 2655, "type": "TagDeclarator", "value": "rectangleSegmentC002" }, @@ -2047,9 +2047,9 @@ description: Variables in memory after executing enclosure.kcl "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 2745, - "end": 2766, - "start": 2745, + "commentStart": 2746, + "end": 2767, + "start": 2746, "type": "TagDeclarator", "value": "rectangleSegmentD002" }, @@ -2070,9 +2070,9 @@ description: Variables in memory after executing enclosure.kcl 0.0 ], "tag": { - "commentStart": 2426, - "end": 2447, - "start": 2426, + "commentStart": 2427, + "end": 2448, + "start": 2427, "type": "TagDeclarator", "value": "rectangleSegmentA002" }, @@ -2095,9 +2095,9 @@ description: Variables in memory after executing enclosure.kcl 0.0 ], "tag": { - "commentStart": 2531, - "end": 2552, - "start": 2531, + "commentStart": 2532, + "end": 2553, + "start": 2532, "type": "TagDeclarator", "value": "rectangleSegmentB002" }, @@ -2120,9 +2120,9 @@ description: Variables in memory after executing enclosure.kcl 175.0 ], "tag": { - "commentStart": 2654, - "end": 2675, - "start": 2654, + "commentStart": 2655, + "end": 2676, + "start": 2655, "type": "TagDeclarator", "value": "rectangleSegmentC002" }, @@ -2145,9 +2145,9 @@ description: Variables in memory after executing enclosure.kcl 175.0 ], "tag": { - "commentStart": 2745, - "end": 2766, - "start": 2745, + "commentStart": 2746, + "end": 2767, + "start": 2746, "type": "TagDeclarator", "value": "rectangleSegmentD002" }, diff --git a/rust/kcl-lib/tests/kcl_samples/exhaust-manifold/artifact_graph_flowchart.snap.md b/rust/kcl-lib/tests/kcl_samples/exhaust-manifold/artifact_graph_flowchart.snap.md index e9badc19a..e21d5f637 100644 --- a/rust/kcl-lib/tests/kcl_samples/exhaust-manifold/artifact_graph_flowchart.snap.md +++ b/rust/kcl-lib/tests/kcl_samples/exhaust-manifold/artifact_graph_flowchart.snap.md @@ -73,64 +73,64 @@ flowchart LR 100[Solid2d] end subgraph path22 [Path] - 22["Path
[1667, 1702, 0]"] - 59["Segment
[1708, 1742, 0]"] - 60["Segment
[1748, 1787, 0]"] - 61["Segment
[1793, 1831, 0]"] - 62["Segment
[1837, 1876, 0]"] - 63["Segment
[1882, 1916, 0]"] - 64["Segment
[1922, 1965, 0]"] - 65["Segment
[1971, 2004, 0]"] - 66["Segment
[2010, 2049, 0]"] - 67["Segment
[2055, 2094, 0]"] - 68["Segment
[2100, 2139, 0]"] - 69["Segment
[2145, 2188, 0]"] - 70["Segment
[2194, 2245, 0]"] - 71["Segment
[2251, 2295, 0]"] - 72["Segment
[2301, 2340, 0]"] - 73["Segment
[2346, 2384, 0]"] - 74["Segment
[2390, 2455, 0]"] - 75["Segment
[2461, 2468, 0]"] + 22["Path
[1923, 1958, 0]"] + 59["Segment
[1964, 1998, 0]"] + 60["Segment
[2004, 2043, 0]"] + 61["Segment
[2049, 2087, 0]"] + 62["Segment
[2093, 2132, 0]"] + 63["Segment
[2138, 2172, 0]"] + 64["Segment
[2178, 2221, 0]"] + 65["Segment
[2227, 2260, 0]"] + 66["Segment
[2266, 2305, 0]"] + 67["Segment
[2311, 2350, 0]"] + 68["Segment
[2356, 2395, 0]"] + 69["Segment
[2401, 2444, 0]"] + 70["Segment
[2450, 2501, 0]"] + 71["Segment
[2507, 2551, 0]"] + 72["Segment
[2557, 2596, 0]"] + 73["Segment
[2602, 2640, 0]"] + 74["Segment
[2646, 2711, 0]"] + 75["Segment
[2717, 2724, 0]"] 96[Solid2d] end subgraph path23 [Path] - 23["Path
[2553, 2626, 0]"] - 76["Segment
[2553, 2626, 0]"] + 23["Path
[2809, 2882, 0]"] + 76["Segment
[2809, 2882, 0]"] 86[Solid2d] end subgraph path24 [Path] - 24["Path
[2651, 2724, 0]"] - 77["Segment
[2651, 2724, 0]"] + 24["Path
[2907, 2980, 0]"] + 77["Segment
[2907, 2980, 0]"] 98[Solid2d] end subgraph path25 [Path] - 25["Path
[2749, 2822, 0]"] - 78["Segment
[2749, 2822, 0]"] + 25["Path
[3005, 3078, 0]"] + 78["Segment
[3005, 3078, 0]"] 85[Solid2d] end subgraph path26 [Path] - 26["Path
[2847, 2920, 0]"] - 79["Segment
[2847, 2920, 0]"] + 26["Path
[3103, 3176, 0]"] + 79["Segment
[3103, 3176, 0]"] 94[Solid2d] end subgraph path27 [Path] - 27["Path
[2984, 3123, 0]"] - 80["Segment
[2984, 3123, 0]"] + 27["Path
[3240, 3379, 0]"] + 80["Segment
[3240, 3379, 0]"] 87[Solid2d] end subgraph path28 [Path] - 28["Path
[3148, 3285, 0]"] - 81["Segment
[3148, 3285, 0]"] + 28["Path
[3404, 3541, 0]"] + 81["Segment
[3404, 3541, 0]"] 99[Solid2d] end subgraph path29 [Path] - 29["Path
[3310, 3457, 0]"] - 82["Segment
[3310, 3457, 0]"] + 29["Path
[3566, 3713, 0]"] + 82["Segment
[3566, 3713, 0]"] 90[Solid2d] end subgraph path30 [Path] - 30["Path
[3482, 3628, 0]"] - 83["Segment
[3482, 3628, 0]"] + 30["Path
[3738, 3884, 0]"] + 83["Segment
[3738, 3884, 0]"] 97[Solid2d] end 1["Plane
[702, 727, 0]"] @@ -141,12 +141,12 @@ flowchart LR 6["Plane
[1152, 1169, 0]"] 7["Plane
[1152, 1169, 0]"] 8["Plane
[1152, 1169, 0]"] - 9["Plane
[1644, 1661, 0]"] + 9["Plane
[1900, 1917, 0]"] 101["Sweep Sweep
[1352, 1375, 0]"] 102["Sweep Sweep
[1352, 1375, 0]"] 103["Sweep Sweep
[1352, 1375, 0]"] 104["Sweep Sweep
[1352, 1375, 0]"] - 105["Sweep Extrusion
[3681, 3710, 0]"] + 105["Sweep Extrusion
[3937, 3966, 0]"] 106[Wall] 107[Wall] 108[Wall] @@ -217,10 +217,10 @@ flowchart LR 173["SweepEdge Adjacent"] 174["SweepEdge Adjacent"] 175["SweepEdge Adjacent"] - 176["EdgeCut Fillet
[3716, 3850, 0]"] - 177["EdgeCut Fillet
[3716, 3850, 0]"] - 178["EdgeCut Fillet
[3856, 3990, 0]"] - 179["EdgeCut Fillet
[3856, 3990, 0]"] + 176["EdgeCut Fillet
[3972, 4106, 0]"] + 177["EdgeCut Fillet
[3972, 4106, 0]"] + 178["EdgeCut Fillet
[4112, 4246, 0]"] + 179["EdgeCut Fillet
[4112, 4246, 0]"] 1 --- 11 2 --- 10 3 --- 13 diff --git a/rust/kcl-lib/tests/kcl_samples/exhaust-manifold/ast.snap b/rust/kcl-lib/tests/kcl_samples/exhaust-manifold/ast.snap index 294891695..41a010275 100644 --- a/rust/kcl-lib/tests/kcl_samples/exhaust-manifold/ast.snap +++ b/rust/kcl-lib/tests/kcl_samples/exhaust-manifold/ast.snap @@ -1717,63 +1717,113 @@ description: Result of parsing exhaust-manifold.kcl "expression": { "arguments": [ { - "commentStart": 0, - "end": 0, - "raw": "0", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 0.0, - "suffix": "None" + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "n", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "end": 0, + "raw": "0", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 0.0, + "suffix": "None" + } } }, { - "commentStart": 0, - "end": 0, - "raw": "0", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 0.0, - "suffix": "None" + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "angle001", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "end": 0, + "raw": "0", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 0.0, + "suffix": "None" + } } }, { - "commentStart": 0, - "end": 0, - "raw": "3", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 3.0, - "suffix": "None" + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "length001", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "end": 0, + "raw": "3", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 3.0, + "suffix": "None" + } } }, { - "commentStart": 0, - "end": 0, - "raw": "6", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 6.0, - "suffix": "None" + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "length002", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "end": 0, + "raw": "6", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 6.0, + "suffix": "None" + } } }, { - "commentStart": 0, - "end": 0, - "raw": "5", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 5.0, - "suffix": "None" + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "length003", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "end": 0, + "raw": "5", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 5.0, + "suffix": "None" + } } } ], @@ -1795,8 +1845,9 @@ description: Result of parsing exhaust-manifold.kcl "commentStart": 0, "end": 0, "start": 0, - "type": "CallExpression", - "type": "CallExpression" + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null }, "preComments": [ "", @@ -1813,63 +1864,113 @@ description: Result of parsing exhaust-manifold.kcl "expression": { "arguments": [ { - "commentStart": 0, - "end": 0, - "raw": "1", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 1.0, - "suffix": "None" + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "n", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "end": 0, + "raw": "1", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 1.0, + "suffix": "None" + } } }, { - "commentStart": 0, - "end": 0, - "raw": "1", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 1.0, - "suffix": "None" + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "angle001", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "end": 0, + "raw": "1", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 1.0, + "suffix": "None" + } } }, { - "commentStart": 0, - "end": 0, - "raw": "3", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 3.0, - "suffix": "None" + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "length001", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "end": 0, + "raw": "3", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 3.0, + "suffix": "None" + } } }, { - "commentStart": 0, - "end": 0, - "raw": "6", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 6.0, - "suffix": "None" + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "length002", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "end": 0, + "raw": "6", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 6.0, + "suffix": "None" + } } }, { - "commentStart": 0, - "end": 0, - "raw": "5", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 5.0, - "suffix": "None" + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "length003", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "end": 0, + "raw": "5", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 5.0, + "suffix": "None" + } } } ], @@ -1891,8 +1992,9 @@ description: Result of parsing exhaust-manifold.kcl "commentStart": 0, "end": 0, "start": 0, - "type": "CallExpression", - "type": "CallExpression" + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null }, "start": 0, "type": "ExpressionStatement", @@ -1904,63 +2006,113 @@ description: Result of parsing exhaust-manifold.kcl "expression": { "arguments": [ { - "commentStart": 0, - "end": 0, - "raw": "2", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 2.0, - "suffix": "None" + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "n", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "end": 0, + "raw": "2", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 2.0, + "suffix": "None" + } } }, { - "commentStart": 0, - "end": 0, - "raw": "24.3", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 24.3, - "suffix": "None" + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "angle001", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "end": 0, + "raw": "24.3", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 24.3, + "suffix": "None" + } } }, { - "commentStart": 0, - "end": 0, - "raw": "5", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 5.0, - "suffix": "None" + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "length001", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "end": 0, + "raw": "5", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 5.0, + "suffix": "None" + } } }, { - "commentStart": 0, - "end": 0, - "raw": "5", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 5.0, - "suffix": "None" + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "length002", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "end": 0, + "raw": "5", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 5.0, + "suffix": "None" + } } }, { - "commentStart": 0, - "end": 0, - "raw": "3", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 3.0, - "suffix": "None" + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "length003", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "end": 0, + "raw": "3", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 3.0, + "suffix": "None" + } } } ], @@ -1982,8 +2134,9 @@ description: Result of parsing exhaust-manifold.kcl "commentStart": 0, "end": 0, "start": 0, - "type": "CallExpression", - "type": "CallExpression" + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null }, "start": 0, "type": "ExpressionStatement", @@ -1995,63 +2148,113 @@ description: Result of parsing exhaust-manifold.kcl "expression": { "arguments": [ { - "commentStart": 0, - "end": 0, - "raw": "3", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 3.0, - "suffix": "None" + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "n", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "end": 0, + "raw": "3", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 3.0, + "suffix": "None" + } } }, { - "commentStart": 0, - "end": 0, - "raw": "25.2", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 25.2, - "suffix": "None" + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "angle001", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "end": 0, + "raw": "25.2", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 25.2, + "suffix": "None" + } } }, { - "commentStart": 0, - "end": 0, - "raw": "5", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 5.0, - "suffix": "None" + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "length001", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "end": 0, + "raw": "5", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 5.0, + "suffix": "None" + } } }, { - "commentStart": 0, - "end": 0, - "raw": "5", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 5.0, - "suffix": "None" + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "length002", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "end": 0, + "raw": "5", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 5.0, + "suffix": "None" + } } }, { - "commentStart": 0, - "end": 0, - "raw": "3", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 3.0, - "suffix": "None" + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "length003", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "end": 0, + "raw": "3", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 3.0, + "suffix": "None" + } } } ], @@ -2073,8 +2276,9 @@ description: Result of parsing exhaust-manifold.kcl "commentStart": 0, "end": 0, "start": 0, - "type": "CallExpression", - "type": "CallExpression" + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null }, "start": 0, "type": "ExpressionStatement", diff --git a/rust/kcl-lib/tests/kcl_samples/exhaust-manifold/ops.snap b/rust/kcl-lib/tests/kcl_samples/exhaust-manifold/ops.snap index 8b8aca410..98e45cf55 100644 --- a/rust/kcl-lib/tests/kcl_samples/exhaust-manifold/ops.snap +++ b/rust/kcl-lib/tests/kcl_samples/exhaust-manifold/ops.snap @@ -1086,7 +1086,88 @@ description: Operations executed exhaust-manifold.kcl "name": "primaryTube", "functionSourceRange": [], "unlabeledArg": null, - "labeledArgs": {} + "labeledArgs": { + "angle001": { + "value": { + "type": "Number", + "value": 0.0, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "length001": { + "value": { + "type": "Number", + "value": 3.0, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "length002": { + "value": { + "type": "Number", + "value": 6.0, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "length003": { + "value": { + "type": "Number", + "value": 5.0, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "n": { + "value": { + "type": "Number", + "value": 0.0, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + } + } }, "sourceRange": [] }, @@ -1097,7 +1178,88 @@ description: Operations executed exhaust-manifold.kcl "name": "primaryTube", "functionSourceRange": [], "unlabeledArg": null, - "labeledArgs": {} + "labeledArgs": { + "angle001": { + "value": { + "type": "Number", + "value": 1.0, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "length001": { + "value": { + "type": "Number", + "value": 3.0, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "length002": { + "value": { + "type": "Number", + "value": 6.0, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "length003": { + "value": { + "type": "Number", + "value": 5.0, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "n": { + "value": { + "type": "Number", + "value": 1.0, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + } + } }, "sourceRange": [] }, @@ -1108,7 +1270,88 @@ description: Operations executed exhaust-manifold.kcl "name": "primaryTube", "functionSourceRange": [], "unlabeledArg": null, - "labeledArgs": {} + "labeledArgs": { + "angle001": { + "value": { + "type": "Number", + "value": 24.3, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "length001": { + "value": { + "type": "Number", + "value": 5.0, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "length002": { + "value": { + "type": "Number", + "value": 5.0, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "length003": { + "value": { + "type": "Number", + "value": 3.0, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "n": { + "value": { + "type": "Number", + "value": 2.0, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + } + } }, "sourceRange": [] }, @@ -1119,7 +1362,88 @@ description: Operations executed exhaust-manifold.kcl "name": "primaryTube", "functionSourceRange": [], "unlabeledArg": null, - "labeledArgs": {} + "labeledArgs": { + "angle001": { + "value": { + "type": "Number", + "value": 25.2, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "length001": { + "value": { + "type": "Number", + "value": 5.0, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "length002": { + "value": { + "type": "Number", + "value": 5.0, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "length003": { + "value": { + "type": "Number", + "value": 3.0, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "n": { + "value": { + "type": "Number", + "value": 3.0, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + } + } }, "sourceRange": [] }, diff --git a/rust/kcl-lib/tests/kcl_samples/exhaust-manifold/program_memory.snap b/rust/kcl-lib/tests/kcl_samples/exhaust-manifold/program_memory.snap index c1bc78139..5e2167296 100644 --- a/rust/kcl-lib/tests/kcl_samples/exhaust-manifold/program_memory.snap +++ b/rust/kcl-lib/tests/kcl_samples/exhaust-manifold/program_memory.snap @@ -28,9 +28,9 @@ description: Variables in memory after executing exhaust-manifold.kcl "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 1735, - "end": 1741, - "start": 1735, + "commentStart": 1991, + "end": 1997, + "start": 1991, "type": "TagDeclarator", "value": "seg01" }, @@ -62,9 +62,9 @@ description: Variables in memory after executing exhaust-manifold.kcl "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 1909, - "end": 1915, - "start": 1909, + "commentStart": 2165, + "end": 2171, + "start": 2165, "type": "TagDeclarator", "value": "seg03" }, @@ -75,9 +75,9 @@ description: Variables in memory after executing exhaust-manifold.kcl "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 1958, - "end": 1964, - "start": 1958, + "commentStart": 2214, + "end": 2220, + "start": 2214, "type": "TagDeclarator", "value": "seg04" }, @@ -88,9 +88,9 @@ description: Variables in memory after executing exhaust-manifold.kcl "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 1997, - "end": 2003, - "start": 1997, + "commentStart": 2253, + "end": 2259, + "start": 2253, "type": "TagDeclarator", "value": "seg05" }, @@ -122,9 +122,9 @@ description: Variables in memory after executing exhaust-manifold.kcl "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 2181, - "end": 2187, - "start": 2181, + "commentStart": 2437, + "end": 2443, + "start": 2437, "type": "TagDeclarator", "value": "seg07" }, @@ -135,9 +135,9 @@ description: Variables in memory after executing exhaust-manifold.kcl "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 2238, - "end": 2244, - "start": 2238, + "commentStart": 2494, + "end": 2500, + "start": 2494, "type": "TagDeclarator", "value": "seg08" }, @@ -148,9 +148,9 @@ description: Variables in memory after executing exhaust-manifold.kcl "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 2288, - "end": 2294, - "start": 2288, + "commentStart": 2544, + "end": 2550, + "start": 2544, "type": "TagDeclarator", "value": "seg09" }, @@ -192,9 +192,9 @@ description: Variables in memory after executing exhaust-manifold.kcl -1.25 ], "tag": { - "commentStart": 1735, - "end": 1741, - "start": 1735, + "commentStart": 1991, + "end": 1997, + "start": 1991, "type": "TagDeclarator", "value": "seg01" }, @@ -289,9 +289,9 @@ description: Variables in memory after executing exhaust-manifold.kcl -1.25 ], "tag": { - "commentStart": 1909, - "end": 1915, - "start": 1909, + "commentStart": 2165, + "end": 2171, + "start": 2165, "type": "TagDeclarator", "value": "seg03" }, @@ -314,9 +314,9 @@ description: Variables in memory after executing exhaust-manifold.kcl -1.25 ], "tag": { - "commentStart": 1958, - "end": 1964, - "start": 1958, + "commentStart": 2214, + "end": 2220, + "start": 2214, "type": "TagDeclarator", "value": "seg04" }, @@ -339,9 +339,9 @@ description: Variables in memory after executing exhaust-manifold.kcl 1.35 ], "tag": { - "commentStart": 1997, - "end": 2003, - "start": 1997, + "commentStart": 2253, + "end": 2259, + "start": 2253, "type": "TagDeclarator", "value": "seg05" }, @@ -436,9 +436,9 @@ description: Variables in memory after executing exhaust-manifold.kcl 1.35 ], "tag": { - "commentStart": 2181, - "end": 2187, - "start": 2181, + "commentStart": 2437, + "end": 2443, + "start": 2437, "type": "TagDeclarator", "value": "seg07" }, @@ -461,9 +461,9 @@ description: Variables in memory after executing exhaust-manifold.kcl 1.35 ], "tag": { - "commentStart": 2238, - "end": 2244, - "start": 2238, + "commentStart": 2494, + "end": 2500, + "start": 2494, "type": "TagDeclarator", "value": "seg08" }, @@ -486,9 +486,9 @@ description: Variables in memory after executing exhaust-manifold.kcl -1.25 ], "tag": { - "commentStart": 2288, - "end": 2294, - "start": 2288, + "commentStart": 2544, + "end": 2550, + "start": 2544, "type": "TagDeclarator", "value": "seg09" }, diff --git a/rust/kcl-lib/tests/kcl_samples/focusrite-scarlett-mounting-bracket/artifact_graph_flowchart.snap.md b/rust/kcl-lib/tests/kcl_samples/focusrite-scarlett-mounting-bracket/artifact_graph_flowchart.snap.md index 220914521..19175abde 100644 --- a/rust/kcl-lib/tests/kcl_samples/focusrite-scarlett-mounting-bracket/artifact_graph_flowchart.snap.md +++ b/rust/kcl-lib/tests/kcl_samples/focusrite-scarlett-mounting-bracket/artifact_graph_flowchart.snap.md @@ -1,68 +1,68 @@ ```mermaid flowchart LR subgraph path6 [Path] - 6["Path
[1234, 1272, 0]"] - 13["Segment
[1280, 1330, 0]"] - 14["Segment
[1338, 1387, 0]"] - 15["Segment
[1395, 1447, 0]"] - 16["Segment
[1455, 1503, 0]"] - 17["Segment
[1511, 1555, 0]"] - 18["Segment
[1563, 1608, 0]"] - 19["Segment
[1616, 1665, 0]"] - 20["Segment
[1673, 1692, 0]"] + 6["Path
[813, 851, 0]"] + 13["Segment
[859, 909, 0]"] + 14["Segment
[917, 966, 0]"] + 15["Segment
[974, 1026, 0]"] + 16["Segment
[1034, 1082, 0]"] + 17["Segment
[1090, 1134, 0]"] + 18["Segment
[1142, 1187, 0]"] + 19["Segment
[1195, 1244, 0]"] + 20["Segment
[1252, 1271, 0]"] 42[Solid2d] end subgraph path7 [Path] - 7["Path
[2383, 2437, 0]"] - 21["Segment
[2443, 2496, 0]"] - 22["Segment
[2502, 2552, 0]"] - 23["Segment
[2558, 2612, 0]"] - 24["Segment
[2618, 2638, 0]"] + 7["Path
[1974, 2028, 0]"] + 21["Segment
[2034, 2087, 0]"] + 22["Segment
[2093, 2143, 0]"] + 23["Segment
[2149, 2203, 0]"] + 24["Segment
[2209, 2229, 0]"] 38[Solid2d] end subgraph path8 [Path] - 8["Path
[2662, 2825, 0]"] - 25["Segment
[2662, 2825, 0]"] + 8["Path
[2253, 2416, 0]"] + 25["Segment
[2253, 2416, 0]"] 40[Solid2d] end subgraph path9 [Path] - 9["Path
[3207, 3262, 0]"] - 26["Segment
[3268, 3322, 0]"] - 27["Segment
[3328, 3378, 0]"] - 28["Segment
[3384, 3437, 0]"] - 29["Segment
[3443, 3463, 0]"] + 9["Path
[2798, 2853, 0]"] + 26["Segment
[2859, 2913, 0]"] + 27["Segment
[2919, 2969, 0]"] + 28["Segment
[2975, 3028, 0]"] + 29["Segment
[3034, 3054, 0]"] 39[Solid2d] end subgraph path10 [Path] - 10["Path
[3487, 3653, 0]"] - 30["Segment
[3487, 3653, 0]"] + 10["Path
[3078, 3244, 0]"] + 30["Segment
[3078, 3244, 0]"] 43[Solid2d] end subgraph path11 [Path] - 11["Path
[4233, 4274, 0]"] - 31["Segment
[4280, 4300, 0]"] - 32["Segment
[4306, 4329, 0]"] - 33["Segment
[4335, 4342, 0]"] + 11["Path
[3824, 3865, 0]"] + 31["Segment
[3871, 3891, 0]"] + 32["Segment
[3897, 3920, 0]"] + 33["Segment
[3926, 3933, 0]"] 41[Solid2d] end subgraph path12 [Path] - 12["Path
[4457, 4497, 0]"] - 34["Segment
[4503, 4523, 0]"] - 35["Segment
[4529, 4550, 0]"] - 36["Segment
[4556, 4577, 0]"] - 37["Segment
[4583, 4590, 0]"] + 12["Path
[4048, 4088, 0]"] + 34["Segment
[4094, 4114, 0]"] + 35["Segment
[4120, 4141, 0]"] + 36["Segment
[4147, 4168, 0]"] + 37["Segment
[4174, 4181, 0]"] 44[Solid2d] end - 1["Plane
[1199, 1226, 0]"] - 2["Plane
[2354, 2377, 0]"] - 3["Plane
[3178, 3201, 0]"] - 4["Plane
[4204, 4227, 0]"] - 5["Plane
[4428, 4451, 0]"] - 45["Sweep Extrusion
[1800, 1834, 0]"] - 46["Sweep Extrusion
[2832, 2857, 0]"] - 47["Sweep Extrusion
[3660, 3685, 0]"] - 48["Sweep Extrusion
[4348, 4376, 0]"] - 49["Sweep Extrusion
[4596, 4624, 0]"] + 1["Plane
[778, 805, 0]"] + 2["Plane
[1945, 1968, 0]"] + 3["Plane
[2769, 2792, 0]"] + 4["Plane
[3795, 3818, 0]"] + 5["Plane
[4019, 4042, 0]"] + 45["Sweep Extrusion
[1391, 1425, 0]"] + 46["Sweep Extrusion
[2423, 2448, 0]"] + 47["Sweep Extrusion
[3251, 3276, 0]"] + 48["Sweep Extrusion
[3939, 3967, 0]"] + 49["Sweep Extrusion
[4187, 4215, 0]"] 50[Wall] 51[Wall] 52[Wall] @@ -142,14 +142,14 @@ flowchart LR 126["SweepEdge Adjacent"] 127["SweepEdge Adjacent"] 128["SweepEdge Adjacent"] - 129["EdgeCut Fillet
[1840, 2099, 0]"] - 130["EdgeCut Fillet
[1840, 2099, 0]"] - 131["EdgeCut Fillet
[1840, 2099, 0]"] - 132["EdgeCut Fillet
[1840, 2099, 0]"] - 133["EdgeCut Fillet
[2863, 3008, 0]"] - 134["EdgeCut Fillet
[2863, 3008, 0]"] - 135["EdgeCut Fillet
[3691, 3836, 0]"] - 136["EdgeCut Fillet
[3691, 3836, 0]"] + 129["EdgeCut Fillet
[1431, 1690, 0]"] + 130["EdgeCut Fillet
[1431, 1690, 0]"] + 131["EdgeCut Fillet
[1431, 1690, 0]"] + 132["EdgeCut Fillet
[1431, 1690, 0]"] + 133["EdgeCut Fillet
[2454, 2599, 0]"] + 134["EdgeCut Fillet
[2454, 2599, 0]"] + 135["EdgeCut Fillet
[3282, 3427, 0]"] + 136["EdgeCut Fillet
[3282, 3427, 0]"] 1 --- 6 2 --- 7 2 --- 8 diff --git a/rust/kcl-lib/tests/kcl_samples/focusrite-scarlett-mounting-bracket/ast.snap b/rust/kcl-lib/tests/kcl_samples/focusrite-scarlett-mounting-bracket/ast.snap index 6126a74e1..dfb05b962 100644 --- a/rust/kcl-lib/tests/kcl_samples/focusrite-scarlett-mounting-bracket/ast.snap +++ b/rust/kcl-lib/tests/kcl_samples/focusrite-scarlett-mounting-bracket/ast.snap @@ -305,1020 +305,6 @@ description: Result of parsing focusrite-scarlett-mounting-bracket.kcl "type": "VariableDeclaration", "type": "VariableDeclaration" }, - { - "commentStart": 0, - "declaration": { - "commentStart": 0, - "end": 0, - "id": { - "commentStart": 0, - "end": 0, - "name": "rectShape", - "start": 0, - "type": "Identifier" - }, - "init": { - "body": { - "body": [ - { - "commentStart": 0, - "declaration": { - "commentStart": 0, - "end": 0, - "id": { - "commentStart": 0, - "end": 0, - "name": "rr", - "start": 0, - "type": "Identifier" - }, - "init": { - "body": [ - { - "arguments": [ - { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "XY", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - } - ], - "callee": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "startSketchOn", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name" - }, - "commentStart": 0, - "end": 0, - "start": 0, - "type": "CallExpression", - "type": "CallExpression" - }, - { - "arguments": [ - { - "type": "LabeledArg", - "label": { - "commentStart": 0, - "end": 0, - "name": "at", - "start": 0, - "type": "Identifier" - }, - "arg": { - "commentStart": 0, - "elements": [ - { - "commentStart": 0, - "end": 0, - "left": { - "commentStart": 0, - "computed": false, - "end": 0, - "object": { - "commentStart": 0, - "end": 0, - "name": "pos", - "start": 0, - "type": "Identifier", - "type": "Identifier" - }, - "property": { - "commentStart": 0, - "end": 0, - "raw": "0", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 0.0, - "suffix": "None" - } - }, - "start": 0, - "type": "MemberExpression", - "type": "MemberExpression" - }, - "operator": "-", - "right": { - "commentStart": 0, - "end": 0, - "left": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "w", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - "operator": "/", - "right": { - "commentStart": 0, - "end": 0, - "raw": "2", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 2.0, - "suffix": "None" - } - }, - "start": 0, - "type": "BinaryExpression", - "type": "BinaryExpression" - }, - "start": 0, - "type": "BinaryExpression", - "type": "BinaryExpression" - }, - { - "commentStart": 0, - "end": 0, - "left": { - "commentStart": 0, - "computed": false, - "end": 0, - "object": { - "commentStart": 0, - "end": 0, - "name": "pos", - "start": 0, - "type": "Identifier", - "type": "Identifier" - }, - "property": { - "commentStart": 0, - "end": 0, - "raw": "1", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 1.0, - "suffix": "None" - } - }, - "start": 0, - "type": "MemberExpression", - "type": "MemberExpression" - }, - "operator": "-", - "right": { - "commentStart": 0, - "end": 0, - "left": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "l", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - "operator": "/", - "right": { - "commentStart": 0, - "end": 0, - "raw": "2", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 2.0, - "suffix": "None" - } - }, - "start": 0, - "type": "BinaryExpression", - "type": "BinaryExpression" - }, - "start": 0, - "type": "BinaryExpression", - "type": "BinaryExpression" - } - ], - "end": 0, - "start": 0, - "type": "ArrayExpression", - "type": "ArrayExpression" - } - } - ], - "callee": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "startProfile", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name" - }, - "commentStart": 0, - "end": 0, - "start": 0, - "type": "CallExpressionKw", - "type": "CallExpressionKw", - "unlabeled": null - }, - { - "arguments": [ - { - "type": "LabeledArg", - "label": { - "commentStart": 0, - "end": 0, - "name": "endAbsolute", - "start": 0, - "type": "Identifier" - }, - "arg": { - "commentStart": 0, - "elements": [ - { - "commentStart": 0, - "end": 0, - "left": { - "commentStart": 0, - "computed": false, - "end": 0, - "object": { - "commentStart": 0, - "end": 0, - "name": "pos", - "start": 0, - "type": "Identifier", - "type": "Identifier" - }, - "property": { - "commentStart": 0, - "end": 0, - "raw": "0", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 0.0, - "suffix": "None" - } - }, - "start": 0, - "type": "MemberExpression", - "type": "MemberExpression" - }, - "operator": "+", - "right": { - "commentStart": 0, - "end": 0, - "left": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "w", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - "operator": "/", - "right": { - "commentStart": 0, - "end": 0, - "raw": "2", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 2.0, - "suffix": "None" - } - }, - "start": 0, - "type": "BinaryExpression", - "type": "BinaryExpression" - }, - "start": 0, - "type": "BinaryExpression", - "type": "BinaryExpression" - }, - { - "commentStart": 0, - "end": 0, - "left": { - "commentStart": 0, - "computed": false, - "end": 0, - "object": { - "commentStart": 0, - "end": 0, - "name": "pos", - "start": 0, - "type": "Identifier", - "type": "Identifier" - }, - "property": { - "commentStart": 0, - "end": 0, - "raw": "1", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 1.0, - "suffix": "None" - } - }, - "start": 0, - "type": "MemberExpression", - "type": "MemberExpression" - }, - "operator": "-", - "right": { - "commentStart": 0, - "end": 0, - "left": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "l", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - "operator": "/", - "right": { - "commentStart": 0, - "end": 0, - "raw": "2", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 2.0, - "suffix": "None" - } - }, - "start": 0, - "type": "BinaryExpression", - "type": "BinaryExpression" - }, - "start": 0, - "type": "BinaryExpression", - "type": "BinaryExpression" - } - ], - "end": 0, - "start": 0, - "type": "ArrayExpression", - "type": "ArrayExpression" - } - }, - { - "type": "LabeledArg", - "label": { - "commentStart": 0, - "end": 0, - "name": "tag", - "start": 0, - "type": "Identifier" - }, - "arg": { - "commentStart": 0, - "end": 0, - "start": 0, - "type": "TagDeclarator", - "type": "TagDeclarator", - "value": "edge01" - } - } - ], - "callee": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "line", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name" - }, - "commentStart": 0, - "end": 0, - "start": 0, - "type": "CallExpressionKw", - "type": "CallExpressionKw", - "unlabeled": null - }, - { - "arguments": [ - { - "type": "LabeledArg", - "label": { - "commentStart": 0, - "end": 0, - "name": "endAbsolute", - "start": 0, - "type": "Identifier" - }, - "arg": { - "commentStart": 0, - "elements": [ - { - "commentStart": 0, - "end": 0, - "left": { - "commentStart": 0, - "computed": false, - "end": 0, - "object": { - "commentStart": 0, - "end": 0, - "name": "pos", - "start": 0, - "type": "Identifier", - "type": "Identifier" - }, - "property": { - "commentStart": 0, - "end": 0, - "raw": "0", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 0.0, - "suffix": "None" - } - }, - "start": 0, - "type": "MemberExpression", - "type": "MemberExpression" - }, - "operator": "+", - "right": { - "commentStart": 0, - "end": 0, - "left": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "w", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - "operator": "/", - "right": { - "commentStart": 0, - "end": 0, - "raw": "2", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 2.0, - "suffix": "None" - } - }, - "start": 0, - "type": "BinaryExpression", - "type": "BinaryExpression" - }, - "start": 0, - "type": "BinaryExpression", - "type": "BinaryExpression" - }, - { - "commentStart": 0, - "end": 0, - "left": { - "commentStart": 0, - "computed": false, - "end": 0, - "object": { - "commentStart": 0, - "end": 0, - "name": "pos", - "start": 0, - "type": "Identifier", - "type": "Identifier" - }, - "property": { - "commentStart": 0, - "end": 0, - "raw": "1", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 1.0, - "suffix": "None" - } - }, - "start": 0, - "type": "MemberExpression", - "type": "MemberExpression" - }, - "operator": "+", - "right": { - "commentStart": 0, - "end": 0, - "left": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "l", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - "operator": "/", - "right": { - "commentStart": 0, - "end": 0, - "raw": "2", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 2.0, - "suffix": "None" - } - }, - "start": 0, - "type": "BinaryExpression", - "type": "BinaryExpression" - }, - "start": 0, - "type": "BinaryExpression", - "type": "BinaryExpression" - } - ], - "end": 0, - "start": 0, - "type": "ArrayExpression", - "type": "ArrayExpression" - } - }, - { - "type": "LabeledArg", - "label": { - "commentStart": 0, - "end": 0, - "name": "tag", - "start": 0, - "type": "Identifier" - }, - "arg": { - "commentStart": 0, - "end": 0, - "start": 0, - "type": "TagDeclarator", - "type": "TagDeclarator", - "value": "edge02" - } - } - ], - "callee": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "line", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name" - }, - "commentStart": 0, - "end": 0, - "start": 0, - "type": "CallExpressionKw", - "type": "CallExpressionKw", - "unlabeled": null - }, - { - "arguments": [ - { - "type": "LabeledArg", - "label": { - "commentStart": 0, - "end": 0, - "name": "endAbsolute", - "start": 0, - "type": "Identifier" - }, - "arg": { - "commentStart": 0, - "elements": [ - { - "commentStart": 0, - "end": 0, - "left": { - "commentStart": 0, - "computed": false, - "end": 0, - "object": { - "commentStart": 0, - "end": 0, - "name": "pos", - "start": 0, - "type": "Identifier", - "type": "Identifier" - }, - "property": { - "commentStart": 0, - "end": 0, - "raw": "0", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 0.0, - "suffix": "None" - } - }, - "start": 0, - "type": "MemberExpression", - "type": "MemberExpression" - }, - "operator": "-", - "right": { - "commentStart": 0, - "end": 0, - "left": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "w", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - "operator": "/", - "right": { - "commentStart": 0, - "end": 0, - "raw": "2", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 2.0, - "suffix": "None" - } - }, - "start": 0, - "type": "BinaryExpression", - "type": "BinaryExpression" - }, - "start": 0, - "type": "BinaryExpression", - "type": "BinaryExpression" - }, - { - "commentStart": 0, - "end": 0, - "left": { - "commentStart": 0, - "computed": false, - "end": 0, - "object": { - "commentStart": 0, - "end": 0, - "name": "pos", - "start": 0, - "type": "Identifier", - "type": "Identifier" - }, - "property": { - "commentStart": 0, - "end": 0, - "raw": "1", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 1.0, - "suffix": "None" - } - }, - "start": 0, - "type": "MemberExpression", - "type": "MemberExpression" - }, - "operator": "+", - "right": { - "commentStart": 0, - "end": 0, - "left": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "l", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - "operator": "/", - "right": { - "commentStart": 0, - "end": 0, - "raw": "2", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 2.0, - "suffix": "None" - } - }, - "start": 0, - "type": "BinaryExpression", - "type": "BinaryExpression" - }, - "start": 0, - "type": "BinaryExpression", - "type": "BinaryExpression" - } - ], - "end": 0, - "start": 0, - "type": "ArrayExpression", - "type": "ArrayExpression" - } - }, - { - "type": "LabeledArg", - "label": { - "commentStart": 0, - "end": 0, - "name": "tag", - "start": 0, - "type": "Identifier" - }, - "arg": { - "commentStart": 0, - "end": 0, - "start": 0, - "type": "TagDeclarator", - "type": "TagDeclarator", - "value": "edge03" - } - } - ], - "callee": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "line", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name" - }, - "commentStart": 0, - "end": 0, - "start": 0, - "type": "CallExpressionKw", - "type": "CallExpressionKw", - "unlabeled": null - }, - { - "arguments": [ - { - "type": "LabeledArg", - "label": { - "commentStart": 0, - "end": 0, - "name": "tag", - "start": 0, - "type": "Identifier" - }, - "arg": { - "commentStart": 0, - "end": 0, - "start": 0, - "type": "TagDeclarator", - "type": "TagDeclarator", - "value": "edge04" - } - } - ], - "callee": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "close", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name" - }, - "commentStart": 0, - "end": 0, - "start": 0, - "type": "CallExpressionKw", - "type": "CallExpressionKw", - "unlabeled": null - } - ], - "commentStart": 0, - "end": 0, - "start": 0, - "type": "PipeExpression", - "type": "PipeExpression" - }, - "start": 0, - "type": "VariableDeclarator" - }, - "end": 0, - "kind": "const", - "start": 0, - "type": "VariableDeclaration", - "type": "VariableDeclaration" - }, - { - "argument": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "rr", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - "commentStart": 0, - "end": 0, - "start": 0, - "type": "ReturnStatement", - "type": "ReturnStatement" - } - ], - "commentStart": 0, - "end": 0, - "start": 0 - }, - "commentStart": 0, - "end": 0, - "params": [ - { - "type": "Parameter", - "identifier": { - "commentStart": 0, - "end": 0, - "name": "pos", - "start": 0, - "type": "Identifier" - } - }, - { - "type": "Parameter", - "identifier": { - "commentStart": 0, - "end": 0, - "name": "w", - "start": 0, - "type": "Identifier" - } - }, - { - "type": "Parameter", - "identifier": { - "commentStart": 0, - "end": 0, - "name": "l", - "start": 0, - "type": "Identifier" - } - } - ], - "start": 0, - "type": "FunctionExpression", - "type": "FunctionExpression" - }, - "start": 0, - "type": "VariableDeclarator" - }, - "end": 0, - "kind": "fn", - "preComments": [ - "", - "", - "// Define a rectangular shape func" - ], - "start": 0, - "type": "VariableDeclaration", - "type": "VariableDeclaration" - }, { "commentStart": 0, "declaration": { @@ -3147,52 +2133,82 @@ description: Result of parsing focusrite-scarlett-mounting-bracket.kcl "init": { "arguments": [ { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { + "type": "LabeledArg", + "label": { "commentStart": 0, "end": 0, - "name": "width", + "name": "w", "start": 0, "type": "Identifier" }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" + "arg": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "width", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } }, { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { + "type": "LabeledArg", + "label": { "commentStart": 0, "end": 0, - "name": "depth", + "name": "d", "start": 0, "type": "Identifier" }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" + "arg": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "depth", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } }, { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { + "type": "LabeledArg", + "label": { "commentStart": 0, "end": 0, - "name": "thk", + "name": "t", "start": 0, "type": "Identifier" }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" + "arg": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "thk", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } } ], "callee": { @@ -3213,8 +2229,9 @@ description: Result of parsing focusrite-scarlett-mounting-bracket.kcl "commentStart": 0, "end": 0, "start": 0, - "type": "CallExpression", - "type": "CallExpression" + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null }, "start": 0, "type": "VariableDeclarator" diff --git a/rust/kcl-lib/tests/kcl_samples/focusrite-scarlett-mounting-bracket/ops.snap b/rust/kcl-lib/tests/kcl_samples/focusrite-scarlett-mounting-bracket/ops.snap index 7ca435454..5e03346f3 100644 --- a/rust/kcl-lib/tests/kcl_samples/focusrite-scarlett-mounting-bracket/ops.snap +++ b/rust/kcl-lib/tests/kcl_samples/focusrite-scarlett-mounting-bracket/ops.snap @@ -202,7 +202,56 @@ description: Operations executed focusrite-scarlett-mounting-bracket.kcl "name": "bracketSketch", "functionSourceRange": [], "unlabeledArg": null, - "labeledArgs": {} + "labeledArgs": { + "d": { + "value": { + "type": "Number", + "value": 45.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "t": { + "value": { + "type": "Number", + "value": 4.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "w": { + "value": { + "type": "Number", + "value": 144.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + } + } }, "sourceRange": [] }, diff --git a/rust/kcl-lib/tests/kcl_samples/focusrite-scarlett-mounting-bracket/program_memory.snap b/rust/kcl-lib/tests/kcl_samples/focusrite-scarlett-mounting-bracket/program_memory.snap index 95ee6572e..4316f42af 100644 --- a/rust/kcl-lib/tests/kcl_samples/focusrite-scarlett-mounting-bracket/program_memory.snap +++ b/rust/kcl-lib/tests/kcl_samples/focusrite-scarlett-mounting-bracket/program_memory.snap @@ -15,9 +15,9 @@ description: Variables in memory after executing focusrite-scarlett-mounting-bra "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 1323, - "end": 1329, - "start": 1323, + "commentStart": 902, + "end": 908, + "start": 902, "type": "TagDeclarator", "value": "edge1" }, @@ -28,9 +28,9 @@ description: Variables in memory after executing focusrite-scarlett-mounting-bra "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 1380, - "end": 1386, - "start": 1380, + "commentStart": 959, + "end": 965, + "start": 959, "type": "TagDeclarator", "value": "edge2" }, @@ -41,9 +41,9 @@ description: Variables in memory after executing focusrite-scarlett-mounting-bra "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 1440, - "end": 1446, - "start": 1440, + "commentStart": 1019, + "end": 1025, + "start": 1019, "type": "TagDeclarator", "value": "edge3" }, @@ -54,9 +54,9 @@ description: Variables in memory after executing focusrite-scarlett-mounting-bra "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 1496, - "end": 1502, - "start": 1496, + "commentStart": 1075, + "end": 1081, + "start": 1075, "type": "TagDeclarator", "value": "edge4" }, @@ -67,9 +67,9 @@ description: Variables in memory after executing focusrite-scarlett-mounting-bra "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 1548, - "end": 1554, - "start": 1548, + "commentStart": 1127, + "end": 1133, + "start": 1127, "type": "TagDeclarator", "value": "edge5" }, @@ -80,9 +80,9 @@ description: Variables in memory after executing focusrite-scarlett-mounting-bra "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 1601, - "end": 1607, - "start": 1601, + "commentStart": 1180, + "end": 1186, + "start": 1180, "type": "TagDeclarator", "value": "edge6" }, @@ -93,9 +93,9 @@ description: Variables in memory after executing focusrite-scarlett-mounting-bra "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 1658, - "end": 1664, - "start": 1658, + "commentStart": 1237, + "end": 1243, + "start": 1237, "type": "TagDeclarator", "value": "edge7" }, @@ -106,9 +106,9 @@ description: Variables in memory after executing focusrite-scarlett-mounting-bra "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 1685, - "end": 1691, - "start": 1685, + "commentStart": 1264, + "end": 1270, + "start": 1264, "type": "TagDeclarator", "value": "edge8" }, @@ -129,9 +129,9 @@ description: Variables in memory after executing focusrite-scarlett-mounting-bra 49.0 ], "tag": { - "commentStart": 1323, - "end": 1329, - "start": 1323, + "commentStart": 902, + "end": 908, + "start": 902, "type": "TagDeclarator", "value": "edge1" }, @@ -154,9 +154,9 @@ description: Variables in memory after executing focusrite-scarlett-mounting-bra -4.0 ], "tag": { - "commentStart": 1380, - "end": 1386, - "start": 1380, + "commentStart": 959, + "end": 965, + "start": 959, "type": "TagDeclarator", "value": "edge2" }, @@ -179,9 +179,9 @@ description: Variables in memory after executing focusrite-scarlett-mounting-bra -4.0 ], "tag": { - "commentStart": 1440, - "end": 1446, - "start": 1440, + "commentStart": 1019, + "end": 1025, + "start": 1019, "type": "TagDeclarator", "value": "edge3" }, @@ -204,9 +204,9 @@ description: Variables in memory after executing focusrite-scarlett-mounting-bra 49.0 ], "tag": { - "commentStart": 1496, - "end": 1502, - "start": 1496, + "commentStart": 1075, + "end": 1081, + "start": 1075, "type": "TagDeclarator", "value": "edge4" }, @@ -229,9 +229,9 @@ description: Variables in memory after executing focusrite-scarlett-mounting-bra 49.0 ], "tag": { - "commentStart": 1548, - "end": 1554, - "start": 1548, + "commentStart": 1127, + "end": 1133, + "start": 1127, "type": "TagDeclarator", "value": "edge5" }, @@ -254,9 +254,9 @@ description: Variables in memory after executing focusrite-scarlett-mounting-bra 0.0 ], "tag": { - "commentStart": 1601, - "end": 1607, - "start": 1601, + "commentStart": 1180, + "end": 1186, + "start": 1180, "type": "TagDeclarator", "value": "edge6" }, @@ -279,9 +279,9 @@ description: Variables in memory after executing focusrite-scarlett-mounting-bra 0.0 ], "tag": { - "commentStart": 1658, - "end": 1664, - "start": 1658, + "commentStart": 1237, + "end": 1243, + "start": 1237, "type": "TagDeclarator", "value": "edge7" }, @@ -304,9 +304,9 @@ description: Variables in memory after executing focusrite-scarlett-mounting-bra 49.0 ], "tag": { - "commentStart": 1685, - "end": 1691, - "start": 1685, + "commentStart": 1264, + "end": 1270, + "start": 1264, "type": "TagDeclarator", "value": "edge8" }, @@ -691,9 +691,9 @@ description: Variables in memory after executing focusrite-scarlett-mounting-bra 49.0 ], "tag": { - "commentStart": 1323, - "end": 1329, - "start": 1323, + "commentStart": 902, + "end": 908, + "start": 902, "type": "TagDeclarator", "value": "edge1" }, @@ -716,9 +716,9 @@ description: Variables in memory after executing focusrite-scarlett-mounting-bra -4.0 ], "tag": { - "commentStart": 1380, - "end": 1386, - "start": 1380, + "commentStart": 959, + "end": 965, + "start": 959, "type": "TagDeclarator", "value": "edge2" }, @@ -741,9 +741,9 @@ description: Variables in memory after executing focusrite-scarlett-mounting-bra -4.0 ], "tag": { - "commentStart": 1440, - "end": 1446, - "start": 1440, + "commentStart": 1019, + "end": 1025, + "start": 1019, "type": "TagDeclarator", "value": "edge3" }, @@ -766,9 +766,9 @@ description: Variables in memory after executing focusrite-scarlett-mounting-bra 49.0 ], "tag": { - "commentStart": 1496, - "end": 1502, - "start": 1496, + "commentStart": 1075, + "end": 1081, + "start": 1075, "type": "TagDeclarator", "value": "edge4" }, @@ -791,9 +791,9 @@ description: Variables in memory after executing focusrite-scarlett-mounting-bra 49.0 ], "tag": { - "commentStart": 1548, - "end": 1554, - "start": 1548, + "commentStart": 1127, + "end": 1133, + "start": 1127, "type": "TagDeclarator", "value": "edge5" }, @@ -816,9 +816,9 @@ description: Variables in memory after executing focusrite-scarlett-mounting-bra 0.0 ], "tag": { - "commentStart": 1601, - "end": 1607, - "start": 1601, + "commentStart": 1180, + "end": 1186, + "start": 1180, "type": "TagDeclarator", "value": "edge6" }, @@ -841,9 +841,9 @@ description: Variables in memory after executing focusrite-scarlett-mounting-bra 0.0 ], "tag": { - "commentStart": 1658, - "end": 1664, - "start": 1658, + "commentStart": 1237, + "end": 1243, + "start": 1237, "type": "TagDeclarator", "value": "edge7" }, @@ -866,9 +866,9 @@ description: Variables in memory after executing focusrite-scarlett-mounting-bra 49.0 ], "tag": { - "commentStart": 1685, - "end": 1691, - "start": 1685, + "commentStart": 1264, + "end": 1270, + "start": 1264, "type": "TagDeclarator", "value": "edge8" }, @@ -1103,9 +1103,6 @@ description: Variables in memory after executing focusrite-scarlett-mounting-bra } } }, - "rectShape": { - "type": "Function" - }, "retBack": { "type": "Solid", "value": { @@ -1856,9 +1853,9 @@ description: Variables in memory after executing focusrite-scarlett-mounting-bra "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 3314, - "end": 3321, - "start": 3314, + "commentStart": 2905, + "end": 2912, + "start": 2905, "type": "TagDeclarator", "value": "edge21" }, @@ -1869,9 +1866,9 @@ description: Variables in memory after executing focusrite-scarlett-mounting-bra "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 3370, - "end": 3377, - "start": 3370, + "commentStart": 2961, + "end": 2968, + "start": 2961, "type": "TagDeclarator", "value": "edge22" }, @@ -1882,9 +1879,9 @@ description: Variables in memory after executing focusrite-scarlett-mounting-bra "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 3429, - "end": 3436, - "start": 3429, + "commentStart": 3020, + "end": 3027, + "start": 3020, "type": "TagDeclarator", "value": "edge23" }, @@ -1895,9 +1892,9 @@ description: Variables in memory after executing focusrite-scarlett-mounting-bra "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 3455, - "end": 3462, - "start": 3455, + "commentStart": 3046, + "end": 3053, + "start": 3046, "type": "TagDeclarator", "value": "edge24" }, @@ -1918,9 +1915,9 @@ description: Variables in memory after executing focusrite-scarlett-mounting-bra 44.0 ], "tag": { - "commentStart": 3314, - "end": 3321, - "start": 3314, + "commentStart": 2905, + "end": 2912, + "start": 2905, "type": "TagDeclarator", "value": "edge21" }, @@ -1943,9 +1940,9 @@ description: Variables in memory after executing focusrite-scarlett-mounting-bra 35.6667 ], "tag": { - "commentStart": 3370, - "end": 3377, - "start": 3370, + "commentStart": 2961, + "end": 2968, + "start": 2961, "type": "TagDeclarator", "value": "edge22" }, @@ -1968,9 +1965,9 @@ description: Variables in memory after executing focusrite-scarlett-mounting-bra 19.0 ], "tag": { - "commentStart": 3429, - "end": 3436, - "start": 3429, + "commentStart": 3020, + "end": 3027, + "start": 3020, "type": "TagDeclarator", "value": "edge23" }, @@ -1993,9 +1990,9 @@ description: Variables in memory after executing focusrite-scarlett-mounting-bra 10.6667 ], "tag": { - "commentStart": 3455, - "end": 3462, - "start": 3455, + "commentStart": 3046, + "end": 3053, + "start": 3046, "type": "TagDeclarator", "value": "edge24" }, @@ -2140,9 +2137,9 @@ description: Variables in memory after executing focusrite-scarlett-mounting-bra "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 3314, - "end": 3321, - "start": 3314, + "commentStart": 2905, + "end": 2912, + "start": 2905, "type": "TagDeclarator", "value": "edge21" }, @@ -2153,9 +2150,9 @@ description: Variables in memory after executing focusrite-scarlett-mounting-bra "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 3370, - "end": 3377, - "start": 3370, + "commentStart": 2961, + "end": 2968, + "start": 2961, "type": "TagDeclarator", "value": "edge22" }, @@ -2166,9 +2163,9 @@ description: Variables in memory after executing focusrite-scarlett-mounting-bra "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 3429, - "end": 3436, - "start": 3429, + "commentStart": 3020, + "end": 3027, + "start": 3020, "type": "TagDeclarator", "value": "edge23" }, @@ -2179,9 +2176,9 @@ description: Variables in memory after executing focusrite-scarlett-mounting-bra "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 3455, - "end": 3462, - "start": 3455, + "commentStart": 3046, + "end": 3053, + "start": 3046, "type": "TagDeclarator", "value": "edge24" }, @@ -2202,9 +2199,9 @@ description: Variables in memory after executing focusrite-scarlett-mounting-bra 44.0 ], "tag": { - "commentStart": 3314, - "end": 3321, - "start": 3314, + "commentStart": 2905, + "end": 2912, + "start": 2905, "type": "TagDeclarator", "value": "edge21" }, @@ -2227,9 +2224,9 @@ description: Variables in memory after executing focusrite-scarlett-mounting-bra 35.6667 ], "tag": { - "commentStart": 3370, - "end": 3377, - "start": 3370, + "commentStart": 2961, + "end": 2968, + "start": 2961, "type": "TagDeclarator", "value": "edge22" }, @@ -2252,9 +2249,9 @@ description: Variables in memory after executing focusrite-scarlett-mounting-bra 19.0 ], "tag": { - "commentStart": 3429, - "end": 3436, - "start": 3429, + "commentStart": 3020, + "end": 3027, + "start": 3020, "type": "TagDeclarator", "value": "edge23" }, @@ -2277,9 +2274,9 @@ description: Variables in memory after executing focusrite-scarlett-mounting-bra 10.6667 ], "tag": { - "commentStart": 3455, - "end": 3462, - "start": 3455, + "commentStart": 3046, + "end": 3053, + "start": 3046, "type": "TagDeclarator", "value": "edge24" }, @@ -2429,9 +2426,9 @@ description: Variables in memory after executing focusrite-scarlett-mounting-bra "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 2488, - "end": 2495, - "start": 2488, + "commentStart": 2079, + "end": 2086, + "start": 2079, "type": "TagDeclarator", "value": "edge11" }, @@ -2442,9 +2439,9 @@ description: Variables in memory after executing focusrite-scarlett-mounting-bra "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 2544, - "end": 2551, - "start": 2544, + "commentStart": 2135, + "end": 2142, + "start": 2135, "type": "TagDeclarator", "value": "edge12" }, @@ -2455,9 +2452,9 @@ description: Variables in memory after executing focusrite-scarlett-mounting-bra "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 2604, - "end": 2611, - "start": 2604, + "commentStart": 2195, + "end": 2202, + "start": 2195, "type": "TagDeclarator", "value": "edge13" }, @@ -2468,9 +2465,9 @@ description: Variables in memory after executing focusrite-scarlett-mounting-bra "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 2630, - "end": 2637, - "start": 2630, + "commentStart": 2221, + "end": 2228, + "start": 2221, "type": "TagDeclarator", "value": "edge14" }, @@ -2491,9 +2488,9 @@ description: Variables in memory after executing focusrite-scarlett-mounting-bra 44.0 ], "tag": { - "commentStart": 2488, - "end": 2495, - "start": 2488, + "commentStart": 2079, + "end": 2086, + "start": 2079, "type": "TagDeclarator", "value": "edge11" }, @@ -2516,9 +2513,9 @@ description: Variables in memory after executing focusrite-scarlett-mounting-bra 35.6667 ], "tag": { - "commentStart": 2544, - "end": 2551, - "start": 2544, + "commentStart": 2135, + "end": 2142, + "start": 2135, "type": "TagDeclarator", "value": "edge12" }, @@ -2541,9 +2538,9 @@ description: Variables in memory after executing focusrite-scarlett-mounting-bra 19.0 ], "tag": { - "commentStart": 2604, - "end": 2611, - "start": 2604, + "commentStart": 2195, + "end": 2202, + "start": 2195, "type": "TagDeclarator", "value": "edge13" }, @@ -2566,9 +2563,9 @@ description: Variables in memory after executing focusrite-scarlett-mounting-bra 10.6667 ], "tag": { - "commentStart": 2630, - "end": 2637, - "start": 2630, + "commentStart": 2221, + "end": 2228, + "start": 2221, "type": "TagDeclarator", "value": "edge14" }, @@ -2713,9 +2710,9 @@ description: Variables in memory after executing focusrite-scarlett-mounting-bra "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 2488, - "end": 2495, - "start": 2488, + "commentStart": 2079, + "end": 2086, + "start": 2079, "type": "TagDeclarator", "value": "edge11" }, @@ -2726,9 +2723,9 @@ description: Variables in memory after executing focusrite-scarlett-mounting-bra "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 2544, - "end": 2551, - "start": 2544, + "commentStart": 2135, + "end": 2142, + "start": 2135, "type": "TagDeclarator", "value": "edge12" }, @@ -2739,9 +2736,9 @@ description: Variables in memory after executing focusrite-scarlett-mounting-bra "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 2604, - "end": 2611, - "start": 2604, + "commentStart": 2195, + "end": 2202, + "start": 2195, "type": "TagDeclarator", "value": "edge13" }, @@ -2752,9 +2749,9 @@ description: Variables in memory after executing focusrite-scarlett-mounting-bra "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 2630, - "end": 2637, - "start": 2630, + "commentStart": 2221, + "end": 2228, + "start": 2221, "type": "TagDeclarator", "value": "edge14" }, @@ -2775,9 +2772,9 @@ description: Variables in memory after executing focusrite-scarlett-mounting-bra 44.0 ], "tag": { - "commentStart": 2488, - "end": 2495, - "start": 2488, + "commentStart": 2079, + "end": 2086, + "start": 2079, "type": "TagDeclarator", "value": "edge11" }, @@ -2800,9 +2797,9 @@ description: Variables in memory after executing focusrite-scarlett-mounting-bra 35.6667 ], "tag": { - "commentStart": 2544, - "end": 2551, - "start": 2544, + "commentStart": 2135, + "end": 2142, + "start": 2135, "type": "TagDeclarator", "value": "edge12" }, @@ -2825,9 +2822,9 @@ description: Variables in memory after executing focusrite-scarlett-mounting-bra 19.0 ], "tag": { - "commentStart": 2604, - "end": 2611, - "start": 2604, + "commentStart": 2195, + "end": 2202, + "start": 2195, "type": "TagDeclarator", "value": "edge13" }, @@ -2850,9 +2847,9 @@ description: Variables in memory after executing focusrite-scarlett-mounting-bra 10.6667 ], "tag": { - "commentStart": 2630, - "end": 2637, - "start": 2630, + "commentStart": 2221, + "end": 2228, + "start": 2221, "type": "TagDeclarator", "value": "edge14" }, diff --git a/rust/kcl-lib/tests/kcl_samples/food-service-spatula/artifact_graph_flowchart.snap.md b/rust/kcl-lib/tests/kcl_samples/food-service-spatula/artifact_graph_flowchart.snap.md index 54e7fbd11..6e8bbf853 100644 --- a/rust/kcl-lib/tests/kcl_samples/food-service-spatula/artifact_graph_flowchart.snap.md +++ b/rust/kcl-lib/tests/kcl_samples/food-service-spatula/artifact_graph_flowchart.snap.md @@ -46,38 +46,38 @@ flowchart LR 57[Solid2d] end subgraph path11 [Path] - 11["Path
[2744, 2800, 0]"] - 38["Segment
[2806, 2865, 0]"] - 39["Segment
[2871, 2906, 0]"] - 40["Segment
[2912, 2945, 0]"] - 41["Segment
[2951, 3010, 0]"] - 42["Segment
[3016, 3052, 0]"] - 43["Segment
[3058, 3082, 0]"] - 44["Segment
[3088, 3095, 0]"] + 11["Path
[2873, 2929, 0]"] + 38["Segment
[2935, 2994, 0]"] + 39["Segment
[3000, 3035, 0]"] + 40["Segment
[3041, 3074, 0]"] + 41["Segment
[3080, 3139, 0]"] + 42["Segment
[3145, 3181, 0]"] + 43["Segment
[3187, 3211, 0]"] + 44["Segment
[3217, 3224, 0]"] 54[Solid2d] end subgraph path12 [Path] - 12["Path
[3690, 3740, 0]"] - 45["Segment
[3746, 3796, 0]"] - 46["Segment
[3802, 3868, 0]"] - 47["Segment
[3874, 3925, 0]"] - 48["Segment
[3931, 3996, 0]"] - 49["Segment
[4002, 4055, 0]"] - 50["Segment
[4061, 4128, 0]"] - 51["Segment
[4134, 4208, 0]"] - 52["Segment
[4214, 4282, 0]"] - 53["Segment
[4288, 4295, 0]"] + 12["Path
[3819, 3869, 0]"] + 45["Segment
[3875, 3925, 0]"] + 46["Segment
[3931, 3997, 0]"] + 47["Segment
[4003, 4054, 0]"] + 48["Segment
[4060, 4125, 0]"] + 49["Segment
[4131, 4184, 0]"] + 50["Segment
[4190, 4257, 0]"] + 51["Segment
[4263, 4337, 0]"] + 52["Segment
[4343, 4411, 0]"] + 53["Segment
[4417, 4424, 0]"] 55[Solid2d] end 1["Plane
[1379, 1396, 0]"] - 2["Plane
[2641, 2683, 0]"] - 3["Plane
[3616, 3642, 0]"] - 4["StartSketchOnPlane
[2627, 2684, 0]"] - 5["StartSketchOnFace
[4452, 4491, 0]"] - 61["Sweep Extrusion
[2318, 2368, 0]"] - 62["Sweep Extrusion
[3129, 3173, 0]"] - 63["Sweep Extrusion
[4351, 4393, 0]"] - 64["Sweep Extrusion
[4628, 4678, 0]"] + 2["Plane
[2770, 2812, 0]"] + 3["Plane
[3745, 3771, 0]"] + 4["StartSketchOnPlane
[2756, 2813, 0]"] + 5["StartSketchOnFace
[4581, 4620, 0]"] + 61["Sweep Extrusion
[2447, 2497, 0]"] + 62["Sweep Extrusion
[3258, 3302, 0]"] + 63["Sweep Extrusion
[4480, 4522, 0]"] + 64["Sweep Extrusion
[4800, 4850, 0]"] 65[Wall] 66[Wall] 67[Wall] @@ -156,10 +156,10 @@ flowchart LR 140["SweepEdge Adjacent"] 141["SweepEdge Adjacent"] 142["SweepEdge Adjacent"] - 143["EdgeCut Fillet
[2405, 2546, 0]"] - 144["EdgeCut Fillet
[2405, 2546, 0]"] - 145["EdgeCut Fillet
[3216, 3347, 0]"] - 146["EdgeCut Fillet
[3216, 3347, 0]"] + 143["EdgeCut Fillet
[2534, 2675, 0]"] + 144["EdgeCut Fillet
[2534, 2675, 0]"] + 145["EdgeCut Fillet
[3345, 3476, 0]"] + 146["EdgeCut Fillet
[3345, 3476, 0]"] 1 --- 6 1 --- 8 1 --- 9 diff --git a/rust/kcl-lib/tests/kcl_samples/food-service-spatula/ast.snap b/rust/kcl-lib/tests/kcl_samples/food-service-spatula/ast.snap index 5cd7c5112..ee8461378 100644 --- a/rust/kcl-lib/tests/kcl_samples/food-service-spatula/ast.snap +++ b/rust/kcl-lib/tests/kcl_samples/food-service-spatula/ast.snap @@ -2863,118 +2863,158 @@ description: Result of parsing food-service-spatula.kcl "init": { "arguments": [ { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { + "type": "LabeledArg", + "label": { "commentStart": 0, "end": 0, - "name": "flipperSketch", + "name": "sketch1", "start": 0, "type": "Identifier" }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" + "arg": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "flipperSketch", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } }, { - "commentStart": 0, - "elements": [ - { - "argument": { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "start", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "elements": [ + { + "argument": { + "commentStart": 0, + "end": 0, + "raw": "25", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 25.0, + "suffix": "None" + } + }, "commentStart": 0, "end": 0, - "raw": "25", + "operator": "-", + "start": 0, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "commentStart": 0, + "end": 0, + "raw": "0", "start": 0, "type": "Literal", "type": "Literal", "value": { - "value": 25.0, + "value": 0.0, "suffix": "None" } - }, - "commentStart": 0, - "end": 0, - "operator": "-", - "start": 0, - "type": "UnaryExpression", - "type": "UnaryExpression" - }, - { - "commentStart": 0, - "end": 0, - "raw": "0", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 0.0, - "suffix": "None" } - } - ], - "end": 0, - "start": 0, - "type": "ArrayExpression", - "type": "ArrayExpression" + ], + "end": 0, + "start": 0, + "type": "ArrayExpression", + "type": "ArrayExpression" + } }, { - "commentStart": 0, - "elements": [ - { - "argument": { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "end", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "elements": [ + { + "argument": { + "commentStart": 0, + "end": 0, + "raw": "55", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 55.0, + "suffix": "None" + } + }, "commentStart": 0, "end": 0, - "raw": "55", + "operator": "-", + "start": 0, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "commentStart": 0, + "end": 0, + "raw": "0", "start": 0, "type": "Literal", "type": "Literal", "value": { - "value": 55.0, + "value": 0.0, "suffix": "None" } - }, - "commentStart": 0, - "end": 0, - "operator": "-", - "start": 0, - "type": "UnaryExpression", - "type": "UnaryExpression" - }, - { - "commentStart": 0, - "end": 0, - "raw": "0", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 0.0, - "suffix": "None" } - } - ], - "end": 0, - "start": 0, - "type": "ArrayExpression", - "type": "ArrayExpression" + ], + "end": 0, + "start": 0, + "type": "ArrayExpression", + "type": "ArrayExpression" + } }, { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { + "type": "LabeledArg", + "label": { "commentStart": 0, "end": 0, - "name": "flipperSlotWidth", + "name": "width", "start": 0, "type": "Identifier" }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" + "arg": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "flipperSlotWidth", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } } ], "callee": { @@ -2995,8 +3035,9 @@ description: Result of parsing food-service-spatula.kcl "commentStart": 0, "end": 0, "start": 0, - "type": "CallExpression", - "type": "CallExpression" + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null }, "start": 0, "type": "VariableDeclarator" @@ -3022,118 +3063,158 @@ description: Result of parsing food-service-spatula.kcl "init": { "arguments": [ { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { + "type": "LabeledArg", + "label": { "commentStart": 0, "end": 0, - "name": "flipperSketch", + "name": "sketch1", "start": 0, "type": "Identifier" }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" + "arg": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "flipperSketch", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } }, { - "commentStart": 0, - "elements": [ - { - "argument": { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "start", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "elements": [ + { + "argument": { + "commentStart": 0, + "end": 0, + "raw": "25", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 25.0, + "suffix": "None" + } + }, "commentStart": 0, "end": 0, - "raw": "25", + "operator": "-", + "start": 0, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "commentStart": 0, + "end": 0, + "raw": "18", "start": 0, "type": "Literal", "type": "Literal", "value": { - "value": 25.0, + "value": 18.0, "suffix": "None" } - }, - "commentStart": 0, - "end": 0, - "operator": "-", - "start": 0, - "type": "UnaryExpression", - "type": "UnaryExpression" - }, - { - "commentStart": 0, - "end": 0, - "raw": "18", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 18.0, - "suffix": "None" } - } - ], - "end": 0, - "start": 0, - "type": "ArrayExpression", - "type": "ArrayExpression" + ], + "end": 0, + "start": 0, + "type": "ArrayExpression", + "type": "ArrayExpression" + } }, { - "commentStart": 0, - "elements": [ - { - "argument": { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "end", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "elements": [ + { + "argument": { + "commentStart": 0, + "end": 0, + "raw": "55", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 55.0, + "suffix": "None" + } + }, "commentStart": 0, "end": 0, - "raw": "55", + "operator": "-", + "start": 0, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "commentStart": 0, + "end": 0, + "raw": "19", "start": 0, "type": "Literal", "type": "Literal", "value": { - "value": 55.0, + "value": 19.0, "suffix": "None" } - }, - "commentStart": 0, - "end": 0, - "operator": "-", - "start": 0, - "type": "UnaryExpression", - "type": "UnaryExpression" - }, - { - "commentStart": 0, - "end": 0, - "raw": "19", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 19.0, - "suffix": "None" } - } - ], - "end": 0, - "start": 0, - "type": "ArrayExpression", - "type": "ArrayExpression" + ], + "end": 0, + "start": 0, + "type": "ArrayExpression", + "type": "ArrayExpression" + } }, { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { + "type": "LabeledArg", + "label": { "commentStart": 0, "end": 0, - "name": "flipperSlotWidth", + "name": "width", "start": 0, "type": "Identifier" }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" + "arg": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "flipperSlotWidth", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } } ], "callee": { @@ -3154,8 +3235,9 @@ description: Result of parsing food-service-spatula.kcl "commentStart": 0, "end": 0, "start": 0, - "type": "CallExpression", - "type": "CallExpression" + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null }, "start": 0, "type": "VariableDeclarator" @@ -3186,134 +3268,174 @@ description: Result of parsing food-service-spatula.kcl "init": { "arguments": [ { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { + "type": "LabeledArg", + "label": { "commentStart": 0, "end": 0, - "name": "flipperSketch", + "name": "sketch1", "start": 0, "type": "Identifier" }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - { - "commentStart": 0, - "elements": [ - { - "argument": { - "commentStart": 0, - "end": 0, - "raw": "25", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 25.0, - "suffix": "None" - } - }, - "commentStart": 0, - "end": 0, - "operator": "-", - "start": 0, - "type": "UnaryExpression", - "type": "UnaryExpression" - }, - { - "argument": { - "commentStart": 0, - "end": 0, - "raw": "18", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 18.0, - "suffix": "None" - } - }, - "commentStart": 0, - "end": 0, - "operator": "-", - "start": 0, - "type": "UnaryExpression", - "type": "UnaryExpression" - } - ], - "end": 0, - "start": 0, - "type": "ArrayExpression", - "type": "ArrayExpression" - }, - { - "commentStart": 0, - "elements": [ - { - "argument": { - "commentStart": 0, - "end": 0, - "raw": "55", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 55.0, - "suffix": "None" - } - }, - "commentStart": 0, - "end": 0, - "operator": "-", - "start": 0, - "type": "UnaryExpression", - "type": "UnaryExpression" - }, - { - "argument": { - "commentStart": 0, - "end": 0, - "raw": "19", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 19.0, - "suffix": "None" - } - }, - "commentStart": 0, - "end": 0, - "operator": "-", - "start": 0, - "type": "UnaryExpression", - "type": "UnaryExpression" - } - ], - "end": 0, - "start": 0, - "type": "ArrayExpression", - "type": "ArrayExpression" - }, - { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { + "arg": { + "abs_path": false, "commentStart": 0, "end": 0, - "name": "flipperSlotWidth", + "name": { + "commentStart": 0, + "end": 0, + "name": "flipperSketch", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } + }, + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "start", "start": 0, "type": "Identifier" }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" + "arg": { + "commentStart": 0, + "elements": [ + { + "argument": { + "commentStart": 0, + "end": 0, + "raw": "25", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 25.0, + "suffix": "None" + } + }, + "commentStart": 0, + "end": 0, + "operator": "-", + "start": 0, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "argument": { + "commentStart": 0, + "end": 0, + "raw": "18", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 18.0, + "suffix": "None" + } + }, + "commentStart": 0, + "end": 0, + "operator": "-", + "start": 0, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 0, + "start": 0, + "type": "ArrayExpression", + "type": "ArrayExpression" + } + }, + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "end", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "elements": [ + { + "argument": { + "commentStart": 0, + "end": 0, + "raw": "55", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 55.0, + "suffix": "None" + } + }, + "commentStart": 0, + "end": 0, + "operator": "-", + "start": 0, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "argument": { + "commentStart": 0, + "end": 0, + "raw": "19", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 19.0, + "suffix": "None" + } + }, + "commentStart": 0, + "end": 0, + "operator": "-", + "start": 0, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 0, + "start": 0, + "type": "ArrayExpression", + "type": "ArrayExpression" + } + }, + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "width", + "start": 0, + "type": "Identifier" + }, + "arg": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "flipperSlotWidth", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } } ], "callee": { @@ -3334,8 +3456,9 @@ description: Result of parsing food-service-spatula.kcl "commentStart": 0, "end": 0, "start": 0, - "type": "CallExpression", - "type": "CallExpression" + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null }, "start": 0, "type": "VariableDeclarator" @@ -6403,102 +6526,142 @@ description: Result of parsing food-service-spatula.kcl "init": { "arguments": [ { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { + "type": "LabeledArg", + "label": { "commentStart": 0, "end": 0, - "name": "holeSketch", + "name": "sketch1", "start": 0, "type": "Identifier" }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - { - "commentStart": 0, - "elements": [ - { - "commentStart": 0, - "end": 0, - "raw": "0", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 0.0, - "suffix": "None" - } - }, - { - "commentStart": 0, - "end": 0, - "raw": "200", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 200.0, - "suffix": "None" - } - } - ], - "end": 0, - "start": 0, - "type": "ArrayExpression", - "type": "ArrayExpression" - }, - { - "commentStart": 0, - "elements": [ - { - "commentStart": 0, - "end": 0, - "raw": "0", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 0.0, - "suffix": "None" - } - }, - { - "commentStart": 0, - "end": 0, - "raw": "210", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 210.0, - "suffix": "None" - } - } - ], - "end": 0, - "start": 0, - "type": "ArrayExpression", - "type": "ArrayExpression" - }, - { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { + "arg": { + "abs_path": false, "commentStart": 0, "end": 0, - "name": "gripSlotWidth", + "name": { + "commentStart": 0, + "end": 0, + "name": "holeSketch", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } + }, + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "start", "start": 0, "type": "Identifier" }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" + "arg": { + "commentStart": 0, + "elements": [ + { + "commentStart": 0, + "end": 0, + "raw": "0", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 0.0, + "suffix": "None" + } + }, + { + "commentStart": 0, + "end": 0, + "raw": "200", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 200.0, + "suffix": "None" + } + } + ], + "end": 0, + "start": 0, + "type": "ArrayExpression", + "type": "ArrayExpression" + } + }, + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "end", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "elements": [ + { + "commentStart": 0, + "end": 0, + "raw": "0", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 0.0, + "suffix": "None" + } + }, + { + "commentStart": 0, + "end": 0, + "raw": "210", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 210.0, + "suffix": "None" + } + } + ], + "end": 0, + "start": 0, + "type": "ArrayExpression", + "type": "ArrayExpression" + } + }, + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "width", + "start": 0, + "type": "Identifier" + }, + "arg": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "gripSlotWidth", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } } ], "callee": { @@ -6519,8 +6682,9 @@ description: Result of parsing food-service-spatula.kcl "commentStart": 0, "end": 0, "start": 0, - "type": "CallExpression", - "type": "CallExpression" + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null }, "start": 0, "type": "VariableDeclarator" diff --git a/rust/kcl-lib/tests/kcl_samples/food-service-spatula/ops.snap b/rust/kcl-lib/tests/kcl_samples/food-service-spatula/ops.snap index c1e8fac73..c82d647ef 100644 --- a/rust/kcl-lib/tests/kcl_samples/food-service-spatula/ops.snap +++ b/rust/kcl-lib/tests/kcl_samples/food-service-spatula/ops.snap @@ -223,7 +223,99 @@ description: Operations executed food-service-spatula.kcl "name": "slot", "functionSourceRange": [], "unlabeledArg": null, - "labeledArgs": {} + "labeledArgs": { + "end": { + "value": { + "type": "Array", + "value": [ + { + "type": "Number", + "value": -55.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + { + "type": "Number", + "value": 0.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + } + ] + }, + "sourceRange": [] + }, + "sketch1": { + "value": { + "type": "Plane", + "artifact_id": "[uuid]" + }, + "sourceRange": [] + }, + "start": { + "value": { + "type": "Array", + "value": [ + { + "type": "Number", + "value": -25.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + { + "type": "Number", + "value": 0.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + } + ] + }, + "sourceRange": [] + }, + "width": { + "value": { + "type": "Number", + "value": 10.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + } + } }, "sourceRange": [] }, @@ -234,7 +326,99 @@ description: Operations executed food-service-spatula.kcl "name": "slot", "functionSourceRange": [], "unlabeledArg": null, - "labeledArgs": {} + "labeledArgs": { + "end": { + "value": { + "type": "Array", + "value": [ + { + "type": "Number", + "value": -55.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + { + "type": "Number", + "value": 19.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + } + ] + }, + "sourceRange": [] + }, + "sketch1": { + "value": { + "type": "Plane", + "artifact_id": "[uuid]" + }, + "sourceRange": [] + }, + "start": { + "value": { + "type": "Array", + "value": [ + { + "type": "Number", + "value": -25.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + { + "type": "Number", + "value": 18.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + } + ] + }, + "sourceRange": [] + }, + "width": { + "value": { + "type": "Number", + "value": 10.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + } + } }, "sourceRange": [] }, @@ -245,7 +429,99 @@ description: Operations executed food-service-spatula.kcl "name": "slot", "functionSourceRange": [], "unlabeledArg": null, - "labeledArgs": {} + "labeledArgs": { + "end": { + "value": { + "type": "Array", + "value": [ + { + "type": "Number", + "value": -55.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + { + "type": "Number", + "value": -19.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + } + ] + }, + "sourceRange": [] + }, + "sketch1": { + "value": { + "type": "Plane", + "artifact_id": "[uuid]" + }, + "sourceRange": [] + }, + "start": { + "value": { + "type": "Array", + "value": [ + { + "type": "Number", + "value": -25.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + { + "type": "Number", + "value": -18.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + } + ] + }, + "sourceRange": [] + }, + "width": { + "value": { + "type": "Number", + "value": 10.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + } + } }, "sourceRange": [] }, @@ -784,7 +1060,99 @@ description: Operations executed food-service-spatula.kcl "name": "slot", "functionSourceRange": [], "unlabeledArg": null, - "labeledArgs": {} + "labeledArgs": { + "end": { + "value": { + "type": "Array", + "value": [ + { + "type": "Number", + "value": 0.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + { + "type": "Number", + "value": 210.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + } + ] + }, + "sourceRange": [] + }, + "sketch1": { + "value": { + "type": "Face", + "artifact_id": "[uuid]" + }, + "sourceRange": [] + }, + "start": { + "value": { + "type": "Array", + "value": [ + { + "type": "Number", + "value": 0.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + { + "type": "Number", + "value": 200.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + } + ] + }, + "sourceRange": [] + }, + "width": { + "value": { + "type": "Number", + "value": 8.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + } + } }, "sourceRange": [] }, diff --git a/rust/kcl-lib/tests/kcl_samples/food-service-spatula/program_memory.snap b/rust/kcl-lib/tests/kcl_samples/food-service-spatula/program_memory.snap index 7d7ed191f..8f6389f8b 100644 --- a/rust/kcl-lib/tests/kcl_samples/food-service-spatula/program_memory.snap +++ b/rust/kcl-lib/tests/kcl_samples/food-service-spatula/program_memory.snap @@ -551,9 +551,9 @@ description: Variables in memory after executing food-service-spatula.kcl "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 4195, - "end": 4207, - "start": 4195, + "commentStart": 4324, + "end": 4336, + "start": 4324, "type": "TagDeclarator", "value": "gripEdgeTop" }, @@ -713,9 +713,9 @@ description: Variables in memory after executing food-service-spatula.kcl 7.0 ], "tag": { - "commentStart": 4195, - "end": 4207, - "start": 4195, + "commentStart": 4324, + "end": 4336, + "start": 4324, "type": "TagDeclarator", "value": "gripEdgeTop" }, @@ -1058,9 +1058,9 @@ description: Variables in memory after executing food-service-spatula.kcl "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 4195, - "end": 4207, - "start": 4195, + "commentStart": 4324, + "end": 4336, + "start": 4324, "type": "TagDeclarator", "value": "gripEdgeTop" }, @@ -1220,9 +1220,9 @@ description: Variables in memory after executing food-service-spatula.kcl 7.0 ], "tag": { - "commentStart": 4195, - "end": 4207, - "start": 4195, + "commentStart": 4324, + "end": 4336, + "start": 4324, "type": "TagDeclarator", "value": "gripEdgeTop" }, @@ -1538,9 +1538,9 @@ description: Variables in memory after executing food-service-spatula.kcl 7.0 ], "tag": { - "commentStart": 4195, - "end": 4207, - "start": 4195, + "commentStart": 4324, + "end": 4336, + "start": 4324, "type": "TagDeclarator", "value": "gripEdgeTop" }, @@ -1729,9 +1729,9 @@ description: Variables in memory after executing food-service-spatula.kcl "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 2847, - "end": 2864, - "start": 2847, + "commentStart": 2976, + "end": 2993, + "start": 2976, "type": "TagDeclarator", "value": "handleBottomEdge" }, @@ -1756,9 +1756,9 @@ description: Variables in memory after executing food-service-spatula.kcl "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 2995, - "end": 3009, - "start": 2995, + "commentStart": 3124, + "end": 3138, + "start": 3124, "type": "TagDeclarator", "value": "handleTopEdge" }, @@ -1800,9 +1800,9 @@ description: Variables in memory after executing food-service-spatula.kcl 3.5 ], "tag": { - "commentStart": 2847, - "end": 2864, - "start": 2847, + "commentStart": 2976, + "end": 2993, + "start": 2976, "type": "TagDeclarator", "value": "handleBottomEdge" }, @@ -1863,9 +1863,9 @@ description: Variables in memory after executing food-service-spatula.kcl 91.3213 ], "tag": { - "commentStart": 2995, - "end": 3009, - "start": 2995, + "commentStart": 3124, + "end": 3138, + "start": 3124, "type": "TagDeclarator", "value": "handleTopEdge" }, @@ -2211,9 +2211,9 @@ description: Variables in memory after executing food-service-spatula.kcl 3.5 ], "tag": { - "commentStart": 2847, - "end": 2864, - "start": 2847, + "commentStart": 2976, + "end": 2993, + "start": 2976, "type": "TagDeclarator", "value": "handleBottomEdge" }, @@ -2274,9 +2274,9 @@ description: Variables in memory after executing food-service-spatula.kcl 91.3213 ], "tag": { - "commentStart": 2995, - "end": 3009, - "start": 2995, + "commentStart": 3124, + "end": 3138, + "start": 3124, "type": "TagDeclarator", "value": "handleTopEdge" }, @@ -2536,9 +2536,9 @@ description: Variables in memory after executing food-service-spatula.kcl "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 4195, - "end": 4207, - "start": 4195, + "commentStart": 4324, + "end": 4336, + "start": 4324, "type": "TagDeclarator", "value": "gripEdgeTop" }, @@ -2698,9 +2698,9 @@ description: Variables in memory after executing food-service-spatula.kcl 7.0 ], "tag": { - "commentStart": 4195, - "end": 4207, - "start": 4195, + "commentStart": 4324, + "end": 4336, + "start": 4324, "type": "TagDeclarator", "value": "gripEdgeTop" }, diff --git a/rust/kcl-lib/tests/kcl_samples/gridfinity-baseplate-magnets/artifact_graph_flowchart.snap.md b/rust/kcl-lib/tests/kcl_samples/gridfinity-baseplate-magnets/artifact_graph_flowchart.snap.md index 967a84bfe..9a0f43ac2 100644 --- a/rust/kcl-lib/tests/kcl_samples/gridfinity-baseplate-magnets/artifact_graph_flowchart.snap.md +++ b/rust/kcl-lib/tests/kcl_samples/gridfinity-baseplate-magnets/artifact_graph_flowchart.snap.md @@ -1,100 +1,100 @@ ```mermaid flowchart LR subgraph path11 [Path] - 11["Path
[922, 947, 0]"] - 18["Segment
[955, 977, 0]"] - 21["Segment
[985, 1029, 0]"] - 23["Segment
[1037, 1064, 0]"] - 24["Segment
[1072, 1116, 0]"] - 26["Segment
[1124, 1131, 0]"] + 11["Path
[923, 948, 0]"] + 18["Segment
[956, 978, 0]"] + 21["Segment
[986, 1030, 0]"] + 23["Segment
[1038, 1065, 0]"] + 24["Segment
[1073, 1117, 0]"] + 26["Segment
[1125, 1132, 0]"] 74[Solid2d] end subgraph path12 [Path] - 12["Path
[922, 947, 0]"] - 19["Segment
[955, 977, 0]"] - 20["Segment
[985, 1029, 0]"] - 22["Segment
[1037, 1064, 0]"] - 25["Segment
[1072, 1116, 0]"] - 27["Segment
[1124, 1131, 0]"] + 12["Path
[923, 948, 0]"] + 19["Segment
[956, 978, 0]"] + 20["Segment
[986, 1030, 0]"] + 22["Segment
[1038, 1065, 0]"] + 25["Segment
[1073, 1117, 0]"] + 27["Segment
[1125, 1132, 0]"] 77[Solid2d] end subgraph path13 [Path] - 13["Path
[2723, 2810, 0]"] - 28["Segment
[2818, 2897, 0]"] - 30["Segment
[2905, 2970, 0]"] - 32["Segment
[2978, 3060, 0]"] - 34["Segment
[3068, 3114, 0]"] - 37["Segment
[3122, 3201, 0]"] - 38["Segment
[3209, 3276, 0]"] - 40["Segment
[3284, 3363, 0]"] - 42["Segment
[3371, 3417, 0]"] - 44["Segment
[3425, 3507, 0]"] - 46["Segment
[3515, 3583, 0]"] - 49["Segment
[3591, 3670, 0]"] - 50["Segment
[3678, 3743, 0]"] - 52["Segment
[3751, 3833, 0]"] - 55["Segment
[3841, 3909, 0]"] - 56["Segment
[3917, 3999, 0]"] - 59["Segment
[4007, 4056, 0]"] - 61["Segment
[4064, 4071, 0]"] + 13["Path
[2725, 2812, 0]"] + 28["Segment
[2820, 2899, 0]"] + 30["Segment
[2907, 2972, 0]"] + 32["Segment
[2980, 3062, 0]"] + 34["Segment
[3070, 3116, 0]"] + 37["Segment
[3124, 3203, 0]"] + 38["Segment
[3211, 3278, 0]"] + 40["Segment
[3286, 3365, 0]"] + 42["Segment
[3373, 3419, 0]"] + 44["Segment
[3427, 3509, 0]"] + 46["Segment
[3517, 3585, 0]"] + 49["Segment
[3593, 3672, 0]"] + 50["Segment
[3680, 3745, 0]"] + 52["Segment
[3753, 3835, 0]"] + 55["Segment
[3843, 3911, 0]"] + 56["Segment
[3919, 4001, 0]"] + 59["Segment
[4009, 4058, 0]"] + 61["Segment
[4066, 4073, 0]"] 71[Solid2d] end subgraph path14 [Path] - 14["Path
[2723, 2810, 0]"] - 29["Segment
[2818, 2897, 0]"] - 31["Segment
[2905, 2970, 0]"] - 33["Segment
[2978, 3060, 0]"] - 35["Segment
[3068, 3114, 0]"] - 36["Segment
[3122, 3201, 0]"] - 39["Segment
[3209, 3276, 0]"] - 41["Segment
[3284, 3363, 0]"] - 43["Segment
[3371, 3417, 0]"] - 45["Segment
[3425, 3507, 0]"] - 47["Segment
[3515, 3583, 0]"] - 48["Segment
[3591, 3670, 0]"] - 51["Segment
[3678, 3743, 0]"] - 53["Segment
[3751, 3833, 0]"] - 54["Segment
[3841, 3909, 0]"] - 57["Segment
[3917, 3999, 0]"] - 58["Segment
[4007, 4056, 0]"] - 60["Segment
[4064, 4071, 0]"] + 14["Path
[2725, 2812, 0]"] + 29["Segment
[2820, 2899, 0]"] + 31["Segment
[2907, 2972, 0]"] + 33["Segment
[2980, 3062, 0]"] + 35["Segment
[3070, 3116, 0]"] + 36["Segment
[3124, 3203, 0]"] + 39["Segment
[3211, 3278, 0]"] + 41["Segment
[3286, 3365, 0]"] + 43["Segment
[3373, 3419, 0]"] + 45["Segment
[3427, 3509, 0]"] + 47["Segment
[3517, 3585, 0]"] + 48["Segment
[3593, 3672, 0]"] + 51["Segment
[3680, 3745, 0]"] + 53["Segment
[3753, 3835, 0]"] + 54["Segment
[3843, 3911, 0]"] + 57["Segment
[3919, 4001, 0]"] + 58["Segment
[4009, 4058, 0]"] + 60["Segment
[4066, 4073, 0]"] 72[Solid2d] end subgraph path15 [Path] - 15["Path
[4214, 4239, 0]"] - 62["Segment
[4247, 4288, 0]"] - 64["Segment
[4296, 4337, 0]"] - 67["Segment
[4345, 4398, 0]"] - 68["Segment
[4406, 4427, 0]"] + 15["Path
[4217, 4242, 0]"] + 62["Segment
[4250, 4291, 0]"] + 64["Segment
[4299, 4340, 0]"] + 67["Segment
[4348, 4401, 0]"] + 68["Segment
[4409, 4430, 0]"] 73[Solid2d] end subgraph path16 [Path] - 16["Path
[4214, 4239, 0]"] - 63["Segment
[4247, 4288, 0]"] - 65["Segment
[4296, 4337, 0]"] - 66["Segment
[4345, 4398, 0]"] - 69["Segment
[4406, 4427, 0]"] + 16["Path
[4217, 4242, 0]"] + 63["Segment
[4250, 4291, 0]"] + 65["Segment
[4299, 4340, 0]"] + 66["Segment
[4348, 4401, 0]"] + 69["Segment
[4409, 4430, 0]"] 76[Solid2d] end subgraph path17 [Path] - 17["Path
[4593, 4673, 0]"] - 70["Segment
[4593, 4673, 0]"] + 17["Path
[4596, 4676, 0]"] + 70["Segment
[4596, 4676, 0]"] 75[Solid2d] end - 1["Plane
[1217, 1255, 0]"] - 2["Plane
[1711, 1749, 0]"] - 3["Plane
[2695, 2715, 0]"] - 4["Plane
[4186, 4206, 0]"] - 5["Plane
[4570, 4587, 0]"] - 6["Plane
[5562, 5597, 0]"] - 7["StartSketchOnPlane
[894, 914, 0]"] - 8["StartSketchOnPlane
[894, 914, 0]"] - 9["StartSketchOnPlane
[4186, 4206, 0]"] - 10["StartSketchOnPlane
[2695, 2715, 0]"] - 78["Sweep Extrusion
[1204, 1298, 0]"] - 79["Sweep Revolve
[1698, 1780, 0]"] - 80["Sweep Extrusion
[5026, 5068, 0]"] - 81["Sweep Extrusion
[5680, 5731, 0]"] + 1["Plane
[1218, 1256, 0]"] + 2["Plane
[1712, 1750, 0]"] + 3["Plane
[2697, 2717, 0]"] + 4["Plane
[4189, 4209, 0]"] + 5["Plane
[4573, 4590, 0]"] + 6["Plane
[5565, 5600, 0]"] + 7["StartSketchOnPlane
[895, 915, 0]"] + 8["StartSketchOnPlane
[895, 915, 0]"] + 9["StartSketchOnPlane
[4189, 4209, 0]"] + 10["StartSketchOnPlane
[2697, 2717, 0]"] + 78["Sweep Extrusion
[1205, 1299, 0]"] + 79["Sweep Revolve
[1699, 1781, 0]"] + 80["Sweep Extrusion
[5029, 5071, 0]"] + 81["Sweep Extrusion
[5683, 5734, 0]"] 82[Wall] 83[Wall] 84[Wall] @@ -157,14 +157,14 @@ flowchart LR 141["SweepEdge Adjacent"] 142["SweepEdge Adjacent"] 143["SweepEdge Adjacent"] - 144["EdgeCut Fillet
[5131, 5470, 0]"] - 145["EdgeCut Fillet
[5131, 5470, 0]"] - 146["EdgeCut Fillet
[5131, 5470, 0]"] - 147["EdgeCut Fillet
[5131, 5470, 0]"] - 148["EdgeCut Fillet
[5795, 6139, 0]"] - 149["EdgeCut Fillet
[5795, 6139, 0]"] - 150["EdgeCut Fillet
[5795, 6139, 0]"] - 151["EdgeCut Fillet
[5795, 6139, 0]"] + 144["EdgeCut Fillet
[5134, 5473, 0]"] + 145["EdgeCut Fillet
[5134, 5473, 0]"] + 146["EdgeCut Fillet
[5134, 5473, 0]"] + 147["EdgeCut Fillet
[5134, 5473, 0]"] + 148["EdgeCut Fillet
[5798, 6142, 0]"] + 149["EdgeCut Fillet
[5798, 6142, 0]"] + 150["EdgeCut Fillet
[5798, 6142, 0]"] + 151["EdgeCut Fillet
[5798, 6142, 0]"] 1 <--x 8 1 --- 12 2 <--x 7 diff --git a/rust/kcl-lib/tests/kcl_samples/gridfinity-baseplate-magnets/ast.snap b/rust/kcl-lib/tests/kcl_samples/gridfinity-baseplate-magnets/ast.snap index 88bdae3e5..4bdf56835 100644 --- a/rust/kcl-lib/tests/kcl_samples/gridfinity-baseplate-magnets/ast.snap +++ b/rust/kcl-lib/tests/kcl_samples/gridfinity-baseplate-magnets/ast.snap @@ -920,7 +920,8 @@ description: Result of parsing gridfinity-baseplate-magnets.kcl "name": "plane", "start": 0, "type": "Identifier" - } + }, + "labeled": false } ], "start": 0, @@ -5192,7 +5193,8 @@ description: Result of parsing gridfinity-baseplate-magnets.kcl "name": "plane", "start": 0, "type": "Identifier" - } + }, + "labeled": false } ], "start": 0, @@ -5740,7 +5742,8 @@ description: Result of parsing gridfinity-baseplate-magnets.kcl "name": "plane", "start": 0, "type": "Identifier" - } + }, + "labeled": false } ], "start": 0, diff --git a/rust/kcl-lib/tests/kcl_samples/gridfinity-baseplate-magnets/program_memory.snap b/rust/kcl-lib/tests/kcl_samples/gridfinity-baseplate-magnets/program_memory.snap index 365060f12..56fe619bc 100644 --- a/rust/kcl-lib/tests/kcl_samples/gridfinity-baseplate-magnets/program_memory.snap +++ b/rust/kcl-lib/tests/kcl_samples/gridfinity-baseplate-magnets/program_memory.snap @@ -10955,9 +10955,9 @@ description: Variables in memory after executing gridfinity-baseplate-magnets.kc "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 4279, - "end": 4287, - "start": 4279, + "commentStart": 4282, + "end": 4290, + "start": 4282, "type": "TagDeclarator", "value": "line001" }, @@ -10968,9 +10968,9 @@ description: Variables in memory after executing gridfinity-baseplate-magnets.kc "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 4328, - "end": 4336, - "start": 4328, + "commentStart": 4331, + "end": 4339, + "start": 4331, "type": "TagDeclarator", "value": "line002" }, @@ -10981,9 +10981,9 @@ description: Variables in memory after executing gridfinity-baseplate-magnets.kc "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 4389, - "end": 4397, - "start": 4389, + "commentStart": 4392, + "end": 4400, + "start": 4392, "type": "TagDeclarator", "value": "line003" }, @@ -10994,9 +10994,9 @@ description: Variables in memory after executing gridfinity-baseplate-magnets.kc "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 4418, - "end": 4426, - "start": 4418, + "commentStart": 4421, + "end": 4429, + "start": 4421, "type": "TagDeclarator", "value": "line004" }, @@ -11017,9 +11017,9 @@ description: Variables in memory after executing gridfinity-baseplate-magnets.kc 0.0 ], "tag": { - "commentStart": 4279, - "end": 4287, - "start": 4279, + "commentStart": 4282, + "end": 4290, + "start": 4282, "type": "TagDeclarator", "value": "line001" }, @@ -11042,9 +11042,9 @@ description: Variables in memory after executing gridfinity-baseplate-magnets.kc 0.0 ], "tag": { - "commentStart": 4328, - "end": 4336, - "start": 4328, + "commentStart": 4331, + "end": 4339, + "start": 4331, "type": "TagDeclarator", "value": "line002" }, @@ -11067,9 +11067,9 @@ description: Variables in memory after executing gridfinity-baseplate-magnets.kc 42.0 ], "tag": { - "commentStart": 4389, - "end": 4397, - "start": 4389, + "commentStart": 4392, + "end": 4400, + "start": 4392, "type": "TagDeclarator", "value": "line003" }, @@ -11092,9 +11092,9 @@ description: Variables in memory after executing gridfinity-baseplate-magnets.kc 42.0 ], "tag": { - "commentStart": 4418, - "end": 4426, - "start": 4418, + "commentStart": 4421, + "end": 4429, + "start": 4421, "type": "TagDeclarator", "value": "line004" }, @@ -11201,9 +11201,9 @@ description: Variables in memory after executing gridfinity-baseplate-magnets.kc "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 4279, - "end": 4287, - "start": 4279, + "commentStart": 4282, + "end": 4290, + "start": 4282, "type": "TagDeclarator", "value": "line001" }, @@ -11214,9 +11214,9 @@ description: Variables in memory after executing gridfinity-baseplate-magnets.kc "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 4328, - "end": 4336, - "start": 4328, + "commentStart": 4331, + "end": 4339, + "start": 4331, "type": "TagDeclarator", "value": "line002" }, @@ -11227,9 +11227,9 @@ description: Variables in memory after executing gridfinity-baseplate-magnets.kc "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 4389, - "end": 4397, - "start": 4389, + "commentStart": 4392, + "end": 4400, + "start": 4392, "type": "TagDeclarator", "value": "line003" }, @@ -11240,9 +11240,9 @@ description: Variables in memory after executing gridfinity-baseplate-magnets.kc "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 4418, - "end": 4426, - "start": 4418, + "commentStart": 4421, + "end": 4429, + "start": 4421, "type": "TagDeclarator", "value": "line004" }, @@ -11263,9 +11263,9 @@ description: Variables in memory after executing gridfinity-baseplate-magnets.kc 0.0 ], "tag": { - "commentStart": 4279, - "end": 4287, - "start": 4279, + "commentStart": 4282, + "end": 4290, + "start": 4282, "type": "TagDeclarator", "value": "line001" }, @@ -11288,9 +11288,9 @@ description: Variables in memory after executing gridfinity-baseplate-magnets.kc 0.0 ], "tag": { - "commentStart": 4328, - "end": 4336, - "start": 4328, + "commentStart": 4331, + "end": 4339, + "start": 4331, "type": "TagDeclarator", "value": "line002" }, @@ -11313,9 +11313,9 @@ description: Variables in memory after executing gridfinity-baseplate-magnets.kc 42.0 ], "tag": { - "commentStart": 4389, - "end": 4397, - "start": 4389, + "commentStart": 4392, + "end": 4400, + "start": 4392, "type": "TagDeclarator", "value": "line003" }, @@ -11338,9 +11338,9 @@ description: Variables in memory after executing gridfinity-baseplate-magnets.kc 42.0 ], "tag": { - "commentStart": 4418, - "end": 4426, - "start": 4418, + "commentStart": 4421, + "end": 4429, + "start": 4421, "type": "TagDeclarator", "value": "line004" }, @@ -11521,9 +11521,9 @@ description: Variables in memory after executing gridfinity-baseplate-magnets.kc "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 4279, - "end": 4287, - "start": 4279, + "commentStart": 4282, + "end": 4290, + "start": 4282, "type": "TagDeclarator", "value": "line001" }, @@ -11534,9 +11534,9 @@ description: Variables in memory after executing gridfinity-baseplate-magnets.kc "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 4328, - "end": 4336, - "start": 4328, + "commentStart": 4331, + "end": 4339, + "start": 4331, "type": "TagDeclarator", "value": "line002" }, @@ -11547,9 +11547,9 @@ description: Variables in memory after executing gridfinity-baseplate-magnets.kc "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 4389, - "end": 4397, - "start": 4389, + "commentStart": 4392, + "end": 4400, + "start": 4392, "type": "TagDeclarator", "value": "line003" }, @@ -11560,9 +11560,9 @@ description: Variables in memory after executing gridfinity-baseplate-magnets.kc "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 4418, - "end": 4426, - "start": 4418, + "commentStart": 4421, + "end": 4429, + "start": 4421, "type": "TagDeclarator", "value": "line004" }, @@ -11583,9 +11583,9 @@ description: Variables in memory after executing gridfinity-baseplate-magnets.kc 0.0 ], "tag": { - "commentStart": 4279, - "end": 4287, - "start": 4279, + "commentStart": 4282, + "end": 4290, + "start": 4282, "type": "TagDeclarator", "value": "line001" }, @@ -11608,9 +11608,9 @@ description: Variables in memory after executing gridfinity-baseplate-magnets.kc 0.0 ], "tag": { - "commentStart": 4328, - "end": 4336, - "start": 4328, + "commentStart": 4331, + "end": 4339, + "start": 4331, "type": "TagDeclarator", "value": "line002" }, @@ -11633,9 +11633,9 @@ description: Variables in memory after executing gridfinity-baseplate-magnets.kc 42.0 ], "tag": { - "commentStart": 4389, - "end": 4397, - "start": 4389, + "commentStart": 4392, + "end": 4400, + "start": 4392, "type": "TagDeclarator", "value": "line003" }, @@ -11658,9 +11658,9 @@ description: Variables in memory after executing gridfinity-baseplate-magnets.kc 42.0 ], "tag": { - "commentStart": 4418, - "end": 4426, - "start": 4418, + "commentStart": 4421, + "end": 4429, + "start": 4421, "type": "TagDeclarator", "value": "line004" }, @@ -11767,9 +11767,9 @@ description: Variables in memory after executing gridfinity-baseplate-magnets.kc "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 4279, - "end": 4287, - "start": 4279, + "commentStart": 4282, + "end": 4290, + "start": 4282, "type": "TagDeclarator", "value": "line001" }, @@ -11780,9 +11780,9 @@ description: Variables in memory after executing gridfinity-baseplate-magnets.kc "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 4328, - "end": 4336, - "start": 4328, + "commentStart": 4331, + "end": 4339, + "start": 4331, "type": "TagDeclarator", "value": "line002" }, @@ -11793,9 +11793,9 @@ description: Variables in memory after executing gridfinity-baseplate-magnets.kc "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 4389, - "end": 4397, - "start": 4389, + "commentStart": 4392, + "end": 4400, + "start": 4392, "type": "TagDeclarator", "value": "line003" }, @@ -11806,9 +11806,9 @@ description: Variables in memory after executing gridfinity-baseplate-magnets.kc "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 4418, - "end": 4426, - "start": 4418, + "commentStart": 4421, + "end": 4429, + "start": 4421, "type": "TagDeclarator", "value": "line004" }, @@ -11829,9 +11829,9 @@ description: Variables in memory after executing gridfinity-baseplate-magnets.kc 0.0 ], "tag": { - "commentStart": 4279, - "end": 4287, - "start": 4279, + "commentStart": 4282, + "end": 4290, + "start": 4282, "type": "TagDeclarator", "value": "line001" }, @@ -11854,9 +11854,9 @@ description: Variables in memory after executing gridfinity-baseplate-magnets.kc 0.0 ], "tag": { - "commentStart": 4328, - "end": 4336, - "start": 4328, + "commentStart": 4331, + "end": 4339, + "start": 4331, "type": "TagDeclarator", "value": "line002" }, @@ -11879,9 +11879,9 @@ description: Variables in memory after executing gridfinity-baseplate-magnets.kc 42.0 ], "tag": { - "commentStart": 4389, - "end": 4397, - "start": 4389, + "commentStart": 4392, + "end": 4400, + "start": 4392, "type": "TagDeclarator", "value": "line003" }, @@ -11904,9 +11904,9 @@ description: Variables in memory after executing gridfinity-baseplate-magnets.kc 42.0 ], "tag": { - "commentStart": 4418, - "end": 4426, - "start": 4418, + "commentStart": 4421, + "end": 4429, + "start": 4421, "type": "TagDeclarator", "value": "line004" }, @@ -12091,9 +12091,9 @@ description: Variables in memory after executing gridfinity-baseplate-magnets.kc 0.0 ], "tag": { - "commentStart": 4279, - "end": 4287, - "start": 4279, + "commentStart": 4282, + "end": 4290, + "start": 4282, "type": "TagDeclarator", "value": "line001" }, @@ -12116,9 +12116,9 @@ description: Variables in memory after executing gridfinity-baseplate-magnets.kc 0.0 ], "tag": { - "commentStart": 4328, - "end": 4336, - "start": 4328, + "commentStart": 4331, + "end": 4339, + "start": 4331, "type": "TagDeclarator", "value": "line002" }, @@ -12141,9 +12141,9 @@ description: Variables in memory after executing gridfinity-baseplate-magnets.kc 42.0 ], "tag": { - "commentStart": 4389, - "end": 4397, - "start": 4389, + "commentStart": 4392, + "end": 4400, + "start": 4392, "type": "TagDeclarator", "value": "line003" }, @@ -12166,9 +12166,9 @@ description: Variables in memory after executing gridfinity-baseplate-magnets.kc 42.0 ], "tag": { - "commentStart": 4418, - "end": 4426, - "start": 4418, + "commentStart": 4421, + "end": 4429, + "start": 4421, "type": "TagDeclarator", "value": "line004" }, @@ -12271,9 +12271,9 @@ description: Variables in memory after executing gridfinity-baseplate-magnets.kc 0.0 ], "tag": { - "commentStart": 4279, - "end": 4287, - "start": 4279, + "commentStart": 4282, + "end": 4290, + "start": 4282, "type": "TagDeclarator", "value": "line001" }, @@ -12296,9 +12296,9 @@ description: Variables in memory after executing gridfinity-baseplate-magnets.kc 0.0 ], "tag": { - "commentStart": 4328, - "end": 4336, - "start": 4328, + "commentStart": 4331, + "end": 4339, + "start": 4331, "type": "TagDeclarator", "value": "line002" }, @@ -12321,9 +12321,9 @@ description: Variables in memory after executing gridfinity-baseplate-magnets.kc 42.0 ], "tag": { - "commentStart": 4389, - "end": 4397, - "start": 4389, + "commentStart": 4392, + "end": 4400, + "start": 4392, "type": "TagDeclarator", "value": "line003" }, @@ -12346,9 +12346,9 @@ description: Variables in memory after executing gridfinity-baseplate-magnets.kc 42.0 ], "tag": { - "commentStart": 4418, - "end": 4426, - "start": 4418, + "commentStart": 4421, + "end": 4429, + "start": 4421, "type": "TagDeclarator", "value": "line004" }, diff --git a/rust/kcl-lib/tests/kcl_samples/gridfinity-baseplate/artifact_graph_flowchart.snap.md b/rust/kcl-lib/tests/kcl_samples/gridfinity-baseplate/artifact_graph_flowchart.snap.md index e40763c70..52c29e483 100644 --- a/rust/kcl-lib/tests/kcl_samples/gridfinity-baseplate/artifact_graph_flowchart.snap.md +++ b/rust/kcl-lib/tests/kcl_samples/gridfinity-baseplate/artifact_graph_flowchart.snap.md @@ -1,29 +1,29 @@ ```mermaid flowchart LR subgraph path5 [Path] - 5["Path
[799, 824, 0]"] - 7["Segment
[832, 854, 0]"] - 10["Segment
[862, 906, 0]"] - 12["Segment
[914, 941, 0]"] - 13["Segment
[949, 993, 0]"] - 15["Segment
[1001, 1008, 0]"] + 5["Path
[800, 825, 0]"] + 7["Segment
[833, 855, 0]"] + 10["Segment
[863, 907, 0]"] + 12["Segment
[915, 942, 0]"] + 13["Segment
[950, 994, 0]"] + 15["Segment
[1002, 1009, 0]"] 17[Solid2d] end subgraph path6 [Path] - 6["Path
[799, 824, 0]"] - 8["Segment
[832, 854, 0]"] - 9["Segment
[862, 906, 0]"] - 11["Segment
[914, 941, 0]"] - 14["Segment
[949, 993, 0]"] - 16["Segment
[1001, 1008, 0]"] + 6["Path
[800, 825, 0]"] + 8["Segment
[833, 855, 0]"] + 9["Segment
[863, 907, 0]"] + 11["Segment
[915, 942, 0]"] + 14["Segment
[950, 994, 0]"] + 16["Segment
[1002, 1009, 0]"] 18[Solid2d] end - 1["Plane
[1094, 1132, 0]"] - 2["Plane
[1588, 1626, 0]"] - 3["StartSketchOnPlane
[771, 791, 0]"] - 4["StartSketchOnPlane
[771, 791, 0]"] - 19["Sweep Extrusion
[1081, 1175, 0]"] - 20["Sweep Revolve
[1575, 1657, 0]"] + 1["Plane
[1095, 1133, 0]"] + 2["Plane
[1589, 1627, 0]"] + 3["StartSketchOnPlane
[772, 792, 0]"] + 4["StartSketchOnPlane
[772, 792, 0]"] + 19["Sweep Extrusion
[1082, 1176, 0]"] + 20["Sweep Revolve
[1576, 1658, 0]"] 21[Wall] 22[Wall] 23[Wall] diff --git a/rust/kcl-lib/tests/kcl_samples/gridfinity-baseplate/ast.snap b/rust/kcl-lib/tests/kcl_samples/gridfinity-baseplate/ast.snap index 8ebb63b09..3399ab139 100644 --- a/rust/kcl-lib/tests/kcl_samples/gridfinity-baseplate/ast.snap +++ b/rust/kcl-lib/tests/kcl_samples/gridfinity-baseplate/ast.snap @@ -821,7 +821,8 @@ description: Result of parsing gridfinity-baseplate.kcl "name": "plane", "start": 0, "type": "Identifier" - } + }, + "labeled": false } ], "start": 0, diff --git a/rust/kcl-lib/tests/kcl_samples/gridfinity-bins-stacking-lip/artifact_graph_flowchart.snap.md b/rust/kcl-lib/tests/kcl_samples/gridfinity-bins-stacking-lip/artifact_graph_flowchart.snap.md index bae105a17..a808a7124 100644 --- a/rust/kcl-lib/tests/kcl_samples/gridfinity-bins-stacking-lip/artifact_graph_flowchart.snap.md +++ b/rust/kcl-lib/tests/kcl_samples/gridfinity-bins-stacking-lip/artifact_graph_flowchart.snap.md @@ -1,118 +1,118 @@ ```mermaid flowchart LR subgraph path13 [Path] - 13["Path
[1187, 1233, 0]"] - 22["Segment
[1241, 1263, 0]"] - 25["Segment
[1271, 1301, 0]"] - 26["Segment
[1309, 1353, 0]"] - 28["Segment
[1361, 1388, 0]"] - 30["Segment
[1396, 1440, 0]"] - 32["Segment
[1448, 1455, 0]"] + 13["Path
[1188, 1234, 0]"] + 22["Segment
[1242, 1264, 0]"] + 25["Segment
[1272, 1302, 0]"] + 26["Segment
[1310, 1354, 0]"] + 28["Segment
[1362, 1389, 0]"] + 30["Segment
[1397, 1441, 0]"] + 32["Segment
[1449, 1456, 0]"] 79[Solid2d] end subgraph path14 [Path] - 14["Path
[1187, 1233, 0]"] - 23["Segment
[1241, 1263, 0]"] - 24["Segment
[1271, 1301, 0]"] - 27["Segment
[1309, 1353, 0]"] - 29["Segment
[1361, 1388, 0]"] - 31["Segment
[1396, 1440, 0]"] - 33["Segment
[1448, 1455, 0]"] + 14["Path
[1188, 1234, 0]"] + 23["Segment
[1242, 1264, 0]"] + 24["Segment
[1272, 1302, 0]"] + 27["Segment
[1310, 1354, 0]"] + 29["Segment
[1362, 1389, 0]"] + 31["Segment
[1397, 1441, 0]"] + 33["Segment
[1449, 1456, 0]"] 80[Solid2d] end subgraph path15 [Path] - 15["Path
[2496, 2584, 0]"] - 34["Segment
[2590, 2654, 0]"] - 35["Segment
[2660, 2724, 0]"] - 36["Segment
[2730, 2783, 0]"] - 37["Segment
[2789, 2810, 0]"] + 15["Path
[2497, 2585, 0]"] + 34["Segment
[2591, 2655, 0]"] + 35["Segment
[2661, 2725, 0]"] + 36["Segment
[2731, 2784, 0]"] + 37["Segment
[2790, 2811, 0]"] 77[Solid2d] end subgraph path16 [Path] - 16["Path
[3141, 3307, 0]"] - 38["Segment
[3141, 3307, 0]"] + 16["Path
[3142, 3308, 0]"] + 38["Segment
[3142, 3308, 0]"] 76[Solid2d] end subgraph path17 [Path] - 17["Path
[4591, 4616, 0]"] - 39["Segment
[4622, 4694, 0]"] - 40["Segment
[4700, 4773, 0]"] - 41["Segment
[4779, 4832, 0]"] - 42["Segment
[4838, 4859, 0]"] + 17["Path
[4592, 4617, 0]"] + 39["Segment
[4623, 4695, 0]"] + 40["Segment
[4701, 4774, 0]"] + 41["Segment
[4780, 4833, 0]"] + 42["Segment
[4839, 4860, 0]"] 75[Solid2d] end subgraph path18 [Path] - 18["Path
[5326, 5351, 0]"] - 45["Segment
[5411, 5454, 0]"] - 49["Segment
[5462, 5582, 0]"] - 53["Segment
[5645, 5694, 0]"] - 56["Segment
[5702, 5727, 0]"] - 60["Segment
[5735, 5778, 0]"] - 65["Segment
[5786, 5811, 0]"] - 68["Segment
[5819, 5863, 0]"] - 74["Segment
[5871, 5878, 0]"] + 18["Path
[5328, 5353, 0]"] + 45["Segment
[5413, 5456, 0]"] + 49["Segment
[5464, 5584, 0]"] + 53["Segment
[5647, 5696, 0]"] + 56["Segment
[5704, 5729, 0]"] + 60["Segment
[5737, 5780, 0]"] + 65["Segment
[5788, 5813, 0]"] + 68["Segment
[5821, 5865, 0]"] + 74["Segment
[5873, 5880, 0]"] 78[Solid2d] end subgraph path19 [Path] - 19["Path
[5326, 5351, 0]"] - 43["Segment
[5411, 5454, 0]"] - 47["Segment
[5462, 5582, 0]"] - 51["Segment
[5645, 5694, 0]"] - 57["Segment
[5702, 5727, 0]"] - 59["Segment
[5735, 5778, 0]"] - 63["Segment
[5786, 5811, 0]"] - 67["Segment
[5819, 5863, 0]"] - 72["Segment
[5871, 5878, 0]"] + 19["Path
[5328, 5353, 0]"] + 43["Segment
[5413, 5456, 0]"] + 47["Segment
[5464, 5584, 0]"] + 51["Segment
[5647, 5696, 0]"] + 57["Segment
[5704, 5729, 0]"] + 59["Segment
[5737, 5780, 0]"] + 63["Segment
[5788, 5813, 0]"] + 67["Segment
[5821, 5865, 0]"] + 72["Segment
[5873, 5880, 0]"] 81[Solid2d] end subgraph path20 [Path] - 20["Path
[5326, 5351, 0]"] - 44["Segment
[5411, 5454, 0]"] - 48["Segment
[5462, 5582, 0]"] - 52["Segment
[5645, 5694, 0]"] - 58["Segment
[5702, 5727, 0]"] - 61["Segment
[5735, 5778, 0]"] - 64["Segment
[5786, 5811, 0]"] - 69["Segment
[5819, 5863, 0]"] - 73["Segment
[5871, 5878, 0]"] + 20["Path
[5328, 5353, 0]"] + 44["Segment
[5413, 5456, 0]"] + 48["Segment
[5464, 5584, 0]"] + 52["Segment
[5647, 5696, 0]"] + 58["Segment
[5704, 5729, 0]"] + 61["Segment
[5737, 5780, 0]"] + 64["Segment
[5788, 5813, 0]"] + 69["Segment
[5821, 5865, 0]"] + 73["Segment
[5873, 5880, 0]"] 82[Solid2d] end subgraph path21 [Path] - 21["Path
[5326, 5351, 0]"] - 46["Segment
[5411, 5454, 0]"] - 50["Segment
[5462, 5582, 0]"] - 54["Segment
[5645, 5694, 0]"] - 55["Segment
[5702, 5727, 0]"] - 62["Segment
[5735, 5778, 0]"] - 66["Segment
[5786, 5811, 0]"] - 70["Segment
[5819, 5863, 0]"] - 71["Segment
[5871, 5878, 0]"] + 21["Path
[5328, 5353, 0]"] + 46["Segment
[5413, 5456, 0]"] + 50["Segment
[5464, 5584, 0]"] + 54["Segment
[5647, 5696, 0]"] + 55["Segment
[5704, 5729, 0]"] + 62["Segment
[5737, 5780, 0]"] + 66["Segment
[5788, 5813, 0]"] + 70["Segment
[5821, 5865, 0]"] + 71["Segment
[5873, 5880, 0]"] 83[Solid2d] end - 1["Plane
[1541, 1588, 0]"] - 2["Plane
[2120, 2167, 0]"] - 3["Plane
[2473, 2490, 0]"] - 4["Plane
[4552, 4584, 0]"] - 5["Plane
[5298, 5318, 0]"] - 6["Plane
[5298, 5318, 0]"] - 7["Plane
[5298, 5318, 0]"] - 8["Plane
[5298, 5318, 0]"] - 9["StartSketchOnPlane
[4538, 4585, 0]"] - 10["StartSketchOnPlane
[1159, 1179, 0]"] - 11["StartSketchOnPlane
[1159, 1179, 0]"] - 12["StartSketchOnFace
[3093, 3135, 0]"] - 84["Sweep Extrusion
[1528, 1631, 0]"] - 85["Sweep Revolve
[2107, 2198, 0]"] - 86["Sweep Extrusion
[2816, 2840, 0]"] - 87["Sweep Extrusion
[3529, 3556, 0]"] - 88["Sweep Extrusion
[3529, 3556, 0]"] - 89["Sweep Extrusion
[3529, 3556, 0]"] - 90["Sweep Extrusion
[3529, 3556, 0]"] - 91["Sweep Extrusion
[4865, 4909, 0]"] - 92["Sweep Extrusion
[6516, 6628, 0]"] - 93["Sweep Extrusion
[6694, 6808, 0]"] - 94["Sweep Revolve
[7634, 7689, 0]"] - 95["Sweep Revolve
[7751, 7805, 0]"] + 1["Plane
[1542, 1589, 0]"] + 2["Plane
[2121, 2168, 0]"] + 3["Plane
[2474, 2491, 0]"] + 4["Plane
[4553, 4585, 0]"] + 5["Plane
[5300, 5320, 0]"] + 6["Plane
[5300, 5320, 0]"] + 7["Plane
[5300, 5320, 0]"] + 8["Plane
[5300, 5320, 0]"] + 9["StartSketchOnPlane
[4539, 4586, 0]"] + 10["StartSketchOnPlane
[1160, 1180, 0]"] + 11["StartSketchOnPlane
[1160, 1180, 0]"] + 12["StartSketchOnFace
[3094, 3136, 0]"] + 84["Sweep Extrusion
[1529, 1632, 0]"] + 85["Sweep Revolve
[2108, 2199, 0]"] + 86["Sweep Extrusion
[2817, 2841, 0]"] + 87["Sweep Extrusion
[3530, 3557, 0]"] + 88["Sweep Extrusion
[3530, 3557, 0]"] + 89["Sweep Extrusion
[3530, 3557, 0]"] + 90["Sweep Extrusion
[3530, 3557, 0]"] + 91["Sweep Extrusion
[4866, 4910, 0]"] + 92["Sweep Extrusion
[6518, 6630, 0]"] + 93["Sweep Extrusion
[6696, 6810, 0]"] + 94["Sweep Revolve
[7636, 7691, 0]"] + 95["Sweep Revolve
[7753, 7807, 0]"] 96[Wall] 97[Wall] 98[Wall] @@ -283,14 +283,14 @@ flowchart LR 263["SweepEdge Adjacent"] 264["SweepEdge Adjacent"] 265["SweepEdge Adjacent"] - 266["EdgeCut Fillet
[2846, 3076, 0]"] - 267["EdgeCut Fillet
[2846, 3076, 0]"] - 268["EdgeCut Fillet
[2846, 3076, 0]"] - 269["EdgeCut Fillet
[2846, 3076, 0]"] - 270["EdgeCut Fillet
[4915, 5148, 0]"] - 271["EdgeCut Fillet
[4915, 5148, 0]"] - 272["EdgeCut Fillet
[4915, 5148, 0]"] - 273["EdgeCut Fillet
[4915, 5148, 0]"] + 266["EdgeCut Fillet
[2847, 3077, 0]"] + 267["EdgeCut Fillet
[2847, 3077, 0]"] + 268["EdgeCut Fillet
[2847, 3077, 0]"] + 269["EdgeCut Fillet
[2847, 3077, 0]"] + 270["EdgeCut Fillet
[4916, 5149, 0]"] + 271["EdgeCut Fillet
[4916, 5149, 0]"] + 272["EdgeCut Fillet
[4916, 5149, 0]"] + 273["EdgeCut Fillet
[4916, 5149, 0]"] 1 <--x 10 1 --- 14 2 <--x 11 diff --git a/rust/kcl-lib/tests/kcl_samples/gridfinity-bins-stacking-lip/ast.snap b/rust/kcl-lib/tests/kcl_samples/gridfinity-bins-stacking-lip/ast.snap index b9cbd0d43..5640a569a 100644 --- a/rust/kcl-lib/tests/kcl_samples/gridfinity-bins-stacking-lip/ast.snap +++ b/rust/kcl-lib/tests/kcl_samples/gridfinity-bins-stacking-lip/ast.snap @@ -1503,7 +1503,8 @@ description: Result of parsing gridfinity-bins-stacking-lip.kcl "name": "plane", "start": 0, "type": "Identifier" - } + }, + "labeled": false } ], "start": 0, @@ -7495,7 +7496,8 @@ description: Result of parsing gridfinity-bins-stacking-lip.kcl "name": "plane", "start": 0, "type": "Identifier" - } + }, + "labeled": false } ], "start": 0, diff --git a/rust/kcl-lib/tests/kcl_samples/gridfinity-bins-stacking-lip/program_memory.snap b/rust/kcl-lib/tests/kcl_samples/gridfinity-bins-stacking-lip/program_memory.snap index cd0583966..a2b890012 100644 --- a/rust/kcl-lib/tests/kcl_samples/gridfinity-bins-stacking-lip/program_memory.snap +++ b/rust/kcl-lib/tests/kcl_samples/gridfinity-bins-stacking-lip/program_memory.snap @@ -5575,9 +5575,9 @@ description: Variables in memory after executing gridfinity-bins-stacking-lip.kc "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 2645, - "end": 2653, - "start": 2645, + "commentStart": 2646, + "end": 2654, + "start": 2646, "type": "TagDeclarator", "value": "line000" }, @@ -5588,9 +5588,9 @@ description: Variables in memory after executing gridfinity-bins-stacking-lip.kc "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 2715, - "end": 2723, - "start": 2715, + "commentStart": 2716, + "end": 2724, + "start": 2716, "type": "TagDeclarator", "value": "line001" }, @@ -5601,9 +5601,9 @@ description: Variables in memory after executing gridfinity-bins-stacking-lip.kc "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 2774, - "end": 2782, - "start": 2774, + "commentStart": 2775, + "end": 2783, + "start": 2775, "type": "TagDeclarator", "value": "line002" }, @@ -5614,9 +5614,9 @@ description: Variables in memory after executing gridfinity-bins-stacking-lip.kc "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 2801, - "end": 2809, - "start": 2801, + "commentStart": 2802, + "end": 2810, + "start": 2802, "type": "TagDeclarator", "value": "line003" }, @@ -5637,9 +5637,9 @@ description: Variables in memory after executing gridfinity-bins-stacking-lip.kc 3.2 ], "tag": { - "commentStart": 2645, - "end": 2653, - "start": 2645, + "commentStart": 2646, + "end": 2654, + "start": 2646, "type": "TagDeclarator", "value": "line000" }, @@ -5662,9 +5662,9 @@ description: Variables in memory after executing gridfinity-bins-stacking-lip.kc 3.2 ], "tag": { - "commentStart": 2715, - "end": 2723, - "start": 2715, + "commentStart": 2716, + "end": 2724, + "start": 2716, "type": "TagDeclarator", "value": "line001" }, @@ -5687,9 +5687,9 @@ description: Variables in memory after executing gridfinity-bins-stacking-lip.kc 38.8 ], "tag": { - "commentStart": 2774, - "end": 2782, - "start": 2774, + "commentStart": 2775, + "end": 2783, + "start": 2775, "type": "TagDeclarator", "value": "line002" }, @@ -5712,9 +5712,9 @@ description: Variables in memory after executing gridfinity-bins-stacking-lip.kc 38.8 ], "tag": { - "commentStart": 2801, - "end": 2809, - "start": 2801, + "commentStart": 2802, + "end": 2810, + "start": 2802, "type": "TagDeclarator", "value": "line003" }, @@ -5895,9 +5895,9 @@ description: Variables in memory after executing gridfinity-bins-stacking-lip.kc "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 2645, - "end": 2653, - "start": 2645, + "commentStart": 2646, + "end": 2654, + "start": 2646, "type": "TagDeclarator", "value": "line000" }, @@ -5908,9 +5908,9 @@ description: Variables in memory after executing gridfinity-bins-stacking-lip.kc "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 2715, - "end": 2723, - "start": 2715, + "commentStart": 2716, + "end": 2724, + "start": 2716, "type": "TagDeclarator", "value": "line001" }, @@ -5921,9 +5921,9 @@ description: Variables in memory after executing gridfinity-bins-stacking-lip.kc "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 2774, - "end": 2782, - "start": 2774, + "commentStart": 2775, + "end": 2783, + "start": 2775, "type": "TagDeclarator", "value": "line002" }, @@ -5934,9 +5934,9 @@ description: Variables in memory after executing gridfinity-bins-stacking-lip.kc "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 2801, - "end": 2809, - "start": 2801, + "commentStart": 2802, + "end": 2810, + "start": 2802, "type": "TagDeclarator", "value": "line003" }, @@ -5957,9 +5957,9 @@ description: Variables in memory after executing gridfinity-bins-stacking-lip.kc 3.2 ], "tag": { - "commentStart": 2645, - "end": 2653, - "start": 2645, + "commentStart": 2646, + "end": 2654, + "start": 2646, "type": "TagDeclarator", "value": "line000" }, @@ -5982,9 +5982,9 @@ description: Variables in memory after executing gridfinity-bins-stacking-lip.kc 3.2 ], "tag": { - "commentStart": 2715, - "end": 2723, - "start": 2715, + "commentStart": 2716, + "end": 2724, + "start": 2716, "type": "TagDeclarator", "value": "line001" }, @@ -6007,9 +6007,9 @@ description: Variables in memory after executing gridfinity-bins-stacking-lip.kc 38.8 ], "tag": { - "commentStart": 2774, - "end": 2782, - "start": 2774, + "commentStart": 2775, + "end": 2783, + "start": 2775, "type": "TagDeclarator", "value": "line002" }, @@ -6032,9 +6032,9 @@ description: Variables in memory after executing gridfinity-bins-stacking-lip.kc 38.8 ], "tag": { - "commentStart": 2801, - "end": 2809, - "start": 2801, + "commentStart": 2802, + "end": 2810, + "start": 2802, "type": "TagDeclarator", "value": "line003" }, @@ -6215,9 +6215,9 @@ description: Variables in memory after executing gridfinity-bins-stacking-lip.kc "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 2645, - "end": 2653, - "start": 2645, + "commentStart": 2646, + "end": 2654, + "start": 2646, "type": "TagDeclarator", "value": "line000" }, @@ -6228,9 +6228,9 @@ description: Variables in memory after executing gridfinity-bins-stacking-lip.kc "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 2715, - "end": 2723, - "start": 2715, + "commentStart": 2716, + "end": 2724, + "start": 2716, "type": "TagDeclarator", "value": "line001" }, @@ -6241,9 +6241,9 @@ description: Variables in memory after executing gridfinity-bins-stacking-lip.kc "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 2774, - "end": 2782, - "start": 2774, + "commentStart": 2775, + "end": 2783, + "start": 2775, "type": "TagDeclarator", "value": "line002" }, @@ -6254,9 +6254,9 @@ description: Variables in memory after executing gridfinity-bins-stacking-lip.kc "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 2801, - "end": 2809, - "start": 2801, + "commentStart": 2802, + "end": 2810, + "start": 2802, "type": "TagDeclarator", "value": "line003" }, @@ -6277,9 +6277,9 @@ description: Variables in memory after executing gridfinity-bins-stacking-lip.kc 3.2 ], "tag": { - "commentStart": 2645, - "end": 2653, - "start": 2645, + "commentStart": 2646, + "end": 2654, + "start": 2646, "type": "TagDeclarator", "value": "line000" }, @@ -6302,9 +6302,9 @@ description: Variables in memory after executing gridfinity-bins-stacking-lip.kc 3.2 ], "tag": { - "commentStart": 2715, - "end": 2723, - "start": 2715, + "commentStart": 2716, + "end": 2724, + "start": 2716, "type": "TagDeclarator", "value": "line001" }, @@ -6327,9 +6327,9 @@ description: Variables in memory after executing gridfinity-bins-stacking-lip.kc 38.8 ], "tag": { - "commentStart": 2774, - "end": 2782, - "start": 2774, + "commentStart": 2775, + "end": 2783, + "start": 2775, "type": "TagDeclarator", "value": "line002" }, @@ -6352,9 +6352,9 @@ description: Variables in memory after executing gridfinity-bins-stacking-lip.kc 38.8 ], "tag": { - "commentStart": 2801, - "end": 2809, - "start": 2801, + "commentStart": 2802, + "end": 2810, + "start": 2802, "type": "TagDeclarator", "value": "line003" }, @@ -6535,9 +6535,9 @@ description: Variables in memory after executing gridfinity-bins-stacking-lip.kc "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 2645, - "end": 2653, - "start": 2645, + "commentStart": 2646, + "end": 2654, + "start": 2646, "type": "TagDeclarator", "value": "line000" }, @@ -6548,9 +6548,9 @@ description: Variables in memory after executing gridfinity-bins-stacking-lip.kc "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 2715, - "end": 2723, - "start": 2715, + "commentStart": 2716, + "end": 2724, + "start": 2716, "type": "TagDeclarator", "value": "line001" }, @@ -6561,9 +6561,9 @@ description: Variables in memory after executing gridfinity-bins-stacking-lip.kc "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 2774, - "end": 2782, - "start": 2774, + "commentStart": 2775, + "end": 2783, + "start": 2775, "type": "TagDeclarator", "value": "line002" }, @@ -6574,9 +6574,9 @@ description: Variables in memory after executing gridfinity-bins-stacking-lip.kc "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 2801, - "end": 2809, - "start": 2801, + "commentStart": 2802, + "end": 2810, + "start": 2802, "type": "TagDeclarator", "value": "line003" }, @@ -6597,9 +6597,9 @@ description: Variables in memory after executing gridfinity-bins-stacking-lip.kc 3.2 ], "tag": { - "commentStart": 2645, - "end": 2653, - "start": 2645, + "commentStart": 2646, + "end": 2654, + "start": 2646, "type": "TagDeclarator", "value": "line000" }, @@ -6622,9 +6622,9 @@ description: Variables in memory after executing gridfinity-bins-stacking-lip.kc 3.2 ], "tag": { - "commentStart": 2715, - "end": 2723, - "start": 2715, + "commentStart": 2716, + "end": 2724, + "start": 2716, "type": "TagDeclarator", "value": "line001" }, @@ -6647,9 +6647,9 @@ description: Variables in memory after executing gridfinity-bins-stacking-lip.kc 38.8 ], "tag": { - "commentStart": 2774, - "end": 2782, - "start": 2774, + "commentStart": 2775, + "end": 2783, + "start": 2775, "type": "TagDeclarator", "value": "line002" }, @@ -6672,9 +6672,9 @@ description: Variables in memory after executing gridfinity-bins-stacking-lip.kc 38.8 ], "tag": { - "commentStart": 2801, - "end": 2809, - "start": 2801, + "commentStart": 2802, + "end": 2810, + "start": 2802, "type": "TagDeclarator", "value": "line003" }, @@ -6855,9 +6855,9 @@ description: Variables in memory after executing gridfinity-bins-stacking-lip.kc "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 2645, - "end": 2653, - "start": 2645, + "commentStart": 2646, + "end": 2654, + "start": 2646, "type": "TagDeclarator", "value": "line000" }, @@ -6868,9 +6868,9 @@ description: Variables in memory after executing gridfinity-bins-stacking-lip.kc "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 2715, - "end": 2723, - "start": 2715, + "commentStart": 2716, + "end": 2724, + "start": 2716, "type": "TagDeclarator", "value": "line001" }, @@ -6881,9 +6881,9 @@ description: Variables in memory after executing gridfinity-bins-stacking-lip.kc "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 2774, - "end": 2782, - "start": 2774, + "commentStart": 2775, + "end": 2783, + "start": 2775, "type": "TagDeclarator", "value": "line002" }, @@ -6894,9 +6894,9 @@ description: Variables in memory after executing gridfinity-bins-stacking-lip.kc "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 2801, - "end": 2809, - "start": 2801, + "commentStart": 2802, + "end": 2810, + "start": 2802, "type": "TagDeclarator", "value": "line003" }, @@ -6917,9 +6917,9 @@ description: Variables in memory after executing gridfinity-bins-stacking-lip.kc 3.2 ], "tag": { - "commentStart": 2645, - "end": 2653, - "start": 2645, + "commentStart": 2646, + "end": 2654, + "start": 2646, "type": "TagDeclarator", "value": "line000" }, @@ -6942,9 +6942,9 @@ description: Variables in memory after executing gridfinity-bins-stacking-lip.kc 3.2 ], "tag": { - "commentStart": 2715, - "end": 2723, - "start": 2715, + "commentStart": 2716, + "end": 2724, + "start": 2716, "type": "TagDeclarator", "value": "line001" }, @@ -6967,9 +6967,9 @@ description: Variables in memory after executing gridfinity-bins-stacking-lip.kc 38.8 ], "tag": { - "commentStart": 2774, - "end": 2782, - "start": 2774, + "commentStart": 2775, + "end": 2783, + "start": 2775, "type": "TagDeclarator", "value": "line002" }, @@ -6992,9 +6992,9 @@ description: Variables in memory after executing gridfinity-bins-stacking-lip.kc 38.8 ], "tag": { - "commentStart": 2801, - "end": 2809, - "start": 2801, + "commentStart": 2802, + "end": 2810, + "start": 2802, "type": "TagDeclarator", "value": "line003" }, @@ -7175,9 +7175,9 @@ description: Variables in memory after executing gridfinity-bins-stacking-lip.kc "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 2645, - "end": 2653, - "start": 2645, + "commentStart": 2646, + "end": 2654, + "start": 2646, "type": "TagDeclarator", "value": "line000" }, @@ -7188,9 +7188,9 @@ description: Variables in memory after executing gridfinity-bins-stacking-lip.kc "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 2715, - "end": 2723, - "start": 2715, + "commentStart": 2716, + "end": 2724, + "start": 2716, "type": "TagDeclarator", "value": "line001" }, @@ -7201,9 +7201,9 @@ description: Variables in memory after executing gridfinity-bins-stacking-lip.kc "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 2774, - "end": 2782, - "start": 2774, + "commentStart": 2775, + "end": 2783, + "start": 2775, "type": "TagDeclarator", "value": "line002" }, @@ -7214,9 +7214,9 @@ description: Variables in memory after executing gridfinity-bins-stacking-lip.kc "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 2801, - "end": 2809, - "start": 2801, + "commentStart": 2802, + "end": 2810, + "start": 2802, "type": "TagDeclarator", "value": "line003" }, @@ -7237,9 +7237,9 @@ description: Variables in memory after executing gridfinity-bins-stacking-lip.kc 3.2 ], "tag": { - "commentStart": 2645, - "end": 2653, - "start": 2645, + "commentStart": 2646, + "end": 2654, + "start": 2646, "type": "TagDeclarator", "value": "line000" }, @@ -7262,9 +7262,9 @@ description: Variables in memory after executing gridfinity-bins-stacking-lip.kc 3.2 ], "tag": { - "commentStart": 2715, - "end": 2723, - "start": 2715, + "commentStart": 2716, + "end": 2724, + "start": 2716, "type": "TagDeclarator", "value": "line001" }, @@ -7287,9 +7287,9 @@ description: Variables in memory after executing gridfinity-bins-stacking-lip.kc 38.8 ], "tag": { - "commentStart": 2774, - "end": 2782, - "start": 2774, + "commentStart": 2775, + "end": 2783, + "start": 2775, "type": "TagDeclarator", "value": "line002" }, @@ -7312,9 +7312,9 @@ description: Variables in memory after executing gridfinity-bins-stacking-lip.kc 38.8 ], "tag": { - "commentStart": 2801, - "end": 2809, - "start": 2801, + "commentStart": 2802, + "end": 2810, + "start": 2802, "type": "TagDeclarator", "value": "line003" }, @@ -12954,9 +12954,9 @@ description: Variables in memory after executing gridfinity-bins-stacking-lip.kc "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 4685, - "end": 4693, - "start": 4685, + "commentStart": 4686, + "end": 4694, + "start": 4686, "type": "TagDeclarator", "value": "line010" }, @@ -12967,9 +12967,9 @@ description: Variables in memory after executing gridfinity-bins-stacking-lip.kc "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 4764, - "end": 4772, - "start": 4764, + "commentStart": 4765, + "end": 4773, + "start": 4765, "type": "TagDeclarator", "value": "line011" }, @@ -12980,9 +12980,9 @@ description: Variables in memory after executing gridfinity-bins-stacking-lip.kc "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 4823, - "end": 4831, - "start": 4823, + "commentStart": 4824, + "end": 4832, + "start": 4824, "type": "TagDeclarator", "value": "line012" }, @@ -12993,9 +12993,9 @@ description: Variables in memory after executing gridfinity-bins-stacking-lip.kc "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 4850, - "end": 4858, - "start": 4850, + "commentStart": 4851, + "end": 4859, + "start": 4851, "type": "TagDeclarator", "value": "line013" }, @@ -13016,9 +13016,9 @@ description: Variables in memory after executing gridfinity-bins-stacking-lip.kc 0.0 ], "tag": { - "commentStart": 4685, - "end": 4693, - "start": 4685, + "commentStart": 4686, + "end": 4694, + "start": 4686, "type": "TagDeclarator", "value": "line010" }, @@ -13041,9 +13041,9 @@ description: Variables in memory after executing gridfinity-bins-stacking-lip.kc 0.0 ], "tag": { - "commentStart": 4764, - "end": 4772, - "start": 4764, + "commentStart": 4765, + "end": 4773, + "start": 4765, "type": "TagDeclarator", "value": "line011" }, @@ -13066,9 +13066,9 @@ description: Variables in memory after executing gridfinity-bins-stacking-lip.kc 126.0 ], "tag": { - "commentStart": 4823, - "end": 4831, - "start": 4823, + "commentStart": 4824, + "end": 4832, + "start": 4824, "type": "TagDeclarator", "value": "line012" }, @@ -13091,9 +13091,9 @@ description: Variables in memory after executing gridfinity-bins-stacking-lip.kc 126.0 ], "tag": { - "commentStart": 4850, - "end": 4858, - "start": 4850, + "commentStart": 4851, + "end": 4859, + "start": 4851, "type": "TagDeclarator", "value": "line013" }, @@ -14303,9 +14303,9 @@ description: Variables in memory after executing gridfinity-bins-stacking-lip.kc "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 5445, - "end": 5453, - "start": 5445, + "commentStart": 5447, + "end": 5455, + "start": 5447, "type": "TagDeclarator", "value": "line000" }, @@ -14316,9 +14316,9 @@ description: Variables in memory after executing gridfinity-bins-stacking-lip.kc "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 5565, - "end": 5572, - "start": 5565, + "commentStart": 5567, + "end": 5574, + "start": 5567, "type": "TagDeclarator", "value": "arc000" }, @@ -14329,9 +14329,9 @@ description: Variables in memory after executing gridfinity-bins-stacking-lip.kc "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 5685, - "end": 5693, - "start": 5685, + "commentStart": 5687, + "end": 5695, + "start": 5687, "type": "TagDeclarator", "value": "line001" }, @@ -14387,9 +14387,9 @@ description: Variables in memory after executing gridfinity-bins-stacking-lip.kc 0.0 ], "tag": { - "commentStart": 5445, - "end": 5453, - "start": 5445, + "commentStart": 5447, + "end": 5455, + "start": 5447, "type": "TagDeclarator", "value": "line000" }, @@ -14418,9 +14418,9 @@ description: Variables in memory after executing gridfinity-bins-stacking-lip.kc ], "radius": 0.5, "tag": { - "commentStart": 5565, - "end": 5572, - "start": 5565, + "commentStart": 5567, + "end": 5574, + "start": 5567, "type": "TagDeclarator", "value": "arc000" }, @@ -14443,9 +14443,9 @@ description: Variables in memory after executing gridfinity-bins-stacking-lip.kc 6.1464 ], "tag": { - "commentStart": 5685, - "end": 5693, - "start": 5685, + "commentStart": 5687, + "end": 5695, + "start": 5687, "type": "TagDeclarator", "value": "line001" }, @@ -14643,9 +14643,9 @@ description: Variables in memory after executing gridfinity-bins-stacking-lip.kc "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 5445, - "end": 5453, - "start": 5445, + "commentStart": 5447, + "end": 5455, + "start": 5447, "type": "TagDeclarator", "value": "line000" }, @@ -14656,9 +14656,9 @@ description: Variables in memory after executing gridfinity-bins-stacking-lip.kc "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 5565, - "end": 5572, - "start": 5565, + "commentStart": 5567, + "end": 5574, + "start": 5567, "type": "TagDeclarator", "value": "arc000" }, @@ -14669,9 +14669,9 @@ description: Variables in memory after executing gridfinity-bins-stacking-lip.kc "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 5685, - "end": 5693, - "start": 5685, + "commentStart": 5687, + "end": 5695, + "start": 5687, "type": "TagDeclarator", "value": "line001" }, @@ -14727,9 +14727,9 @@ description: Variables in memory after executing gridfinity-bins-stacking-lip.kc 0.0 ], "tag": { - "commentStart": 5445, - "end": 5453, - "start": 5445, + "commentStart": 5447, + "end": 5455, + "start": 5447, "type": "TagDeclarator", "value": "line000" }, @@ -14758,9 +14758,9 @@ description: Variables in memory after executing gridfinity-bins-stacking-lip.kc ], "radius": 0.5, "tag": { - "commentStart": 5565, - "end": 5572, - "start": 5565, + "commentStart": 5567, + "end": 5574, + "start": 5567, "type": "TagDeclarator", "value": "arc000" }, @@ -14783,9 +14783,9 @@ description: Variables in memory after executing gridfinity-bins-stacking-lip.kc 6.1464 ], "tag": { - "commentStart": 5685, - "end": 5693, - "start": 5685, + "commentStart": 5687, + "end": 5695, + "start": 5687, "type": "TagDeclarator", "value": "line001" }, @@ -14988,9 +14988,9 @@ description: Variables in memory after executing gridfinity-bins-stacking-lip.kc "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 5445, - "end": 5453, - "start": 5445, + "commentStart": 5447, + "end": 5455, + "start": 5447, "type": "TagDeclarator", "value": "line000" }, @@ -15001,9 +15001,9 @@ description: Variables in memory after executing gridfinity-bins-stacking-lip.kc "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 5565, - "end": 5572, - "start": 5565, + "commentStart": 5567, + "end": 5574, + "start": 5567, "type": "TagDeclarator", "value": "arc000" }, @@ -15014,9 +15014,9 @@ description: Variables in memory after executing gridfinity-bins-stacking-lip.kc "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 5685, - "end": 5693, - "start": 5685, + "commentStart": 5687, + "end": 5695, + "start": 5687, "type": "TagDeclarator", "value": "line001" }, @@ -15072,9 +15072,9 @@ description: Variables in memory after executing gridfinity-bins-stacking-lip.kc 0.0 ], "tag": { - "commentStart": 5445, - "end": 5453, - "start": 5445, + "commentStart": 5447, + "end": 5455, + "start": 5447, "type": "TagDeclarator", "value": "line000" }, @@ -15103,9 +15103,9 @@ description: Variables in memory after executing gridfinity-bins-stacking-lip.kc ], "radius": 0.5, "tag": { - "commentStart": 5565, - "end": 5572, - "start": 5565, + "commentStart": 5567, + "end": 5574, + "start": 5567, "type": "TagDeclarator", "value": "arc000" }, @@ -15128,9 +15128,9 @@ description: Variables in memory after executing gridfinity-bins-stacking-lip.kc 6.1464 ], "tag": { - "commentStart": 5685, - "end": 5693, - "start": 5685, + "commentStart": 5687, + "end": 5695, + "start": 5687, "type": "TagDeclarator", "value": "line001" }, @@ -15328,9 +15328,9 @@ description: Variables in memory after executing gridfinity-bins-stacking-lip.kc "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 5445, - "end": 5453, - "start": 5445, + "commentStart": 5447, + "end": 5455, + "start": 5447, "type": "TagDeclarator", "value": "line000" }, @@ -15341,9 +15341,9 @@ description: Variables in memory after executing gridfinity-bins-stacking-lip.kc "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 5565, - "end": 5572, - "start": 5565, + "commentStart": 5567, + "end": 5574, + "start": 5567, "type": "TagDeclarator", "value": "arc000" }, @@ -15354,9 +15354,9 @@ description: Variables in memory after executing gridfinity-bins-stacking-lip.kc "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 5685, - "end": 5693, - "start": 5685, + "commentStart": 5687, + "end": 5695, + "start": 5687, "type": "TagDeclarator", "value": "line001" }, @@ -15412,9 +15412,9 @@ description: Variables in memory after executing gridfinity-bins-stacking-lip.kc 0.0 ], "tag": { - "commentStart": 5445, - "end": 5453, - "start": 5445, + "commentStart": 5447, + "end": 5455, + "start": 5447, "type": "TagDeclarator", "value": "line000" }, @@ -15443,9 +15443,9 @@ description: Variables in memory after executing gridfinity-bins-stacking-lip.kc ], "radius": 0.5, "tag": { - "commentStart": 5565, - "end": 5572, - "start": 5565, + "commentStart": 5567, + "end": 5574, + "start": 5567, "type": "TagDeclarator", "value": "arc000" }, @@ -15468,9 +15468,9 @@ description: Variables in memory after executing gridfinity-bins-stacking-lip.kc 6.1464 ], "tag": { - "commentStart": 5685, - "end": 5693, - "start": 5685, + "commentStart": 5687, + "end": 5695, + "start": 5687, "type": "TagDeclarator", "value": "line001" }, @@ -15689,9 +15689,9 @@ description: Variables in memory after executing gridfinity-bins-stacking-lip.kc "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 5445, - "end": 5453, - "start": 5445, + "commentStart": 5447, + "end": 5455, + "start": 5447, "type": "TagDeclarator", "value": "line000" }, @@ -15702,9 +15702,9 @@ description: Variables in memory after executing gridfinity-bins-stacking-lip.kc "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 5565, - "end": 5572, - "start": 5565, + "commentStart": 5567, + "end": 5574, + "start": 5567, "type": "TagDeclarator", "value": "arc000" }, @@ -15715,9 +15715,9 @@ description: Variables in memory after executing gridfinity-bins-stacking-lip.kc "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 5685, - "end": 5693, - "start": 5685, + "commentStart": 5687, + "end": 5695, + "start": 5687, "type": "TagDeclarator", "value": "line001" }, @@ -15773,9 +15773,9 @@ description: Variables in memory after executing gridfinity-bins-stacking-lip.kc 0.0 ], "tag": { - "commentStart": 5445, - "end": 5453, - "start": 5445, + "commentStart": 5447, + "end": 5455, + "start": 5447, "type": "TagDeclarator", "value": "line000" }, @@ -15804,9 +15804,9 @@ description: Variables in memory after executing gridfinity-bins-stacking-lip.kc ], "radius": 0.5, "tag": { - "commentStart": 5565, - "end": 5572, - "start": 5565, + "commentStart": 5567, + "end": 5574, + "start": 5567, "type": "TagDeclarator", "value": "arc000" }, @@ -15829,9 +15829,9 @@ description: Variables in memory after executing gridfinity-bins-stacking-lip.kc 6.1464 ], "tag": { - "commentStart": 5685, - "end": 5693, - "start": 5685, + "commentStart": 5687, + "end": 5695, + "start": 5687, "type": "TagDeclarator", "value": "line001" }, @@ -16029,9 +16029,9 @@ description: Variables in memory after executing gridfinity-bins-stacking-lip.kc "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 5445, - "end": 5453, - "start": 5445, + "commentStart": 5447, + "end": 5455, + "start": 5447, "type": "TagDeclarator", "value": "line000" }, @@ -16042,9 +16042,9 @@ description: Variables in memory after executing gridfinity-bins-stacking-lip.kc "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 5565, - "end": 5572, - "start": 5565, + "commentStart": 5567, + "end": 5574, + "start": 5567, "type": "TagDeclarator", "value": "arc000" }, @@ -16055,9 +16055,9 @@ description: Variables in memory after executing gridfinity-bins-stacking-lip.kc "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 5685, - "end": 5693, - "start": 5685, + "commentStart": 5687, + "end": 5695, + "start": 5687, "type": "TagDeclarator", "value": "line001" }, @@ -16113,9 +16113,9 @@ description: Variables in memory after executing gridfinity-bins-stacking-lip.kc 0.0 ], "tag": { - "commentStart": 5445, - "end": 5453, - "start": 5445, + "commentStart": 5447, + "end": 5455, + "start": 5447, "type": "TagDeclarator", "value": "line000" }, @@ -16144,9 +16144,9 @@ description: Variables in memory after executing gridfinity-bins-stacking-lip.kc ], "radius": 0.5, "tag": { - "commentStart": 5565, - "end": 5572, - "start": 5565, + "commentStart": 5567, + "end": 5574, + "start": 5567, "type": "TagDeclarator", "value": "arc000" }, @@ -16169,9 +16169,9 @@ description: Variables in memory after executing gridfinity-bins-stacking-lip.kc 6.1464 ], "tag": { - "commentStart": 5685, - "end": 5693, - "start": 5685, + "commentStart": 5687, + "end": 5695, + "start": 5687, "type": "TagDeclarator", "value": "line001" }, @@ -16384,9 +16384,9 @@ description: Variables in memory after executing gridfinity-bins-stacking-lip.kc "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 5445, - "end": 5453, - "start": 5445, + "commentStart": 5447, + "end": 5455, + "start": 5447, "type": "TagDeclarator", "value": "line000" }, @@ -16397,9 +16397,9 @@ description: Variables in memory after executing gridfinity-bins-stacking-lip.kc "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 5565, - "end": 5572, - "start": 5565, + "commentStart": 5567, + "end": 5574, + "start": 5567, "type": "TagDeclarator", "value": "arc000" }, @@ -16410,9 +16410,9 @@ description: Variables in memory after executing gridfinity-bins-stacking-lip.kc "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 5685, - "end": 5693, - "start": 5685, + "commentStart": 5687, + "end": 5695, + "start": 5687, "type": "TagDeclarator", "value": "line001" }, @@ -16468,9 +16468,9 @@ description: Variables in memory after executing gridfinity-bins-stacking-lip.kc 0.0 ], "tag": { - "commentStart": 5445, - "end": 5453, - "start": 5445, + "commentStart": 5447, + "end": 5455, + "start": 5447, "type": "TagDeclarator", "value": "line000" }, @@ -16499,9 +16499,9 @@ description: Variables in memory after executing gridfinity-bins-stacking-lip.kc ], "radius": 0.5, "tag": { - "commentStart": 5565, - "end": 5572, - "start": 5565, + "commentStart": 5567, + "end": 5574, + "start": 5567, "type": "TagDeclarator", "value": "arc000" }, @@ -16524,9 +16524,9 @@ description: Variables in memory after executing gridfinity-bins-stacking-lip.kc 6.1464 ], "tag": { - "commentStart": 5685, - "end": 5693, - "start": 5685, + "commentStart": 5687, + "end": 5695, + "start": 5687, "type": "TagDeclarator", "value": "line001" }, @@ -16724,9 +16724,9 @@ description: Variables in memory after executing gridfinity-bins-stacking-lip.kc "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 5445, - "end": 5453, - "start": 5445, + "commentStart": 5447, + "end": 5455, + "start": 5447, "type": "TagDeclarator", "value": "line000" }, @@ -16737,9 +16737,9 @@ description: Variables in memory after executing gridfinity-bins-stacking-lip.kc "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 5565, - "end": 5572, - "start": 5565, + "commentStart": 5567, + "end": 5574, + "start": 5567, "type": "TagDeclarator", "value": "arc000" }, @@ -16750,9 +16750,9 @@ description: Variables in memory after executing gridfinity-bins-stacking-lip.kc "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 5685, - "end": 5693, - "start": 5685, + "commentStart": 5687, + "end": 5695, + "start": 5687, "type": "TagDeclarator", "value": "line001" }, @@ -16808,9 +16808,9 @@ description: Variables in memory after executing gridfinity-bins-stacking-lip.kc 0.0 ], "tag": { - "commentStart": 5445, - "end": 5453, - "start": 5445, + "commentStart": 5447, + "end": 5455, + "start": 5447, "type": "TagDeclarator", "value": "line000" }, @@ -16839,9 +16839,9 @@ description: Variables in memory after executing gridfinity-bins-stacking-lip.kc ], "radius": 0.5, "tag": { - "commentStart": 5565, - "end": 5572, - "start": 5565, + "commentStart": 5567, + "end": 5574, + "start": 5567, "type": "TagDeclarator", "value": "arc000" }, @@ -16864,9 +16864,9 @@ description: Variables in memory after executing gridfinity-bins-stacking-lip.kc 6.1464 ], "tag": { - "commentStart": 5685, - "end": 5693, - "start": 5685, + "commentStart": 5687, + "end": 5695, + "start": 5687, "type": "TagDeclarator", "value": "line001" }, @@ -17064,9 +17064,9 @@ description: Variables in memory after executing gridfinity-bins-stacking-lip.kc "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 5445, - "end": 5453, - "start": 5445, + "commentStart": 5447, + "end": 5455, + "start": 5447, "type": "TagDeclarator", "value": "line000" }, @@ -17077,9 +17077,9 @@ description: Variables in memory after executing gridfinity-bins-stacking-lip.kc "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 5565, - "end": 5572, - "start": 5565, + "commentStart": 5567, + "end": 5574, + "start": 5567, "type": "TagDeclarator", "value": "arc000" }, @@ -17090,9 +17090,9 @@ description: Variables in memory after executing gridfinity-bins-stacking-lip.kc "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 5685, - "end": 5693, - "start": 5685, + "commentStart": 5687, + "end": 5695, + "start": 5687, "type": "TagDeclarator", "value": "line001" }, @@ -17148,9 +17148,9 @@ description: Variables in memory after executing gridfinity-bins-stacking-lip.kc 0.0 ], "tag": { - "commentStart": 5445, - "end": 5453, - "start": 5445, + "commentStart": 5447, + "end": 5455, + "start": 5447, "type": "TagDeclarator", "value": "line000" }, @@ -17179,9 +17179,9 @@ description: Variables in memory after executing gridfinity-bins-stacking-lip.kc ], "radius": 0.5, "tag": { - "commentStart": 5565, - "end": 5572, - "start": 5565, + "commentStart": 5567, + "end": 5574, + "start": 5567, "type": "TagDeclarator", "value": "arc000" }, @@ -17204,9 +17204,9 @@ description: Variables in memory after executing gridfinity-bins-stacking-lip.kc 6.1464 ], "tag": { - "commentStart": 5685, - "end": 5693, - "start": 5685, + "commentStart": 5687, + "end": 5695, + "start": 5687, "type": "TagDeclarator", "value": "line001" }, @@ -17404,9 +17404,9 @@ description: Variables in memory after executing gridfinity-bins-stacking-lip.kc "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 5445, - "end": 5453, - "start": 5445, + "commentStart": 5447, + "end": 5455, + "start": 5447, "type": "TagDeclarator", "value": "line000" }, @@ -17417,9 +17417,9 @@ description: Variables in memory after executing gridfinity-bins-stacking-lip.kc "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 5565, - "end": 5572, - "start": 5565, + "commentStart": 5567, + "end": 5574, + "start": 5567, "type": "TagDeclarator", "value": "arc000" }, @@ -17430,9 +17430,9 @@ description: Variables in memory after executing gridfinity-bins-stacking-lip.kc "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 5685, - "end": 5693, - "start": 5685, + "commentStart": 5687, + "end": 5695, + "start": 5687, "type": "TagDeclarator", "value": "line001" }, @@ -17488,9 +17488,9 @@ description: Variables in memory after executing gridfinity-bins-stacking-lip.kc 0.0 ], "tag": { - "commentStart": 5445, - "end": 5453, - "start": 5445, + "commentStart": 5447, + "end": 5455, + "start": 5447, "type": "TagDeclarator", "value": "line000" }, @@ -17519,9 +17519,9 @@ description: Variables in memory after executing gridfinity-bins-stacking-lip.kc ], "radius": 0.5, "tag": { - "commentStart": 5565, - "end": 5572, - "start": 5565, + "commentStart": 5567, + "end": 5574, + "start": 5567, "type": "TagDeclarator", "value": "arc000" }, @@ -17544,9 +17544,9 @@ description: Variables in memory after executing gridfinity-bins-stacking-lip.kc 6.1464 ], "tag": { - "commentStart": 5685, - "end": 5693, - "start": 5685, + "commentStart": 5687, + "end": 5695, + "start": 5687, "type": "TagDeclarator", "value": "line001" }, @@ -17812,9 +17812,9 @@ description: Variables in memory after executing gridfinity-bins-stacking-lip.kc "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 5445, - "end": 5453, - "start": 5445, + "commentStart": 5447, + "end": 5455, + "start": 5447, "type": "TagDeclarator", "value": "line000" }, @@ -17825,9 +17825,9 @@ description: Variables in memory after executing gridfinity-bins-stacking-lip.kc "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 5565, - "end": 5572, - "start": 5565, + "commentStart": 5567, + "end": 5574, + "start": 5567, "type": "TagDeclarator", "value": "arc000" }, @@ -17838,9 +17838,9 @@ description: Variables in memory after executing gridfinity-bins-stacking-lip.kc "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 5685, - "end": 5693, - "start": 5685, + "commentStart": 5687, + "end": 5695, + "start": 5687, "type": "TagDeclarator", "value": "line001" }, @@ -17896,9 +17896,9 @@ description: Variables in memory after executing gridfinity-bins-stacking-lip.kc 0.0 ], "tag": { - "commentStart": 5445, - "end": 5453, - "start": 5445, + "commentStart": 5447, + "end": 5455, + "start": 5447, "type": "TagDeclarator", "value": "line000" }, @@ -17927,9 +17927,9 @@ description: Variables in memory after executing gridfinity-bins-stacking-lip.kc ], "radius": 0.5, "tag": { - "commentStart": 5565, - "end": 5572, - "start": 5565, + "commentStart": 5567, + "end": 5574, + "start": 5567, "type": "TagDeclarator", "value": "arc000" }, @@ -17952,9 +17952,9 @@ description: Variables in memory after executing gridfinity-bins-stacking-lip.kc 6.1464 ], "tag": { - "commentStart": 5685, - "end": 5693, - "start": 5685, + "commentStart": 5687, + "end": 5695, + "start": 5687, "type": "TagDeclarator", "value": "line001" }, @@ -18152,9 +18152,9 @@ description: Variables in memory after executing gridfinity-bins-stacking-lip.kc "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 5445, - "end": 5453, - "start": 5445, + "commentStart": 5447, + "end": 5455, + "start": 5447, "type": "TagDeclarator", "value": "line000" }, @@ -18165,9 +18165,9 @@ description: Variables in memory after executing gridfinity-bins-stacking-lip.kc "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 5565, - "end": 5572, - "start": 5565, + "commentStart": 5567, + "end": 5574, + "start": 5567, "type": "TagDeclarator", "value": "arc000" }, @@ -18178,9 +18178,9 @@ description: Variables in memory after executing gridfinity-bins-stacking-lip.kc "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 5685, - "end": 5693, - "start": 5685, + "commentStart": 5687, + "end": 5695, + "start": 5687, "type": "TagDeclarator", "value": "line001" }, @@ -18236,9 +18236,9 @@ description: Variables in memory after executing gridfinity-bins-stacking-lip.kc 0.0 ], "tag": { - "commentStart": 5445, - "end": 5453, - "start": 5445, + "commentStart": 5447, + "end": 5455, + "start": 5447, "type": "TagDeclarator", "value": "line000" }, @@ -18267,9 +18267,9 @@ description: Variables in memory after executing gridfinity-bins-stacking-lip.kc ], "radius": 0.5, "tag": { - "commentStart": 5565, - "end": 5572, - "start": 5565, + "commentStart": 5567, + "end": 5574, + "start": 5567, "type": "TagDeclarator", "value": "arc000" }, @@ -18292,9 +18292,9 @@ description: Variables in memory after executing gridfinity-bins-stacking-lip.kc 6.1464 ], "tag": { - "commentStart": 5685, - "end": 5693, - "start": 5685, + "commentStart": 5687, + "end": 5695, + "start": 5687, "type": "TagDeclarator", "value": "line001" }, @@ -18561,9 +18561,9 @@ description: Variables in memory after executing gridfinity-bins-stacking-lip.kc "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 2645, - "end": 2653, - "start": 2645, + "commentStart": 2646, + "end": 2654, + "start": 2646, "type": "TagDeclarator", "value": "line000" }, @@ -18574,9 +18574,9 @@ description: Variables in memory after executing gridfinity-bins-stacking-lip.kc "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 2715, - "end": 2723, - "start": 2715, + "commentStart": 2716, + "end": 2724, + "start": 2716, "type": "TagDeclarator", "value": "line001" }, @@ -18587,9 +18587,9 @@ description: Variables in memory after executing gridfinity-bins-stacking-lip.kc "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 2774, - "end": 2782, - "start": 2774, + "commentStart": 2775, + "end": 2783, + "start": 2775, "type": "TagDeclarator", "value": "line002" }, @@ -18600,9 +18600,9 @@ description: Variables in memory after executing gridfinity-bins-stacking-lip.kc "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 2801, - "end": 2809, - "start": 2801, + "commentStart": 2802, + "end": 2810, + "start": 2802, "type": "TagDeclarator", "value": "line003" }, @@ -18623,9 +18623,9 @@ description: Variables in memory after executing gridfinity-bins-stacking-lip.kc 3.2 ], "tag": { - "commentStart": 2645, - "end": 2653, - "start": 2645, + "commentStart": 2646, + "end": 2654, + "start": 2646, "type": "TagDeclarator", "value": "line000" }, @@ -18648,9 +18648,9 @@ description: Variables in memory after executing gridfinity-bins-stacking-lip.kc 3.2 ], "tag": { - "commentStart": 2715, - "end": 2723, - "start": 2715, + "commentStart": 2716, + "end": 2724, + "start": 2716, "type": "TagDeclarator", "value": "line001" }, @@ -18673,9 +18673,9 @@ description: Variables in memory after executing gridfinity-bins-stacking-lip.kc 38.8 ], "tag": { - "commentStart": 2774, - "end": 2782, - "start": 2774, + "commentStart": 2775, + "end": 2783, + "start": 2775, "type": "TagDeclarator", "value": "line002" }, @@ -18698,9 +18698,9 @@ description: Variables in memory after executing gridfinity-bins-stacking-lip.kc 38.8 ], "tag": { - "commentStart": 2801, - "end": 2809, - "start": 2801, + "commentStart": 2802, + "end": 2810, + "start": 2802, "type": "TagDeclarator", "value": "line003" }, @@ -18981,9 +18981,9 @@ description: Variables in memory after executing gridfinity-bins-stacking-lip.kc "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 2645, - "end": 2653, - "start": 2645, + "commentStart": 2646, + "end": 2654, + "start": 2646, "type": "TagDeclarator", "value": "line000" }, @@ -18994,9 +18994,9 @@ description: Variables in memory after executing gridfinity-bins-stacking-lip.kc "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 2715, - "end": 2723, - "start": 2715, + "commentStart": 2716, + "end": 2724, + "start": 2716, "type": "TagDeclarator", "value": "line001" }, @@ -19007,9 +19007,9 @@ description: Variables in memory after executing gridfinity-bins-stacking-lip.kc "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 2774, - "end": 2782, - "start": 2774, + "commentStart": 2775, + "end": 2783, + "start": 2775, "type": "TagDeclarator", "value": "line002" }, @@ -19020,9 +19020,9 @@ description: Variables in memory after executing gridfinity-bins-stacking-lip.kc "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 2801, - "end": 2809, - "start": 2801, + "commentStart": 2802, + "end": 2810, + "start": 2802, "type": "TagDeclarator", "value": "line003" }, @@ -19043,9 +19043,9 @@ description: Variables in memory after executing gridfinity-bins-stacking-lip.kc 3.2 ], "tag": { - "commentStart": 2645, - "end": 2653, - "start": 2645, + "commentStart": 2646, + "end": 2654, + "start": 2646, "type": "TagDeclarator", "value": "line000" }, @@ -19068,9 +19068,9 @@ description: Variables in memory after executing gridfinity-bins-stacking-lip.kc 3.2 ], "tag": { - "commentStart": 2715, - "end": 2723, - "start": 2715, + "commentStart": 2716, + "end": 2724, + "start": 2716, "type": "TagDeclarator", "value": "line001" }, @@ -19093,9 +19093,9 @@ description: Variables in memory after executing gridfinity-bins-stacking-lip.kc 38.8 ], "tag": { - "commentStart": 2774, - "end": 2782, - "start": 2774, + "commentStart": 2775, + "end": 2783, + "start": 2775, "type": "TagDeclarator", "value": "line002" }, @@ -19118,9 +19118,9 @@ description: Variables in memory after executing gridfinity-bins-stacking-lip.kc 38.8 ], "tag": { - "commentStart": 2801, - "end": 2809, - "start": 2801, + "commentStart": 2802, + "end": 2810, + "start": 2802, "type": "TagDeclarator", "value": "line003" }, @@ -19401,9 +19401,9 @@ description: Variables in memory after executing gridfinity-bins-stacking-lip.kc "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 2645, - "end": 2653, - "start": 2645, + "commentStart": 2646, + "end": 2654, + "start": 2646, "type": "TagDeclarator", "value": "line000" }, @@ -19414,9 +19414,9 @@ description: Variables in memory after executing gridfinity-bins-stacking-lip.kc "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 2715, - "end": 2723, - "start": 2715, + "commentStart": 2716, + "end": 2724, + "start": 2716, "type": "TagDeclarator", "value": "line001" }, @@ -19427,9 +19427,9 @@ description: Variables in memory after executing gridfinity-bins-stacking-lip.kc "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 2774, - "end": 2782, - "start": 2774, + "commentStart": 2775, + "end": 2783, + "start": 2775, "type": "TagDeclarator", "value": "line002" }, @@ -19440,9 +19440,9 @@ description: Variables in memory after executing gridfinity-bins-stacking-lip.kc "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 2801, - "end": 2809, - "start": 2801, + "commentStart": 2802, + "end": 2810, + "start": 2802, "type": "TagDeclarator", "value": "line003" }, @@ -19463,9 +19463,9 @@ description: Variables in memory after executing gridfinity-bins-stacking-lip.kc 3.2 ], "tag": { - "commentStart": 2645, - "end": 2653, - "start": 2645, + "commentStart": 2646, + "end": 2654, + "start": 2646, "type": "TagDeclarator", "value": "line000" }, @@ -19488,9 +19488,9 @@ description: Variables in memory after executing gridfinity-bins-stacking-lip.kc 3.2 ], "tag": { - "commentStart": 2715, - "end": 2723, - "start": 2715, + "commentStart": 2716, + "end": 2724, + "start": 2716, "type": "TagDeclarator", "value": "line001" }, @@ -19513,9 +19513,9 @@ description: Variables in memory after executing gridfinity-bins-stacking-lip.kc 38.8 ], "tag": { - "commentStart": 2774, - "end": 2782, - "start": 2774, + "commentStart": 2775, + "end": 2783, + "start": 2775, "type": "TagDeclarator", "value": "line002" }, @@ -19538,9 +19538,9 @@ description: Variables in memory after executing gridfinity-bins-stacking-lip.kc 38.8 ], "tag": { - "commentStart": 2801, - "end": 2809, - "start": 2801, + "commentStart": 2802, + "end": 2810, + "start": 2802, "type": "TagDeclarator", "value": "line003" }, @@ -19821,9 +19821,9 @@ description: Variables in memory after executing gridfinity-bins-stacking-lip.kc "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 2645, - "end": 2653, - "start": 2645, + "commentStart": 2646, + "end": 2654, + "start": 2646, "type": "TagDeclarator", "value": "line000" }, @@ -19834,9 +19834,9 @@ description: Variables in memory after executing gridfinity-bins-stacking-lip.kc "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 2715, - "end": 2723, - "start": 2715, + "commentStart": 2716, + "end": 2724, + "start": 2716, "type": "TagDeclarator", "value": "line001" }, @@ -19847,9 +19847,9 @@ description: Variables in memory after executing gridfinity-bins-stacking-lip.kc "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 2774, - "end": 2782, - "start": 2774, + "commentStart": 2775, + "end": 2783, + "start": 2775, "type": "TagDeclarator", "value": "line002" }, @@ -19860,9 +19860,9 @@ description: Variables in memory after executing gridfinity-bins-stacking-lip.kc "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 2801, - "end": 2809, - "start": 2801, + "commentStart": 2802, + "end": 2810, + "start": 2802, "type": "TagDeclarator", "value": "line003" }, @@ -19883,9 +19883,9 @@ description: Variables in memory after executing gridfinity-bins-stacking-lip.kc 3.2 ], "tag": { - "commentStart": 2645, - "end": 2653, - "start": 2645, + "commentStart": 2646, + "end": 2654, + "start": 2646, "type": "TagDeclarator", "value": "line000" }, @@ -19908,9 +19908,9 @@ description: Variables in memory after executing gridfinity-bins-stacking-lip.kc 3.2 ], "tag": { - "commentStart": 2715, - "end": 2723, - "start": 2715, + "commentStart": 2716, + "end": 2724, + "start": 2716, "type": "TagDeclarator", "value": "line001" }, @@ -19933,9 +19933,9 @@ description: Variables in memory after executing gridfinity-bins-stacking-lip.kc 38.8 ], "tag": { - "commentStart": 2774, - "end": 2782, - "start": 2774, + "commentStart": 2775, + "end": 2783, + "start": 2775, "type": "TagDeclarator", "value": "line002" }, @@ -19958,9 +19958,9 @@ description: Variables in memory after executing gridfinity-bins-stacking-lip.kc 38.8 ], "tag": { - "commentStart": 2801, - "end": 2809, - "start": 2801, + "commentStart": 2802, + "end": 2810, + "start": 2802, "type": "TagDeclarator", "value": "line003" }, @@ -21547,9 +21547,9 @@ description: Variables in memory after executing gridfinity-bins-stacking-lip.kc "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 2645, - "end": 2653, - "start": 2645, + "commentStart": 2646, + "end": 2654, + "start": 2646, "type": "TagDeclarator", "value": "line000" }, @@ -21560,9 +21560,9 @@ description: Variables in memory after executing gridfinity-bins-stacking-lip.kc "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 2715, - "end": 2723, - "start": 2715, + "commentStart": 2716, + "end": 2724, + "start": 2716, "type": "TagDeclarator", "value": "line001" }, @@ -21573,9 +21573,9 @@ description: Variables in memory after executing gridfinity-bins-stacking-lip.kc "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 2774, - "end": 2782, - "start": 2774, + "commentStart": 2775, + "end": 2783, + "start": 2775, "type": "TagDeclarator", "value": "line002" }, @@ -21586,9 +21586,9 @@ description: Variables in memory after executing gridfinity-bins-stacking-lip.kc "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 2801, - "end": 2809, - "start": 2801, + "commentStart": 2802, + "end": 2810, + "start": 2802, "type": "TagDeclarator", "value": "line003" }, @@ -21609,9 +21609,9 @@ description: Variables in memory after executing gridfinity-bins-stacking-lip.kc 3.2 ], "tag": { - "commentStart": 2645, - "end": 2653, - "start": 2645, + "commentStart": 2646, + "end": 2654, + "start": 2646, "type": "TagDeclarator", "value": "line000" }, @@ -21634,9 +21634,9 @@ description: Variables in memory after executing gridfinity-bins-stacking-lip.kc 3.2 ], "tag": { - "commentStart": 2715, - "end": 2723, - "start": 2715, + "commentStart": 2716, + "end": 2724, + "start": 2716, "type": "TagDeclarator", "value": "line001" }, @@ -21659,9 +21659,9 @@ description: Variables in memory after executing gridfinity-bins-stacking-lip.kc 38.8 ], "tag": { - "commentStart": 2774, - "end": 2782, - "start": 2774, + "commentStart": 2775, + "end": 2783, + "start": 2775, "type": "TagDeclarator", "value": "line002" }, @@ -21684,9 +21684,9 @@ description: Variables in memory after executing gridfinity-bins-stacking-lip.kc 38.8 ], "tag": { - "commentStart": 2801, - "end": 2809, - "start": 2801, + "commentStart": 2802, + "end": 2810, + "start": 2802, "type": "TagDeclarator", "value": "line003" }, diff --git a/rust/kcl-lib/tests/kcl_samples/gridfinity-bins/artifact_graph_flowchart.snap.md b/rust/kcl-lib/tests/kcl_samples/gridfinity-bins/artifact_graph_flowchart.snap.md index 592595582..09937ad1b 100644 --- a/rust/kcl-lib/tests/kcl_samples/gridfinity-bins/artifact_graph_flowchart.snap.md +++ b/rust/kcl-lib/tests/kcl_samples/gridfinity-bins/artifact_graph_flowchart.snap.md @@ -1,62 +1,62 @@ ```mermaid flowchart LR subgraph path9 [Path] - 9["Path
[928, 974, 0]"] - 14["Segment
[982, 1004, 0]"] - 17["Segment
[1012, 1042, 0]"] - 18["Segment
[1050, 1094, 0]"] - 20["Segment
[1102, 1129, 0]"] - 22["Segment
[1137, 1181, 0]"] - 24["Segment
[1189, 1196, 0]"] + 9["Path
[929, 975, 0]"] + 14["Segment
[983, 1005, 0]"] + 17["Segment
[1013, 1043, 0]"] + 18["Segment
[1051, 1095, 0]"] + 20["Segment
[1103, 1130, 0]"] + 22["Segment
[1138, 1182, 0]"] + 24["Segment
[1190, 1197, 0]"] 38[Solid2d] end subgraph path10 [Path] - 10["Path
[928, 974, 0]"] - 15["Segment
[982, 1004, 0]"] - 16["Segment
[1012, 1042, 0]"] - 19["Segment
[1050, 1094, 0]"] - 21["Segment
[1102, 1129, 0]"] - 23["Segment
[1137, 1181, 0]"] - 25["Segment
[1189, 1196, 0]"] + 10["Path
[929, 975, 0]"] + 15["Segment
[983, 1005, 0]"] + 16["Segment
[1013, 1043, 0]"] + 19["Segment
[1051, 1095, 0]"] + 21["Segment
[1103, 1130, 0]"] + 23["Segment
[1138, 1182, 0]"] + 25["Segment
[1190, 1197, 0]"] 39[Solid2d] end subgraph path11 [Path] - 11["Path
[2237, 2325, 0]"] - 26["Segment
[2331, 2395, 0]"] - 27["Segment
[2401, 2465, 0]"] - 28["Segment
[2471, 2524, 0]"] - 29["Segment
[2530, 2551, 0]"] + 11["Path
[2238, 2326, 0]"] + 26["Segment
[2332, 2396, 0]"] + 27["Segment
[2402, 2466, 0]"] + 28["Segment
[2472, 2525, 0]"] + 29["Segment
[2531, 2552, 0]"] 37[Solid2d] end subgraph path12 [Path] - 12["Path
[2882, 3048, 0]"] - 30["Segment
[2882, 3048, 0]"] + 12["Path
[2883, 3049, 0]"] + 30["Segment
[2883, 3049, 0]"] 36[Solid2d] end subgraph path13 [Path] - 13["Path
[4361, 4386, 0]"] - 31["Segment
[4392, 4464, 0]"] - 32["Segment
[4470, 4543, 0]"] - 33["Segment
[4549, 4602, 0]"] - 34["Segment
[4608, 4629, 0]"] + 13["Path
[4362, 4387, 0]"] + 31["Segment
[4393, 4465, 0]"] + 32["Segment
[4471, 4544, 0]"] + 33["Segment
[4550, 4603, 0]"] + 34["Segment
[4609, 4630, 0]"] 35[Solid2d] end - 1["Plane
[1282, 1329, 0]"] - 2["Plane
[1861, 1908, 0]"] - 3["Plane
[2214, 2231, 0]"] - 4["Plane
[4322, 4354, 0]"] - 5["StartSketchOnPlane
[4308, 4355, 0]"] - 6["StartSketchOnPlane
[900, 920, 0]"] - 7["StartSketchOnPlane
[900, 920, 0]"] - 8["StartSketchOnFace
[2834, 2876, 0]"] - 40["Sweep Extrusion
[1269, 1372, 0]"] - 41["Sweep Revolve
[1848, 1939, 0]"] - 42["Sweep Extrusion
[2557, 2581, 0]"] - 43["Sweep Extrusion
[3270, 3297, 0]"] - 44["Sweep Extrusion
[3270, 3297, 0]"] - 45["Sweep Extrusion
[3270, 3297, 0]"] - 46["Sweep Extrusion
[3270, 3297, 0]"] - 47["Sweep Extrusion
[4635, 4679, 0]"] + 1["Plane
[1283, 1330, 0]"] + 2["Plane
[1862, 1909, 0]"] + 3["Plane
[2215, 2232, 0]"] + 4["Plane
[4323, 4355, 0]"] + 5["StartSketchOnPlane
[4309, 4356, 0]"] + 6["StartSketchOnPlane
[901, 921, 0]"] + 7["StartSketchOnPlane
[901, 921, 0]"] + 8["StartSketchOnFace
[2835, 2877, 0]"] + 40["Sweep Extrusion
[1270, 1373, 0]"] + 41["Sweep Revolve
[1849, 1940, 0]"] + 42["Sweep Extrusion
[2558, 2582, 0]"] + 43["Sweep Extrusion
[3271, 3298, 0]"] + 44["Sweep Extrusion
[3271, 3298, 0]"] + 45["Sweep Extrusion
[3271, 3298, 0]"] + 46["Sweep Extrusion
[3271, 3298, 0]"] + 47["Sweep Extrusion
[4636, 4680, 0]"] 48[Wall] 49[Wall] 50[Wall] @@ -123,14 +123,14 @@ flowchart LR 111["SweepEdge Adjacent"] 112["SweepEdge Adjacent"] 113["SweepEdge Adjacent"] - 114["EdgeCut Fillet
[2587, 2817, 0]"] - 115["EdgeCut Fillet
[2587, 2817, 0]"] - 116["EdgeCut Fillet
[2587, 2817, 0]"] - 117["EdgeCut Fillet
[2587, 2817, 0]"] - 118["EdgeCut Fillet
[4685, 4918, 0]"] - 119["EdgeCut Fillet
[4685, 4918, 0]"] - 120["EdgeCut Fillet
[4685, 4918, 0]"] - 121["EdgeCut Fillet
[4685, 4918, 0]"] + 114["EdgeCut Fillet
[2588, 2818, 0]"] + 115["EdgeCut Fillet
[2588, 2818, 0]"] + 116["EdgeCut Fillet
[2588, 2818, 0]"] + 117["EdgeCut Fillet
[2588, 2818, 0]"] + 118["EdgeCut Fillet
[4686, 4919, 0]"] + 119["EdgeCut Fillet
[4686, 4919, 0]"] + 120["EdgeCut Fillet
[4686, 4919, 0]"] + 121["EdgeCut Fillet
[4686, 4919, 0]"] 1 <--x 6 1 --- 10 2 <--x 7 diff --git a/rust/kcl-lib/tests/kcl_samples/gridfinity-bins/ast.snap b/rust/kcl-lib/tests/kcl_samples/gridfinity-bins/ast.snap index 2e34fea9d..edcc79ed9 100644 --- a/rust/kcl-lib/tests/kcl_samples/gridfinity-bins/ast.snap +++ b/rust/kcl-lib/tests/kcl_samples/gridfinity-bins/ast.snap @@ -1172,7 +1172,8 @@ description: Result of parsing gridfinity-bins.kcl "name": "plane", "start": 0, "type": "Identifier" - } + }, + "labeled": false } ], "start": 0, diff --git a/rust/kcl-lib/tests/kcl_samples/gridfinity-bins/program_memory.snap b/rust/kcl-lib/tests/kcl_samples/gridfinity-bins/program_memory.snap index ca16115d2..7a7f73293 100644 --- a/rust/kcl-lib/tests/kcl_samples/gridfinity-bins/program_memory.snap +++ b/rust/kcl-lib/tests/kcl_samples/gridfinity-bins/program_memory.snap @@ -5503,9 +5503,9 @@ description: Variables in memory after executing gridfinity-bins.kcl "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 2386, - "end": 2394, - "start": 2386, + "commentStart": 2387, + "end": 2395, + "start": 2387, "type": "TagDeclarator", "value": "line000" }, @@ -5516,9 +5516,9 @@ description: Variables in memory after executing gridfinity-bins.kcl "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 2456, - "end": 2464, - "start": 2456, + "commentStart": 2457, + "end": 2465, + "start": 2457, "type": "TagDeclarator", "value": "line001" }, @@ -5529,9 +5529,9 @@ description: Variables in memory after executing gridfinity-bins.kcl "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 2515, - "end": 2523, - "start": 2515, + "commentStart": 2516, + "end": 2524, + "start": 2516, "type": "TagDeclarator", "value": "line002" }, @@ -5542,9 +5542,9 @@ description: Variables in memory after executing gridfinity-bins.kcl "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 2542, - "end": 2550, - "start": 2542, + "commentStart": 2543, + "end": 2551, + "start": 2543, "type": "TagDeclarator", "value": "line003" }, @@ -5565,9 +5565,9 @@ description: Variables in memory after executing gridfinity-bins.kcl 3.2 ], "tag": { - "commentStart": 2386, - "end": 2394, - "start": 2386, + "commentStart": 2387, + "end": 2395, + "start": 2387, "type": "TagDeclarator", "value": "line000" }, @@ -5590,9 +5590,9 @@ description: Variables in memory after executing gridfinity-bins.kcl 3.2 ], "tag": { - "commentStart": 2456, - "end": 2464, - "start": 2456, + "commentStart": 2457, + "end": 2465, + "start": 2457, "type": "TagDeclarator", "value": "line001" }, @@ -5615,9 +5615,9 @@ description: Variables in memory after executing gridfinity-bins.kcl 38.8 ], "tag": { - "commentStart": 2515, - "end": 2523, - "start": 2515, + "commentStart": 2516, + "end": 2524, + "start": 2516, "type": "TagDeclarator", "value": "line002" }, @@ -5640,9 +5640,9 @@ description: Variables in memory after executing gridfinity-bins.kcl 38.8 ], "tag": { - "commentStart": 2542, - "end": 2550, - "start": 2542, + "commentStart": 2543, + "end": 2551, + "start": 2543, "type": "TagDeclarator", "value": "line003" }, @@ -5823,9 +5823,9 @@ description: Variables in memory after executing gridfinity-bins.kcl "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 2386, - "end": 2394, - "start": 2386, + "commentStart": 2387, + "end": 2395, + "start": 2387, "type": "TagDeclarator", "value": "line000" }, @@ -5836,9 +5836,9 @@ description: Variables in memory after executing gridfinity-bins.kcl "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 2456, - "end": 2464, - "start": 2456, + "commentStart": 2457, + "end": 2465, + "start": 2457, "type": "TagDeclarator", "value": "line001" }, @@ -5849,9 +5849,9 @@ description: Variables in memory after executing gridfinity-bins.kcl "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 2515, - "end": 2523, - "start": 2515, + "commentStart": 2516, + "end": 2524, + "start": 2516, "type": "TagDeclarator", "value": "line002" }, @@ -5862,9 +5862,9 @@ description: Variables in memory after executing gridfinity-bins.kcl "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 2542, - "end": 2550, - "start": 2542, + "commentStart": 2543, + "end": 2551, + "start": 2543, "type": "TagDeclarator", "value": "line003" }, @@ -5885,9 +5885,9 @@ description: Variables in memory after executing gridfinity-bins.kcl 3.2 ], "tag": { - "commentStart": 2386, - "end": 2394, - "start": 2386, + "commentStart": 2387, + "end": 2395, + "start": 2387, "type": "TagDeclarator", "value": "line000" }, @@ -5910,9 +5910,9 @@ description: Variables in memory after executing gridfinity-bins.kcl 3.2 ], "tag": { - "commentStart": 2456, - "end": 2464, - "start": 2456, + "commentStart": 2457, + "end": 2465, + "start": 2457, "type": "TagDeclarator", "value": "line001" }, @@ -5935,9 +5935,9 @@ description: Variables in memory after executing gridfinity-bins.kcl 38.8 ], "tag": { - "commentStart": 2515, - "end": 2523, - "start": 2515, + "commentStart": 2516, + "end": 2524, + "start": 2516, "type": "TagDeclarator", "value": "line002" }, @@ -5960,9 +5960,9 @@ description: Variables in memory after executing gridfinity-bins.kcl 38.8 ], "tag": { - "commentStart": 2542, - "end": 2550, - "start": 2542, + "commentStart": 2543, + "end": 2551, + "start": 2543, "type": "TagDeclarator", "value": "line003" }, @@ -6143,9 +6143,9 @@ description: Variables in memory after executing gridfinity-bins.kcl "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 2386, - "end": 2394, - "start": 2386, + "commentStart": 2387, + "end": 2395, + "start": 2387, "type": "TagDeclarator", "value": "line000" }, @@ -6156,9 +6156,9 @@ description: Variables in memory after executing gridfinity-bins.kcl "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 2456, - "end": 2464, - "start": 2456, + "commentStart": 2457, + "end": 2465, + "start": 2457, "type": "TagDeclarator", "value": "line001" }, @@ -6169,9 +6169,9 @@ description: Variables in memory after executing gridfinity-bins.kcl "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 2515, - "end": 2523, - "start": 2515, + "commentStart": 2516, + "end": 2524, + "start": 2516, "type": "TagDeclarator", "value": "line002" }, @@ -6182,9 +6182,9 @@ description: Variables in memory after executing gridfinity-bins.kcl "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 2542, - "end": 2550, - "start": 2542, + "commentStart": 2543, + "end": 2551, + "start": 2543, "type": "TagDeclarator", "value": "line003" }, @@ -6205,9 +6205,9 @@ description: Variables in memory after executing gridfinity-bins.kcl 3.2 ], "tag": { - "commentStart": 2386, - "end": 2394, - "start": 2386, + "commentStart": 2387, + "end": 2395, + "start": 2387, "type": "TagDeclarator", "value": "line000" }, @@ -6230,9 +6230,9 @@ description: Variables in memory after executing gridfinity-bins.kcl 3.2 ], "tag": { - "commentStart": 2456, - "end": 2464, - "start": 2456, + "commentStart": 2457, + "end": 2465, + "start": 2457, "type": "TagDeclarator", "value": "line001" }, @@ -6255,9 +6255,9 @@ description: Variables in memory after executing gridfinity-bins.kcl 38.8 ], "tag": { - "commentStart": 2515, - "end": 2523, - "start": 2515, + "commentStart": 2516, + "end": 2524, + "start": 2516, "type": "TagDeclarator", "value": "line002" }, @@ -6280,9 +6280,9 @@ description: Variables in memory after executing gridfinity-bins.kcl 38.8 ], "tag": { - "commentStart": 2542, - "end": 2550, - "start": 2542, + "commentStart": 2543, + "end": 2551, + "start": 2543, "type": "TagDeclarator", "value": "line003" }, @@ -6463,9 +6463,9 @@ description: Variables in memory after executing gridfinity-bins.kcl "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 2386, - "end": 2394, - "start": 2386, + "commentStart": 2387, + "end": 2395, + "start": 2387, "type": "TagDeclarator", "value": "line000" }, @@ -6476,9 +6476,9 @@ description: Variables in memory after executing gridfinity-bins.kcl "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 2456, - "end": 2464, - "start": 2456, + "commentStart": 2457, + "end": 2465, + "start": 2457, "type": "TagDeclarator", "value": "line001" }, @@ -6489,9 +6489,9 @@ description: Variables in memory after executing gridfinity-bins.kcl "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 2515, - "end": 2523, - "start": 2515, + "commentStart": 2516, + "end": 2524, + "start": 2516, "type": "TagDeclarator", "value": "line002" }, @@ -6502,9 +6502,9 @@ description: Variables in memory after executing gridfinity-bins.kcl "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 2542, - "end": 2550, - "start": 2542, + "commentStart": 2543, + "end": 2551, + "start": 2543, "type": "TagDeclarator", "value": "line003" }, @@ -6525,9 +6525,9 @@ description: Variables in memory after executing gridfinity-bins.kcl 3.2 ], "tag": { - "commentStart": 2386, - "end": 2394, - "start": 2386, + "commentStart": 2387, + "end": 2395, + "start": 2387, "type": "TagDeclarator", "value": "line000" }, @@ -6550,9 +6550,9 @@ description: Variables in memory after executing gridfinity-bins.kcl 3.2 ], "tag": { - "commentStart": 2456, - "end": 2464, - "start": 2456, + "commentStart": 2457, + "end": 2465, + "start": 2457, "type": "TagDeclarator", "value": "line001" }, @@ -6575,9 +6575,9 @@ description: Variables in memory after executing gridfinity-bins.kcl 38.8 ], "tag": { - "commentStart": 2515, - "end": 2523, - "start": 2515, + "commentStart": 2516, + "end": 2524, + "start": 2516, "type": "TagDeclarator", "value": "line002" }, @@ -6600,9 +6600,9 @@ description: Variables in memory after executing gridfinity-bins.kcl 38.8 ], "tag": { - "commentStart": 2542, - "end": 2550, - "start": 2542, + "commentStart": 2543, + "end": 2551, + "start": 2543, "type": "TagDeclarator", "value": "line003" }, @@ -6783,9 +6783,9 @@ description: Variables in memory after executing gridfinity-bins.kcl "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 2386, - "end": 2394, - "start": 2386, + "commentStart": 2387, + "end": 2395, + "start": 2387, "type": "TagDeclarator", "value": "line000" }, @@ -6796,9 +6796,9 @@ description: Variables in memory after executing gridfinity-bins.kcl "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 2456, - "end": 2464, - "start": 2456, + "commentStart": 2457, + "end": 2465, + "start": 2457, "type": "TagDeclarator", "value": "line001" }, @@ -6809,9 +6809,9 @@ description: Variables in memory after executing gridfinity-bins.kcl "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 2515, - "end": 2523, - "start": 2515, + "commentStart": 2516, + "end": 2524, + "start": 2516, "type": "TagDeclarator", "value": "line002" }, @@ -6822,9 +6822,9 @@ description: Variables in memory after executing gridfinity-bins.kcl "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 2542, - "end": 2550, - "start": 2542, + "commentStart": 2543, + "end": 2551, + "start": 2543, "type": "TagDeclarator", "value": "line003" }, @@ -6845,9 +6845,9 @@ description: Variables in memory after executing gridfinity-bins.kcl 3.2 ], "tag": { - "commentStart": 2386, - "end": 2394, - "start": 2386, + "commentStart": 2387, + "end": 2395, + "start": 2387, "type": "TagDeclarator", "value": "line000" }, @@ -6870,9 +6870,9 @@ description: Variables in memory after executing gridfinity-bins.kcl 3.2 ], "tag": { - "commentStart": 2456, - "end": 2464, - "start": 2456, + "commentStart": 2457, + "end": 2465, + "start": 2457, "type": "TagDeclarator", "value": "line001" }, @@ -6895,9 +6895,9 @@ description: Variables in memory after executing gridfinity-bins.kcl 38.8 ], "tag": { - "commentStart": 2515, - "end": 2523, - "start": 2515, + "commentStart": 2516, + "end": 2524, + "start": 2516, "type": "TagDeclarator", "value": "line002" }, @@ -6920,9 +6920,9 @@ description: Variables in memory after executing gridfinity-bins.kcl 38.8 ], "tag": { - "commentStart": 2542, - "end": 2550, - "start": 2542, + "commentStart": 2543, + "end": 2551, + "start": 2543, "type": "TagDeclarator", "value": "line003" }, @@ -7103,9 +7103,9 @@ description: Variables in memory after executing gridfinity-bins.kcl "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 2386, - "end": 2394, - "start": 2386, + "commentStart": 2387, + "end": 2395, + "start": 2387, "type": "TagDeclarator", "value": "line000" }, @@ -7116,9 +7116,9 @@ description: Variables in memory after executing gridfinity-bins.kcl "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 2456, - "end": 2464, - "start": 2456, + "commentStart": 2457, + "end": 2465, + "start": 2457, "type": "TagDeclarator", "value": "line001" }, @@ -7129,9 +7129,9 @@ description: Variables in memory after executing gridfinity-bins.kcl "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 2515, - "end": 2523, - "start": 2515, + "commentStart": 2516, + "end": 2524, + "start": 2516, "type": "TagDeclarator", "value": "line002" }, @@ -7142,9 +7142,9 @@ description: Variables in memory after executing gridfinity-bins.kcl "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 2542, - "end": 2550, - "start": 2542, + "commentStart": 2543, + "end": 2551, + "start": 2543, "type": "TagDeclarator", "value": "line003" }, @@ -7165,9 +7165,9 @@ description: Variables in memory after executing gridfinity-bins.kcl 3.2 ], "tag": { - "commentStart": 2386, - "end": 2394, - "start": 2386, + "commentStart": 2387, + "end": 2395, + "start": 2387, "type": "TagDeclarator", "value": "line000" }, @@ -7190,9 +7190,9 @@ description: Variables in memory after executing gridfinity-bins.kcl 3.2 ], "tag": { - "commentStart": 2456, - "end": 2464, - "start": 2456, + "commentStart": 2457, + "end": 2465, + "start": 2457, "type": "TagDeclarator", "value": "line001" }, @@ -7215,9 +7215,9 @@ description: Variables in memory after executing gridfinity-bins.kcl 38.8 ], "tag": { - "commentStart": 2515, - "end": 2523, - "start": 2515, + "commentStart": 2516, + "end": 2524, + "start": 2516, "type": "TagDeclarator", "value": "line002" }, @@ -7240,9 +7240,9 @@ description: Variables in memory after executing gridfinity-bins.kcl 38.8 ], "tag": { - "commentStart": 2542, - "end": 2550, - "start": 2542, + "commentStart": 2543, + "end": 2551, + "start": 2543, "type": "TagDeclarator", "value": "line003" }, @@ -12882,9 +12882,9 @@ description: Variables in memory after executing gridfinity-bins.kcl "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 4455, - "end": 4463, - "start": 4455, + "commentStart": 4456, + "end": 4464, + "start": 4456, "type": "TagDeclarator", "value": "line010" }, @@ -12895,9 +12895,9 @@ description: Variables in memory after executing gridfinity-bins.kcl "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 4534, - "end": 4542, - "start": 4534, + "commentStart": 4535, + "end": 4543, + "start": 4535, "type": "TagDeclarator", "value": "line011" }, @@ -12908,9 +12908,9 @@ description: Variables in memory after executing gridfinity-bins.kcl "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 4593, - "end": 4601, - "start": 4593, + "commentStart": 4594, + "end": 4602, + "start": 4594, "type": "TagDeclarator", "value": "line012" }, @@ -12921,9 +12921,9 @@ description: Variables in memory after executing gridfinity-bins.kcl "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 4620, - "end": 4628, - "start": 4620, + "commentStart": 4621, + "end": 4629, + "start": 4621, "type": "TagDeclarator", "value": "line013" }, @@ -12944,9 +12944,9 @@ description: Variables in memory after executing gridfinity-bins.kcl 0.0 ], "tag": { - "commentStart": 4455, - "end": 4463, - "start": 4455, + "commentStart": 4456, + "end": 4464, + "start": 4456, "type": "TagDeclarator", "value": "line010" }, @@ -12969,9 +12969,9 @@ description: Variables in memory after executing gridfinity-bins.kcl 0.0 ], "tag": { - "commentStart": 4534, - "end": 4542, - "start": 4534, + "commentStart": 4535, + "end": 4543, + "start": 4535, "type": "TagDeclarator", "value": "line011" }, @@ -12994,9 +12994,9 @@ description: Variables in memory after executing gridfinity-bins.kcl 126.0 ], "tag": { - "commentStart": 4593, - "end": 4601, - "start": 4593, + "commentStart": 4594, + "end": 4602, + "start": 4594, "type": "TagDeclarator", "value": "line012" }, @@ -13019,9 +13019,9 @@ description: Variables in memory after executing gridfinity-bins.kcl 126.0 ], "tag": { - "commentStart": 4620, - "end": 4628, - "start": 4620, + "commentStart": 4621, + "end": 4629, + "start": 4621, "type": "TagDeclarator", "value": "line013" }, @@ -14295,9 +14295,9 @@ description: Variables in memory after executing gridfinity-bins.kcl "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 2386, - "end": 2394, - "start": 2386, + "commentStart": 2387, + "end": 2395, + "start": 2387, "type": "TagDeclarator", "value": "line000" }, @@ -14308,9 +14308,9 @@ description: Variables in memory after executing gridfinity-bins.kcl "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 2456, - "end": 2464, - "start": 2456, + "commentStart": 2457, + "end": 2465, + "start": 2457, "type": "TagDeclarator", "value": "line001" }, @@ -14321,9 +14321,9 @@ description: Variables in memory after executing gridfinity-bins.kcl "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 2515, - "end": 2523, - "start": 2515, + "commentStart": 2516, + "end": 2524, + "start": 2516, "type": "TagDeclarator", "value": "line002" }, @@ -14334,9 +14334,9 @@ description: Variables in memory after executing gridfinity-bins.kcl "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 2542, - "end": 2550, - "start": 2542, + "commentStart": 2543, + "end": 2551, + "start": 2543, "type": "TagDeclarator", "value": "line003" }, @@ -14357,9 +14357,9 @@ description: Variables in memory after executing gridfinity-bins.kcl 3.2 ], "tag": { - "commentStart": 2386, - "end": 2394, - "start": 2386, + "commentStart": 2387, + "end": 2395, + "start": 2387, "type": "TagDeclarator", "value": "line000" }, @@ -14382,9 +14382,9 @@ description: Variables in memory after executing gridfinity-bins.kcl 3.2 ], "tag": { - "commentStart": 2456, - "end": 2464, - "start": 2456, + "commentStart": 2457, + "end": 2465, + "start": 2457, "type": "TagDeclarator", "value": "line001" }, @@ -14407,9 +14407,9 @@ description: Variables in memory after executing gridfinity-bins.kcl 38.8 ], "tag": { - "commentStart": 2515, - "end": 2523, - "start": 2515, + "commentStart": 2516, + "end": 2524, + "start": 2516, "type": "TagDeclarator", "value": "line002" }, @@ -14432,9 +14432,9 @@ description: Variables in memory after executing gridfinity-bins.kcl 38.8 ], "tag": { - "commentStart": 2542, - "end": 2550, - "start": 2542, + "commentStart": 2543, + "end": 2551, + "start": 2543, "type": "TagDeclarator", "value": "line003" }, @@ -14715,9 +14715,9 @@ description: Variables in memory after executing gridfinity-bins.kcl "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 2386, - "end": 2394, - "start": 2386, + "commentStart": 2387, + "end": 2395, + "start": 2387, "type": "TagDeclarator", "value": "line000" }, @@ -14728,9 +14728,9 @@ description: Variables in memory after executing gridfinity-bins.kcl "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 2456, - "end": 2464, - "start": 2456, + "commentStart": 2457, + "end": 2465, + "start": 2457, "type": "TagDeclarator", "value": "line001" }, @@ -14741,9 +14741,9 @@ description: Variables in memory after executing gridfinity-bins.kcl "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 2515, - "end": 2523, - "start": 2515, + "commentStart": 2516, + "end": 2524, + "start": 2516, "type": "TagDeclarator", "value": "line002" }, @@ -14754,9 +14754,9 @@ description: Variables in memory after executing gridfinity-bins.kcl "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 2542, - "end": 2550, - "start": 2542, + "commentStart": 2543, + "end": 2551, + "start": 2543, "type": "TagDeclarator", "value": "line003" }, @@ -14777,9 +14777,9 @@ description: Variables in memory after executing gridfinity-bins.kcl 3.2 ], "tag": { - "commentStart": 2386, - "end": 2394, - "start": 2386, + "commentStart": 2387, + "end": 2395, + "start": 2387, "type": "TagDeclarator", "value": "line000" }, @@ -14802,9 +14802,9 @@ description: Variables in memory after executing gridfinity-bins.kcl 3.2 ], "tag": { - "commentStart": 2456, - "end": 2464, - "start": 2456, + "commentStart": 2457, + "end": 2465, + "start": 2457, "type": "TagDeclarator", "value": "line001" }, @@ -14827,9 +14827,9 @@ description: Variables in memory after executing gridfinity-bins.kcl 38.8 ], "tag": { - "commentStart": 2515, - "end": 2523, - "start": 2515, + "commentStart": 2516, + "end": 2524, + "start": 2516, "type": "TagDeclarator", "value": "line002" }, @@ -14852,9 +14852,9 @@ description: Variables in memory after executing gridfinity-bins.kcl 38.8 ], "tag": { - "commentStart": 2542, - "end": 2550, - "start": 2542, + "commentStart": 2543, + "end": 2551, + "start": 2543, "type": "TagDeclarator", "value": "line003" }, @@ -15135,9 +15135,9 @@ description: Variables in memory after executing gridfinity-bins.kcl "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 2386, - "end": 2394, - "start": 2386, + "commentStart": 2387, + "end": 2395, + "start": 2387, "type": "TagDeclarator", "value": "line000" }, @@ -15148,9 +15148,9 @@ description: Variables in memory after executing gridfinity-bins.kcl "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 2456, - "end": 2464, - "start": 2456, + "commentStart": 2457, + "end": 2465, + "start": 2457, "type": "TagDeclarator", "value": "line001" }, @@ -15161,9 +15161,9 @@ description: Variables in memory after executing gridfinity-bins.kcl "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 2515, - "end": 2523, - "start": 2515, + "commentStart": 2516, + "end": 2524, + "start": 2516, "type": "TagDeclarator", "value": "line002" }, @@ -15174,9 +15174,9 @@ description: Variables in memory after executing gridfinity-bins.kcl "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 2542, - "end": 2550, - "start": 2542, + "commentStart": 2543, + "end": 2551, + "start": 2543, "type": "TagDeclarator", "value": "line003" }, @@ -15197,9 +15197,9 @@ description: Variables in memory after executing gridfinity-bins.kcl 3.2 ], "tag": { - "commentStart": 2386, - "end": 2394, - "start": 2386, + "commentStart": 2387, + "end": 2395, + "start": 2387, "type": "TagDeclarator", "value": "line000" }, @@ -15222,9 +15222,9 @@ description: Variables in memory after executing gridfinity-bins.kcl 3.2 ], "tag": { - "commentStart": 2456, - "end": 2464, - "start": 2456, + "commentStart": 2457, + "end": 2465, + "start": 2457, "type": "TagDeclarator", "value": "line001" }, @@ -15247,9 +15247,9 @@ description: Variables in memory after executing gridfinity-bins.kcl 38.8 ], "tag": { - "commentStart": 2515, - "end": 2523, - "start": 2515, + "commentStart": 2516, + "end": 2524, + "start": 2516, "type": "TagDeclarator", "value": "line002" }, @@ -15272,9 +15272,9 @@ description: Variables in memory after executing gridfinity-bins.kcl 38.8 ], "tag": { - "commentStart": 2542, - "end": 2550, - "start": 2542, + "commentStart": 2543, + "end": 2551, + "start": 2543, "type": "TagDeclarator", "value": "line003" }, @@ -15555,9 +15555,9 @@ description: Variables in memory after executing gridfinity-bins.kcl "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 2386, - "end": 2394, - "start": 2386, + "commentStart": 2387, + "end": 2395, + "start": 2387, "type": "TagDeclarator", "value": "line000" }, @@ -15568,9 +15568,9 @@ description: Variables in memory after executing gridfinity-bins.kcl "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 2456, - "end": 2464, - "start": 2456, + "commentStart": 2457, + "end": 2465, + "start": 2457, "type": "TagDeclarator", "value": "line001" }, @@ -15581,9 +15581,9 @@ description: Variables in memory after executing gridfinity-bins.kcl "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 2515, - "end": 2523, - "start": 2515, + "commentStart": 2516, + "end": 2524, + "start": 2516, "type": "TagDeclarator", "value": "line002" }, @@ -15594,9 +15594,9 @@ description: Variables in memory after executing gridfinity-bins.kcl "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 2542, - "end": 2550, - "start": 2542, + "commentStart": 2543, + "end": 2551, + "start": 2543, "type": "TagDeclarator", "value": "line003" }, @@ -15617,9 +15617,9 @@ description: Variables in memory after executing gridfinity-bins.kcl 3.2 ], "tag": { - "commentStart": 2386, - "end": 2394, - "start": 2386, + "commentStart": 2387, + "end": 2395, + "start": 2387, "type": "TagDeclarator", "value": "line000" }, @@ -15642,9 +15642,9 @@ description: Variables in memory after executing gridfinity-bins.kcl 3.2 ], "tag": { - "commentStart": 2456, - "end": 2464, - "start": 2456, + "commentStart": 2457, + "end": 2465, + "start": 2457, "type": "TagDeclarator", "value": "line001" }, @@ -15667,9 +15667,9 @@ description: Variables in memory after executing gridfinity-bins.kcl 38.8 ], "tag": { - "commentStart": 2515, - "end": 2523, - "start": 2515, + "commentStart": 2516, + "end": 2524, + "start": 2516, "type": "TagDeclarator", "value": "line002" }, @@ -15692,9 +15692,9 @@ description: Variables in memory after executing gridfinity-bins.kcl 38.8 ], "tag": { - "commentStart": 2542, - "end": 2550, - "start": 2542, + "commentStart": 2543, + "end": 2551, + "start": 2543, "type": "TagDeclarator", "value": "line003" }, @@ -16870,9 +16870,9 @@ description: Variables in memory after executing gridfinity-bins.kcl "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 2386, - "end": 2394, - "start": 2386, + "commentStart": 2387, + "end": 2395, + "start": 2387, "type": "TagDeclarator", "value": "line000" }, @@ -16883,9 +16883,9 @@ description: Variables in memory after executing gridfinity-bins.kcl "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 2456, - "end": 2464, - "start": 2456, + "commentStart": 2457, + "end": 2465, + "start": 2457, "type": "TagDeclarator", "value": "line001" }, @@ -16896,9 +16896,9 @@ description: Variables in memory after executing gridfinity-bins.kcl "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 2515, - "end": 2523, - "start": 2515, + "commentStart": 2516, + "end": 2524, + "start": 2516, "type": "TagDeclarator", "value": "line002" }, @@ -16909,9 +16909,9 @@ description: Variables in memory after executing gridfinity-bins.kcl "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 2542, - "end": 2550, - "start": 2542, + "commentStart": 2543, + "end": 2551, + "start": 2543, "type": "TagDeclarator", "value": "line003" }, @@ -16932,9 +16932,9 @@ description: Variables in memory after executing gridfinity-bins.kcl 3.2 ], "tag": { - "commentStart": 2386, - "end": 2394, - "start": 2386, + "commentStart": 2387, + "end": 2395, + "start": 2387, "type": "TagDeclarator", "value": "line000" }, @@ -16957,9 +16957,9 @@ description: Variables in memory after executing gridfinity-bins.kcl 3.2 ], "tag": { - "commentStart": 2456, - "end": 2464, - "start": 2456, + "commentStart": 2457, + "end": 2465, + "start": 2457, "type": "TagDeclarator", "value": "line001" }, @@ -16982,9 +16982,9 @@ description: Variables in memory after executing gridfinity-bins.kcl 38.8 ], "tag": { - "commentStart": 2515, - "end": 2523, - "start": 2515, + "commentStart": 2516, + "end": 2524, + "start": 2516, "type": "TagDeclarator", "value": "line002" }, @@ -17007,9 +17007,9 @@ description: Variables in memory after executing gridfinity-bins.kcl 38.8 ], "tag": { - "commentStart": 2542, - "end": 2550, - "start": 2542, + "commentStart": 2543, + "end": 2551, + "start": 2543, "type": "TagDeclarator", "value": "line003" }, diff --git a/rust/kcl-lib/tests/kcl_samples/hex-nut/ast.snap b/rust/kcl-lib/tests/kcl_samples/hex-nut/ast.snap index 1c4d95584..aac74b806 100644 --- a/rust/kcl-lib/tests/kcl_samples/hex-nut/ast.snap +++ b/rust/kcl-lib/tests/kcl_samples/hex-nut/ast.snap @@ -1050,69 +1050,99 @@ description: Result of parsing hex-nut.kcl "expression": { "arguments": [ { - "commentStart": 0, - "elements": [ - { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "start", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "elements": [ + { + "commentStart": 0, + "end": 0, + "raw": "0", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 0.0, + "suffix": "None" + } + }, + { + "commentStart": 0, + "end": 0, + "raw": "0", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 0.0, + "suffix": "None" + } + } + ], + "end": 0, + "start": 0, + "type": "ArrayExpression", + "type": "ArrayExpression" + } + }, + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "thk", + "start": 0, + "type": "Identifier" + }, + "arg": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { "commentStart": 0, "end": 0, - "raw": "0", + "name": "thickness", "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 0.0, - "suffix": "None" - } + "type": "Identifier" }, - { + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } + }, + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "innerDia", + "start": 0, + "type": "Identifier" + }, + "arg": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { "commentStart": 0, "end": 0, - "raw": "0", + "name": "diameter", "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 0.0, - "suffix": "None" - } - } - ], - "end": 0, - "start": 0, - "type": "ArrayExpression", - "type": "ArrayExpression" - }, - { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "thickness", + "type": "Identifier" + }, + "path": [], "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "diameter", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" + "type": "Name", + "type": "Name" + } } ], "callee": { @@ -1133,8 +1163,9 @@ description: Result of parsing hex-nut.kcl "commentStart": 0, "end": 0, "start": 0, - "type": "CallExpression", - "type": "CallExpression" + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null }, "preComments": [ "", diff --git a/rust/kcl-lib/tests/kcl_samples/hex-nut/ops.snap b/rust/kcl-lib/tests/kcl_samples/hex-nut/ops.snap index 175c5cc1b..67140e3eb 100644 --- a/rust/kcl-lib/tests/kcl_samples/hex-nut/ops.snap +++ b/rust/kcl-lib/tests/kcl_samples/hex-nut/ops.snap @@ -82,7 +82,74 @@ description: Operations executed hex-nut.kcl "name": "hexNut", "functionSourceRange": [], "unlabeledArg": null, - "labeledArgs": {} + "labeledArgs": { + "innerDia": { + "value": { + "type": "Number", + "value": 0.3125, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "start": { + "value": { + "type": "Array", + "value": [ + { + "type": "Number", + "value": 0.0, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + { + "type": "Number", + "value": 0.0, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + } + ] + }, + "sourceRange": [] + }, + "thk": { + "value": { + "type": "Number", + "value": 0.266, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + } + } }, "sourceRange": [] }, diff --git a/rust/kcl-lib/tests/kcl_samples/keyboard/artifact_graph_flowchart.snap.md b/rust/kcl-lib/tests/kcl_samples/keyboard/artifact_graph_flowchart.snap.md index 9be4a16d7..f1940494d 100644 --- a/rust/kcl-lib/tests/kcl_samples/keyboard/artifact_graph_flowchart.snap.md +++ b/rust/kcl-lib/tests/kcl_samples/keyboard/artifact_graph_flowchart.snap.md @@ -303,55 +303,55 @@ flowchart LR 320[Solid2d] end subgraph path55 [Path] - 55["Path
[4901, 4988, 0]"] - 258["Segment
[4996, 5025, 0]"] - 259["Segment
[5033, 5061, 0]"] - 260["Segment
[5069, 5147, 0]"] - 261["Segment
[5155, 5202, 0]"] - 262["Segment
[5210, 5238, 0]"] - 263["Segment
[5246, 5275, 0]"] - 264["Segment
[5283, 5312, 0]"] - 265["Segment
[5320, 5386, 0]"] - 266["Segment
[5394, 5422, 0]"] - 267["Segment
[5430, 5459, 0]"] - 268["Segment
[5467, 5529, 0]"] - 269["Segment
[5537, 5565, 0]"] - 270["Segment
[5573, 5607, 0]"] - 271["Segment
[5615, 5645, 0]"] - 272["Segment
[5653, 5721, 0]"] - 273["Segment
[5729, 5736, 0]"] + 55["Path
[6329, 6416, 0]"] + 258["Segment
[6424, 6453, 0]"] + 259["Segment
[6461, 6489, 0]"] + 260["Segment
[6497, 6575, 0]"] + 261["Segment
[6583, 6630, 0]"] + 262["Segment
[6638, 6666, 0]"] + 263["Segment
[6674, 6703, 0]"] + 264["Segment
[6711, 6740, 0]"] + 265["Segment
[6748, 6814, 0]"] + 266["Segment
[6822, 6850, 0]"] + 267["Segment
[6858, 6887, 0]"] + 268["Segment
[6895, 6957, 0]"] + 269["Segment
[6965, 6993, 0]"] + 270["Segment
[7001, 7035, 0]"] + 271["Segment
[7043, 7073, 0]"] + 272["Segment
[7081, 7149, 0]"] + 273["Segment
[7157, 7164, 0]"] 294[Solid2d] end subgraph path56 [Path] - 56["Path
[5936, 6034, 0]"] - 274["Segment
[6042, 6120, 0]"] - 276["Segment
[6128, 6175, 0]"] - 279["Segment
[6183, 6263, 0]"] - 281["Segment
[6271, 6278, 0]"] + 56["Path
[7364, 7462, 0]"] + 274["Segment
[7470, 7548, 0]"] + 276["Segment
[7556, 7603, 0]"] + 279["Segment
[7611, 7691, 0]"] + 281["Segment
[7699, 7706, 0]"] 299[Solid2d] end subgraph path57 [Path] - 57["Path
[5936, 6034, 0]"] - 275["Segment
[6042, 6120, 0]"] - 277["Segment
[6128, 6175, 0]"] - 278["Segment
[6183, 6263, 0]"] - 280["Segment
[6271, 6278, 0]"] + 57["Path
[7364, 7462, 0]"] + 275["Segment
[7470, 7548, 0]"] + 277["Segment
[7556, 7603, 0]"] + 278["Segment
[7611, 7691, 0]"] + 280["Segment
[7699, 7706, 0]"] 313[Solid2d] end subgraph path58 [Path] - 58["Path
[6386, 6483, 0]"] - 282["Segment
[6491, 6569, 0]"] - 285["Segment
[6577, 6625, 0]"] - 287["Segment
[6633, 6713, 0]"] - 289["Segment
[6721, 6728, 0]"] + 58["Path
[7814, 7911, 0]"] + 282["Segment
[7919, 7997, 0]"] + 285["Segment
[8005, 8053, 0]"] + 287["Segment
[8061, 8141, 0]"] + 289["Segment
[8149, 8156, 0]"] 306[Solid2d] end subgraph path59 [Path] - 59["Path
[6386, 6483, 0]"] - 283["Segment
[6491, 6569, 0]"] - 284["Segment
[6577, 6625, 0]"] - 286["Segment
[6633, 6713, 0]"] - 288["Segment
[6721, 6728, 0]"] + 59["Path
[7814, 7911, 0]"] + 283["Segment
[7919, 7997, 0]"] + 284["Segment
[8005, 8053, 0]"] + 286["Segment
[8061, 8141, 0]"] + 288["Segment
[8149, 8156, 0]"] 309[Solid2d] end 1["Plane
[532, 549, 0]"] @@ -376,11 +376,11 @@ flowchart LR 20["Plane
[1946, 1969, 0]"] 21["Plane
[1946, 1969, 0]"] 22["Plane
[1946, 1969, 0]"] - 23["Plane
[4870, 4893, 0]"] - 24["Plane
[5905, 5928, 0]"] - 25["Plane
[5905, 5928, 0]"] - 26["Plane
[6355, 6378, 0]"] - 27["Plane
[6355, 6378, 0]"] + 23["Plane
[6298, 6321, 0]"] + 24["Plane
[7333, 7356, 0]"] + 25["Plane
[7333, 7356, 0]"] + 26["Plane
[7783, 7806, 0]"] + 27["Plane
[7783, 7806, 0]"] 28["StartSketchOnFace
[1151, 1189, 0]"] 321["Sweep Extrusion
[851, 873, 0]"] 322["Sweep Extrusion
[1472, 1570, 0]"] @@ -408,11 +408,11 @@ flowchart LR 344["Sweep Extrusion
[2685, 2711, 0]"] 345["Sweep Extrusion
[2685, 2711, 0]"] 346["Sweep Extrusion
[2685, 2711, 0]"] - 347["Sweep Extrusion
[5744, 5768, 0]"] - 348["Sweep Extrusion
[6286, 6310, 0]"] - 349["Sweep Extrusion
[6286, 6310, 0]"] - 350["Sweep Extrusion
[6736, 6760, 0]"] - 351["Sweep Extrusion
[6736, 6760, 0]"] + 347["Sweep Extrusion
[7172, 7196, 0]"] + 348["Sweep Extrusion
[7714, 7738, 0]"] + 349["Sweep Extrusion
[7714, 7738, 0]"] + 350["Sweep Extrusion
[8164, 8188, 0]"] + 351["Sweep Extrusion
[8164, 8188, 0]"] 352[Wall] 353[Wall] 354[Wall] diff --git a/rust/kcl-lib/tests/kcl_samples/keyboard/ast.snap b/rust/kcl-lib/tests/kcl_samples/keyboard/ast.snap index a25c82c2d..cafb642d5 100644 --- a/rust/kcl-lib/tests/kcl_samples/keyboard/ast.snap +++ b/rust/kcl-lib/tests/kcl_samples/keyboard/ast.snap @@ -4145,97 +4145,147 @@ description: Result of parsing keyboard.kcl "expression": { "arguments": [ { - "commentStart": 0, - "elements": [ - { - "commentStart": 0, - "end": 0, - "raw": "0.3", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 0.3, - "suffix": "None" - } - }, - { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "originStart", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "elements": [ + { "commentStart": 0, "end": 0, - "name": "row1", + "raw": "0.3", "start": 0, - "type": "Identifier" + "type": "Literal", + "type": "Literal", + "value": { + "value": 0.3, + "suffix": "None" + } }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - } - ], - "end": 0, - "start": 0, - "type": "ArrayExpression", - "type": "ArrayExpression" - }, - { - "commentStart": 0, - "end": 0, - "raw": "1.1", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 1.1, - "suffix": "None" + { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "row1", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } + ], + "end": 0, + "start": 0, + "type": "ArrayExpression", + "type": "ArrayExpression" } }, { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "keyWidth", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "end": 0, + "raw": "1.1", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 1.1, + "suffix": "None" + } + } + }, + { + "type": "LabeledArg", + "label": { "commentStart": 0, "end": 0, "name": "keyHeight", "start": 0, "type": "Identifier" }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - { - "commentStart": 0, - "end": 0, - "raw": "0", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 0.0, - "suffix": "None" + "arg": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "keyHeight", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" } }, { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { + "type": "LabeledArg", + "label": { "commentStart": 0, "end": 0, - "name": "highlightColor2", + "name": "repeats", "start": 0, "type": "Identifier" }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" + "arg": { + "commentStart": 0, + "end": 0, + "raw": "0", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 0.0, + "suffix": "None" + } + } + }, + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "color", + "start": 0, + "type": "Identifier" + }, + "arg": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "highlightColor2", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } } ], "callee": { @@ -4256,8 +4306,9 @@ description: Result of parsing keyboard.kcl "commentStart": 0, "end": 0, "start": 0, - "type": "CallExpression", - "type": "CallExpression" + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null }, "preComments": [ "", @@ -4274,97 +4325,147 @@ description: Result of parsing keyboard.kcl "expression": { "arguments": [ { - "commentStart": 0, - "elements": [ - { - "commentStart": 0, - "end": 0, - "raw": "1.5", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 1.5, - "suffix": "None" + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "originStart", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "elements": [ + { + "commentStart": 0, + "end": 0, + "raw": "1.5", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 1.5, + "suffix": "None" + } + }, + { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "row1", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" } - }, - { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "row1", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - } - ], - "end": 0, - "start": 0, - "type": "ArrayExpression", - "type": "ArrayExpression" - }, - { - "commentStart": 0, - "end": 0, - "raw": "0.8", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 0.8, - "suffix": "None" + ], + "end": 0, + "start": 0, + "type": "ArrayExpression", + "type": "ArrayExpression" } }, { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "keyWidth", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "end": 0, + "raw": "0.8", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 0.8, + "suffix": "None" + } + } + }, + { + "type": "LabeledArg", + "label": { "commentStart": 0, "end": 0, "name": "keyHeight", "start": 0, "type": "Identifier" }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - { - "commentStart": 0, - "end": 0, - "raw": "2", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 2.0, - "suffix": "None" + "arg": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "keyHeight", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" } }, { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { + "type": "LabeledArg", + "label": { "commentStart": 0, "end": 0, - "name": "highlightColor1", + "name": "repeats", "start": 0, "type": "Identifier" }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" + "arg": { + "commentStart": 0, + "end": 0, + "raw": "2", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 2.0, + "suffix": "None" + } + } + }, + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "color", + "start": 0, + "type": "Identifier" + }, + "arg": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "highlightColor1", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } } ], "callee": { @@ -4385,8 +4486,9 @@ description: Result of parsing keyboard.kcl "commentStart": 0, "end": 0, "start": 0, - "type": "CallExpression", - "type": "CallExpression" + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null }, "start": 0, "type": "ExpressionStatement", @@ -4398,684 +4500,18 @@ description: Result of parsing keyboard.kcl "expression": { "arguments": [ { - "commentStart": 0, - "elements": [ - { - "commentStart": 0, - "end": 0, - "left": { - "commentStart": 0, - "end": 0, - "left": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "spacing", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - "operator": "*", - "right": { - "commentStart": 0, - "end": 0, - "raw": "7", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 7.0, - "suffix": "None" - } - }, - "start": 0, - "type": "BinaryExpression", - "type": "BinaryExpression" - }, - "operator": "+", - "right": { - "commentStart": 0, - "end": 0, - "raw": "3.5", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 3.5, - "suffix": "None" - } - }, - "start": 0, - "type": "BinaryExpression", - "type": "BinaryExpression" - }, - { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "row1", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - } - ], - "end": 0, - "start": 0, - "type": "ArrayExpression", - "type": "ArrayExpression" - }, - { - "commentStart": 0, - "end": 0, - "raw": "5.2", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 5.2, - "suffix": "None" - } - }, - { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { + "type": "LabeledArg", + "label": { "commentStart": 0, "end": 0, - "name": "keyHeight", + "name": "originStart", "start": 0, "type": "Identifier" }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - { - "commentStart": 0, - "end": 0, - "raw": "0", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 0.0, - "suffix": "None" - } - }, - { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { + "arg": { "commentStart": 0, - "end": 0, - "name": "highlightColor2", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - } - ], - "callee": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "keyFn", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name" - }, - "commentStart": 0, - "end": 0, - "start": 0, - "type": "CallExpression", - "type": "CallExpression" - }, - "start": 0, - "type": "ExpressionStatement", - "type": "ExpressionStatement" - }, - { - "commentStart": 0, - "end": 0, - "expression": { - "arguments": [ - { - "commentStart": 0, - "elements": [ - { - "commentStart": 0, - "end": 0, - "left": { - "commentStart": 0, - "end": 0, - "left": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "spacing", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - "operator": "*", - "right": { - "commentStart": 0, - "end": 0, - "raw": "8", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 8.0, - "suffix": "None" - } - }, - "start": 0, - "type": "BinaryExpression", - "type": "BinaryExpression" - }, - "operator": "+", - "right": { - "commentStart": 0, - "end": 0, - "raw": "8.7", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 8.7, - "suffix": "None" - } - }, - "start": 0, - "type": "BinaryExpression", - "type": "BinaryExpression" - }, - { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "row1", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - } - ], - "end": 0, - "start": 0, - "type": "ArrayExpression", - "type": "ArrayExpression" - }, - { - "commentStart": 0, - "end": 0, - "raw": "0.8", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 0.8, - "suffix": "None" - } - }, - { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "keyHeight", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - { - "commentStart": 0, - "end": 0, - "raw": "0", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 0.0, - "suffix": "None" - } - }, - { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "highlightColor1", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - } - ], - "callee": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "keyFn", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name" - }, - "commentStart": 0, - "end": 0, - "start": 0, - "type": "CallExpression", - "type": "CallExpression" - }, - "start": 0, - "type": "ExpressionStatement", - "type": "ExpressionStatement" - }, - { - "commentStart": 0, - "end": 0, - "expression": { - "arguments": [ - { - "commentStart": 0, - "elements": [ - { - "commentStart": 0, - "end": 0, - "left": { - "commentStart": 0, - "end": 0, - "left": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "spacing", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - "operator": "*", - "right": { - "commentStart": 0, - "end": 0, - "raw": "8", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 8.0, - "suffix": "None" - } - }, - "start": 0, - "type": "BinaryExpression", - "type": "BinaryExpression" - }, - "operator": "+", - "right": { - "commentStart": 0, - "end": 0, - "raw": "9.6", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 9.6, - "suffix": "None" - } - }, - "start": 0, - "type": "BinaryExpression", - "type": "BinaryExpression" - }, - { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "row1", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - } - ], - "end": 0, - "start": 0, - "type": "ArrayExpression", - "type": "ArrayExpression" - }, - { - "commentStart": 0, - "end": 0, - "raw": "0.8", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 0.8, - "suffix": "None" - } - }, - { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "keyHeight", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - { - "commentStart": 0, - "end": 0, - "raw": "0", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 0.0, - "suffix": "None" - } - }, - { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "highlightColor1", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - } - ], - "callee": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "keyFn", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name" - }, - "commentStart": 0, - "end": 0, - "start": 0, - "type": "CallExpression", - "type": "CallExpression" - }, - "start": 0, - "type": "ExpressionStatement", - "type": "ExpressionStatement" - }, - { - "commentStart": 0, - "end": 0, - "expression": { - "arguments": [ - { - "commentStart": 0, - "elements": [ - { - "commentStart": 0, - "end": 0, - "left": { - "commentStart": 0, - "end": 0, - "left": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "spacing", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - "operator": "*", - "right": { - "commentStart": 0, - "end": 0, - "raw": "10", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 10.0, - "suffix": "None" - } - }, - "start": 0, - "type": "BinaryExpression", - "type": "BinaryExpression" - }, - "operator": "+", - "right": { - "commentStart": 0, - "end": 0, - "raw": "10.3", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 10.3, - "suffix": "None" - } - }, - "start": 0, - "type": "BinaryExpression", - "type": "BinaryExpression" - }, - { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "row1", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - } - ], - "end": 0, - "start": 0, - "type": "ArrayExpression", - "type": "ArrayExpression" - }, - { - "commentStart": 0, - "end": 0, - "raw": "1.1", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 1.1, - "suffix": "None" - } - }, - { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "keyHeight", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - { - "commentStart": 0, - "end": 0, - "raw": "0", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 0.0, - "suffix": "None" - } - }, - { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "highlightColor1", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - } - ], - "callee": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "keyFn", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name" - }, - "commentStart": 0, - "end": 0, - "start": 0, - "type": "CallExpression", - "type": "CallExpression" - }, - "start": 0, - "type": "ExpressionStatement", - "type": "ExpressionStatement" - }, - { - "commentStart": 0, - "end": 0, - "expression": { - "arguments": [ - { - "commentStart": 0, - "elements": [ - { - "commentStart": 0, - "end": 0, - "left": { + "elements": [ + { "commentStart": 0, "end": 0, "left": { @@ -5101,12 +4537,669 @@ description: Result of parsing keyboard.kcl "right": { "commentStart": 0, "end": 0, - "raw": "12", + "raw": "7", "start": 0, "type": "Literal", "type": "Literal", "value": { - "value": 12.0, + "value": 7.0, + "suffix": "None" + } + }, + "start": 0, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "operator": "+", + "right": { + "commentStart": 0, + "end": 0, + "raw": "3.5", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 3.5, + "suffix": "None" + } + }, + "start": 0, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "row1", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } + ], + "end": 0, + "start": 0, + "type": "ArrayExpression", + "type": "ArrayExpression" + } + }, + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "keyWidth", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "end": 0, + "raw": "5.2", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 5.2, + "suffix": "None" + } + } + }, + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "keyHeight", + "start": 0, + "type": "Identifier" + }, + "arg": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "keyHeight", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } + }, + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "repeats", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "end": 0, + "raw": "0", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 0.0, + "suffix": "None" + } + } + }, + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "color", + "start": 0, + "type": "Identifier" + }, + "arg": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "highlightColor2", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } + } + ], + "callee": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "keyFn", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name" + }, + "commentStart": 0, + "end": 0, + "start": 0, + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null + }, + "start": 0, + "type": "ExpressionStatement", + "type": "ExpressionStatement" + }, + { + "commentStart": 0, + "end": 0, + "expression": { + "arguments": [ + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "originStart", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "elements": [ + { + "commentStart": 0, + "end": 0, + "left": { + "commentStart": 0, + "end": 0, + "left": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "spacing", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + }, + "operator": "*", + "right": { + "commentStart": 0, + "end": 0, + "raw": "8", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 8.0, + "suffix": "None" + } + }, + "start": 0, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "operator": "+", + "right": { + "commentStart": 0, + "end": 0, + "raw": "8.7", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 8.7, + "suffix": "None" + } + }, + "start": 0, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "row1", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } + ], + "end": 0, + "start": 0, + "type": "ArrayExpression", + "type": "ArrayExpression" + } + }, + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "keyWidth", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "end": 0, + "raw": "0.8", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 0.8, + "suffix": "None" + } + } + }, + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "keyHeight", + "start": 0, + "type": "Identifier" + }, + "arg": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "keyHeight", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } + }, + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "repeats", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "end": 0, + "raw": "0", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 0.0, + "suffix": "None" + } + } + }, + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "color", + "start": 0, + "type": "Identifier" + }, + "arg": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "highlightColor1", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } + } + ], + "callee": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "keyFn", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name" + }, + "commentStart": 0, + "end": 0, + "start": 0, + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null + }, + "start": 0, + "type": "ExpressionStatement", + "type": "ExpressionStatement" + }, + { + "commentStart": 0, + "end": 0, + "expression": { + "arguments": [ + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "originStart", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "elements": [ + { + "commentStart": 0, + "end": 0, + "left": { + "commentStart": 0, + "end": 0, + "left": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "spacing", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + }, + "operator": "*", + "right": { + "commentStart": 0, + "end": 0, + "raw": "8", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 8.0, + "suffix": "None" + } + }, + "start": 0, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "operator": "+", + "right": { + "commentStart": 0, + "end": 0, + "raw": "9.6", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 9.6, + "suffix": "None" + } + }, + "start": 0, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "row1", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } + ], + "end": 0, + "start": 0, + "type": "ArrayExpression", + "type": "ArrayExpression" + } + }, + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "keyWidth", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "end": 0, + "raw": "0.8", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 0.8, + "suffix": "None" + } + } + }, + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "keyHeight", + "start": 0, + "type": "Identifier" + }, + "arg": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "keyHeight", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } + }, + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "repeats", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "end": 0, + "raw": "0", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 0.0, + "suffix": "None" + } + } + }, + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "color", + "start": 0, + "type": "Identifier" + }, + "arg": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "highlightColor1", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } + } + ], + "callee": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "keyFn", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name" + }, + "commentStart": 0, + "end": 0, + "start": 0, + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null + }, + "start": 0, + "type": "ExpressionStatement", + "type": "ExpressionStatement" + }, + { + "commentStart": 0, + "end": 0, + "expression": { + "arguments": [ + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "originStart", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "elements": [ + { + "commentStart": 0, + "end": 0, + "left": { + "commentStart": 0, + "end": 0, + "left": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "spacing", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + }, + "operator": "*", + "right": { + "commentStart": 0, + "end": 0, + "raw": "10", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 10.0, "suffix": "None" } }, @@ -5131,146 +5224,14 @@ description: Result of parsing keyboard.kcl "type": "BinaryExpression", "type": "BinaryExpression" }, - "operator": "+", - "right": { - "commentStart": 0, - "end": 0, - "raw": "1", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 1.0, - "suffix": "None" - } - }, - "start": 0, - "type": "BinaryExpression", - "type": "BinaryExpression" - }, - { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "row1", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - } - ], - "end": 0, - "start": 0, - "type": "ArrayExpression", - "type": "ArrayExpression" - }, - { - "commentStart": 0, - "end": 0, - "raw": "0.8", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 0.8, - "suffix": "None" - } - }, - { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "keyHeight", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - { - "commentStart": 0, - "end": 0, - "raw": "0", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 0.0, - "suffix": "None" - } - }, - { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "highlightColor2", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - } - ], - "callee": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "keyFn", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name" - }, - "commentStart": 0, - "end": 0, - "start": 0, - "type": "CallExpression", - "type": "CallExpression" - }, - "start": 0, - "type": "ExpressionStatement", - "type": "ExpressionStatement" - }, - { - "commentStart": 0, - "end": 0, - "expression": { - "arguments": [ - { - "commentStart": 0, - "elements": [ - { - "commentStart": 0, - "end": 0, - "left": { + { "abs_path": false, "commentStart": 0, "end": 0, "name": { "commentStart": 0, "end": 0, - "name": "spacing", + "name": "row1", "start": 0, "type": "Identifier" }, @@ -5278,101 +5239,109 @@ description: Result of parsing keyboard.kcl "start": 0, "type": "Name", "type": "Name" - }, - "operator": "*", - "right": { - "commentStart": 0, - "end": 0, - "raw": "3", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 3.0, - "suffix": "None" - } - }, - "start": 0, - "type": "BinaryExpression", - "type": "BinaryExpression" - }, - { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "row2", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - } - ], - "end": 0, - "start": 0, - "type": "ArrayExpression", - "type": "ArrayExpression" - }, - { - "commentStart": 0, - "end": 0, - "raw": "1.7", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 1.7, - "suffix": "None" + } + ], + "end": 0, + "start": 0, + "type": "ArrayExpression", + "type": "ArrayExpression" } }, { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "keyWidth", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "end": 0, + "raw": "1.1", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 1.1, + "suffix": "None" + } + } + }, + { + "type": "LabeledArg", + "label": { "commentStart": 0, "end": 0, "name": "keyHeight", "start": 0, "type": "Identifier" }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - { - "commentStart": 0, - "end": 0, - "raw": "0", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 0.0, - "suffix": "None" + "arg": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "keyHeight", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" } }, { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { + "type": "LabeledArg", + "label": { "commentStart": 0, "end": 0, - "name": "highlightColor2", + "name": "repeats", "start": 0, "type": "Identifier" }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" + "arg": { + "commentStart": 0, + "end": 0, + "raw": "0", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 0.0, + "suffix": "None" + } + } + }, + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "color", + "start": 0, + "type": "Identifier" + }, + "arg": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "highlightColor1", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } } ], "callee": { @@ -5393,14 +5362,10 @@ description: Result of parsing keyboard.kcl "commentStart": 0, "end": 0, "start": 0, - "type": "CallExpression", - "type": "CallExpression" + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null }, - "preComments": [ - "", - "", - "// Build the second row of keys" - ], "start": 0, "type": "ExpressionStatement", "type": "ExpressionStatement" @@ -5411,12 +5376,257 @@ description: Result of parsing keyboard.kcl "expression": { "arguments": [ { - "commentStart": 0, - "elements": [ - { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "originStart", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "elements": [ + { + "commentStart": 0, + "end": 0, + "left": { + "commentStart": 0, + "end": 0, + "left": { + "commentStart": 0, + "end": 0, + "left": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "spacing", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + }, + "operator": "*", + "right": { + "commentStart": 0, + "end": 0, + "raw": "12", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 12.0, + "suffix": "None" + } + }, + "start": 0, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "operator": "+", + "right": { + "commentStart": 0, + "end": 0, + "raw": "10.3", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 10.3, + "suffix": "None" + } + }, + "start": 0, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "operator": "+", + "right": { + "commentStart": 0, + "end": 0, + "raw": "1", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 1.0, + "suffix": "None" + } + }, + "start": 0, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "row1", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } + ], + "end": 0, + "start": 0, + "type": "ArrayExpression", + "type": "ArrayExpression" + } + }, + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "keyWidth", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "end": 0, + "raw": "0.8", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 0.8, + "suffix": "None" + } + } + }, + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "keyHeight", + "start": 0, + "type": "Identifier" + }, + "arg": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { "commentStart": 0, "end": 0, - "left": { + "name": "keyHeight", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } + }, + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "repeats", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "end": 0, + "raw": "0", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 0.0, + "suffix": "None" + } + } + }, + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "color", + "start": 0, + "type": "Identifier" + }, + "arg": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "highlightColor2", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } + } + ], + "callee": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "keyFn", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name" + }, + "commentStart": 0, + "end": 0, + "start": 0, + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null + }, + "start": 0, + "type": "ExpressionStatement", + "type": "ExpressionStatement" + }, + { + "commentStart": 0, + "end": 0, + "expression": { + "arguments": [ + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "originStart", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "elements": [ + { "commentStart": 0, "end": 0, "left": { @@ -5439,12 +5649,12 @@ description: Result of parsing keyboard.kcl "right": { "commentStart": 0, "end": 0, - "raw": "4", + "raw": "3", "start": 0, "type": "Literal", "type": "Literal", "value": { - "value": 4.0, + "value": 3.0, "suffix": "None" } }, @@ -5452,100 +5662,124 @@ description: Result of parsing keyboard.kcl "type": "BinaryExpression", "type": "BinaryExpression" }, - "operator": "+", - "right": { + { + "abs_path": false, "commentStart": 0, "end": 0, - "raw": "1.7", + "name": { + "commentStart": 0, + "end": 0, + "name": "row2", + "start": 0, + "type": "Identifier" + }, + "path": [], "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 1.7, - "suffix": "None" - } - }, - "start": 0, - "type": "BinaryExpression", - "type": "BinaryExpression" - }, - { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "row2", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - } - ], - "end": 0, - "start": 0, - "type": "ArrayExpression", - "type": "ArrayExpression" - }, - { - "commentStart": 0, - "end": 0, - "raw": "0.8", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 0.8, - "suffix": "None" + "type": "Name", + "type": "Name" + } + ], + "end": 0, + "start": 0, + "type": "ArrayExpression", + "type": "ArrayExpression" } }, { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "keyWidth", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "end": 0, + "raw": "1.7", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 1.7, + "suffix": "None" + } + } + }, + { + "type": "LabeledArg", + "label": { "commentStart": 0, "end": 0, "name": "keyHeight", "start": 0, "type": "Identifier" }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - { - "commentStart": 0, - "end": 0, - "raw": "9", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 9.0, - "suffix": "None" + "arg": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "keyHeight", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" } }, { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { + "type": "LabeledArg", + "label": { "commentStart": 0, "end": 0, - "name": "highlightColor1", + "name": "repeats", "start": 0, "type": "Identifier" }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" + "arg": { + "commentStart": 0, + "end": 0, + "raw": "0", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 0.0, + "suffix": "None" + } + } + }, + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "color", + "start": 0, + "type": "Identifier" + }, + "arg": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "highlightColor2", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } } ], "callee": { @@ -5566,9 +5800,15 @@ description: Result of parsing keyboard.kcl "commentStart": 0, "end": 0, "start": 0, - "type": "CallExpression", - "type": "CallExpression" + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null }, + "preComments": [ + "", + "", + "// Build the second row of keys" + ], "start": 0, "type": "ExpressionStatement", "type": "ExpressionStatement" @@ -5579,12 +5819,18 @@ description: Result of parsing keyboard.kcl "expression": { "arguments": [ { - "commentStart": 0, - "elements": [ - { - "commentStart": 0, - "end": 0, - "left": { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "originStart", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "elements": [ + { "commentStart": 0, "end": 0, "left": { @@ -5610,12 +5856,12 @@ description: Result of parsing keyboard.kcl "right": { "commentStart": 0, "end": 0, - "raw": "14", + "raw": "4", "start": 0, "type": "Literal", "type": "Literal", "value": { - "value": 14.0, + "value": 4.0, "suffix": "None" } }, @@ -5640,120 +5886,124 @@ description: Result of parsing keyboard.kcl "type": "BinaryExpression", "type": "BinaryExpression" }, - "operator": "+", - "right": { + { + "abs_path": false, "commentStart": 0, "end": 0, - "left": { + "name": { "commentStart": 0, "end": 0, - "raw": "0.8", + "name": "row2", "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 0.8, - "suffix": "None" - } - }, - "operator": "*", - "right": { - "commentStart": 0, - "end": 0, - "raw": "10", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 10.0, - "suffix": "None" - } + "type": "Identifier" }, + "path": [], "start": 0, - "type": "BinaryExpression", - "type": "BinaryExpression" - }, - "start": 0, - "type": "BinaryExpression", - "type": "BinaryExpression" - }, - { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "row2", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - } - ], - "end": 0, - "start": 0, - "type": "ArrayExpression", - "type": "ArrayExpression" - }, - { - "commentStart": 0, - "end": 0, - "raw": "2.2", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 2.2, - "suffix": "None" + "type": "Name", + "type": "Name" + } + ], + "end": 0, + "start": 0, + "type": "ArrayExpression", + "type": "ArrayExpression" } }, { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "keyWidth", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "end": 0, + "raw": "0.8", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 0.8, + "suffix": "None" + } + } + }, + { + "type": "LabeledArg", + "label": { "commentStart": 0, "end": 0, "name": "keyHeight", "start": 0, "type": "Identifier" }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - { - "commentStart": 0, - "end": 0, - "raw": "0", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 0.0, - "suffix": "None" + "arg": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "keyHeight", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" } }, { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { + "type": "LabeledArg", + "label": { "commentStart": 0, "end": 0, - "name": "highlightColor2", + "name": "repeats", "start": 0, "type": "Identifier" }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" + "arg": { + "commentStart": 0, + "end": 0, + "raw": "9", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 9.0, + "suffix": "None" + } + } + }, + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "color", + "start": 0, + "type": "Identifier" + }, + "arg": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "highlightColor1", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } } ], "callee": { @@ -5774,8 +6024,9 @@ description: Result of parsing keyboard.kcl "commentStart": 0, "end": 0, "start": 0, - "type": "CallExpression", - "type": "CallExpression" + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null }, "start": 0, "type": "ExpressionStatement", @@ -5787,19 +6038,121 @@ description: Result of parsing keyboard.kcl "expression": { "arguments": [ { - "commentStart": 0, - "elements": [ - { - "commentStart": 0, - "end": 0, - "left": { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "originStart", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "elements": [ + { + "commentStart": 0, + "end": 0, + "left": { + "commentStart": 0, + "end": 0, + "left": { + "commentStart": 0, + "end": 0, + "left": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "spacing", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + }, + "operator": "*", + "right": { + "commentStart": 0, + "end": 0, + "raw": "14", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 14.0, + "suffix": "None" + } + }, + "start": 0, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "operator": "+", + "right": { + "commentStart": 0, + "end": 0, + "raw": "1.7", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 1.7, + "suffix": "None" + } + }, + "start": 0, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "operator": "+", + "right": { + "commentStart": 0, + "end": 0, + "left": { + "commentStart": 0, + "end": 0, + "raw": "0.8", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 0.8, + "suffix": "None" + } + }, + "operator": "*", + "right": { + "commentStart": 0, + "end": 0, + "raw": "10", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 10.0, + "suffix": "None" + } + }, + "start": 0, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "start": 0, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + { "abs_path": false, "commentStart": 0, "end": 0, "name": { "commentStart": 0, "end": 0, - "name": "spacing", + "name": "row2", "start": 0, "type": "Identifier" }, @@ -5807,121 +6160,109 @@ description: Result of parsing keyboard.kcl "start": 0, "type": "Name", "type": "Name" - }, - "operator": "*", - "right": { - "commentStart": 0, - "end": 0, - "raw": "3", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 3.0, - "suffix": "None" - } - }, - "start": 0, - "type": "BinaryExpression", - "type": "BinaryExpression" - }, - { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "row3", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - } - ], - "end": 0, - "start": 0, - "type": "ArrayExpression", - "type": "ArrayExpression" + } + ], + "end": 0, + "start": 0, + "type": "ArrayExpression", + "type": "ArrayExpression" + } }, { - "commentStart": 0, - "end": 0, - "left": { + "type": "LabeledArg", + "label": { "commentStart": 0, "end": 0, - "raw": "1.1", + "name": "keyWidth", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "end": 0, + "raw": "2.2", "start": 0, "type": "Literal", "type": "Literal", "value": { - "value": 1.1, + "value": 2.2, "suffix": "None" } - }, - "operator": "+", - "right": { - "commentStart": 0, - "end": 0, - "raw": ".1", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 0.1, - "suffix": "None" - } - }, - "start": 0, - "type": "BinaryExpression", - "type": "BinaryExpression" + } }, { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { + "type": "LabeledArg", + "label": { "commentStart": 0, "end": 0, "name": "keyHeight", "start": 0, "type": "Identifier" }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - { - "commentStart": 0, - "end": 0, - "raw": "0", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 0.0, - "suffix": "None" + "arg": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "keyHeight", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" } }, { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { + "type": "LabeledArg", + "label": { "commentStart": 0, "end": 0, - "name": "highlightColor1", + "name": "repeats", "start": 0, "type": "Identifier" }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" + "arg": { + "commentStart": 0, + "end": 0, + "raw": "0", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 0.0, + "suffix": "None" + } + } + }, + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "color", + "start": 0, + "type": "Identifier" + }, + "arg": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "highlightColor2", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } } ], "callee": { @@ -5942,8 +6283,228 @@ description: Result of parsing keyboard.kcl "commentStart": 0, "end": 0, "start": 0, - "type": "CallExpression", - "type": "CallExpression" + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null + }, + "start": 0, + "type": "ExpressionStatement", + "type": "ExpressionStatement" + }, + { + "commentStart": 0, + "end": 0, + "expression": { + "arguments": [ + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "originStart", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "elements": [ + { + "commentStart": 0, + "end": 0, + "left": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "spacing", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + }, + "operator": "*", + "right": { + "commentStart": 0, + "end": 0, + "raw": "3", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 3.0, + "suffix": "None" + } + }, + "start": 0, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "row3", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } + ], + "end": 0, + "start": 0, + "type": "ArrayExpression", + "type": "ArrayExpression" + } + }, + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "keyWidth", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "end": 0, + "left": { + "commentStart": 0, + "end": 0, + "raw": "1.1", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 1.1, + "suffix": "None" + } + }, + "operator": "+", + "right": { + "commentStart": 0, + "end": 0, + "raw": ".1", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 0.1, + "suffix": "None" + } + }, + "start": 0, + "type": "BinaryExpression", + "type": "BinaryExpression" + } + }, + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "keyHeight", + "start": 0, + "type": "Identifier" + }, + "arg": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "keyHeight", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } + }, + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "repeats", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "end": 0, + "raw": "0", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 0.0, + "suffix": "None" + } + } + }, + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "color", + "start": 0, + "type": "Identifier" + }, + "arg": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "highlightColor1", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } + } + ], + "callee": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "keyFn", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name" + }, + "commentStart": 0, + "end": 0, + "start": 0, + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null }, "preComments": [ "", @@ -5960,12 +6521,1805 @@ description: Result of parsing keyboard.kcl "expression": { "arguments": [ { - "commentStart": 0, - "elements": [ - { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "originStart", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "elements": [ + { + "commentStart": 0, + "end": 0, + "left": { + "commentStart": 0, + "end": 0, + "left": { + "commentStart": 0, + "end": 0, + "left": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "spacing", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + }, + "operator": "*", + "right": { + "commentStart": 0, + "end": 0, + "raw": "4", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 4.0, + "suffix": "None" + } + }, + "start": 0, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "operator": "+", + "right": { + "commentStart": 0, + "end": 0, + "raw": "1.1", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 1.1, + "suffix": "None" + } + }, + "start": 0, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "operator": "+", + "right": { + "commentStart": 0, + "end": 0, + "raw": ".1", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 0.1, + "suffix": "None" + } + }, + "start": 0, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "row3", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } + ], + "end": 0, + "start": 0, + "type": "ArrayExpression", + "type": "ArrayExpression" + } + }, + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "keyWidth", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "end": 0, + "raw": "0.8", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 0.8, + "suffix": "None" + } + } + }, + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "keyHeight", + "start": 0, + "type": "Identifier" + }, + "arg": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { "commentStart": 0, "end": 0, - "left": { + "name": "keyHeight", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } + }, + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "repeats", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "end": 0, + "raw": "10", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 10.0, + "suffix": "None" + } + } + }, + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "color", + "start": 0, + "type": "Identifier" + }, + "arg": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "highlightColor1", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } + } + ], + "callee": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "keyFn", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name" + }, + "commentStart": 0, + "end": 0, + "start": 0, + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null + }, + "start": 0, + "type": "ExpressionStatement", + "type": "ExpressionStatement" + }, + { + "commentStart": 0, + "end": 0, + "expression": { + "arguments": [ + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "originStart", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "elements": [ + { + "commentStart": 0, + "end": 0, + "left": { + "commentStart": 0, + "end": 0, + "left": { + "commentStart": 0, + "end": 0, + "left": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "spacing", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + }, + "operator": "*", + "right": { + "commentStart": 0, + "end": 0, + "raw": "3", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 3.0, + "suffix": "None" + } + }, + "start": 0, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "operator": "+", + "right": { + "commentStart": 0, + "end": 0, + "raw": "11.1", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 11.1, + "suffix": "None" + } + }, + "start": 0, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "operator": "+", + "right": { + "commentStart": 0, + "end": 0, + "raw": ".1", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 0.1, + "suffix": "None" + } + }, + "start": 0, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "row3", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } + ], + "end": 0, + "start": 0, + "type": "ArrayExpression", + "type": "ArrayExpression" + } + }, + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "keyWidth", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "end": 0, + "left": { + "commentStart": 0, + "end": 0, + "raw": "1.4", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 1.4, + "suffix": "None" + } + }, + "operator": "+", + "right": { + "commentStart": 0, + "end": 0, + "raw": ".4", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 0.4, + "suffix": "None" + } + }, + "start": 0, + "type": "BinaryExpression", + "type": "BinaryExpression" + } + }, + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "keyHeight", + "start": 0, + "type": "Identifier" + }, + "arg": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "keyHeight", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } + }, + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "repeats", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "end": 0, + "raw": "0", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 0.0, + "suffix": "None" + } + } + }, + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "color", + "start": 0, + "type": "Identifier" + }, + "arg": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "highlightColor2", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } + } + ], + "callee": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "keyFn", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name" + }, + "commentStart": 0, + "end": 0, + "start": 0, + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null + }, + "start": 0, + "type": "ExpressionStatement", + "type": "ExpressionStatement" + }, + { + "commentStart": 0, + "end": 0, + "expression": { + "arguments": [ + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "originStart", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "elements": [ + { + "commentStart": 0, + "end": 0, + "left": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "spacing", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + }, + "operator": "*", + "right": { + "commentStart": 0, + "end": 0, + "raw": "3", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 3.0, + "suffix": "None" + } + }, + "start": 0, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "row4", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } + ], + "end": 0, + "start": 0, + "type": "ArrayExpression", + "type": "ArrayExpression" + } + }, + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "keyWidth", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "end": 0, + "raw": "0.9", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 0.9, + "suffix": "None" + } + } + }, + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "keyHeight", + "start": 0, + "type": "Identifier" + }, + "arg": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "keyHeight", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } + }, + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "repeats", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "end": 0, + "raw": "0", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 0.0, + "suffix": "None" + } + } + }, + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "color", + "start": 0, + "type": "Identifier" + }, + "arg": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "highlightColor1", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } + } + ], + "callee": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "keyFn", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name" + }, + "commentStart": 0, + "end": 0, + "start": 0, + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null + }, + "preComments": [ + "", + "", + "// Build the fourth row of keys" + ], + "start": 0, + "type": "ExpressionStatement", + "type": "ExpressionStatement" + }, + { + "commentStart": 0, + "end": 0, + "expression": { + "arguments": [ + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "originStart", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "elements": [ + { + "commentStart": 0, + "end": 0, + "left": { + "commentStart": 0, + "end": 0, + "left": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "spacing", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + }, + "operator": "*", + "right": { + "commentStart": 0, + "end": 0, + "raw": "4", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 4.0, + "suffix": "None" + } + }, + "start": 0, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "operator": "+", + "right": { + "commentStart": 0, + "end": 0, + "raw": "0.9", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 0.9, + "suffix": "None" + } + }, + "start": 0, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "row4", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } + ], + "end": 0, + "start": 0, + "type": "ArrayExpression", + "type": "ArrayExpression" + } + }, + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "keyWidth", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "end": 0, + "raw": "0.8", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 0.8, + "suffix": "None" + } + } + }, + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "keyHeight", + "start": 0, + "type": "Identifier" + }, + "arg": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "keyHeight", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } + }, + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "repeats", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "end": 0, + "raw": "11", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 11.0, + "suffix": "None" + } + } + }, + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "color", + "start": 0, + "type": "Identifier" + }, + "arg": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "highlightColor1", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } + } + ], + "callee": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "keyFn", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name" + }, + "commentStart": 0, + "end": 0, + "start": 0, + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null + }, + "start": 0, + "type": "ExpressionStatement", + "type": "ExpressionStatement" + }, + { + "commentStart": 0, + "end": 0, + "expression": { + "arguments": [ + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "originStart", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "elements": [ + { + "commentStart": 0, + "end": 0, + "left": { + "commentStart": 0, + "end": 0, + "left": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "spacing", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + }, + "operator": "*", + "right": { + "commentStart": 0, + "end": 0, + "raw": "3", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 3.0, + "suffix": "None" + } + }, + "start": 0, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "operator": "+", + "right": { + "commentStart": 0, + "end": 0, + "raw": "11.8", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 11.8, + "suffix": "None" + } + }, + "start": 0, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "row4", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } + ], + "end": 0, + "start": 0, + "type": "ArrayExpression", + "type": "ArrayExpression" + } + }, + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "keyWidth", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "end": 0, + "raw": "1.2", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 1.2, + "suffix": "None" + } + } + }, + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "keyHeight", + "start": 0, + "type": "Identifier" + }, + "arg": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "keyHeight", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } + }, + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "repeats", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "end": 0, + "raw": "0", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 0.0, + "suffix": "None" + } + } + }, + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "color", + "start": 0, + "type": "Identifier" + }, + "arg": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "highlightColor1", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } + } + ], + "callee": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "keyFn", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name" + }, + "commentStart": 0, + "end": 0, + "start": 0, + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null + }, + "start": 0, + "type": "ExpressionStatement", + "type": "ExpressionStatement" + }, + { + "commentStart": 0, + "end": 0, + "expression": { + "arguments": [ + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "originStart", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "elements": [ + { + "commentStart": 0, + "end": 0, + "left": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "spacing", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + }, + "operator": "*", + "right": { + "commentStart": 0, + "end": 0, + "raw": "3", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 3.0, + "suffix": "None" + } + }, + "start": 0, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "row5", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } + ], + "end": 0, + "start": 0, + "type": "ArrayExpression", + "type": "ArrayExpression" + } + }, + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "keyWidth", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "end": 0, + "raw": "0.8", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 0.8, + "suffix": "None" + } + } + }, + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "keyHeight", + "start": 0, + "type": "Identifier" + }, + "arg": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "keyHeight", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } + }, + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "repeats", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "end": 0, + "raw": "12", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 12.0, + "suffix": "None" + } + } + }, + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "color", + "start": 0, + "type": "Identifier" + }, + "arg": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "highlightColor1", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } + } + ], + "callee": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "keyFn", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name" + }, + "commentStart": 0, + "end": 0, + "start": 0, + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null + }, + "preComments": [ + "", + "", + "// Build the fifth row of keys" + ], + "start": 0, + "type": "ExpressionStatement", + "type": "ExpressionStatement" + }, + { + "commentStart": 0, + "end": 0, + "expression": { + "arguments": [ + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "originStart", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "elements": [ + { + "commentStart": 0, + "end": 0, + "left": { + "commentStart": 0, + "end": 0, + "left": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "spacing", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + }, + "operator": "*", + "right": { + "commentStart": 0, + "end": 0, + "raw": "3", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 3.0, + "suffix": "None" + } + }, + "start": 0, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "operator": "+", + "right": { + "commentStart": 0, + "end": 0, + "raw": "11.7", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 11.7, + "suffix": "None" + } + }, + "start": 0, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "row5", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } + ], + "end": 0, + "start": 0, + "type": "ArrayExpression", + "type": "ArrayExpression" + } + }, + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "keyWidth", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "end": 0, + "raw": "1.3", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 1.3, + "suffix": "None" + } + } + }, + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "keyHeight", + "start": 0, + "type": "Identifier" + }, + "arg": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "keyHeight", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } + }, + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "repeats", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "end": 0, + "raw": "0", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 0.0, + "suffix": "None" + } + } + }, + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "color", + "start": 0, + "type": "Identifier" + }, + "arg": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "highlightColor2", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } + } + ], + "callee": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "keyFn", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name" + }, + "commentStart": 0, + "end": 0, + "start": 0, + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null + }, + "start": 0, + "type": "ExpressionStatement", + "type": "ExpressionStatement" + }, + { + "commentStart": 0, + "end": 0, + "expression": { + "arguments": [ + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "originStart", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "elements": [ + { + "commentStart": 0, + "end": 0, + "left": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "spacing", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + }, + "operator": "*", + "right": { + "commentStart": 0, + "end": 0, + "raw": "3", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 3.0, + "suffix": "None" + } + }, + "start": 0, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "row6", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } + ], + "end": 0, + "start": 0, + "type": "ArrayExpression", + "type": "ArrayExpression" + } + }, + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "keyWidth", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "end": 0, + "raw": "1.1", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 1.1, + "suffix": "None" + } + } + }, + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "keyHeight", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "end": 0, + "left": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "keyHeight", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + }, + "operator": "*", + "right": { + "commentStart": 0, + "end": 0, + "raw": ".6", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 0.6, + "suffix": "None" + } + }, + "start": 0, + "type": "BinaryExpression", + "type": "BinaryExpression" + } + }, + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "repeats", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "end": 0, + "raw": "0", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 0.0, + "suffix": "None" + } + } + }, + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "color", + "start": 0, + "type": "Identifier" + }, + "arg": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "highlightColor2", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } + } + ], + "callee": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "keyFn", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name" + }, + "commentStart": 0, + "end": 0, + "start": 0, + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null + }, + "preComments": [ + "", + "", + "// Build the sixth row of keys" + ], + "start": 0, + "type": "ExpressionStatement", + "type": "ExpressionStatement" + }, + { + "commentStart": 0, + "end": 0, + "expression": { + "arguments": [ + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "originStart", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "elements": [ + { "commentStart": 0, "end": 0, "left": { @@ -6021,31 +8375,71 @@ description: Result of parsing keyboard.kcl "type": "BinaryExpression", "type": "BinaryExpression" }, - "operator": "+", - "right": { + { + "abs_path": false, "commentStart": 0, "end": 0, - "raw": ".1", + "name": { + "commentStart": 0, + "end": 0, + "name": "row6", + "start": 0, + "type": "Identifier" + }, + "path": [], "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 0.1, - "suffix": "None" - } - }, - "start": 0, - "type": "BinaryExpression", - "type": "BinaryExpression" - }, - { + "type": "Name", + "type": "Name" + } + ], + "end": 0, + "start": 0, + "type": "ArrayExpression", + "type": "ArrayExpression" + } + }, + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "keyWidth", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "end": 0, + "raw": "0.8", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 0.8, + "suffix": "None" + } + } + }, + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "keyHeight", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "end": 0, + "left": { "abs_path": false, "commentStart": 0, "end": 0, "name": { "commentStart": 0, "end": 0, - "name": "row3", + "name": "keyHeight", "start": 0, "type": "Identifier" }, @@ -6053,68 +8447,72 @@ description: Result of parsing keyboard.kcl "start": 0, "type": "Name", "type": "Name" + }, + "operator": "*", + "right": { + "commentStart": 0, + "end": 0, + "raw": ".6", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 0.6, + "suffix": "None" + } + }, + "start": 0, + "type": "BinaryExpression", + "type": "BinaryExpression" + } + }, + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "repeats", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "end": 0, + "raw": "11", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 11.0, + "suffix": "None" } - ], - "end": 0, - "start": 0, - "type": "ArrayExpression", - "type": "ArrayExpression" - }, - { - "commentStart": 0, - "end": 0, - "raw": "0.8", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 0.8, - "suffix": "None" } }, { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { + "type": "LabeledArg", + "label": { "commentStart": 0, "end": 0, - "name": "keyHeight", + "name": "color", "start": 0, "type": "Identifier" }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - { - "commentStart": 0, - "end": 0, - "raw": "10", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 10.0, - "suffix": "None" + "arg": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "highlightColor1", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" } - }, - { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "highlightColor1", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" } ], "callee": { @@ -6135,8 +8533,9 @@ description: Result of parsing keyboard.kcl "commentStart": 0, "end": 0, "start": 0, - "type": "CallExpression", - "type": "CallExpression" + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null }, "start": 0, "type": "ExpressionStatement", @@ -6148,12 +8547,18 @@ description: Result of parsing keyboard.kcl "expression": { "arguments": [ { - "commentStart": 0, - "elements": [ - { - "commentStart": 0, - "end": 0, - "left": { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "originStart", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "elements": [ + { "commentStart": 0, "end": 0, "left": { @@ -6196,12 +8601,12 @@ description: Result of parsing keyboard.kcl "right": { "commentStart": 0, "end": 0, - "raw": "11.1", + "raw": "12", "start": 0, "type": "Literal", "type": "Literal", "value": { - "value": 11.1, + "value": 12.0, "suffix": "None" } }, @@ -6209,166 +8614,14 @@ description: Result of parsing keyboard.kcl "type": "BinaryExpression", "type": "BinaryExpression" }, - "operator": "+", - "right": { - "commentStart": 0, - "end": 0, - "raw": ".1", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 0.1, - "suffix": "None" - } - }, - "start": 0, - "type": "BinaryExpression", - "type": "BinaryExpression" - }, - { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "row3", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - } - ], - "end": 0, - "start": 0, - "type": "ArrayExpression", - "type": "ArrayExpression" - }, - { - "commentStart": 0, - "end": 0, - "left": { - "commentStart": 0, - "end": 0, - "raw": "1.4", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 1.4, - "suffix": "None" - } - }, - "operator": "+", - "right": { - "commentStart": 0, - "end": 0, - "raw": ".4", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 0.4, - "suffix": "None" - } - }, - "start": 0, - "type": "BinaryExpression", - "type": "BinaryExpression" - }, - { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "keyHeight", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - { - "commentStart": 0, - "end": 0, - "raw": "0", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 0.0, - "suffix": "None" - } - }, - { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "highlightColor2", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - } - ], - "callee": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "keyFn", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name" - }, - "commentStart": 0, - "end": 0, - "start": 0, - "type": "CallExpression", - "type": "CallExpression" - }, - "start": 0, - "type": "ExpressionStatement", - "type": "ExpressionStatement" - }, - { - "commentStart": 0, - "end": 0, - "expression": { - "arguments": [ - { - "commentStart": 0, - "elements": [ - { - "commentStart": 0, - "end": 0, - "left": { + { "abs_path": false, "commentStart": 0, "end": 0, "name": { "commentStart": 0, "end": 0, - "name": "spacing", + "name": "row6", "start": 0, "type": "Identifier" }, @@ -6376,205 +8629,56 @@ description: Result of parsing keyboard.kcl "start": 0, "type": "Name", "type": "Name" - }, - "operator": "*", - "right": { - "commentStart": 0, - "end": 0, - "raw": "3", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 3.0, - "suffix": "None" - } - }, - "start": 0, - "type": "BinaryExpression", - "type": "BinaryExpression" - }, - { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "row4", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - } - ], - "end": 0, - "start": 0, - "type": "ArrayExpression", - "type": "ArrayExpression" - }, - { - "commentStart": 0, - "end": 0, - "raw": "0.9", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 0.9, - "suffix": "None" + } + ], + "end": 0, + "start": 0, + "type": "ArrayExpression", + "type": "ArrayExpression" } }, { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "keyWidth", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "end": 0, + "raw": "1", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 1.0, + "suffix": "None" + } + } + }, + { + "type": "LabeledArg", + "label": { "commentStart": 0, "end": 0, "name": "keyHeight", "start": 0, "type": "Identifier" }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - { - "commentStart": 0, - "end": 0, - "raw": "0", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 0.0, - "suffix": "None" - } - }, - { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { + "arg": { "commentStart": 0, "end": 0, - "name": "highlightColor1", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - } - ], - "callee": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "keyFn", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name" - }, - "commentStart": 0, - "end": 0, - "start": 0, - "type": "CallExpression", - "type": "CallExpression" - }, - "preComments": [ - "", - "", - "// Build the fourth row of keys" - ], - "start": 0, - "type": "ExpressionStatement", - "type": "ExpressionStatement" - }, - { - "commentStart": 0, - "end": 0, - "expression": { - "arguments": [ - { - "commentStart": 0, - "elements": [ - { - "commentStart": 0, - "end": 0, - "left": { - "commentStart": 0, - "end": 0, - "left": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "spacing", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - "operator": "*", - "right": { - "commentStart": 0, - "end": 0, - "raw": "4", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 4.0, - "suffix": "None" - } - }, - "start": 0, - "type": "BinaryExpression", - "type": "BinaryExpression" - }, - "operator": "+", - "right": { - "commentStart": 0, - "end": 0, - "raw": "0.9", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 0.9, - "suffix": "None" - } - }, - "start": 0, - "type": "BinaryExpression", - "type": "BinaryExpression" - }, - { + "left": { "abs_path": false, "commentStart": 0, "end": 0, "name": { "commentStart": 0, "end": 0, - "name": "row4", + "name": "keyHeight", "start": 0, "type": "Identifier" }, @@ -6582,673 +8686,64 @@ description: Result of parsing keyboard.kcl "start": 0, "type": "Name", "type": "Name" - } - ], - "end": 0, - "start": 0, - "type": "ArrayExpression", - "type": "ArrayExpression" - }, - { - "commentStart": 0, - "end": 0, - "raw": "0.8", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 0.8, - "suffix": "None" - } - }, - { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "keyHeight", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - { - "commentStart": 0, - "end": 0, - "raw": "11", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 11.0, - "suffix": "None" - } - }, - { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "highlightColor1", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - } - ], - "callee": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "keyFn", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name" - }, - "commentStart": 0, - "end": 0, - "start": 0, - "type": "CallExpression", - "type": "CallExpression" - }, - "start": 0, - "type": "ExpressionStatement", - "type": "ExpressionStatement" - }, - { - "commentStart": 0, - "end": 0, - "expression": { - "arguments": [ - { - "commentStart": 0, - "elements": [ - { - "commentStart": 0, - "end": 0, - "left": { - "commentStart": 0, - "end": 0, - "left": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "spacing", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - "operator": "*", - "right": { - "commentStart": 0, - "end": 0, - "raw": "3", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 3.0, - "suffix": "None" - } - }, - "start": 0, - "type": "BinaryExpression", - "type": "BinaryExpression" - }, - "operator": "+", - "right": { - "commentStart": 0, - "end": 0, - "raw": "11.8", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 11.8, - "suffix": "None" - } - }, - "start": 0, - "type": "BinaryExpression", - "type": "BinaryExpression" }, - { - "abs_path": false, + "operator": "*", + "right": { "commentStart": 0, "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "row4", - "start": 0, - "type": "Identifier" - }, - "path": [], + "raw": ".6", "start": 0, - "type": "Name", - "type": "Name" - } - ], - "end": 0, - "start": 0, - "type": "ArrayExpression", - "type": "ArrayExpression" - }, - { - "commentStart": 0, - "end": 0, - "raw": "1.2", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 1.2, - "suffix": "None" - } - }, - { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "keyHeight", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - { - "commentStart": 0, - "end": 0, - "raw": "0", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 0.0, - "suffix": "None" - } - }, - { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "highlightColor1", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - } - ], - "callee": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "keyFn", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name" - }, - "commentStart": 0, - "end": 0, - "start": 0, - "type": "CallExpression", - "type": "CallExpression" - }, - "start": 0, - "type": "ExpressionStatement", - "type": "ExpressionStatement" - }, - { - "commentStart": 0, - "end": 0, - "expression": { - "arguments": [ - { - "commentStart": 0, - "elements": [ - { - "commentStart": 0, - "end": 0, - "left": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "spacing", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - "operator": "*", - "right": { - "commentStart": 0, - "end": 0, - "raw": "3", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 3.0, - "suffix": "None" - } - }, - "start": 0, - "type": "BinaryExpression", - "type": "BinaryExpression" + "type": "Literal", + "type": "Literal", + "value": { + "value": 0.6, + "suffix": "None" + } }, - { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "row5", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" + "start": 0, + "type": "BinaryExpression", + "type": "BinaryExpression" + } + }, + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "repeats", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "end": 0, + "raw": "0", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 0.0, + "suffix": "None" } - ], - "end": 0, - "start": 0, - "type": "ArrayExpression", - "type": "ArrayExpression" - }, - { - "commentStart": 0, - "end": 0, - "raw": "0.8", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 0.8, - "suffix": "None" } }, { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { + "type": "LabeledArg", + "label": { "commentStart": 0, "end": 0, - "name": "keyHeight", + "name": "color", "start": 0, "type": "Identifier" }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - { - "commentStart": 0, - "end": 0, - "raw": "12", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 12.0, - "suffix": "None" - } - }, - { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "highlightColor1", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - } - ], - "callee": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "keyFn", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name" - }, - "commentStart": 0, - "end": 0, - "start": 0, - "type": "CallExpression", - "type": "CallExpression" - }, - "preComments": [ - "", - "", - "// Build the fifth row of keys" - ], - "start": 0, - "type": "ExpressionStatement", - "type": "ExpressionStatement" - }, - { - "commentStart": 0, - "end": 0, - "expression": { - "arguments": [ - { - "commentStart": 0, - "elements": [ - { - "commentStart": 0, - "end": 0, - "left": { - "commentStart": 0, - "end": 0, - "left": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "spacing", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - "operator": "*", - "right": { - "commentStart": 0, - "end": 0, - "raw": "3", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 3.0, - "suffix": "None" - } - }, - "start": 0, - "type": "BinaryExpression", - "type": "BinaryExpression" - }, - "operator": "+", - "right": { - "commentStart": 0, - "end": 0, - "raw": "11.7", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 11.7, - "suffix": "None" - } - }, - "start": 0, - "type": "BinaryExpression", - "type": "BinaryExpression" - }, - { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "row5", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - } - ], - "end": 0, - "start": 0, - "type": "ArrayExpression", - "type": "ArrayExpression" - }, - { - "commentStart": 0, - "end": 0, - "raw": "1.3", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 1.3, - "suffix": "None" - } - }, - { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "keyHeight", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - { - "commentStart": 0, - "end": 0, - "raw": "0", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 0.0, - "suffix": "None" - } - }, - { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "highlightColor2", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - } - ], - "callee": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "keyFn", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name" - }, - "commentStart": 0, - "end": 0, - "start": 0, - "type": "CallExpression", - "type": "CallExpression" - }, - "start": 0, - "type": "ExpressionStatement", - "type": "ExpressionStatement" - }, - { - "commentStart": 0, - "end": 0, - "expression": { - "arguments": [ - { - "commentStart": 0, - "elements": [ - { - "commentStart": 0, - "end": 0, - "left": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "spacing", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - "operator": "*", - "right": { - "commentStart": 0, - "end": 0, - "raw": "3", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 3.0, - "suffix": "None" - } - }, - "start": 0, - "type": "BinaryExpression", - "type": "BinaryExpression" - }, - { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "row6", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - } - ], - "end": 0, - "start": 0, - "type": "ArrayExpression", - "type": "ArrayExpression" - }, - { - "commentStart": 0, - "end": 0, - "raw": "1.1", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 1.1, - "suffix": "None" - } - }, - { - "commentStart": 0, - "end": 0, - "left": { + "arg": { "abs_path": false, "commentStart": 0, "end": 0, "name": { "commentStart": 0, "end": 0, - "name": "keyHeight", + "name": "highlightColor2", "start": 0, "type": "Identifier" }, @@ -7256,51 +8751,7 @@ description: Result of parsing keyboard.kcl "start": 0, "type": "Name", "type": "Name" - }, - "operator": "*", - "right": { - "commentStart": 0, - "end": 0, - "raw": ".6", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 0.6, - "suffix": "None" - } - }, - "start": 0, - "type": "BinaryExpression", - "type": "BinaryExpression" - }, - { - "commentStart": 0, - "end": 0, - "raw": "0", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 0.0, - "suffix": "None" } - }, - { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "highlightColor2", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" } ], "callee": { @@ -7321,389 +8772,9 @@ description: Result of parsing keyboard.kcl "commentStart": 0, "end": 0, "start": 0, - "type": "CallExpression", - "type": "CallExpression" - }, - "preComments": [ - "", - "", - "// Build the sixth row of keys" - ], - "start": 0, - "type": "ExpressionStatement", - "type": "ExpressionStatement" - }, - { - "commentStart": 0, - "end": 0, - "expression": { - "arguments": [ - { - "commentStart": 0, - "elements": [ - { - "commentStart": 0, - "end": 0, - "left": { - "commentStart": 0, - "end": 0, - "left": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "spacing", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - "operator": "*", - "right": { - "commentStart": 0, - "end": 0, - "raw": "4", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 4.0, - "suffix": "None" - } - }, - "start": 0, - "type": "BinaryExpression", - "type": "BinaryExpression" - }, - "operator": "+", - "right": { - "commentStart": 0, - "end": 0, - "raw": "1.1", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 1.1, - "suffix": "None" - } - }, - "start": 0, - "type": "BinaryExpression", - "type": "BinaryExpression" - }, - { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "row6", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - } - ], - "end": 0, - "start": 0, - "type": "ArrayExpression", - "type": "ArrayExpression" - }, - { - "commentStart": 0, - "end": 0, - "raw": "0.8", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 0.8, - "suffix": "None" - } - }, - { - "commentStart": 0, - "end": 0, - "left": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "keyHeight", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - "operator": "*", - "right": { - "commentStart": 0, - "end": 0, - "raw": ".6", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 0.6, - "suffix": "None" - } - }, - "start": 0, - "type": "BinaryExpression", - "type": "BinaryExpression" - }, - { - "commentStart": 0, - "end": 0, - "raw": "11", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 11.0, - "suffix": "None" - } - }, - { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "highlightColor1", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - } - ], - "callee": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "keyFn", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name" - }, - "commentStart": 0, - "end": 0, - "start": 0, - "type": "CallExpression", - "type": "CallExpression" - }, - "start": 0, - "type": "ExpressionStatement", - "type": "ExpressionStatement" - }, - { - "commentStart": 0, - "end": 0, - "expression": { - "arguments": [ - { - "commentStart": 0, - "elements": [ - { - "commentStart": 0, - "end": 0, - "left": { - "commentStart": 0, - "end": 0, - "left": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "spacing", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - "operator": "*", - "right": { - "commentStart": 0, - "end": 0, - "raw": "3", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 3.0, - "suffix": "None" - } - }, - "start": 0, - "type": "BinaryExpression", - "type": "BinaryExpression" - }, - "operator": "+", - "right": { - "commentStart": 0, - "end": 0, - "raw": "12", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 12.0, - "suffix": "None" - } - }, - "start": 0, - "type": "BinaryExpression", - "type": "BinaryExpression" - }, - { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "row6", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - } - ], - "end": 0, - "start": 0, - "type": "ArrayExpression", - "type": "ArrayExpression" - }, - { - "commentStart": 0, - "end": 0, - "raw": "1", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 1.0, - "suffix": "None" - } - }, - { - "commentStart": 0, - "end": 0, - "left": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "keyHeight", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - "operator": "*", - "right": { - "commentStart": 0, - "end": 0, - "raw": ".6", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 0.6, - "suffix": "None" - } - }, - "start": 0, - "type": "BinaryExpression", - "type": "BinaryExpression" - }, - { - "commentStart": 0, - "end": 0, - "raw": "0", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 0.0, - "suffix": "None" - } - }, - { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "highlightColor2", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - } - ], - "callee": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "keyFn", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name" - }, - "commentStart": 0, - "end": 0, - "start": 0, - "type": "CallExpression", - "type": "CallExpression" + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null }, "start": 0, "type": "ExpressionStatement", @@ -11608,60 +12679,90 @@ description: Result of parsing keyboard.kcl "expression": { "arguments": [ { - "commentStart": 0, - "elements": [ - { - "commentStart": 0, - "end": 0, - "raw": "2.3", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 2.3, - "suffix": "None" + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "origin", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "elements": [ + { + "commentStart": 0, + "end": 0, + "raw": "2.3", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 2.3, + "suffix": "None" + } + }, + { + "commentStart": 0, + "end": 0, + "raw": "1.3", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 1.3, + "suffix": "None" + } } - }, - { - "commentStart": 0, - "end": 0, - "raw": "1.3", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 1.3, - "suffix": "None" - } - } - ], - "end": 0, - "start": 0, - "type": "ArrayExpression", - "type": "ArrayExpression" - }, - { - "commentStart": 0, - "end": 0, - "raw": ".4", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 0.4, - "suffix": "None" + ], + "end": 0, + "start": 0, + "type": "ArrayExpression", + "type": "ArrayExpression" } }, { - "commentStart": 0, - "end": 0, - "raw": "0.03", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 0.03, - "suffix": "None" + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "scale", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "end": 0, + "raw": ".4", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 0.4, + "suffix": "None" + } + } + }, + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "depth", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "end": 0, + "raw": "0.03", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 0.03, + "suffix": "None" + } } } ], @@ -11683,8 +12784,9 @@ description: Result of parsing keyboard.kcl "commentStart": 0, "end": 0, "start": 0, - "type": "CallExpression", - "type": "CallExpression" + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null }, "preComments": [ "", @@ -11701,124 +12803,18 @@ description: Result of parsing keyboard.kcl "expression": { "arguments": [ { - "commentStart": 0, - "elements": [ - { - "commentStart": 0, - "end": 0, - "raw": "8.71", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 8.71, - "suffix": "None" - } - }, - { - "commentStart": 0, - "end": 0, - "left": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "row4", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - "operator": "+", - "right": { - "commentStart": 0, - "end": 0, - "raw": ".08", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 0.08, - "suffix": "None" - } - }, - "start": 0, - "type": "BinaryExpression", - "type": "BinaryExpression" - } - ], - "end": 0, - "start": 0, - "type": "ArrayExpression", - "type": "ArrayExpression" - }, - { - "commentStart": 0, - "end": 0, - "raw": "0.4", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 0.4, - "suffix": "None" - } - }, - { - "commentStart": 0, - "end": 0, - "raw": "0.03", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 0.03, - "suffix": "None" - } - } - ], - "callee": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "o", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name" - }, - "commentStart": 0, - "end": 0, - "start": 0, - "type": "CallExpression", - "type": "CallExpression" - }, - "start": 0, - "type": "ExpressionStatement", - "type": "ExpressionStatement" - }, - { - "commentStart": 0, - "end": 0, - "expression": { - "arguments": [ - { - "commentStart": 0, - "elements": [ - { - "commentStart": 0, - "end": 0, - "left": { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "origin", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "elements": [ + { "commentStart": 0, "end": 0, "raw": "8.71", @@ -11830,87 +12826,91 @@ description: Result of parsing keyboard.kcl "suffix": "None" } }, - "operator": "+", - "right": { + { "commentStart": 0, "end": 0, - "raw": "0.9", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 0.9, - "suffix": "None" - } - }, - "start": 0, - "type": "BinaryExpression", - "type": "BinaryExpression" - }, - { - "commentStart": 0, - "end": 0, - "left": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { + "left": { + "abs_path": false, "commentStart": 0, "end": 0, - "name": "row4", + "name": { + "commentStart": 0, + "end": 0, + "name": "row4", + "start": 0, + "type": "Identifier" + }, + "path": [], "start": 0, - "type": "Identifier" + "type": "Name", + "type": "Name" + }, + "operator": "+", + "right": { + "commentStart": 0, + "end": 0, + "raw": ".08", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 0.08, + "suffix": "None" + } }, - "path": [], "start": 0, - "type": "Name", - "type": "Name" - }, - "operator": "+", - "right": { - "commentStart": 0, - "end": 0, - "raw": ".08", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 0.08, - "suffix": "None" - } - }, - "start": 0, - "type": "BinaryExpression", - "type": "BinaryExpression" - } - ], - "end": 0, - "start": 0, - "type": "ArrayExpression", - "type": "ArrayExpression" - }, - { - "commentStart": 0, - "end": 0, - "raw": "0.4", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 0.4, - "suffix": "None" + "type": "BinaryExpression", + "type": "BinaryExpression" + } + ], + "end": 0, + "start": 0, + "type": "ArrayExpression", + "type": "ArrayExpression" } }, { - "commentStart": 0, - "end": 0, - "raw": "0.03", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 0.03, - "suffix": "None" + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "scale", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "end": 0, + "raw": "0.4", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 0.4, + "suffix": "None" + } + } + }, + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "depth", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "end": 0, + "raw": "0.03", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 0.03, + "suffix": "None" + } } } ], @@ -11932,8 +12932,172 @@ description: Result of parsing keyboard.kcl "commentStart": 0, "end": 0, "start": 0, - "type": "CallExpression", - "type": "CallExpression" + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null + }, + "start": 0, + "type": "ExpressionStatement", + "type": "ExpressionStatement" + }, + { + "commentStart": 0, + "end": 0, + "expression": { + "arguments": [ + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "origin", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "elements": [ + { + "commentStart": 0, + "end": 0, + "left": { + "commentStart": 0, + "end": 0, + "raw": "8.71", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 8.71, + "suffix": "None" + } + }, + "operator": "+", + "right": { + "commentStart": 0, + "end": 0, + "raw": "0.9", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 0.9, + "suffix": "None" + } + }, + "start": 0, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + { + "commentStart": 0, + "end": 0, + "left": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "row4", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + }, + "operator": "+", + "right": { + "commentStart": 0, + "end": 0, + "raw": ".08", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 0.08, + "suffix": "None" + } + }, + "start": 0, + "type": "BinaryExpression", + "type": "BinaryExpression" + } + ], + "end": 0, + "start": 0, + "type": "ArrayExpression", + "type": "ArrayExpression" + } + }, + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "scale", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "end": 0, + "raw": "0.4", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 0.4, + "suffix": "None" + } + } + }, + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "depth", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "end": 0, + "raw": "0.03", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 0.03, + "suffix": "None" + } + } + } + ], + "callee": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "o", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name" + }, + "commentStart": 0, + "end": 0, + "start": 0, + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null }, "start": 0, "type": "ExpressionStatement", diff --git a/rust/kcl-lib/tests/kcl_samples/keyboard/ops.snap b/rust/kcl-lib/tests/kcl_samples/keyboard/ops.snap index 7a5b8cadc..7da35ce75 100644 --- a/rust/kcl-lib/tests/kcl_samples/keyboard/ops.snap +++ b/rust/kcl-lib/tests/kcl_samples/keyboard/ops.snap @@ -6799,7 +6799,97 @@ description: Operations executed keyboard.kcl "name": "keyFn", "functionSourceRange": [], "unlabeledArg": null, - "labeledArgs": {} + "labeledArgs": { + "color": { + "value": { + "type": "String", + "value": "#23af93" + }, + "sourceRange": [] + }, + "keyHeight": { + "value": { + "type": "Number", + "value": 0.8, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "keyWidth": { + "value": { + "type": "Number", + "value": 1.1, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "originStart": { + "value": { + "type": "Array", + "value": [ + { + "type": "Number", + "value": 0.3, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + { + "type": "Number", + "value": 0.30000000000000004, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + } + ] + }, + "sourceRange": [] + }, + "repeats": { + "value": { + "type": "Number", + "value": 0.0, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + } + } }, "sourceRange": [] }, @@ -6810,7 +6900,97 @@ description: Operations executed keyboard.kcl "name": "keyFn", "functionSourceRange": [], "unlabeledArg": null, - "labeledArgs": {} + "labeledArgs": { + "color": { + "value": { + "type": "String", + "value": "#b0b0b0" + }, + "sourceRange": [] + }, + "keyHeight": { + "value": { + "type": "Number", + "value": 0.8, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "keyWidth": { + "value": { + "type": "Number", + "value": 0.8, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "originStart": { + "value": { + "type": "Array", + "value": [ + { + "type": "Number", + "value": 1.5, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + { + "type": "Number", + "value": 0.30000000000000004, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + } + ] + }, + "sourceRange": [] + }, + "repeats": { + "value": { + "type": "Number", + "value": 2.0, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + } + } }, "sourceRange": [] }, @@ -6821,7 +7001,97 @@ description: Operations executed keyboard.kcl "name": "keyFn", "functionSourceRange": [], "unlabeledArg": null, - "labeledArgs": {} + "labeledArgs": { + "color": { + "value": { + "type": "String", + "value": "#23af93" + }, + "sourceRange": [] + }, + "keyHeight": { + "value": { + "type": "Number", + "value": 0.8, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "keyWidth": { + "value": { + "type": "Number", + "value": 5.2, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "originStart": { + "value": { + "type": "Array", + "value": [ + { + "type": "Number", + "value": 4.2, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + { + "type": "Number", + "value": 0.30000000000000004, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + } + ] + }, + "sourceRange": [] + }, + "repeats": { + "value": { + "type": "Number", + "value": 0.0, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + } + } }, "sourceRange": [] }, @@ -6832,7 +7102,97 @@ description: Operations executed keyboard.kcl "name": "keyFn", "functionSourceRange": [], "unlabeledArg": null, - "labeledArgs": {} + "labeledArgs": { + "color": { + "value": { + "type": "String", + "value": "#b0b0b0" + }, + "sourceRange": [] + }, + "keyHeight": { + "value": { + "type": "Number", + "value": 0.8, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "keyWidth": { + "value": { + "type": "Number", + "value": 0.8, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "originStart": { + "value": { + "type": "Array", + "value": [ + { + "type": "Number", + "value": 9.5, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + { + "type": "Number", + "value": 0.30000000000000004, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + } + ] + }, + "sourceRange": [] + }, + "repeats": { + "value": { + "type": "Number", + "value": 0.0, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + } + } }, "sourceRange": [] }, @@ -6843,7 +7203,97 @@ description: Operations executed keyboard.kcl "name": "keyFn", "functionSourceRange": [], "unlabeledArg": null, - "labeledArgs": {} + "labeledArgs": { + "color": { + "value": { + "type": "String", + "value": "#b0b0b0" + }, + "sourceRange": [] + }, + "keyHeight": { + "value": { + "type": "Number", + "value": 0.8, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "keyWidth": { + "value": { + "type": "Number", + "value": 0.8, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "originStart": { + "value": { + "type": "Array", + "value": [ + { + "type": "Number", + "value": 10.4, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + { + "type": "Number", + "value": 0.30000000000000004, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + } + ] + }, + "sourceRange": [] + }, + "repeats": { + "value": { + "type": "Number", + "value": 0.0, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + } + } }, "sourceRange": [] }, @@ -6854,7 +7304,97 @@ description: Operations executed keyboard.kcl "name": "keyFn", "functionSourceRange": [], "unlabeledArg": null, - "labeledArgs": {} + "labeledArgs": { + "color": { + "value": { + "type": "String", + "value": "#b0b0b0" + }, + "sourceRange": [] + }, + "keyHeight": { + "value": { + "type": "Number", + "value": 0.8, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "keyWidth": { + "value": { + "type": "Number", + "value": 1.1, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "originStart": { + "value": { + "type": "Array", + "value": [ + { + "type": "Number", + "value": 11.3, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + { + "type": "Number", + "value": 0.30000000000000004, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + } + ] + }, + "sourceRange": [] + }, + "repeats": { + "value": { + "type": "Number", + "value": 0.0, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + } + } }, "sourceRange": [] }, @@ -6865,7 +7405,97 @@ description: Operations executed keyboard.kcl "name": "keyFn", "functionSourceRange": [], "unlabeledArg": null, - "labeledArgs": {} + "labeledArgs": { + "color": { + "value": { + "type": "String", + "value": "#23af93" + }, + "sourceRange": [] + }, + "keyHeight": { + "value": { + "type": "Number", + "value": 0.8, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "keyWidth": { + "value": { + "type": "Number", + "value": 0.8, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "originStart": { + "value": { + "type": "Array", + "value": [ + { + "type": "Number", + "value": 12.5, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + { + "type": "Number", + "value": 0.30000000000000004, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + } + ] + }, + "sourceRange": [] + }, + "repeats": { + "value": { + "type": "Number", + "value": 0.0, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + } + } }, "sourceRange": [] }, @@ -6876,7 +7506,97 @@ description: Operations executed keyboard.kcl "name": "keyFn", "functionSourceRange": [], "unlabeledArg": null, - "labeledArgs": {} + "labeledArgs": { + "color": { + "value": { + "type": "String", + "value": "#23af93" + }, + "sourceRange": [] + }, + "keyHeight": { + "value": { + "type": "Number", + "value": 0.8, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "keyWidth": { + "value": { + "type": "Number", + "value": 1.7, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "originStart": { + "value": { + "type": "Array", + "value": [ + { + "type": "Number", + "value": 0.30000000000000004, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + { + "type": "Number", + "value": 1.2000000000000002, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + } + ] + }, + "sourceRange": [] + }, + "repeats": { + "value": { + "type": "Number", + "value": 0.0, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + } + } }, "sourceRange": [] }, @@ -6887,7 +7607,97 @@ description: Operations executed keyboard.kcl "name": "keyFn", "functionSourceRange": [], "unlabeledArg": null, - "labeledArgs": {} + "labeledArgs": { + "color": { + "value": { + "type": "String", + "value": "#b0b0b0" + }, + "sourceRange": [] + }, + "keyHeight": { + "value": { + "type": "Number", + "value": 0.8, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "keyWidth": { + "value": { + "type": "Number", + "value": 0.8, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "originStart": { + "value": { + "type": "Array", + "value": [ + { + "type": "Number", + "value": 2.1, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + { + "type": "Number", + "value": 1.2000000000000002, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + } + ] + }, + "sourceRange": [] + }, + "repeats": { + "value": { + "type": "Number", + "value": 9.0, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + } + } }, "sourceRange": [] }, @@ -6898,7 +7708,97 @@ description: Operations executed keyboard.kcl "name": "keyFn", "functionSourceRange": [], "unlabeledArg": null, - "labeledArgs": {} + "labeledArgs": { + "color": { + "value": { + "type": "String", + "value": "#23af93" + }, + "sourceRange": [] + }, + "keyHeight": { + "value": { + "type": "Number", + "value": 0.8, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "keyWidth": { + "value": { + "type": "Number", + "value": 2.2, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "originStart": { + "value": { + "type": "Array", + "value": [ + { + "type": "Number", + "value": 11.1, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + { + "type": "Number", + "value": 1.2000000000000002, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + } + ] + }, + "sourceRange": [] + }, + "repeats": { + "value": { + "type": "Number", + "value": 0.0, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + } + } }, "sourceRange": [] }, @@ -6909,7 +7809,97 @@ description: Operations executed keyboard.kcl "name": "keyFn", "functionSourceRange": [], "unlabeledArg": null, - "labeledArgs": {} + "labeledArgs": { + "color": { + "value": { + "type": "String", + "value": "#b0b0b0" + }, + "sourceRange": [] + }, + "keyHeight": { + "value": { + "type": "Number", + "value": 0.8, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "keyWidth": { + "value": { + "type": "Number", + "value": 1.2000000000000002, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "originStart": { + "value": { + "type": "Array", + "value": [ + { + "type": "Number", + "value": 0.30000000000000004, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + { + "type": "Number", + "value": 2.1, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + } + ] + }, + "sourceRange": [] + }, + "repeats": { + "value": { + "type": "Number", + "value": 0.0, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + } + } }, "sourceRange": [] }, @@ -6920,7 +7910,97 @@ description: Operations executed keyboard.kcl "name": "keyFn", "functionSourceRange": [], "unlabeledArg": null, - "labeledArgs": {} + "labeledArgs": { + "color": { + "value": { + "type": "String", + "value": "#b0b0b0" + }, + "sourceRange": [] + }, + "keyHeight": { + "value": { + "type": "Number", + "value": 0.8, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "keyWidth": { + "value": { + "type": "Number", + "value": 0.8, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "originStart": { + "value": { + "type": "Array", + "value": [ + { + "type": "Number", + "value": 1.6, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + { + "type": "Number", + "value": 2.1, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + } + ] + }, + "sourceRange": [] + }, + "repeats": { + "value": { + "type": "Number", + "value": 10.0, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + } + } }, "sourceRange": [] }, @@ -6931,7 +8011,97 @@ description: Operations executed keyboard.kcl "name": "keyFn", "functionSourceRange": [], "unlabeledArg": null, - "labeledArgs": {} + "labeledArgs": { + "color": { + "value": { + "type": "String", + "value": "#23af93" + }, + "sourceRange": [] + }, + "keyHeight": { + "value": { + "type": "Number", + "value": 0.8, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "keyWidth": { + "value": { + "type": "Number", + "value": 1.7999999999999998, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "originStart": { + "value": { + "type": "Array", + "value": [ + { + "type": "Number", + "value": 11.5, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + { + "type": "Number", + "value": 2.1, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + } + ] + }, + "sourceRange": [] + }, + "repeats": { + "value": { + "type": "Number", + "value": 0.0, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + } + } }, "sourceRange": [] }, @@ -6942,7 +8112,97 @@ description: Operations executed keyboard.kcl "name": "keyFn", "functionSourceRange": [], "unlabeledArg": null, - "labeledArgs": {} + "labeledArgs": { + "color": { + "value": { + "type": "String", + "value": "#b0b0b0" + }, + "sourceRange": [] + }, + "keyHeight": { + "value": { + "type": "Number", + "value": 0.8, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "keyWidth": { + "value": { + "type": "Number", + "value": 0.9, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "originStart": { + "value": { + "type": "Array", + "value": [ + { + "type": "Number", + "value": 0.30000000000000004, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + { + "type": "Number", + "value": 3.0000000000000004, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + } + ] + }, + "sourceRange": [] + }, + "repeats": { + "value": { + "type": "Number", + "value": 0.0, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + } + } }, "sourceRange": [] }, @@ -6953,7 +8213,97 @@ description: Operations executed keyboard.kcl "name": "keyFn", "functionSourceRange": [], "unlabeledArg": null, - "labeledArgs": {} + "labeledArgs": { + "color": { + "value": { + "type": "String", + "value": "#b0b0b0" + }, + "sourceRange": [] + }, + "keyHeight": { + "value": { + "type": "Number", + "value": 0.8, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "keyWidth": { + "value": { + "type": "Number", + "value": 0.8, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "originStart": { + "value": { + "type": "Array", + "value": [ + { + "type": "Number", + "value": 1.3, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + { + "type": "Number", + "value": 3.0000000000000004, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + } + ] + }, + "sourceRange": [] + }, + "repeats": { + "value": { + "type": "Number", + "value": 11.0, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + } + } }, "sourceRange": [] }, @@ -6964,7 +8314,97 @@ description: Operations executed keyboard.kcl "name": "keyFn", "functionSourceRange": [], "unlabeledArg": null, - "labeledArgs": {} + "labeledArgs": { + "color": { + "value": { + "type": "String", + "value": "#b0b0b0" + }, + "sourceRange": [] + }, + "keyHeight": { + "value": { + "type": "Number", + "value": 0.8, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "keyWidth": { + "value": { + "type": "Number", + "value": 1.2, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "originStart": { + "value": { + "type": "Array", + "value": [ + { + "type": "Number", + "value": 12.100000000000001, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + { + "type": "Number", + "value": 3.0000000000000004, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + } + ] + }, + "sourceRange": [] + }, + "repeats": { + "value": { + "type": "Number", + "value": 0.0, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + } + } }, "sourceRange": [] }, @@ -6975,7 +8415,97 @@ description: Operations executed keyboard.kcl "name": "keyFn", "functionSourceRange": [], "unlabeledArg": null, - "labeledArgs": {} + "labeledArgs": { + "color": { + "value": { + "type": "String", + "value": "#b0b0b0" + }, + "sourceRange": [] + }, + "keyHeight": { + "value": { + "type": "Number", + "value": 0.8, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "keyWidth": { + "value": { + "type": "Number", + "value": 0.8, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "originStart": { + "value": { + "type": "Array", + "value": [ + { + "type": "Number", + "value": 0.30000000000000004, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + { + "type": "Number", + "value": 3.900000000000001, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + } + ] + }, + "sourceRange": [] + }, + "repeats": { + "value": { + "type": "Number", + "value": 12.0, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + } + } }, "sourceRange": [] }, @@ -6986,7 +8516,97 @@ description: Operations executed keyboard.kcl "name": "keyFn", "functionSourceRange": [], "unlabeledArg": null, - "labeledArgs": {} + "labeledArgs": { + "color": { + "value": { + "type": "String", + "value": "#23af93" + }, + "sourceRange": [] + }, + "keyHeight": { + "value": { + "type": "Number", + "value": 0.8, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "keyWidth": { + "value": { + "type": "Number", + "value": 1.3, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "originStart": { + "value": { + "type": "Array", + "value": [ + { + "type": "Number", + "value": 12.0, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + { + "type": "Number", + "value": 3.900000000000001, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + } + ] + }, + "sourceRange": [] + }, + "repeats": { + "value": { + "type": "Number", + "value": 0.0, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + } + } }, "sourceRange": [] }, @@ -6997,7 +8617,97 @@ description: Operations executed keyboard.kcl "name": "keyFn", "functionSourceRange": [], "unlabeledArg": null, - "labeledArgs": {} + "labeledArgs": { + "color": { + "value": { + "type": "String", + "value": "#23af93" + }, + "sourceRange": [] + }, + "keyHeight": { + "value": { + "type": "Number", + "value": 0.48, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "keyWidth": { + "value": { + "type": "Number", + "value": 1.1, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "originStart": { + "value": { + "type": "Array", + "value": [ + { + "type": "Number", + "value": 0.30000000000000004, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + { + "type": "Number", + "value": 4.800000000000001, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + } + ] + }, + "sourceRange": [] + }, + "repeats": { + "value": { + "type": "Number", + "value": 0.0, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + } + } }, "sourceRange": [] }, @@ -7008,7 +8718,97 @@ description: Operations executed keyboard.kcl "name": "keyFn", "functionSourceRange": [], "unlabeledArg": null, - "labeledArgs": {} + "labeledArgs": { + "color": { + "value": { + "type": "String", + "value": "#b0b0b0" + }, + "sourceRange": [] + }, + "keyHeight": { + "value": { + "type": "Number", + "value": 0.48, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "keyWidth": { + "value": { + "type": "Number", + "value": 0.8, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "originStart": { + "value": { + "type": "Array", + "value": [ + { + "type": "Number", + "value": 1.5, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + { + "type": "Number", + "value": 4.800000000000001, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + } + ] + }, + "sourceRange": [] + }, + "repeats": { + "value": { + "type": "Number", + "value": 11.0, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + } + } }, "sourceRange": [] }, @@ -7019,7 +8819,97 @@ description: Operations executed keyboard.kcl "name": "keyFn", "functionSourceRange": [], "unlabeledArg": null, - "labeledArgs": {} + "labeledArgs": { + "color": { + "value": { + "type": "String", + "value": "#23af93" + }, + "sourceRange": [] + }, + "keyHeight": { + "value": { + "type": "Number", + "value": 0.48, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "keyWidth": { + "value": { + "type": "Number", + "value": 1.0, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "originStart": { + "value": { + "type": "Array", + "value": [ + { + "type": "Number", + "value": 12.3, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + { + "type": "Number", + "value": 4.800000000000001, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + } + ] + }, + "sourceRange": [] + }, + "repeats": { + "value": { + "type": "Number", + "value": 0.0, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + } + } }, "sourceRange": [] }, @@ -8136,7 +10026,74 @@ description: Operations executed keyboard.kcl "name": "z", "functionSourceRange": [], "unlabeledArg": null, - "labeledArgs": {} + "labeledArgs": { + "depth": { + "value": { + "type": "Number", + "value": 0.03, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "origin": { + "value": { + "type": "Array", + "value": [ + { + "type": "Number", + "value": 2.3, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + { + "type": "Number", + "value": 1.3, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + } + ] + }, + "sourceRange": [] + }, + "scale": { + "value": { + "type": "Number", + "value": 0.4, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + } + } }, "sourceRange": [] }, @@ -8147,7 +10104,74 @@ description: Operations executed keyboard.kcl "name": "o", "functionSourceRange": [], "unlabeledArg": null, - "labeledArgs": {} + "labeledArgs": { + "depth": { + "value": { + "type": "Number", + "value": 0.03, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "origin": { + "value": { + "type": "Array", + "value": [ + { + "type": "Number", + "value": 8.71, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + { + "type": "Number", + "value": 3.0800000000000005, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + } + ] + }, + "sourceRange": [] + }, + "scale": { + "value": { + "type": "Number", + "value": 0.4, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + } + } }, "sourceRange": [] }, @@ -8158,7 +10182,74 @@ description: Operations executed keyboard.kcl "name": "o", "functionSourceRange": [], "unlabeledArg": null, - "labeledArgs": {} + "labeledArgs": { + "depth": { + "value": { + "type": "Number", + "value": 0.03, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "origin": { + "value": { + "type": "Array", + "value": [ + { + "type": "Number", + "value": 9.610000000000001, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + { + "type": "Number", + "value": 3.0800000000000005, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + } + ] + }, + "sourceRange": [] + }, + "scale": { + "value": { + "type": "Number", + "value": 0.4, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + } + } }, "sourceRange": [] }, diff --git a/rust/kcl-lib/tests/kcl_samples/kitt/artifact_graph_flowchart.snap.md b/rust/kcl-lib/tests/kcl_samples/kitt/artifact_graph_flowchart.snap.md index cf1e35820..8ffcf8b44 100644 --- a/rust/kcl-lib/tests/kcl_samples/kitt/artifact_graph_flowchart.snap.md +++ b/rust/kcl-lib/tests/kcl_samples/kitt/artifact_graph_flowchart.snap.md @@ -352,60 +352,60 @@ flowchart LR 338[Solid2d] end subgraph path83 [Path] - 83["Path
[1506, 1562, 0]"] - 282["Segment
[1568, 1586, 0]"] - 283["Segment
[1616, 1635, 0]"] - 284["Segment
[1667, 1697, 0]"] - 285["Segment
[1719, 1737, 0]"] - 286["Segment
[1770, 1788, 0]"] - 287["Segment
[1818, 1847, 0]"] - 288["Segment
[1873, 1892, 0]"] - 289["Segment
[1925, 1943, 0]"] - 290["Segment
[1977, 2008, 0]"] - 291["Segment
[2033, 2052, 0]"] - 292["Segment
[2085, 2104, 0]"] - 293["Segment
[2137, 2193, 0]"] - 294["Segment
[2199, 2206, 0]"] + 83["Path
[1598, 1654, 0]"] + 282["Segment
[1660, 1678, 0]"] + 283["Segment
[1708, 1727, 0]"] + 284["Segment
[1759, 1789, 0]"] + 285["Segment
[1811, 1829, 0]"] + 286["Segment
[1862, 1880, 0]"] + 287["Segment
[1910, 1939, 0]"] + 288["Segment
[1965, 1984, 0]"] + 289["Segment
[2017, 2035, 0]"] + 290["Segment
[2069, 2100, 0]"] + 291["Segment
[2125, 2144, 0]"] + 292["Segment
[2177, 2196, 0]"] + 293["Segment
[2229, 2285, 0]"] + 294["Segment
[2291, 2298, 0]"] 318[Solid2d] end subgraph path84 [Path] - 84["Path
[2887, 2928, 0]"] - 295["Segment
[2941, 2959, 0]"] - 296["Segment
[2982, 3000, 0]"] - 297["Segment
[3026, 3044, 0]"] - 298["Segment
[3065, 3084, 0]"] - 299["Segment
[3109, 3127, 0]"] - 300["Segment
[3150, 3168, 0]"] - 301["Segment
[3193, 3212, 0]"] - 302["Segment
[3238, 3257, 0]"] - 303["Segment
[3283, 3302, 0]"] - 304["Segment
[3325, 3343, 0]"] - 305["Segment
[3370, 3389, 0]"] - 306["Segment
[3415, 3471, 0]"] - 307["Segment
[3477, 3484, 0]"] + 84["Path
[3347, 3388, 0]"] + 295["Segment
[3401, 3419, 0]"] + 296["Segment
[3442, 3460, 0]"] + 297["Segment
[3486, 3504, 0]"] + 298["Segment
[3525, 3544, 0]"] + 299["Segment
[3569, 3587, 0]"] + 300["Segment
[3610, 3628, 0]"] + 301["Segment
[3653, 3672, 0]"] + 302["Segment
[3698, 3717, 0]"] + 303["Segment
[3743, 3762, 0]"] + 304["Segment
[3785, 3803, 0]"] + 305["Segment
[3830, 3849, 0]"] + 306["Segment
[3875, 3931, 0]"] + 307["Segment
[3937, 3944, 0]"] 351[Solid2d] end subgraph path85 [Path] - 85["Path
[6208, 6259, 0]"] - 309["Segment
[6267, 6296, 0]"] - 310["Segment
[6304, 6335, 0]"] - 312["Segment
[6343, 6373, 0]"] - 315["Segment
[6381, 6437, 0]"] - 316["Segment
[6445, 6452, 0]"] + 85["Path
[7864, 7915, 0]"] + 309["Segment
[7923, 7952, 0]"] + 310["Segment
[7960, 7991, 0]"] + 312["Segment
[7999, 8029, 0]"] + 315["Segment
[8037, 8093, 0]"] + 316["Segment
[8101, 8108, 0]"] 343[Solid2d] end subgraph path86 [Path] - 86["Path
[6208, 6259, 0]"] - 308["Segment
[6267, 6296, 0]"] - 311["Segment
[6304, 6335, 0]"] - 313["Segment
[6343, 6373, 0]"] - 314["Segment
[6381, 6437, 0]"] - 317["Segment
[6445, 6452, 0]"] + 86["Path
[7864, 7915, 0]"] + 308["Segment
[7923, 7952, 0]"] + 311["Segment
[7960, 7991, 0]"] + 313["Segment
[7999, 8029, 0]"] + 314["Segment
[8037, 8093, 0]"] + 317["Segment
[8101, 8108, 0]"] 348[Solid2d] end 1["Plane
[609, 626, 0]"] - 2["Plane
[6183, 6200, 0]"] - 3["Plane
[6183, 6200, 0]"] + 2["Plane
[7839, 7856, 0]"] + 3["Plane
[7839, 7856, 0]"] 4["StartSketchOnFace
[183, 227, 0]"] 5["StartSketchOnFace
[183, 227, 0]"] 6["StartSketchOnFace
[183, 227, 0]"] @@ -429,8 +429,8 @@ flowchart LR 24["StartSketchOnFace
[183, 227, 0]"] 25["StartSketchOnFace
[183, 227, 0]"] 26["StartSketchOnFace
[183, 227, 0]"] - 27["StartSketchOnFace
[1466, 1500, 0]"] - 28["StartSketchOnFace
[2845, 2881, 0]"] + 27["StartSketchOnFace
[1558, 1592, 0]"] + 28["StartSketchOnFace
[3305, 3341, 0]"] 29["StartSketchOnFace
[183, 227, 0]"] 30["StartSketchOnFace
[183, 227, 0]"] 31["StartSketchOnFace
[183, 227, 0]"] @@ -485,10 +485,10 @@ flowchart LR 397["Sweep Extrusion
[456, 479, 0]"] 398["Sweep Extrusion
[456, 479, 0]"] 399["Sweep Extrusion
[905, 935, 0]"] - 400["Sweep Extrusion
[2212, 2243, 0]"] - 401["Sweep Extrusion
[3490, 3519, 0]"] - 402["Sweep Extrusion
[6466, 6511, 0]"] - 403["Sweep Extrusion
[6466, 6511, 0]"] + 400["Sweep Extrusion
[2304, 2335, 0]"] + 401["Sweep Extrusion
[3950, 3979, 0]"] + 402["Sweep Extrusion
[8122, 8167, 0]"] + 403["Sweep Extrusion
[8122, 8167, 0]"] 404[Wall] 405[Wall] 406[Wall] diff --git a/rust/kcl-lib/tests/kcl_samples/kitt/ast.snap b/rust/kcl-lib/tests/kcl_samples/kitt/ast.snap index 2a311a73d..40a0875c8 100644 --- a/rust/kcl-lib/tests/kcl_samples/kitt/ast.snap +++ b/rust/kcl-lib/tests/kcl_samples/kitt/ast.snap @@ -1791,144 +1791,214 @@ description: Result of parsing kitt.kcl "init": { "arguments": [ { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { + "type": "LabeledArg", + "label": { "commentStart": 0, "end": 0, - "name": "kitBody", + "name": "kitExtrude", "start": 0, "type": "Identifier" }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { + "arg": { + "abs_path": false, "commentStart": 0, "end": 0, - "name": "END", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - { - "commentStart": 0, - "end": 0, - "left": { - "argument": { - "abs_path": false, + "name": { "commentStart": 0, "end": 0, - "name": { + "name": "kitBody", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } + }, + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "extrudeTag", + "start": 0, + "type": "Identifier" + }, + "arg": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "END", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } + }, + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "positionY", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "end": 0, + "left": { + "argument": { + "abs_path": false, "commentStart": 0, "end": 0, - "name": "kitHeadWidth", + "name": { + "commentStart": 0, + "end": 0, + "name": "kitHeadWidth", + "start": 0, + "type": "Identifier" + }, + "path": [], "start": 0, - "type": "Identifier" + "type": "Name", + "type": "Name" }, - "path": [], + "commentStart": 0, + "end": 0, + "operator": "-", "start": 0, - "type": "Name", - "type": "Name" + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + "operator": "/", + "right": { + "commentStart": 0, + "end": 0, + "raw": "2", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 2.0, + "suffix": "None" + } }, - "commentStart": 0, - "end": 0, - "operator": "-", "start": 0, - "type": "UnaryExpression", - "type": "UnaryExpression" - }, - "operator": "/", - "right": { - "commentStart": 0, - "end": 0, - "raw": "2", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 2.0, - "suffix": "None" - } - }, - "start": 0, - "type": "BinaryExpression", - "type": "BinaryExpression" + "type": "BinaryExpression", + "type": "BinaryExpression" + } }, { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { + "type": "LabeledArg", + "label": { "commentStart": 0, "end": 0, - "name": "kitHeadElevation", + "name": "positionZ", "start": 0, "type": "Identifier" }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { + "arg": { + "abs_path": false, "commentStart": 0, "end": 0, - "name": "kitHeadWidth", + "name": { + "commentStart": 0, + "end": 0, + "name": "kitHeadElevation", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } + }, + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "width", "start": 0, "type": "Identifier" }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { + "arg": { + "abs_path": false, "commentStart": 0, "end": 0, - "name": "kitHeadHeight", + "name": { + "commentStart": 0, + "end": 0, + "name": "kitHeadWidth", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } + }, + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "height", "start": 0, "type": "Identifier" }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { + "arg": { + "abs_path": false, "commentStart": 0, "end": 0, - "name": "kitHeadDepth", + "name": { + "commentStart": 0, + "end": 0, + "name": "kitHeadHeight", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } + }, + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "depth", "start": 0, "type": "Identifier" }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" + "arg": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "kitHeadDepth", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } } ], "callee": { @@ -1949,8 +2019,9 @@ description: Result of parsing kitt.kcl "commentStart": 0, "end": 0, "start": 0, - "type": "CallExpression", - "type": "CallExpression" + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null }, "start": 0, "type": "VariableDeclarator" @@ -3630,7 +3701,7 @@ description: Result of parsing kitt.kcl "id": { "commentStart": 0, "end": 0, - "name": "kitEyeHeihgt", + "name": "kitEyeHeight", "start": 0, "type": "Identifier" }, @@ -3727,46 +3798,22 @@ description: Result of parsing kitt.kcl "init": { "arguments": [ { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { + "type": "LabeledArg", + "label": { "commentStart": 0, "end": 0, - "name": "kitFace", + "name": "kitExtrude", "start": 0, "type": "Identifier" }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "START", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - { - "argument": { + "arg": { "abs_path": false, "commentStart": 0, "end": 0, "name": { "commentStart": 0, "end": 0, - "name": "kitEyeOffset", + "name": "kitFace", "start": 0, "type": "Identifier" }, @@ -3774,69 +3821,163 @@ description: Result of parsing kitt.kcl "start": 0, "type": "Name", "type": "Name" - }, - "commentStart": 0, - "end": 0, - "operator": "-", - "start": 0, - "type": "UnaryExpression", - "type": "UnaryExpression" - }, - { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "kitEyeHeihgt", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - { - "commentStart": 0, - "end": 0, - "raw": "1", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 1.0, - "suffix": "None" } }, { - "commentStart": 0, - "end": 0, - "raw": "1", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 1.0, - "suffix": "None" - } - }, - { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { + "type": "LabeledArg", + "label": { "commentStart": 0, "end": 0, - "name": "kitEyeDepth", + "name": "extrudeTag", "start": 0, "type": "Identifier" }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" + "arg": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "START", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } + }, + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "positionY", + "start": 0, + "type": "Identifier" + }, + "arg": { + "argument": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "kitEyeOffset", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + }, + "commentStart": 0, + "end": 0, + "operator": "-", + "start": 0, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + }, + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "positionZ", + "start": 0, + "type": "Identifier" + }, + "arg": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "kitEyeHeight", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } + }, + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "width", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "end": 0, + "raw": "1", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 1.0, + "suffix": "None" + } + } + }, + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "height", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "end": 0, + "raw": "1", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 1.0, + "suffix": "None" + } + } + }, + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "depth", + "start": 0, + "type": "Identifier" + }, + "arg": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "kitEyeDepth", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } } ], "callee": { @@ -3857,8 +3998,9 @@ description: Result of parsing kitt.kcl "commentStart": 0, "end": 0, "start": 0, - "type": "CallExpression", - "type": "CallExpression" + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null }, "start": 0, "type": "VariableDeclarator" @@ -3889,49 +4031,131 @@ description: Result of parsing kitt.kcl "init": { "arguments": [ { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { + "type": "LabeledArg", + "label": { "commentStart": 0, "end": 0, - "name": "kitFace", + "name": "kitExtrude", "start": 0, "type": "Identifier" }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { + "arg": { + "abs_path": false, "commentStart": 0, "end": 0, - "name": "START", + "name": { + "commentStart": 0, + "end": 0, + "name": "kitFace", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } + }, + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "extrudeTag", "start": 0, "type": "Identifier" }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" + "arg": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "START", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } }, { - "commentStart": 0, - "end": 0, - "left": { - "argument": { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "positionY", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "end": 0, + "left": { + "argument": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "kitEyeOffset", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + }, + "commentStart": 0, + "end": 0, + "operator": "-", + "start": 0, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + "operator": "+", + "right": { + "commentStart": 0, + "end": 0, + "raw": "1", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 1.0, + "suffix": "None" + } + }, + "start": 0, + "type": "BinaryExpression", + "type": "BinaryExpression" + } + }, + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "positionZ", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "end": 0, + "left": { "abs_path": false, "commentStart": 0, "end": 0, "name": { "commentStart": 0, "end": 0, - "name": "kitEyeOffset", + "name": "kitEyeHeight", "start": 0, "type": "Identifier" }, @@ -3940,15 +4164,56 @@ description: Result of parsing kitt.kcl "type": "Name", "type": "Name" }, + "operator": "+", + "right": { + "commentStart": 0, + "end": 0, + "raw": "1", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 1.0, + "suffix": "None" + } + }, + "start": 0, + "type": "BinaryExpression", + "type": "BinaryExpression" + } + }, + { + "type": "LabeledArg", + "label": { "commentStart": 0, "end": 0, - "operator": "-", + "name": "width", "start": 0, - "type": "UnaryExpression", - "type": "UnaryExpression" + "type": "Identifier" }, - "operator": "+", - "right": { + "arg": { + "commentStart": 0, + "end": 0, + "raw": "3", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 3.0, + "suffix": "None" + } + } + }, + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "height", + "start": 0, + "type": "Identifier" + }, + "arg": { "commentStart": 0, "end": 0, "raw": "1", @@ -3959,22 +4224,25 @@ description: Result of parsing kitt.kcl "value": 1.0, "suffix": "None" } - }, - "start": 0, - "type": "BinaryExpression", - "type": "BinaryExpression" + } }, { - "commentStart": 0, - "end": 0, - "left": { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "depth", + "start": 0, + "type": "Identifier" + }, + "arg": { "abs_path": false, "commentStart": 0, "end": 0, "name": { "commentStart": 0, "end": 0, - "name": "kitEyeHeihgt", + "name": "kitEyeDepth", "start": 0, "type": "Identifier" }, @@ -3982,63 +4250,7 @@ description: Result of parsing kitt.kcl "start": 0, "type": "Name", "type": "Name" - }, - "operator": "+", - "right": { - "commentStart": 0, - "end": 0, - "raw": "1", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 1.0, - "suffix": "None" - } - }, - "start": 0, - "type": "BinaryExpression", - "type": "BinaryExpression" - }, - { - "commentStart": 0, - "end": 0, - "raw": "3", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 3.0, - "suffix": "None" } - }, - { - "commentStart": 0, - "end": 0, - "raw": "1", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 1.0, - "suffix": "None" - } - }, - { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "kitEyeDepth", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" } ], "callee": { @@ -4059,8 +4271,9 @@ description: Result of parsing kitt.kcl "commentStart": 0, "end": 0, "start": 0, - "type": "CallExpression", - "type": "CallExpression" + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null }, "start": 0, "type": "VariableDeclarator" @@ -4091,136 +4304,206 @@ description: Result of parsing kitt.kcl "init": { "arguments": [ { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { + "type": "LabeledArg", + "label": { "commentStart": 0, "end": 0, - "name": "kitFace", + "name": "kitExtrude", "start": 0, "type": "Identifier" }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { + "arg": { + "abs_path": false, "commentStart": 0, "end": 0, - "name": "START", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - { - "commentStart": 0, - "end": 0, - "left": { - "argument": { - "abs_path": false, + "name": { "commentStart": 0, "end": 0, - "name": { + "name": "kitFace", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } + }, + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "extrudeTag", + "start": 0, + "type": "Identifier" + }, + "arg": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "START", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } + }, + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "positionY", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "end": 0, + "left": { + "argument": { + "abs_path": false, "commentStart": 0, "end": 0, - "name": "kitEyeOffset", + "name": { + "commentStart": 0, + "end": 0, + "name": "kitEyeOffset", + "start": 0, + "type": "Identifier" + }, + "path": [], "start": 0, - "type": "Identifier" + "type": "Name", + "type": "Name" }, - "path": [], + "commentStart": 0, + "end": 0, + "operator": "-", "start": 0, - "type": "Name", - "type": "Name" + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + "operator": "+", + "right": { + "commentStart": 0, + "end": 0, + "raw": "4", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 4.0, + "suffix": "None" + } }, - "commentStart": 0, - "end": 0, - "operator": "-", "start": 0, - "type": "UnaryExpression", - "type": "UnaryExpression" - }, - "operator": "+", - "right": { + "type": "BinaryExpression", + "type": "BinaryExpression" + } + }, + { + "type": "LabeledArg", + "label": { "commentStart": 0, "end": 0, - "raw": "4", + "name": "positionZ", + "start": 0, + "type": "Identifier" + }, + "arg": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "kitEyeHeight", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } + }, + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "width", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "end": 0, + "raw": "1", "start": 0, "type": "Literal", "type": "Literal", "value": { - "value": 4.0, + "value": 1.0, "suffix": "None" } - }, - "start": 0, - "type": "BinaryExpression", - "type": "BinaryExpression" - }, - { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "kitEyeHeihgt", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - { - "commentStart": 0, - "end": 0, - "raw": "1", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 1.0, - "suffix": "None" } }, { - "commentStart": 0, - "end": 0, - "raw": "1", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 1.0, - "suffix": "None" - } - }, - { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { + "type": "LabeledArg", + "label": { "commentStart": 0, "end": 0, - "name": "kitEyeDepth", + "name": "height", "start": 0, "type": "Identifier" }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" + "arg": { + "commentStart": 0, + "end": 0, + "raw": "1", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 1.0, + "suffix": "None" + } + } + }, + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "depth", + "start": 0, + "type": "Identifier" + }, + "arg": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "kitEyeDepth", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } } ], "callee": { @@ -4241,8 +4524,9 @@ description: Result of parsing kitt.kcl "commentStart": 0, "end": 0, "start": 0, - "type": "CallExpression", - "type": "CallExpression" + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null }, "start": 0, "type": "VariableDeclarator" @@ -4268,48 +4552,22 @@ description: Result of parsing kitt.kcl "init": { "arguments": [ { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { + "type": "LabeledArg", + "label": { "commentStart": 0, "end": 0, - "name": "kitFace", + "name": "kitExtrude", "start": 0, "type": "Identifier" }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "START", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - { - "commentStart": 0, - "end": 0, - "left": { + "arg": { "abs_path": false, "commentStart": 0, "end": 0, "name": { "commentStart": 0, "end": 0, - "name": "kitEyeOffset", + "name": "kitFace", "start": 0, "type": "Identifier" }, @@ -4317,35 +4575,25 @@ description: Result of parsing kitt.kcl "start": 0, "type": "Name", "type": "Name" - }, - "operator": "-", - "right": { - "commentStart": 0, - "end": 0, - "raw": "3", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 3.0, - "suffix": "None" - } - }, - "start": 0, - "type": "BinaryExpression", - "type": "BinaryExpression" + } }, { - "commentStart": 0, - "end": 0, - "left": { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "extrudeTag", + "start": 0, + "type": "Identifier" + }, + "arg": { "abs_path": false, "commentStart": 0, "end": 0, "name": { "commentStart": 0, "end": 0, - "name": "kitEyeHeihgt", + "name": "START", "start": 0, "type": "Identifier" }, @@ -4353,63 +4601,169 @@ description: Result of parsing kitt.kcl "start": 0, "type": "Name", "type": "Name" - }, - "operator": "-", - "right": { + } + }, + { + "type": "LabeledArg", + "label": { "commentStart": 0, "end": 0, - "raw": "1", + "name": "positionY", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "end": 0, + "left": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "kitEyeOffset", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + }, + "operator": "-", + "right": { + "commentStart": 0, + "end": 0, + "raw": "3", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 3.0, + "suffix": "None" + } + }, + "start": 0, + "type": "BinaryExpression", + "type": "BinaryExpression" + } + }, + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "positionZ", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "end": 0, + "left": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "kitEyeHeight", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + }, + "operator": "-", + "right": { + "commentStart": 0, + "end": 0, + "raw": "1", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 1.0, + "suffix": "None" + } + }, + "start": 0, + "type": "BinaryExpression", + "type": "BinaryExpression" + } + }, + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "width", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "end": 0, + "raw": "2", "start": 0, "type": "Literal", "type": "Literal", "value": { - "value": 1.0, + "value": 2.0, "suffix": "None" } - }, - "start": 0, - "type": "BinaryExpression", - "type": "BinaryExpression" - }, - { - "commentStart": 0, - "end": 0, - "raw": "2", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 2.0, - "suffix": "None" } }, { - "commentStart": 0, - "end": 0, - "raw": "4", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 4.0, - "suffix": "None" - } - }, - { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { + "type": "LabeledArg", + "label": { "commentStart": 0, "end": 0, - "name": "kitEyeDepth", + "name": "height", "start": 0, "type": "Identifier" }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" + "arg": { + "commentStart": 0, + "end": 0, + "raw": "4", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 4.0, + "suffix": "None" + } + } + }, + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "depth", + "start": 0, + "type": "Identifier" + }, + "arg": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "kitEyeDepth", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } } ], "callee": { @@ -4430,8 +4784,9 @@ description: Result of parsing kitt.kcl "commentStart": 0, "end": 0, "start": 0, - "type": "CallExpression", - "type": "CallExpression" + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null }, "start": 0, "type": "VariableDeclarator" @@ -4464,7 +4819,7 @@ description: Result of parsing kitt.kcl "name": { "commentStart": 0, "end": 0, - "name": "kitEyeHeihgt", + "name": "kitEyeHeight", "start": 0, "type": "Identifier" }, @@ -5872,7 +6227,7 @@ description: Result of parsing kitt.kcl "name": { "commentStart": 0, "end": 0, - "name": "kitEyeHeihgt", + "name": "kitEyeHeight", "start": 0, "type": "Identifier" }, @@ -5922,46 +6277,22 @@ description: Result of parsing kitt.kcl "init": { "arguments": [ { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { + "type": "LabeledArg", + "label": { "commentStart": 0, "end": 0, - "name": "kitFace", + "name": "kitExtrude", "start": 0, "type": "Identifier" }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "START", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - { - "argument": { + "arg": { "abs_path": false, "commentStart": 0, "end": 0, "name": { "commentStart": 0, "end": 0, - "name": "kitMouthOffset", + "name": "kitFace", "start": 0, "type": "Identifier" }, @@ -5969,69 +6300,163 @@ description: Result of parsing kitt.kcl "start": 0, "type": "Name", "type": "Name" - }, - "commentStart": 0, - "end": 0, - "operator": "-", - "start": 0, - "type": "UnaryExpression", - "type": "UnaryExpression" - }, - { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "kitMouthHeight", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - { - "commentStart": 0, - "end": 0, - "raw": "1", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 1.0, - "suffix": "None" } }, { - "commentStart": 0, - "end": 0, - "raw": "1", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 1.0, - "suffix": "None" - } - }, - { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { + "type": "LabeledArg", + "label": { "commentStart": 0, "end": 0, - "name": "kitEyeDepth", + "name": "extrudeTag", "start": 0, "type": "Identifier" }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" + "arg": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "START", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } + }, + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "positionY", + "start": 0, + "type": "Identifier" + }, + "arg": { + "argument": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "kitMouthOffset", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + }, + "commentStart": 0, + "end": 0, + "operator": "-", + "start": 0, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + }, + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "positionZ", + "start": 0, + "type": "Identifier" + }, + "arg": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "kitMouthHeight", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } + }, + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "width", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "end": 0, + "raw": "1", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 1.0, + "suffix": "None" + } + } + }, + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "height", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "end": 0, + "raw": "1", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 1.0, + "suffix": "None" + } + } + }, + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "depth", + "start": 0, + "type": "Identifier" + }, + "arg": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "kitEyeDepth", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } } ], "callee": { @@ -6052,8 +6477,9 @@ description: Result of parsing kitt.kcl "commentStart": 0, "end": 0, "start": 0, - "type": "CallExpression", - "type": "CallExpression" + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null }, "start": 0, "type": "VariableDeclarator" @@ -6079,49 +6505,131 @@ description: Result of parsing kitt.kcl "init": { "arguments": [ { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { + "type": "LabeledArg", + "label": { "commentStart": 0, "end": 0, - "name": "kitFace", + "name": "kitExtrude", "start": 0, "type": "Identifier" }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { + "arg": { + "abs_path": false, "commentStart": 0, "end": 0, - "name": "START", + "name": { + "commentStart": 0, + "end": 0, + "name": "kitFace", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } + }, + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "extrudeTag", "start": 0, "type": "Identifier" }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" + "arg": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "START", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } }, { - "commentStart": 0, - "end": 0, - "left": { - "argument": { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "positionY", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "end": 0, + "left": { + "argument": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "kitMouthOffset", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + }, + "commentStart": 0, + "end": 0, + "operator": "-", + "start": 0, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + "operator": "+", + "right": { + "commentStart": 0, + "end": 0, + "raw": "1", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 1.0, + "suffix": "None" + } + }, + "start": 0, + "type": "BinaryExpression", + "type": "BinaryExpression" + } + }, + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "positionZ", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "end": 0, + "left": { "abs_path": false, "commentStart": 0, "end": 0, "name": { "commentStart": 0, "end": 0, - "name": "kitMouthOffset", + "name": "kitMouthHeight", "start": 0, "type": "Identifier" }, @@ -6130,15 +6638,34 @@ description: Result of parsing kitt.kcl "type": "Name", "type": "Name" }, + "operator": "-", + "right": { + "commentStart": 0, + "end": 0, + "raw": "1", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 1.0, + "suffix": "None" + } + }, + "start": 0, + "type": "BinaryExpression", + "type": "BinaryExpression" + } + }, + { + "type": "LabeledArg", + "label": { "commentStart": 0, "end": 0, - "operator": "-", + "name": "width", "start": 0, - "type": "UnaryExpression", - "type": "UnaryExpression" + "type": "Identifier" }, - "operator": "+", - "right": { + "arg": { "commentStart": 0, "end": 0, "raw": "1", @@ -6149,22 +6676,47 @@ description: Result of parsing kitt.kcl "value": 1.0, "suffix": "None" } - }, - "start": 0, - "type": "BinaryExpression", - "type": "BinaryExpression" + } }, { - "commentStart": 0, - "end": 0, - "left": { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "height", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "end": 0, + "raw": "1", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 1.0, + "suffix": "None" + } + } + }, + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "depth", + "start": 0, + "type": "Identifier" + }, + "arg": { "abs_path": false, "commentStart": 0, "end": 0, "name": { "commentStart": 0, "end": 0, - "name": "kitMouthHeight", + "name": "kitEyeDepth", "start": 0, "type": "Identifier" }, @@ -6172,63 +6724,7 @@ description: Result of parsing kitt.kcl "start": 0, "type": "Name", "type": "Name" - }, - "operator": "-", - "right": { - "commentStart": 0, - "end": 0, - "raw": "1", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 1.0, - "suffix": "None" - } - }, - "start": 0, - "type": "BinaryExpression", - "type": "BinaryExpression" - }, - { - "commentStart": 0, - "end": 0, - "raw": "1", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 1.0, - "suffix": "None" } - }, - { - "commentStart": 0, - "end": 0, - "raw": "1", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 1.0, - "suffix": "None" - } - }, - { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "kitEyeDepth", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" } ], "callee": { @@ -6249,8 +6745,9 @@ description: Result of parsing kitt.kcl "commentStart": 0, "end": 0, "start": 0, - "type": "CallExpression", - "type": "CallExpression" + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null }, "start": 0, "type": "VariableDeclarator" @@ -6281,108 +6778,178 @@ description: Result of parsing kitt.kcl "init": { "arguments": [ { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { + "type": "LabeledArg", + "label": { "commentStart": 0, "end": 0, - "name": "kitFace", + "name": "kitExtrude", "start": 0, "type": "Identifier" }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { + "arg": { + "abs_path": false, "commentStart": 0, "end": 0, - "name": "START", + "name": { + "commentStart": 0, + "end": 0, + "name": "kitFace", + "start": 0, + "type": "Identifier" + }, + "path": [], "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "kitMouthOffset", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "kitMouthHeight", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - { - "commentStart": 0, - "end": 0, - "raw": "1", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 1.0, - "suffix": "None" + "type": "Name", + "type": "Name" } }, { - "commentStart": 0, - "end": 0, - "raw": "1", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 1.0, - "suffix": "None" - } - }, - { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { + "type": "LabeledArg", + "label": { "commentStart": 0, "end": 0, - "name": "kitEyeDepth", + "name": "extrudeTag", "start": 0, "type": "Identifier" }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" + "arg": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "START", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } + }, + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "positionY", + "start": 0, + "type": "Identifier" + }, + "arg": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "kitMouthOffset", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } + }, + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "positionZ", + "start": 0, + "type": "Identifier" + }, + "arg": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "kitMouthHeight", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } + }, + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "width", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "end": 0, + "raw": "1", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 1.0, + "suffix": "None" + } + } + }, + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "height", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "end": 0, + "raw": "1", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 1.0, + "suffix": "None" + } + } + }, + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "depth", + "start": 0, + "type": "Identifier" + }, + "arg": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "kitEyeDepth", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } } ], "callee": { @@ -6403,8 +6970,9 @@ description: Result of parsing kitt.kcl "commentStart": 0, "end": 0, "start": 0, - "type": "CallExpression", - "type": "CallExpression" + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null }, "start": 0, "type": "VariableDeclarator" @@ -6430,48 +6998,22 @@ description: Result of parsing kitt.kcl "init": { "arguments": [ { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { + "type": "LabeledArg", + "label": { "commentStart": 0, "end": 0, - "name": "kitFace", + "name": "kitExtrude", "start": 0, "type": "Identifier" }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "START", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - { - "commentStart": 0, - "end": 0, - "left": { + "arg": { "abs_path": false, "commentStart": 0, "end": 0, "name": { "commentStart": 0, "end": 0, - "name": "kitMouthOffset", + "name": "kitFace", "start": 0, "type": "Identifier" }, @@ -6479,9 +7021,136 @@ description: Result of parsing kitt.kcl "start": 0, "type": "Name", "type": "Name" + } + }, + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "extrudeTag", + "start": 0, + "type": "Identifier" }, - "operator": "-", - "right": { + "arg": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "START", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } + }, + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "positionY", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "end": 0, + "left": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "kitMouthOffset", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + }, + "operator": "-", + "right": { + "commentStart": 0, + "end": 0, + "raw": "1", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 1.0, + "suffix": "None" + } + }, + "start": 0, + "type": "BinaryExpression", + "type": "BinaryExpression" + } + }, + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "positionZ", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "end": 0, + "left": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "kitMouthHeight", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + }, + "operator": "-", + "right": { + "commentStart": 0, + "end": 0, + "raw": "1", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 1.0, + "suffix": "None" + } + }, + "start": 0, + "type": "BinaryExpression", + "type": "BinaryExpression" + } + }, + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "width", + "start": 0, + "type": "Identifier" + }, + "arg": { "commentStart": 0, "end": 0, "raw": "1", @@ -6492,32 +7161,18 @@ description: Result of parsing kitt.kcl "value": 1.0, "suffix": "None" } - }, - "start": 0, - "type": "BinaryExpression", - "type": "BinaryExpression" + } }, { - "commentStart": 0, - "end": 0, - "left": { - "abs_path": false, + "type": "LabeledArg", + "label": { "commentStart": 0, "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "kitMouthHeight", - "start": 0, - "type": "Identifier" - }, - "path": [], + "name": "height", "start": 0, - "type": "Name", - "type": "Name" + "type": "Identifier" }, - "operator": "-", - "right": { + "arg": { "commentStart": 0, "end": 0, "raw": "1", @@ -6528,50 +7183,33 @@ description: Result of parsing kitt.kcl "value": 1.0, "suffix": "None" } - }, - "start": 0, - "type": "BinaryExpression", - "type": "BinaryExpression" - }, - { - "commentStart": 0, - "end": 0, - "raw": "1", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 1.0, - "suffix": "None" } }, { - "commentStart": 0, - "end": 0, - "raw": "1", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 1.0, - "suffix": "None" - } - }, - { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { + "type": "LabeledArg", + "label": { "commentStart": 0, "end": 0, - "name": "kitEyeDepth", + "name": "depth", "start": 0, "type": "Identifier" }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" + "arg": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "kitEyeDepth", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } } ], "callee": { @@ -6592,8 +7230,9 @@ description: Result of parsing kitt.kcl "commentStart": 0, "end": 0, "start": 0, - "type": "CallExpression", - "type": "CallExpression" + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null }, "start": 0, "type": "VariableDeclarator" @@ -6836,144 +7475,214 @@ description: Result of parsing kitt.kcl "init": { "arguments": [ { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { + "type": "LabeledArg", + "label": { "commentStart": 0, "end": 0, - "name": "kitBody", + "name": "kitExtrude", "start": 0, "type": "Identifier" }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { + "arg": { + "abs_path": false, "commentStart": 0, "end": 0, - "name": "END", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - { - "commentStart": 0, - "end": 0, - "left": { - "argument": { - "abs_path": false, + "name": { "commentStart": 0, "end": 0, - "name": { + "name": "kitBody", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } + }, + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "extrudeTag", + "start": 0, + "type": "Identifier" + }, + "arg": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "END", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } + }, + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "positionY", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "end": 0, + "left": { + "argument": { + "abs_path": false, "commentStart": 0, "end": 0, - "name": "kitBellyWidth", + "name": { + "commentStart": 0, + "end": 0, + "name": "kitBellyWidth", + "start": 0, + "type": "Identifier" + }, + "path": [], "start": 0, - "type": "Identifier" + "type": "Name", + "type": "Name" }, - "path": [], + "commentStart": 0, + "end": 0, + "operator": "-", "start": 0, - "type": "Name", - "type": "Name" + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + "operator": "/", + "right": { + "commentStart": 0, + "end": 0, + "raw": "2", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 2.0, + "suffix": "None" + } }, - "commentStart": 0, - "end": 0, - "operator": "-", "start": 0, - "type": "UnaryExpression", - "type": "UnaryExpression" - }, - "operator": "/", - "right": { - "commentStart": 0, - "end": 0, - "raw": "2", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 2.0, - "suffix": "None" - } - }, - "start": 0, - "type": "BinaryExpression", - "type": "BinaryExpression" + "type": "BinaryExpression", + "type": "BinaryExpression" + } }, { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { + "type": "LabeledArg", + "label": { "commentStart": 0, "end": 0, - "name": "kitBellyElevation", + "name": "positionZ", "start": 0, "type": "Identifier" }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { + "arg": { + "abs_path": false, "commentStart": 0, "end": 0, - "name": "kitBellyWidth", + "name": { + "commentStart": 0, + "end": 0, + "name": "kitBellyElevation", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } + }, + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "width", "start": 0, "type": "Identifier" }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { + "arg": { + "abs_path": false, "commentStart": 0, "end": 0, - "name": "kitBellyHeight", + "name": { + "commentStart": 0, + "end": 0, + "name": "kitBellyWidth", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } + }, + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "height", "start": 0, "type": "Identifier" }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { + "arg": { + "abs_path": false, "commentStart": 0, "end": 0, - "name": "kitBellyDepth", + "name": { + "commentStart": 0, + "end": 0, + "name": "kitBellyHeight", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } + }, + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "depth", "start": 0, "type": "Identifier" }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" + "arg": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "kitBellyDepth", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } } ], "callee": { @@ -6994,8 +7703,9 @@ description: Result of parsing kitt.kcl "commentStart": 0, "end": 0, "start": 0, - "type": "CallExpression", - "type": "CallExpression" + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null }, "start": 0, "type": "VariableDeclarator" @@ -7182,144 +7892,214 @@ description: Result of parsing kitt.kcl "init": { "arguments": [ { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { + "type": "LabeledArg", + "label": { "commentStart": 0, "end": 0, - "name": "kitBelly", + "name": "kitExtrude", "start": 0, "type": "Identifier" }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { + "arg": { + "abs_path": false, "commentStart": 0, "end": 0, - "name": "END", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - { - "commentStart": 0, - "end": 0, - "left": { - "argument": { - "abs_path": false, + "name": { "commentStart": 0, "end": 0, - "name": { + "name": "kitBelly", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } + }, + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "extrudeTag", + "start": 0, + "type": "Identifier" + }, + "arg": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "END", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } + }, + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "positionY", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "end": 0, + "left": { + "argument": { + "abs_path": false, "commentStart": 0, "end": 0, - "name": "kitVHSwidth", + "name": { + "commentStart": 0, + "end": 0, + "name": "kitVHSwidth", + "start": 0, + "type": "Identifier" + }, + "path": [], "start": 0, - "type": "Identifier" + "type": "Name", + "type": "Name" }, - "path": [], + "commentStart": 0, + "end": 0, + "operator": "-", "start": 0, - "type": "Name", - "type": "Name" + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + "operator": "/", + "right": { + "commentStart": 0, + "end": 0, + "raw": "2", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 2.0, + "suffix": "None" + } }, - "commentStart": 0, - "end": 0, - "operator": "-", "start": 0, - "type": "UnaryExpression", - "type": "UnaryExpression" - }, - "operator": "/", - "right": { - "commentStart": 0, - "end": 0, - "raw": "2", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 2.0, - "suffix": "None" - } - }, - "start": 0, - "type": "BinaryExpression", - "type": "BinaryExpression" + "type": "BinaryExpression", + "type": "BinaryExpression" + } }, { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { + "type": "LabeledArg", + "label": { "commentStart": 0, "end": 0, - "name": "kitVHSelevation", + "name": "positionZ", "start": 0, "type": "Identifier" }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { + "arg": { + "abs_path": false, "commentStart": 0, "end": 0, - "name": "kitVHSwidth", + "name": { + "commentStart": 0, + "end": 0, + "name": "kitVHSelevation", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } + }, + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "width", "start": 0, "type": "Identifier" }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { + "arg": { + "abs_path": false, "commentStart": 0, "end": 0, - "name": "kitVHSheight", + "name": { + "commentStart": 0, + "end": 0, + "name": "kitVHSwidth", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } + }, + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "height", "start": 0, "type": "Identifier" }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { + "arg": { + "abs_path": false, "commentStart": 0, "end": 0, - "name": "kitVHSdepth", + "name": { + "commentStart": 0, + "end": 0, + "name": "kitVHSheight", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } + }, + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "depth", "start": 0, "type": "Identifier" }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" + "arg": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "kitVHSdepth", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } } ], "callee": { @@ -7340,8 +8120,9 @@ description: Result of parsing kitt.kcl "commentStart": 0, "end": 0, "start": 0, - "type": "CallExpression", - "type": "CallExpression" + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null }, "start": 0, "type": "VariableDeclarator" @@ -7600,46 +8381,22 @@ description: Result of parsing kitt.kcl "init": { "arguments": [ { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { + "type": "LabeledArg", + "label": { "commentStart": 0, "end": 0, - "name": "kitBelly", + "name": "kitExtrude", "start": 0, "type": "Identifier" }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "END", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - { - "argument": { + "arg": { "abs_path": false, "commentStart": 0, "end": 0, "name": { "commentStart": 0, "end": 0, - "name": "kitFloppyOffset", + "name": "kitBelly", "start": 0, "type": "Identifier" }, @@ -7647,71 +8404,25 @@ description: Result of parsing kitt.kcl "start": 0, "type": "Name", "type": "Name" - }, - "commentStart": 0, - "end": 0, - "operator": "-", - "start": 0, - "type": "UnaryExpression", - "type": "UnaryExpression" + } }, { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { + "type": "LabeledArg", + "label": { "commentStart": 0, "end": 0, - "name": "kitFloppyElevation", + "name": "extrudeTag", "start": 0, "type": "Identifier" }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "kitFloppyWidth", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "kitFloppyHeight", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - { - "argument": { + "arg": { "abs_path": false, "commentStart": 0, "end": 0, "name": { "commentStart": 0, "end": 0, - "name": "kitFloppyDepth", + "name": "END", "start": 0, "type": "Identifier" }, @@ -7719,13 +8430,153 @@ description: Result of parsing kitt.kcl "start": 0, "type": "Name", "type": "Name" + } + }, + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "positionY", + "start": 0, + "type": "Identifier" }, - "commentStart": 0, - "end": 0, - "operator": "-", - "start": 0, - "type": "UnaryExpression", - "type": "UnaryExpression" + "arg": { + "argument": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "kitFloppyOffset", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + }, + "commentStart": 0, + "end": 0, + "operator": "-", + "start": 0, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + }, + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "positionZ", + "start": 0, + "type": "Identifier" + }, + "arg": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "kitFloppyElevation", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } + }, + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "width", + "start": 0, + "type": "Identifier" + }, + "arg": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "kitFloppyWidth", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } + }, + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "height", + "start": 0, + "type": "Identifier" + }, + "arg": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "kitFloppyHeight", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } + }, + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "depth", + "start": 0, + "type": "Identifier" + }, + "arg": { + "argument": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "kitFloppyDepth", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + }, + "commentStart": 0, + "end": 0, + "operator": "-", + "start": 0, + "type": "UnaryExpression", + "type": "UnaryExpression" + } } ], "callee": { @@ -7746,8 +8597,9 @@ description: Result of parsing kitt.kcl "commentStart": 0, "end": 0, "start": 0, - "type": "CallExpression", - "type": "CallExpression" + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null }, "start": 0, "type": "VariableDeclarator" @@ -7778,46 +8630,22 @@ description: Result of parsing kitt.kcl "init": { "arguments": [ { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { + "type": "LabeledArg", + "label": { "commentStart": 0, "end": 0, - "name": "kitBelly", + "name": "kitExtrude", "start": 0, "type": "Identifier" }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "END", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - { - "argument": { + "arg": { "abs_path": false, "commentStart": 0, "end": 0, "name": { "commentStart": 0, "end": 0, - "name": "kitFloppyOffset", + "name": "kitBelly", "start": 0, "type": "Identifier" }, @@ -7825,25 +8653,25 @@ description: Result of parsing kitt.kcl "start": 0, "type": "Name", "type": "Name" - }, - "commentStart": 0, - "end": 0, - "operator": "-", - "start": 0, - "type": "UnaryExpression", - "type": "UnaryExpression" + } }, { - "commentStart": 0, - "end": 0, - "left": { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "extrudeTag", + "start": 0, + "type": "Identifier" + }, + "arg": { "abs_path": false, "commentStart": 0, "end": 0, "name": { "commentStart": 0, "end": 0, - "name": "kitFloppyElevation", + "name": "END", "start": 0, "type": "Identifier" }, @@ -7851,65 +8679,105 @@ description: Result of parsing kitt.kcl "start": 0, "type": "Name", "type": "Name" - }, - "operator": "+", - "right": { - "commentStart": 0, - "end": 0, - "raw": "2", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 2.0, - "suffix": "None" - } - }, - "start": 0, - "type": "BinaryExpression", - "type": "BinaryExpression" + } }, { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { + "type": "LabeledArg", + "label": { "commentStart": 0, "end": 0, - "name": "kitFloppyWidth", + "name": "positionY", "start": 0, "type": "Identifier" }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { + "arg": { + "argument": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "kitFloppyOffset", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + }, "commentStart": 0, "end": 0, - "name": "kitFloppyHeight", + "operator": "-", + "start": 0, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + }, + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "positionZ", "start": 0, "type": "Identifier" }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" + "arg": { + "commentStart": 0, + "end": 0, + "left": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "kitFloppyElevation", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + }, + "operator": "+", + "right": { + "commentStart": 0, + "end": 0, + "raw": "2", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 2.0, + "suffix": "None" + } + }, + "start": 0, + "type": "BinaryExpression", + "type": "BinaryExpression" + } }, { - "argument": { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "width", + "start": 0, + "type": "Identifier" + }, + "arg": { "abs_path": false, "commentStart": 0, "end": 0, "name": { "commentStart": 0, "end": 0, - "name": "kitFloppyDepth", + "name": "kitFloppyWidth", "start": 0, "type": "Identifier" }, @@ -7917,13 +8785,67 @@ description: Result of parsing kitt.kcl "start": 0, "type": "Name", "type": "Name" + } + }, + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "height", + "start": 0, + "type": "Identifier" }, - "commentStart": 0, - "end": 0, - "operator": "-", - "start": 0, - "type": "UnaryExpression", - "type": "UnaryExpression" + "arg": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "kitFloppyHeight", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } + }, + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "depth", + "start": 0, + "type": "Identifier" + }, + "arg": { + "argument": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "kitFloppyDepth", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + }, + "commentStart": 0, + "end": 0, + "operator": "-", + "start": 0, + "type": "UnaryExpression", + "type": "UnaryExpression" + } } ], "callee": { @@ -7944,8 +8866,9 @@ description: Result of parsing kitt.kcl "commentStart": 0, "end": 0, "start": 0, - "type": "CallExpression", - "type": "CallExpression" + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null }, "start": 0, "type": "VariableDeclarator" @@ -7971,78 +8894,22 @@ description: Result of parsing kitt.kcl "init": { "arguments": [ { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { + "type": "LabeledArg", + "label": { "commentStart": 0, "end": 0, - "name": "kitBelly", + "name": "kitExtrude", "start": 0, "type": "Identifier" }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "END", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "kitFloppyOffset", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "kitFloppyElevation", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - { - "argument": { + "arg": { "abs_path": false, "commentStart": 0, "end": 0, "name": { "commentStart": 0, "end": 0, - "name": "kitFloppyWidth", + "name": "kitBelly", "start": 0, "type": "Identifier" }, @@ -8050,39 +8917,25 @@ description: Result of parsing kitt.kcl "start": 0, "type": "Name", "type": "Name" - }, - "commentStart": 0, - "end": 0, - "operator": "-", - "start": 0, - "type": "UnaryExpression", - "type": "UnaryExpression" + } }, { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { + "type": "LabeledArg", + "label": { "commentStart": 0, "end": 0, - "name": "kitFloppyHeight", + "name": "extrudeTag", "start": 0, "type": "Identifier" }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - { - "argument": { + "arg": { "abs_path": false, "commentStart": 0, "end": 0, "name": { "commentStart": 0, "end": 0, - "name": "kitFloppyDepth", + "name": "END", "start": 0, "type": "Identifier" }, @@ -8090,13 +8943,153 @@ description: Result of parsing kitt.kcl "start": 0, "type": "Name", "type": "Name" + } + }, + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "positionY", + "start": 0, + "type": "Identifier" }, - "commentStart": 0, - "end": 0, - "operator": "-", - "start": 0, - "type": "UnaryExpression", - "type": "UnaryExpression" + "arg": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "kitFloppyOffset", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } + }, + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "positionZ", + "start": 0, + "type": "Identifier" + }, + "arg": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "kitFloppyElevation", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } + }, + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "width", + "start": 0, + "type": "Identifier" + }, + "arg": { + "argument": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "kitFloppyWidth", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + }, + "commentStart": 0, + "end": 0, + "operator": "-", + "start": 0, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + }, + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "height", + "start": 0, + "type": "Identifier" + }, + "arg": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "kitFloppyHeight", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } + }, + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "depth", + "start": 0, + "type": "Identifier" + }, + "arg": { + "argument": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "kitFloppyDepth", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + }, + "commentStart": 0, + "end": 0, + "operator": "-", + "start": 0, + "type": "UnaryExpression", + "type": "UnaryExpression" + } } ], "callee": { @@ -8117,8 +9110,9 @@ description: Result of parsing kitt.kcl "commentStart": 0, "end": 0, "start": 0, - "type": "CallExpression", - "type": "CallExpression" + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null }, "start": 0, "type": "VariableDeclarator" @@ -8406,46 +9400,22 @@ description: Result of parsing kitt.kcl "init": { "arguments": [ { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { + "type": "LabeledArg", + "label": { "commentStart": 0, "end": 0, - "name": "kitBody", + "name": "kitExtrude", "start": 0, "type": "Identifier" }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "END", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - { - "argument": { + "arg": { "abs_path": false, "commentStart": 0, "end": 0, "name": { "commentStart": 0, "end": 0, - "name": "kitBellyButtonOffset", + "name": "kitBody", "start": 0, "type": "Identifier" }, @@ -8453,77 +9423,171 @@ description: Result of parsing kitt.kcl "start": 0, "type": "Name", "type": "Name" - }, - "commentStart": 0, - "end": 0, - "operator": "-", - "start": 0, - "type": "UnaryExpression", - "type": "UnaryExpression" + } }, { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { + "type": "LabeledArg", + "label": { "commentStart": 0, "end": 0, - "name": "kitBellyButtonElevation", + "name": "extrudeTag", "start": 0, "type": "Identifier" }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { + "arg": { + "abs_path": false, "commentStart": 0, "end": 0, - "name": "kitBellyButtonWidth", + "name": { + "commentStart": 0, + "end": 0, + "name": "END", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } + }, + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "positionY", "start": 0, "type": "Identifier" }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { + "arg": { + "argument": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "kitBellyButtonOffset", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + }, "commentStart": 0, "end": 0, - "name": "kitBellyButtonHeight", + "operator": "-", + "start": 0, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + }, + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "positionZ", "start": 0, "type": "Identifier" }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { + "arg": { + "abs_path": false, "commentStart": 0, "end": 0, - "name": "kitBellyButtonDepth", + "name": { + "commentStart": 0, + "end": 0, + "name": "kitBellyButtonElevation", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } + }, + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "width", "start": 0, "type": "Identifier" }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" + "arg": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "kitBellyButtonWidth", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } + }, + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "height", + "start": 0, + "type": "Identifier" + }, + "arg": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "kitBellyButtonHeight", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } + }, + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "depth", + "start": 0, + "type": "Identifier" + }, + "arg": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "kitBellyButtonDepth", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } } ], "callee": { @@ -8544,8 +9608,9 @@ description: Result of parsing kitt.kcl "commentStart": 0, "end": 0, "start": 0, - "type": "CallExpression", - "type": "CallExpression" + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null }, "start": 0, "type": "VariableDeclarator" @@ -8731,64 +9796,22 @@ description: Result of parsing kitt.kcl "init": { "arguments": [ { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { + "type": "LabeledArg", + "label": { "commentStart": 0, "end": 0, - "name": "kitBelly", + "name": "kitExtrude", "start": 0, "type": "Identifier" }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "END", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "kitFloppyOffset", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - { - "commentStart": 0, - "end": 0, - "left": { + "arg": { "abs_path": false, "commentStart": 0, "end": 0, "name": { "commentStart": 0, "end": 0, - "name": "kitFloppyElevation", + "name": "kitBelly", "start": 0, "type": "Identifier" }, @@ -8796,73 +9819,25 @@ description: Result of parsing kitt.kcl "start": 0, "type": "Name", "type": "Name" - }, - "operator": "+", - "right": { - "commentStart": 0, - "end": 0, - "raw": "2", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 2.0, - "suffix": "None" - } - }, - "start": 0, - "type": "BinaryExpression", - "type": "BinaryExpression" + } }, { - "argument": { - "abs_path": false, + "type": "LabeledArg", + "label": { "commentStart": 0, "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "kitButtonWidth", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - "commentStart": 0, - "end": 0, - "operator": "-", - "start": 0, - "type": "UnaryExpression", - "type": "UnaryExpression" - }, - { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "kitButtonHeight", + "name": "extrudeTag", "start": 0, "type": "Identifier" }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - { - "argument": { + "arg": { "abs_path": false, "commentStart": 0, "end": 0, "name": { "commentStart": 0, "end": 0, - "name": "kitButtonDepth", + "name": "END", "start": 0, "type": "Identifier" }, @@ -8870,13 +9845,173 @@ description: Result of parsing kitt.kcl "start": 0, "type": "Name", "type": "Name" + } + }, + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "positionY", + "start": 0, + "type": "Identifier" }, - "commentStart": 0, - "end": 0, - "operator": "-", - "start": 0, - "type": "UnaryExpression", - "type": "UnaryExpression" + "arg": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "kitFloppyOffset", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } + }, + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "positionZ", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "end": 0, + "left": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "kitFloppyElevation", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + }, + "operator": "+", + "right": { + "commentStart": 0, + "end": 0, + "raw": "2", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 2.0, + "suffix": "None" + } + }, + "start": 0, + "type": "BinaryExpression", + "type": "BinaryExpression" + } + }, + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "width", + "start": 0, + "type": "Identifier" + }, + "arg": { + "argument": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "kitButtonWidth", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + }, + "commentStart": 0, + "end": 0, + "operator": "-", + "start": 0, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + }, + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "height", + "start": 0, + "type": "Identifier" + }, + "arg": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "kitButtonHeight", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } + }, + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "depth", + "start": 0, + "type": "Identifier" + }, + "arg": { + "argument": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "kitButtonDepth", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + }, + "commentStart": 0, + "end": 0, + "operator": "-", + "start": 0, + "type": "UnaryExpression", + "type": "UnaryExpression" + } } ], "callee": { @@ -8897,8 +10032,9 @@ description: Result of parsing kitt.kcl "commentStart": 0, "end": 0, "start": 0, - "type": "CallExpression", - "type": "CallExpression" + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null }, "start": 0, "type": "VariableDeclarator" @@ -8924,41 +10060,137 @@ description: Result of parsing kitt.kcl "init": { "arguments": [ { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { + "type": "LabeledArg", + "label": { "commentStart": 0, "end": 0, - "name": "kitBelly", + "name": "kitExtrude", "start": 0, "type": "Identifier" }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { + "arg": { + "abs_path": false, "commentStart": 0, "end": 0, - "name": "END", + "name": { + "commentStart": 0, + "end": 0, + "name": "kitBelly", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } + }, + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "extrudeTag", "start": 0, "type": "Identifier" }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" + "arg": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "END", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } }, { - "commentStart": 0, - "end": 0, - "left": { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "positionY", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "end": 0, + "left": { + "commentStart": 0, + "end": 0, + "left": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "kitFloppyOffset", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + }, + "operator": "-", + "right": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "kitButtonWidth", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + }, + "start": 0, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "operator": "-", + "right": { + "commentStart": 0, + "end": 0, + "raw": "1", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 1.0, + "suffix": "None" + } + }, + "start": 0, + "type": "BinaryExpression", + "type": "BinaryExpression" + } + }, + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "positionZ", + "start": 0, + "type": "Identifier" + }, + "arg": { "commentStart": 0, "end": 0, "left": { @@ -8968,7 +10200,7 @@ description: Result of parsing kitt.kcl "name": { "commentStart": 0, "end": 0, - "name": "kitFloppyOffset", + "name": "kitFloppyElevation", "start": 0, "type": "Identifier" }, @@ -8977,8 +10209,35 @@ description: Result of parsing kitt.kcl "type": "Name", "type": "Name" }, - "operator": "-", + "operator": "+", "right": { + "commentStart": 0, + "end": 0, + "raw": "2", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 2.0, + "suffix": "None" + } + }, + "start": 0, + "type": "BinaryExpression", + "type": "BinaryExpression" + } + }, + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "width", + "start": 0, + "type": "Identifier" + }, + "arg": { + "argument": { "abs_path": false, "commentStart": 0, "end": 0, @@ -8994,112 +10253,31 @@ description: Result of parsing kitt.kcl "type": "Name", "type": "Name" }, - "start": 0, - "type": "BinaryExpression", - "type": "BinaryExpression" - }, - "operator": "-", - "right": { "commentStart": 0, "end": 0, - "raw": "1", + "operator": "-", "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 1.0, - "suffix": "None" - } - }, - "start": 0, - "type": "BinaryExpression", - "type": "BinaryExpression" + "type": "UnaryExpression", + "type": "UnaryExpression" + } }, { - "commentStart": 0, - "end": 0, - "left": { - "abs_path": false, + "type": "LabeledArg", + "label": { "commentStart": 0, "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "kitFloppyElevation", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - "operator": "+", - "right": { - "commentStart": 0, - "end": 0, - "raw": "2", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 2.0, - "suffix": "None" - } - }, - "start": 0, - "type": "BinaryExpression", - "type": "BinaryExpression" - }, - { - "argument": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "kitButtonWidth", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - "commentStart": 0, - "end": 0, - "operator": "-", - "start": 0, - "type": "UnaryExpression", - "type": "UnaryExpression" - }, - { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "kitButtonHeight", + "name": "height", "start": 0, "type": "Identifier" }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - { - "argument": { + "arg": { "abs_path": false, "commentStart": 0, "end": 0, "name": { "commentStart": 0, "end": 0, - "name": "kitButtonDepth", + "name": "kitButtonHeight", "start": 0, "type": "Identifier" }, @@ -9107,13 +10285,41 @@ description: Result of parsing kitt.kcl "start": 0, "type": "Name", "type": "Name" + } + }, + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "depth", + "start": 0, + "type": "Identifier" }, - "commentStart": 0, - "end": 0, - "operator": "-", - "start": 0, - "type": "UnaryExpression", - "type": "UnaryExpression" + "arg": { + "argument": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "kitButtonDepth", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + }, + "commentStart": 0, + "end": 0, + "operator": "-", + "start": 0, + "type": "UnaryExpression", + "type": "UnaryExpression" + } } ], "callee": { @@ -9134,8 +10340,9 @@ description: Result of parsing kitt.kcl "commentStart": 0, "end": 0, "start": 0, - "type": "CallExpression", - "type": "CallExpression" + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null }, "start": 0, "type": "VariableDeclarator" @@ -9166,48 +10373,22 @@ description: Result of parsing kitt.kcl "init": { "arguments": [ { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { + "type": "LabeledArg", + "label": { "commentStart": 0, "end": 0, - "name": "kitBelly", + "name": "kitExtrude", "start": 0, "type": "Identifier" }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "END", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - { - "commentStart": 0, - "end": 0, - "left": { + "arg": { "abs_path": false, "commentStart": 0, "end": 0, "name": { "commentStart": 0, "end": 0, - "name": "kitFloppyOffset", + "name": "kitBelly", "start": 0, "type": "Identifier" }, @@ -9215,12 +10396,154 @@ description: Result of parsing kitt.kcl "start": 0, "type": "Name", "type": "Name" + } + }, + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "extrudeTag", + "start": 0, + "type": "Identifier" }, - "operator": "-", - "right": { + "arg": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "END", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } + }, + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "positionY", + "start": 0, + "type": "Identifier" + }, + "arg": { "commentStart": 0, "end": 0, "left": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "kitFloppyOffset", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + }, + "operator": "-", + "right": { + "commentStart": 0, + "end": 0, + "left": { + "commentStart": 0, + "end": 0, + "raw": "2", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 2.0, + "suffix": "None" + } + }, + "operator": "*", + "right": { + "commentStart": 0, + "end": 0, + "left": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "kitButtonWidth", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + }, + "operator": "+", + "right": { + "commentStart": 0, + "end": 0, + "raw": "1", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 1.0, + "suffix": "None" + } + }, + "start": 0, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "start": 0, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "start": 0, + "type": "BinaryExpression", + "type": "BinaryExpression" + } + }, + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "positionZ", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "end": 0, + "left": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "kitFloppyElevation", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + }, + "operator": "+", + "right": { "commentStart": 0, "end": 0, "raw": "2", @@ -9232,136 +10555,62 @@ description: Result of parsing kitt.kcl "suffix": "None" } }, - "operator": "*", - "right": { - "commentStart": 0, - "end": 0, - "left": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "kitButtonWidth", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - "operator": "+", - "right": { - "commentStart": 0, - "end": 0, - "raw": "1", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 1.0, - "suffix": "None" - } - }, - "start": 0, - "type": "BinaryExpression", - "type": "BinaryExpression" - }, "start": 0, "type": "BinaryExpression", "type": "BinaryExpression" - }, - "start": 0, - "type": "BinaryExpression", - "type": "BinaryExpression" + } }, { - "commentStart": 0, - "end": 0, - "left": { - "abs_path": false, + "type": "LabeledArg", + "label": { "commentStart": 0, "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "kitFloppyElevation", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - "operator": "+", - "right": { - "commentStart": 0, - "end": 0, - "raw": "2", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 2.0, - "suffix": "None" - } - }, - "start": 0, - "type": "BinaryExpression", - "type": "BinaryExpression" - }, - { - "argument": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "kitButtonWidth", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - "commentStart": 0, - "end": 0, - "operator": "-", - "start": 0, - "type": "UnaryExpression", - "type": "UnaryExpression" - }, - { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "kitButtonHeight", + "name": "width", "start": 0, "type": "Identifier" }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" + "arg": { + "argument": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "kitButtonWidth", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + }, + "commentStart": 0, + "end": 0, + "operator": "-", + "start": 0, + "type": "UnaryExpression", + "type": "UnaryExpression" + } }, { - "argument": { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "height", + "start": 0, + "type": "Identifier" + }, + "arg": { "abs_path": false, "commentStart": 0, "end": 0, "name": { "commentStart": 0, "end": 0, - "name": "kitButtonDepth", + "name": "kitButtonHeight", "start": 0, "type": "Identifier" }, @@ -9369,13 +10618,41 @@ description: Result of parsing kitt.kcl "start": 0, "type": "Name", "type": "Name" + } + }, + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "depth", + "start": 0, + "type": "Identifier" }, - "commentStart": 0, - "end": 0, - "operator": "-", - "start": 0, - "type": "UnaryExpression", - "type": "UnaryExpression" + "arg": { + "argument": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "kitButtonDepth", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + }, + "commentStart": 0, + "end": 0, + "operator": "-", + "start": 0, + "type": "UnaryExpression", + "type": "UnaryExpression" + } } ], "callee": { @@ -9396,8 +10673,9 @@ description: Result of parsing kitt.kcl "commentStart": 0, "end": 0, "start": 0, - "type": "CallExpression", - "type": "CallExpression" + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null }, "start": 0, "type": "VariableDeclarator" @@ -10545,116 +11823,186 @@ description: Result of parsing kitt.kcl "init": { "arguments": [ { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { + "type": "LabeledArg", + "label": { "commentStart": 0, "end": 0, - "name": "kitShoe", + "name": "kitExtrude", "start": 0, "type": "Identifier" }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" + "arg": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "kitShoe", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } }, { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { + "type": "LabeledArg", + "label": { "commentStart": 0, "end": 0, - "name": "END", + "name": "extrudeTag", "start": 0, "type": "Identifier" }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" + "arg": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "END", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } }, { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { + "type": "LabeledArg", + "label": { "commentStart": 0, "end": 0, - "name": "kitPantsOffsetSide", + "name": "positionY", "start": 0, "type": "Identifier" }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" + "arg": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "kitPantsOffsetSide", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } }, { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { + "type": "LabeledArg", + "label": { "commentStart": 0, "end": 0, - "name": "kitPantsOffsetFront", + "name": "positionZ", "start": 0, "type": "Identifier" }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" + "arg": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "kitPantsOffsetFront", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } }, { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { + "type": "LabeledArg", + "label": { "commentStart": 0, "end": 0, - "name": "kitPantsFrontWidth", + "name": "width", "start": 0, "type": "Identifier" }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" + "arg": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "kitPantsFrontWidth", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } }, { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { + "type": "LabeledArg", + "label": { "commentStart": 0, "end": 0, - "name": "kitPantsWidth", + "name": "height", "start": 0, "type": "Identifier" }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" + "arg": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "kitPantsWidth", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } }, { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { + "type": "LabeledArg", + "label": { "commentStart": 0, "end": 0, - "name": "kitPantsHeight", + "name": "depth", "start": 0, "type": "Identifier" }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" + "arg": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "kitPantsHeight", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } } ], "callee": { @@ -10675,8 +12023,9 @@ description: Result of parsing kitt.kcl "commentStart": 0, "end": 0, "start": 0, - "type": "CallExpression", - "type": "CallExpression" + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null }, "start": 0, "type": "VariableDeclarator" @@ -10860,32 +12209,52 @@ description: Result of parsing kitt.kcl "init": { "arguments": [ { - "commentStart": 0, - "end": 0, - "raw": "0", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 0.0, - "suffix": "None" - } - }, - { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { + "type": "LabeledArg", + "label": { "commentStart": 0, "end": 0, - "name": "kitLegOffset", + "name": "offsetFront", "start": 0, "type": "Identifier" }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" + "arg": { + "commentStart": 0, + "end": 0, + "raw": "0", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 0.0, + "suffix": "None" + } + } + }, + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "offsetSide", + "start": 0, + "type": "Identifier" + }, + "arg": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "kitLegOffset", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } } ], "callee": { @@ -10906,8 +12275,9 @@ description: Result of parsing kitt.kcl "commentStart": 0, "end": 0, "start": 0, - "type": "CallExpression", - "type": "CallExpression" + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null }, "start": 0, "type": "VariableDeclarator" @@ -10933,29 +12303,72 @@ description: Result of parsing kitt.kcl "init": { "arguments": [ { - "commentStart": 0, - "end": 0, - "raw": "0", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 0.0, - "suffix": "None" + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "offsetFront", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "end": 0, + "raw": "0", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 0.0, + "suffix": "None" + } } }, { - "commentStart": 0, - "end": 0, - "left": { - "argument": { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "offsetSide", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "end": 0, + "left": { + "argument": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "kitLegOffset", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + }, + "commentStart": 0, + "end": 0, + "operator": "-", + "start": 0, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + "operator": "-", + "right": { "abs_path": false, "commentStart": 0, "end": 0, "name": { "commentStart": 0, "end": 0, - "name": "kitLegOffset", + "name": "kitShoeWidth", "start": 0, "type": "Identifier" }, @@ -10964,33 +12377,10 @@ description: Result of parsing kitt.kcl "type": "Name", "type": "Name" }, - "commentStart": 0, - "end": 0, - "operator": "-", "start": 0, - "type": "UnaryExpression", - "type": "UnaryExpression" - }, - "operator": "-", - "right": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "kitShoeWidth", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - "start": 0, - "type": "BinaryExpression", - "type": "BinaryExpression" + "type": "BinaryExpression", + "type": "BinaryExpression" + } } ], "callee": { @@ -11011,8 +12401,9 @@ description: Result of parsing kitt.kcl "commentStart": 0, "end": 0, "start": 0, - "type": "CallExpression", - "type": "CallExpression" + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null }, "start": 0, "type": "VariableDeclarator" @@ -11307,94 +12698,22 @@ description: Result of parsing kitt.kcl "init": { "arguments": [ { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { + "type": "LabeledArg", + "label": { "commentStart": 0, "end": 0, - "name": "kitBody", + "name": "kitExtrude", "start": 0, "type": "Identifier" }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "seg01", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "kitNewEarOffsetSide", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "kitNewEarOffsetFront", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "kitEarWidth", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - { - "argument": { + "arg": { "abs_path": false, "commentStart": 0, "end": 0, "name": { "commentStart": 0, "end": 0, - "name": "kitEarDepth", + "name": "kitBody", "start": 0, "type": "Identifier" }, @@ -11402,29 +12721,171 @@ description: Result of parsing kitt.kcl "start": 0, "type": "Name", "type": "Name" - }, - "commentStart": 0, - "end": 0, - "operator": "-", - "start": 0, - "type": "UnaryExpression", - "type": "UnaryExpression" + } }, { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { + "type": "LabeledArg", + "label": { "commentStart": 0, "end": 0, - "name": "kitEarHeight", + "name": "extrudeTag", "start": 0, "type": "Identifier" }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" + "arg": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "seg01", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } + }, + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "positionY", + "start": 0, + "type": "Identifier" + }, + "arg": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "kitNewEarOffsetSide", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } + }, + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "positionZ", + "start": 0, + "type": "Identifier" + }, + "arg": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "kitNewEarOffsetFront", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } + }, + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "width", + "start": 0, + "type": "Identifier" + }, + "arg": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "kitEarWidth", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } + }, + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "height", + "start": 0, + "type": "Identifier" + }, + "arg": { + "argument": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "kitEarDepth", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + }, + "commentStart": 0, + "end": 0, + "operator": "-", + "start": 0, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + }, + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "depth", + "start": 0, + "type": "Identifier" + }, + "arg": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "kitEarHeight", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } } ], "callee": { @@ -11445,8 +12906,9 @@ description: Result of parsing kitt.kcl "commentStart": 0, "end": 0, "start": 0, - "type": "CallExpression", - "type": "CallExpression" + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null }, "start": 0, "type": "VariableDeclarator" @@ -11505,137 +12967,87 @@ description: Result of parsing kitt.kcl "init": { "arguments": [ { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { + "type": "LabeledArg", + "label": { "commentStart": 0, "end": 0, - "name": "baseVolume", + "name": "kitExtrude", "start": 0, "type": "Identifier" }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { + "arg": { + "abs_path": false, "commentStart": 0, "end": 0, - "name": "END", + "name": { + "commentStart": 0, + "end": 0, + "name": "baseVolume", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } + }, + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "extrudeTag", "start": 0, "type": "Identifier" }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" + "arg": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "END", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } }, { - "commentStart": 0, - "end": 0, - "left": { - "abs_path": false, + "type": "LabeledArg", + "label": { "commentStart": 0, "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "kitNewEarOffsetSide", - "start": 0, - "type": "Identifier" - }, - "path": [], + "name": "positionY", "start": 0, - "type": "Name", - "type": "Name" + "type": "Identifier" }, - "operator": "+", - "right": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "secondOffset", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - "start": 0, - "type": "BinaryExpression", - "type": "BinaryExpression" - }, - { - "commentStart": 0, - "end": 0, - "left": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "kitNewEarOffsetFront", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - "operator": "-", - "right": { - "commentStart": 0, - "end": 0, - "raw": "0.01", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 0.01, - "suffix": "None" - } - }, - "start": 0, - "type": "BinaryExpression", - "type": "BinaryExpression" - }, - { - "commentStart": 0, - "end": 0, - "left": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "kitEarWidth", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - "operator": "-", - "right": { + "arg": { "commentStart": 0, "end": 0, "left": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "kitNewEarOffsetSide", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + }, + "operator": "+", + "right": { "abs_path": false, "commentStart": 0, "end": 0, @@ -11651,39 +13063,31 @@ description: Result of parsing kitt.kcl "type": "Name", "type": "Name" }, - "operator": "*", - "right": { - "commentStart": 0, - "end": 0, - "raw": "2", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 2.0, - "suffix": "None" - } - }, "start": 0, "type": "BinaryExpression", "type": "BinaryExpression" - }, - "start": 0, - "type": "BinaryExpression", - "type": "BinaryExpression" + } }, { - "commentStart": 0, - "end": 0, - "left": { - "argument": { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "positionZ", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "end": 0, + "left": { "abs_path": false, "commentStart": 0, "end": 0, "name": { "commentStart": 0, "end": 0, - "name": "kitEarDepth", + "name": "kitNewEarOffsetFront", "start": 0, "type": "Identifier" }, @@ -11692,15 +13096,34 @@ description: Result of parsing kitt.kcl "type": "Name", "type": "Name" }, - "commentStart": 0, - "end": 0, "operator": "-", + "right": { + "commentStart": 0, + "end": 0, + "raw": "0.01", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 0.01, + "suffix": "None" + } + }, "start": 0, - "type": "UnaryExpression", - "type": "UnaryExpression" + "type": "BinaryExpression", + "type": "BinaryExpression" + } + }, + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "width", + "start": 0, + "type": "Identifier" }, - "operator": "+", - "right": { + "arg": { "commentStart": 0, "end": 0, "left": { @@ -11710,7 +13133,7 @@ description: Result of parsing kitt.kcl "name": { "commentStart": 0, "end": 0, - "name": "secondOffset", + "name": "kitEarWidth", "start": 0, "type": "Identifier" }, @@ -11719,42 +13142,151 @@ description: Result of parsing kitt.kcl "type": "Name", "type": "Name" }, - "operator": "*", + "operator": "-", "right": { "commentStart": 0, "end": 0, - "raw": "2", + "left": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "secondOffset", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + }, + "operator": "*", + "right": { + "commentStart": 0, + "end": 0, + "raw": "2", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 2.0, + "suffix": "None" + } + }, "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 2.0, - "suffix": "None" - } + "type": "BinaryExpression", + "type": "BinaryExpression" }, "start": 0, "type": "BinaryExpression", "type": "BinaryExpression" - }, - "start": 0, - "type": "BinaryExpression", - "type": "BinaryExpression" + } }, { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { + "type": "LabeledArg", + "label": { "commentStart": 0, "end": 0, - "name": "kitEarHeight", + "name": "height", "start": 0, "type": "Identifier" }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" + "arg": { + "commentStart": 0, + "end": 0, + "left": { + "argument": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "kitEarDepth", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + }, + "commentStart": 0, + "end": 0, + "operator": "-", + "start": 0, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + "operator": "+", + "right": { + "commentStart": 0, + "end": 0, + "left": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "secondOffset", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + }, + "operator": "*", + "right": { + "commentStart": 0, + "end": 0, + "raw": "2", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 2.0, + "suffix": "None" + } + }, + "start": 0, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "start": 0, + "type": "BinaryExpression", + "type": "BinaryExpression" + } + }, + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "depth", + "start": 0, + "type": "Identifier" + }, + "arg": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "kitEarHeight", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } } ], "callee": { @@ -11775,8 +13307,9 @@ description: Result of parsing kitt.kcl "commentStart": 0, "end": 0, "start": 0, - "type": "CallExpression", - "type": "CallExpression" + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null }, "start": 0, "type": "VariableDeclarator" @@ -11835,137 +13368,87 @@ description: Result of parsing kitt.kcl "init": { "arguments": [ { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { + "type": "LabeledArg", + "label": { "commentStart": 0, "end": 0, - "name": "secondLevel", + "name": "kitExtrude", "start": 0, "type": "Identifier" }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { + "arg": { + "abs_path": false, "commentStart": 0, "end": 0, - "name": "END", + "name": { + "commentStart": 0, + "end": 0, + "name": "secondLevel", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } + }, + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "extrudeTag", "start": 0, "type": "Identifier" }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" + "arg": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "END", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } }, { - "commentStart": 0, - "end": 0, - "left": { - "abs_path": false, + "type": "LabeledArg", + "label": { "commentStart": 0, "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "kitNewEarOffsetSide", - "start": 0, - "type": "Identifier" - }, - "path": [], + "name": "positionY", "start": 0, - "type": "Name", - "type": "Name" + "type": "Identifier" }, - "operator": "+", - "right": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "thirdOffset", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - "start": 0, - "type": "BinaryExpression", - "type": "BinaryExpression" - }, - { - "commentStart": 0, - "end": 0, - "left": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "kitNewEarOffsetFront", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - "operator": "-", - "right": { - "commentStart": 0, - "end": 0, - "raw": "0.02", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 0.02, - "suffix": "None" - } - }, - "start": 0, - "type": "BinaryExpression", - "type": "BinaryExpression" - }, - { - "commentStart": 0, - "end": 0, - "left": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "kitEarWidth", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - "operator": "-", - "right": { + "arg": { "commentStart": 0, "end": 0, "left": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "kitNewEarOffsetSide", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + }, + "operator": "+", + "right": { "abs_path": false, "commentStart": 0, "end": 0, @@ -11981,39 +13464,31 @@ description: Result of parsing kitt.kcl "type": "Name", "type": "Name" }, - "operator": "*", - "right": { - "commentStart": 0, - "end": 0, - "raw": "2", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 2.0, - "suffix": "None" - } - }, "start": 0, "type": "BinaryExpression", "type": "BinaryExpression" - }, - "start": 0, - "type": "BinaryExpression", - "type": "BinaryExpression" + } }, { - "commentStart": 0, - "end": 0, - "left": { - "argument": { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "positionZ", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "end": 0, + "left": { "abs_path": false, "commentStart": 0, "end": 0, "name": { "commentStart": 0, "end": 0, - "name": "kitEarDepth", + "name": "kitNewEarOffsetFront", "start": 0, "type": "Identifier" }, @@ -12022,15 +13497,34 @@ description: Result of parsing kitt.kcl "type": "Name", "type": "Name" }, - "commentStart": 0, - "end": 0, "operator": "-", + "right": { + "commentStart": 0, + "end": 0, + "raw": "0.02", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 0.02, + "suffix": "None" + } + }, "start": 0, - "type": "UnaryExpression", - "type": "UnaryExpression" + "type": "BinaryExpression", + "type": "BinaryExpression" + } + }, + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "width", + "start": 0, + "type": "Identifier" }, - "operator": "+", - "right": { + "arg": { "commentStart": 0, "end": 0, "left": { @@ -12040,7 +13534,7 @@ description: Result of parsing kitt.kcl "name": { "commentStart": 0, "end": 0, - "name": "thirdOffset", + "name": "kitEarWidth", "start": 0, "type": "Identifier" }, @@ -12049,42 +13543,151 @@ description: Result of parsing kitt.kcl "type": "Name", "type": "Name" }, - "operator": "*", + "operator": "-", "right": { "commentStart": 0, "end": 0, - "raw": "2", + "left": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "thirdOffset", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + }, + "operator": "*", + "right": { + "commentStart": 0, + "end": 0, + "raw": "2", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 2.0, + "suffix": "None" + } + }, "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 2.0, - "suffix": "None" - } + "type": "BinaryExpression", + "type": "BinaryExpression" }, "start": 0, "type": "BinaryExpression", "type": "BinaryExpression" - }, - "start": 0, - "type": "BinaryExpression", - "type": "BinaryExpression" + } }, { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { + "type": "LabeledArg", + "label": { "commentStart": 0, "end": 0, - "name": "kitEarHeight", + "name": "height", "start": 0, "type": "Identifier" }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" + "arg": { + "commentStart": 0, + "end": 0, + "left": { + "argument": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "kitEarDepth", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + }, + "commentStart": 0, + "end": 0, + "operator": "-", + "start": 0, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + "operator": "+", + "right": { + "commentStart": 0, + "end": 0, + "left": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "thirdOffset", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + }, + "operator": "*", + "right": { + "commentStart": 0, + "end": 0, + "raw": "2", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 2.0, + "suffix": "None" + } + }, + "start": 0, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "start": 0, + "type": "BinaryExpression", + "type": "BinaryExpression" + } + }, + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "depth", + "start": 0, + "type": "Identifier" + }, + "arg": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "kitEarHeight", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } } ], "callee": { @@ -12105,8 +13708,9 @@ description: Result of parsing kitt.kcl "commentStart": 0, "end": 0, "start": 0, - "type": "CallExpression", - "type": "CallExpression" + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null }, "start": 0, "type": "VariableDeclarator" @@ -12165,137 +13769,87 @@ description: Result of parsing kitt.kcl "init": { "arguments": [ { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { + "type": "LabeledArg", + "label": { "commentStart": 0, "end": 0, - "name": "thirdLevel", + "name": "kitExtrude", "start": 0, "type": "Identifier" }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { + "arg": { + "abs_path": false, "commentStart": 0, "end": 0, - "name": "END", + "name": { + "commentStart": 0, + "end": 0, + "name": "thirdLevel", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } + }, + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "extrudeTag", "start": 0, "type": "Identifier" }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" + "arg": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "END", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } }, { - "commentStart": 0, - "end": 0, - "left": { - "abs_path": false, + "type": "LabeledArg", + "label": { "commentStart": 0, "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "kitNewEarOffsetSide", - "start": 0, - "type": "Identifier" - }, - "path": [], + "name": "positionY", "start": 0, - "type": "Name", - "type": "Name" + "type": "Identifier" }, - "operator": "+", - "right": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "fourthOffset", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - "start": 0, - "type": "BinaryExpression", - "type": "BinaryExpression" - }, - { - "commentStart": 0, - "end": 0, - "left": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "kitNewEarOffsetFront", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - "operator": "-", - "right": { - "commentStart": 0, - "end": 0, - "raw": "0.03", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 0.03, - "suffix": "None" - } - }, - "start": 0, - "type": "BinaryExpression", - "type": "BinaryExpression" - }, - { - "commentStart": 0, - "end": 0, - "left": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "kitEarWidth", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - "operator": "-", - "right": { + "arg": { "commentStart": 0, "end": 0, "left": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "kitNewEarOffsetSide", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + }, + "operator": "+", + "right": { "abs_path": false, "commentStart": 0, "end": 0, @@ -12311,39 +13865,31 @@ description: Result of parsing kitt.kcl "type": "Name", "type": "Name" }, - "operator": "*", - "right": { - "commentStart": 0, - "end": 0, - "raw": "2", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 2.0, - "suffix": "None" - } - }, "start": 0, "type": "BinaryExpression", "type": "BinaryExpression" - }, - "start": 0, - "type": "BinaryExpression", - "type": "BinaryExpression" + } }, { - "commentStart": 0, - "end": 0, - "left": { - "argument": { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "positionZ", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "end": 0, + "left": { "abs_path": false, "commentStart": 0, "end": 0, "name": { "commentStart": 0, "end": 0, - "name": "kitEarDepth", + "name": "kitNewEarOffsetFront", "start": 0, "type": "Identifier" }, @@ -12352,15 +13898,34 @@ description: Result of parsing kitt.kcl "type": "Name", "type": "Name" }, - "commentStart": 0, - "end": 0, "operator": "-", + "right": { + "commentStart": 0, + "end": 0, + "raw": "0.03", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 0.03, + "suffix": "None" + } + }, "start": 0, - "type": "UnaryExpression", - "type": "UnaryExpression" + "type": "BinaryExpression", + "type": "BinaryExpression" + } + }, + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "width", + "start": 0, + "type": "Identifier" }, - "operator": "+", - "right": { + "arg": { "commentStart": 0, "end": 0, "left": { @@ -12370,7 +13935,7 @@ description: Result of parsing kitt.kcl "name": { "commentStart": 0, "end": 0, - "name": "fourthOffset", + "name": "kitEarWidth", "start": 0, "type": "Identifier" }, @@ -12379,42 +13944,151 @@ description: Result of parsing kitt.kcl "type": "Name", "type": "Name" }, - "operator": "*", + "operator": "-", "right": { "commentStart": 0, "end": 0, - "raw": "2", + "left": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "fourthOffset", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + }, + "operator": "*", + "right": { + "commentStart": 0, + "end": 0, + "raw": "2", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 2.0, + "suffix": "None" + } + }, "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 2.0, - "suffix": "None" - } + "type": "BinaryExpression", + "type": "BinaryExpression" }, "start": 0, "type": "BinaryExpression", "type": "BinaryExpression" - }, - "start": 0, - "type": "BinaryExpression", - "type": "BinaryExpression" + } }, { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { + "type": "LabeledArg", + "label": { "commentStart": 0, "end": 0, - "name": "kitEarHeight", + "name": "height", "start": 0, "type": "Identifier" }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" + "arg": { + "commentStart": 0, + "end": 0, + "left": { + "argument": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "kitEarDepth", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + }, + "commentStart": 0, + "end": 0, + "operator": "-", + "start": 0, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + "operator": "+", + "right": { + "commentStart": 0, + "end": 0, + "left": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "fourthOffset", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + }, + "operator": "*", + "right": { + "commentStart": 0, + "end": 0, + "raw": "2", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 2.0, + "suffix": "None" + } + }, + "start": 0, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "start": 0, + "type": "BinaryExpression", + "type": "BinaryExpression" + } + }, + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "depth", + "start": 0, + "type": "Identifier" + }, + "arg": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "kitEarHeight", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } } ], "callee": { @@ -12435,8 +14109,9 @@ description: Result of parsing kitt.kcl "commentStart": 0, "end": 0, "start": 0, - "type": "CallExpression", - "type": "CallExpression" + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null }, "start": 0, "type": "VariableDeclarator" @@ -12642,36 +14317,56 @@ description: Result of parsing kitt.kcl "init": { "arguments": [ { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { + "type": "LabeledArg", + "label": { "commentStart": 0, "end": 0, - "name": "kitEarOffsetFront", + "name": "earOffsetFront", "start": 0, "type": "Identifier" }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" + "arg": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "kitEarOffsetFront", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } }, { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { + "type": "LabeledArg", + "label": { "commentStart": 0, "end": 0, - "name": "kitEarOffsetSide", + "name": "earOffsetSide", "start": 0, "type": "Identifier" }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" + "arg": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "kitEarOffsetSide", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } } ], "callee": { @@ -12692,8 +14387,9 @@ description: Result of parsing kitt.kcl "commentStart": 0, "end": 0, "start": 0, - "type": "CallExpression", - "type": "CallExpression" + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null }, "start": 0, "type": "VariableDeclarator" @@ -12719,42 +14415,82 @@ description: Result of parsing kitt.kcl "init": { "arguments": [ { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { + "type": "LabeledArg", + "label": { "commentStart": 0, "end": 0, - "name": "kitEarOffsetFront", + "name": "earOffsetFront", "start": 0, "type": "Identifier" }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" + "arg": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "kitEarOffsetFront", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } }, { - "commentStart": 0, - "end": 0, - "left": { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "earOffsetSide", + "start": 0, + "type": "Identifier" + }, + "arg": { "commentStart": 0, "end": 0, "left": { - "abs_path": false, "commentStart": 0, "end": 0, - "name": { + "left": { + "abs_path": false, "commentStart": 0, "end": 0, - "name": "kitBodyWidth", + "name": { + "commentStart": 0, + "end": 0, + "name": "kitBodyWidth", + "start": 0, + "type": "Identifier" + }, + "path": [], "start": 0, - "type": "Identifier" + "type": "Name", + "type": "Name" + }, + "operator": "-", + "right": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "kitEarWidth", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" }, - "path": [], "start": 0, - "type": "Name", - "type": "Name" + "type": "BinaryExpression", + "type": "BinaryExpression" }, "operator": "-", "right": { @@ -12764,7 +14500,7 @@ description: Result of parsing kitt.kcl "name": { "commentStart": 0, "end": 0, - "name": "kitEarWidth", + "name": "kitEarOffsetSide", "start": 0, "type": "Identifier" }, @@ -12776,27 +14512,7 @@ description: Result of parsing kitt.kcl "start": 0, "type": "BinaryExpression", "type": "BinaryExpression" - }, - "operator": "-", - "right": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "kitEarOffsetSide", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - "start": 0, - "type": "BinaryExpression", - "type": "BinaryExpression" + } } ], "callee": { @@ -12817,8 +14533,9 @@ description: Result of parsing kitt.kcl "commentStart": 0, "end": 0, "start": 0, - "type": "CallExpression", - "type": "CallExpression" + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null }, "start": 0, "type": "VariableDeclarator" @@ -13445,116 +15162,186 @@ description: Result of parsing kitt.kcl "init": { "arguments": [ { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { + "type": "LabeledArg", + "label": { "commentStart": 0, "end": 0, - "name": "kitBody", + "name": "kitExtrude", "start": 0, "type": "Identifier" }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" + "arg": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "kitBody", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } }, { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { + "type": "LabeledArg", + "label": { "commentStart": 0, "end": 0, - "name": "seg02", + "name": "extrudeTag", "start": 0, "type": "Identifier" }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" + "arg": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "seg02", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } }, { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { + "type": "LabeledArg", + "label": { "commentStart": 0, "end": 0, - "name": "grillRowA", + "name": "positionY", "start": 0, "type": "Identifier" }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" + "arg": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "grillRowA", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } }, { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { + "type": "LabeledArg", + "label": { "commentStart": 0, "end": 0, - "name": "grillColumnB", + "name": "positionZ", "start": 0, "type": "Identifier" }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" + "arg": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "grillColumnB", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } }, { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { + "type": "LabeledArg", + "label": { "commentStart": 0, "end": 0, - "name": "grillHoleSize", + "name": "width", "start": 0, "type": "Identifier" }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" + "arg": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "grillHoleSize", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } }, { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { + "type": "LabeledArg", + "label": { "commentStart": 0, "end": 0, - "name": "grillHoleSize", + "name": "height", "start": 0, "type": "Identifier" }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" + "arg": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "grillHoleSize", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } }, { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { + "type": "LabeledArg", + "label": { "commentStart": 0, "end": 0, - "name": "grillHoleDepth", + "name": "depth", "start": 0, "type": "Identifier" }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" + "arg": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "grillHoleDepth", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } } ], "callee": { @@ -13575,8 +15362,9 @@ description: Result of parsing kitt.kcl "commentStart": 0, "end": 0, "start": 0, - "type": "CallExpression", - "type": "CallExpression" + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null }, "start": 0, "type": "VariableDeclarator" @@ -13602,116 +15390,186 @@ description: Result of parsing kitt.kcl "init": { "arguments": [ { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { + "type": "LabeledArg", + "label": { "commentStart": 0, "end": 0, - "name": "kitBody", + "name": "kitExtrude", "start": 0, "type": "Identifier" }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" + "arg": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "kitBody", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } }, { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { + "type": "LabeledArg", + "label": { "commentStart": 0, "end": 0, - "name": "seg02", + "name": "extrudeTag", "start": 0, "type": "Identifier" }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" + "arg": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "seg02", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } }, { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { + "type": "LabeledArg", + "label": { "commentStart": 0, "end": 0, - "name": "grillRowA", + "name": "positionY", "start": 0, "type": "Identifier" }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" + "arg": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "grillRowA", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } }, { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { + "type": "LabeledArg", + "label": { "commentStart": 0, "end": 0, - "name": "grillColumnD", + "name": "positionZ", "start": 0, "type": "Identifier" }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" + "arg": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "grillColumnD", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } }, { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { + "type": "LabeledArg", + "label": { "commentStart": 0, "end": 0, - "name": "grillHoleSize", + "name": "width", "start": 0, "type": "Identifier" }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" + "arg": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "grillHoleSize", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } }, { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { + "type": "LabeledArg", + "label": { "commentStart": 0, "end": 0, - "name": "grillHoleSize", + "name": "height", "start": 0, "type": "Identifier" }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" + "arg": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "grillHoleSize", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } }, { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { + "type": "LabeledArg", + "label": { "commentStart": 0, "end": 0, - "name": "grillHoleDepth", + "name": "depth", "start": 0, "type": "Identifier" }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" + "arg": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "grillHoleDepth", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } } ], "callee": { @@ -13732,8 +15590,9 @@ description: Result of parsing kitt.kcl "commentStart": 0, "end": 0, "start": 0, - "type": "CallExpression", - "type": "CallExpression" + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null }, "start": 0, "type": "VariableDeclarator" @@ -13759,116 +15618,186 @@ description: Result of parsing kitt.kcl "init": { "arguments": [ { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { + "type": "LabeledArg", + "label": { "commentStart": 0, "end": 0, - "name": "kitBody", + "name": "kitExtrude", "start": 0, "type": "Identifier" }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" + "arg": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "kitBody", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } }, { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { + "type": "LabeledArg", + "label": { "commentStart": 0, "end": 0, - "name": "seg02", + "name": "extrudeTag", "start": 0, "type": "Identifier" }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" + "arg": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "seg02", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } }, { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { + "type": "LabeledArg", + "label": { "commentStart": 0, "end": 0, - "name": "grillRowB", + "name": "positionY", "start": 0, "type": "Identifier" }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" + "arg": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "grillRowB", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } }, { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { + "type": "LabeledArg", + "label": { "commentStart": 0, "end": 0, - "name": "grillColumnA", + "name": "positionZ", "start": 0, "type": "Identifier" }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" + "arg": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "grillColumnA", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } }, { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { + "type": "LabeledArg", + "label": { "commentStart": 0, "end": 0, - "name": "grillHoleSize", + "name": "width", "start": 0, "type": "Identifier" }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" + "arg": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "grillHoleSize", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } }, { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { + "type": "LabeledArg", + "label": { "commentStart": 0, "end": 0, - "name": "grillHoleSize", + "name": "height", "start": 0, "type": "Identifier" }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" + "arg": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "grillHoleSize", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } }, { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { + "type": "LabeledArg", + "label": { "commentStart": 0, "end": 0, - "name": "grillHoleDepth", + "name": "depth", "start": 0, "type": "Identifier" }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" + "arg": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "grillHoleDepth", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } } ], "callee": { @@ -13889,8 +15818,9 @@ description: Result of parsing kitt.kcl "commentStart": 0, "end": 0, "start": 0, - "type": "CallExpression", - "type": "CallExpression" + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null }, "start": 0, "type": "VariableDeclarator" @@ -13916,116 +15846,186 @@ description: Result of parsing kitt.kcl "init": { "arguments": [ { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { + "type": "LabeledArg", + "label": { "commentStart": 0, "end": 0, - "name": "kitBody", + "name": "kitExtrude", "start": 0, "type": "Identifier" }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" + "arg": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "kitBody", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } }, { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { + "type": "LabeledArg", + "label": { "commentStart": 0, "end": 0, - "name": "seg02", + "name": "extrudeTag", "start": 0, "type": "Identifier" }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" + "arg": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "seg02", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } }, { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { + "type": "LabeledArg", + "label": { "commentStart": 0, "end": 0, - "name": "grillRowB", + "name": "positionY", "start": 0, "type": "Identifier" }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" + "arg": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "grillRowB", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } }, { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { + "type": "LabeledArg", + "label": { "commentStart": 0, "end": 0, - "name": "grillColumnC", + "name": "positionZ", "start": 0, "type": "Identifier" }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" + "arg": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "grillColumnC", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } }, { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { + "type": "LabeledArg", + "label": { "commentStart": 0, "end": 0, - "name": "grillHoleSize", + "name": "width", "start": 0, "type": "Identifier" }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" + "arg": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "grillHoleSize", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } }, { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { + "type": "LabeledArg", + "label": { "commentStart": 0, "end": 0, - "name": "grillHoleSize", + "name": "height", "start": 0, "type": "Identifier" }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" + "arg": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "grillHoleSize", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } }, { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { + "type": "LabeledArg", + "label": { "commentStart": 0, "end": 0, - "name": "grillHoleDepth", + "name": "depth", "start": 0, "type": "Identifier" }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" + "arg": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "grillHoleDepth", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } } ], "callee": { @@ -14046,8 +16046,9 @@ description: Result of parsing kitt.kcl "commentStart": 0, "end": 0, "start": 0, - "type": "CallExpression", - "type": "CallExpression" + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null }, "start": 0, "type": "VariableDeclarator" @@ -14073,116 +16074,186 @@ description: Result of parsing kitt.kcl "init": { "arguments": [ { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { + "type": "LabeledArg", + "label": { "commentStart": 0, "end": 0, - "name": "kitBody", + "name": "kitExtrude", "start": 0, "type": "Identifier" }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" + "arg": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "kitBody", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } }, { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { + "type": "LabeledArg", + "label": { "commentStart": 0, "end": 0, - "name": "seg02", + "name": "extrudeTag", "start": 0, "type": "Identifier" }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" + "arg": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "seg02", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } }, { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { + "type": "LabeledArg", + "label": { "commentStart": 0, "end": 0, - "name": "grillRowB", + "name": "positionY", "start": 0, "type": "Identifier" }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" + "arg": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "grillRowB", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } }, { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { + "type": "LabeledArg", + "label": { "commentStart": 0, "end": 0, - "name": "grillColumnE", + "name": "positionZ", "start": 0, "type": "Identifier" }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" + "arg": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "grillColumnE", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } }, { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { + "type": "LabeledArg", + "label": { "commentStart": 0, "end": 0, - "name": "grillHoleSize", + "name": "width", "start": 0, "type": "Identifier" }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" + "arg": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "grillHoleSize", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } }, { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { + "type": "LabeledArg", + "label": { "commentStart": 0, "end": 0, - "name": "grillHoleSize", + "name": "height", "start": 0, "type": "Identifier" }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" + "arg": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "grillHoleSize", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } }, { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { + "type": "LabeledArg", + "label": { "commentStart": 0, "end": 0, - "name": "grillHoleDepth", + "name": "depth", "start": 0, "type": "Identifier" }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" + "arg": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "grillHoleDepth", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } } ], "callee": { @@ -14203,8 +16274,9 @@ description: Result of parsing kitt.kcl "commentStart": 0, "end": 0, "start": 0, - "type": "CallExpression", - "type": "CallExpression" + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null }, "start": 0, "type": "VariableDeclarator" @@ -14230,116 +16302,186 @@ description: Result of parsing kitt.kcl "init": { "arguments": [ { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { + "type": "LabeledArg", + "label": { "commentStart": 0, "end": 0, - "name": "kitBody", + "name": "kitExtrude", "start": 0, "type": "Identifier" }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" + "arg": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "kitBody", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } }, { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { + "type": "LabeledArg", + "label": { "commentStart": 0, "end": 0, - "name": "seg02", + "name": "extrudeTag", "start": 0, "type": "Identifier" }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" + "arg": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "seg02", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } }, { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { + "type": "LabeledArg", + "label": { "commentStart": 0, "end": 0, - "name": "grillRowC", + "name": "positionY", "start": 0, "type": "Identifier" }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" + "arg": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "grillRowC", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } }, { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { + "type": "LabeledArg", + "label": { "commentStart": 0, "end": 0, - "name": "grillColumnB", + "name": "positionZ", "start": 0, "type": "Identifier" }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" + "arg": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "grillColumnB", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } }, { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { + "type": "LabeledArg", + "label": { "commentStart": 0, "end": 0, - "name": "grillHoleSize", + "name": "width", "start": 0, "type": "Identifier" }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" + "arg": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "grillHoleSize", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } }, { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { + "type": "LabeledArg", + "label": { "commentStart": 0, "end": 0, - "name": "grillHoleSize", + "name": "height", "start": 0, "type": "Identifier" }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" + "arg": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "grillHoleSize", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } }, { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { + "type": "LabeledArg", + "label": { "commentStart": 0, "end": 0, - "name": "grillHoleDepth", + "name": "depth", "start": 0, "type": "Identifier" }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" + "arg": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "grillHoleDepth", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } } ], "callee": { @@ -14360,8 +16502,9 @@ description: Result of parsing kitt.kcl "commentStart": 0, "end": 0, "start": 0, - "type": "CallExpression", - "type": "CallExpression" + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null }, "start": 0, "type": "VariableDeclarator" @@ -14387,116 +16530,186 @@ description: Result of parsing kitt.kcl "init": { "arguments": [ { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { + "type": "LabeledArg", + "label": { "commentStart": 0, "end": 0, - "name": "kitBody", + "name": "kitExtrude", "start": 0, "type": "Identifier" }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" + "arg": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "kitBody", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } }, { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { + "type": "LabeledArg", + "label": { "commentStart": 0, "end": 0, - "name": "seg02", + "name": "extrudeTag", "start": 0, "type": "Identifier" }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" + "arg": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "seg02", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } }, { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { + "type": "LabeledArg", + "label": { "commentStart": 0, "end": 0, - "name": "grillRowC", + "name": "positionY", "start": 0, "type": "Identifier" }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" + "arg": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "grillRowC", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } }, { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { + "type": "LabeledArg", + "label": { "commentStart": 0, "end": 0, - "name": "grillColumnD", + "name": "positionZ", "start": 0, "type": "Identifier" }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" + "arg": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "grillColumnD", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } }, { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { + "type": "LabeledArg", + "label": { "commentStart": 0, "end": 0, - "name": "grillHoleSize", + "name": "width", "start": 0, "type": "Identifier" }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" + "arg": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "grillHoleSize", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } }, { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { + "type": "LabeledArg", + "label": { "commentStart": 0, "end": 0, - "name": "grillHoleSize", + "name": "height", "start": 0, "type": "Identifier" }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" + "arg": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "grillHoleSize", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } }, { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { + "type": "LabeledArg", + "label": { "commentStart": 0, "end": 0, - "name": "grillHoleDepth", + "name": "depth", "start": 0, "type": "Identifier" }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" + "arg": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "grillHoleDepth", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } } ], "callee": { @@ -14517,8 +16730,9 @@ description: Result of parsing kitt.kcl "commentStart": 0, "end": 0, "start": 0, - "type": "CallExpression", - "type": "CallExpression" + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null }, "start": 0, "type": "VariableDeclarator" @@ -14742,116 +16956,186 @@ description: Result of parsing kitt.kcl "init": { "arguments": [ { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { + "type": "LabeledArg", + "label": { "commentStart": 0, "end": 0, - "name": "kitBody", + "name": "kitExtrude", "start": 0, "type": "Identifier" }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" + "arg": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "kitBody", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } }, { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { + "type": "LabeledArg", + "label": { "commentStart": 0, "end": 0, - "name": "seg02", + "name": "extrudeTag", "start": 0, "type": "Identifier" }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" + "arg": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "seg02", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } }, { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { + "type": "LabeledArg", + "label": { "commentStart": 0, "end": 0, - "name": "kitVentElevation", + "name": "positionY", "start": 0, "type": "Identifier" }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" + "arg": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "kitVentElevation", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } }, { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { + "type": "LabeledArg", + "label": { "commentStart": 0, "end": 0, - "name": "kitVentOffset", + "name": "positionZ", "start": 0, "type": "Identifier" }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" + "arg": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "kitVentOffset", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } }, { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { + "type": "LabeledArg", + "label": { "commentStart": 0, "end": 0, - "name": "kitVentHoleHeight", + "name": "width", "start": 0, "type": "Identifier" }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" + "arg": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "kitVentHoleHeight", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } }, { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { + "type": "LabeledArg", + "label": { "commentStart": 0, "end": 0, - "name": "kitVentHoleWidth", + "name": "height", "start": 0, "type": "Identifier" }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" + "arg": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "kitVentHoleWidth", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } }, { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { + "type": "LabeledArg", + "label": { "commentStart": 0, "end": 0, - "name": "kitVentHoleDepth", + "name": "depth", "start": 0, "type": "Identifier" }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" + "arg": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "kitVentHoleDepth", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } } ], "callee": { @@ -14872,8 +17156,9 @@ description: Result of parsing kitt.kcl "commentStart": 0, "end": 0, "start": 0, - "type": "CallExpression", - "type": "CallExpression" + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null }, "start": 0, "type": "VariableDeclarator" @@ -14899,64 +17184,22 @@ description: Result of parsing kitt.kcl "init": { "arguments": [ { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { + "type": "LabeledArg", + "label": { "commentStart": 0, "end": 0, - "name": "kitBody", + "name": "kitExtrude", "start": 0, "type": "Identifier" }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "seg02", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "kitVentElevation", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - { - "commentStart": 0, - "end": 0, - "left": { + "arg": { "abs_path": false, "commentStart": 0, "end": 0, "name": { "commentStart": 0, "end": 0, - "name": "kitVentOffset", + "name": "kitBody", "start": 0, "type": "Identifier" }, @@ -14964,71 +17207,183 @@ description: Result of parsing kitt.kcl "start": 0, "type": "Name", "type": "Name" - }, - "operator": "+", - "right": { - "commentStart": 0, - "end": 0, - "raw": "2", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 2.0, - "suffix": "None" - } - }, - "start": 0, - "type": "BinaryExpression", - "type": "BinaryExpression" + } }, { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { + "type": "LabeledArg", + "label": { "commentStart": 0, "end": 0, - "name": "kitVentHoleHeight", + "name": "extrudeTag", "start": 0, "type": "Identifier" }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { + "arg": { + "abs_path": false, "commentStart": 0, "end": 0, - "name": "kitVentHoleWidth", + "name": { + "commentStart": 0, + "end": 0, + "name": "seg02", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } + }, + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "positionY", "start": 0, "type": "Identifier" }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { + "arg": { + "abs_path": false, "commentStart": 0, "end": 0, - "name": "kitVentHoleDepth", + "name": { + "commentStart": 0, + "end": 0, + "name": "kitVentElevation", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } + }, + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "positionZ", "start": 0, "type": "Identifier" }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" + "arg": { + "commentStart": 0, + "end": 0, + "left": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "kitVentOffset", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + }, + "operator": "+", + "right": { + "commentStart": 0, + "end": 0, + "raw": "2", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 2.0, + "suffix": "None" + } + }, + "start": 0, + "type": "BinaryExpression", + "type": "BinaryExpression" + } + }, + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "width", + "start": 0, + "type": "Identifier" + }, + "arg": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "kitVentHoleHeight", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } + }, + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "height", + "start": 0, + "type": "Identifier" + }, + "arg": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "kitVentHoleWidth", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } + }, + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "depth", + "start": 0, + "type": "Identifier" + }, + "arg": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "kitVentHoleDepth", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } } ], "callee": { @@ -15049,8 +17404,9 @@ description: Result of parsing kitt.kcl "commentStart": 0, "end": 0, "start": 0, - "type": "CallExpression", - "type": "CallExpression" + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null }, "start": 0, "type": "VariableDeclarator" @@ -15076,64 +17432,22 @@ description: Result of parsing kitt.kcl "init": { "arguments": [ { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { + "type": "LabeledArg", + "label": { "commentStart": 0, "end": 0, - "name": "kitBody", + "name": "kitExtrude", "start": 0, "type": "Identifier" }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "seg02", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "kitVentElevation", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - { - "commentStart": 0, - "end": 0, - "left": { + "arg": { "abs_path": false, "commentStart": 0, "end": 0, "name": { "commentStart": 0, "end": 0, - "name": "kitVentOffset", + "name": "kitBody", "start": 0, "type": "Identifier" }, @@ -15141,71 +17455,183 @@ description: Result of parsing kitt.kcl "start": 0, "type": "Name", "type": "Name" - }, - "operator": "+", - "right": { - "commentStart": 0, - "end": 0, - "raw": "4", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 4.0, - "suffix": "None" - } - }, - "start": 0, - "type": "BinaryExpression", - "type": "BinaryExpression" + } }, { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { + "type": "LabeledArg", + "label": { "commentStart": 0, "end": 0, - "name": "kitVentHoleHeight", + "name": "extrudeTag", "start": 0, "type": "Identifier" }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { + "arg": { + "abs_path": false, "commentStart": 0, "end": 0, - "name": "kitVentHoleWidth", + "name": { + "commentStart": 0, + "end": 0, + "name": "seg02", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } + }, + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "positionY", "start": 0, "type": "Identifier" }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { + "arg": { + "abs_path": false, "commentStart": 0, "end": 0, - "name": "kitVentHoleDepth", + "name": { + "commentStart": 0, + "end": 0, + "name": "kitVentElevation", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } + }, + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "positionZ", "start": 0, "type": "Identifier" }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" + "arg": { + "commentStart": 0, + "end": 0, + "left": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "kitVentOffset", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + }, + "operator": "+", + "right": { + "commentStart": 0, + "end": 0, + "raw": "4", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 4.0, + "suffix": "None" + } + }, + "start": 0, + "type": "BinaryExpression", + "type": "BinaryExpression" + } + }, + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "width", + "start": 0, + "type": "Identifier" + }, + "arg": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "kitVentHoleHeight", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } + }, + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "height", + "start": 0, + "type": "Identifier" + }, + "arg": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "kitVentHoleWidth", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } + }, + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "depth", + "start": 0, + "type": "Identifier" + }, + "arg": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "kitVentHoleDepth", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } } ], "callee": { @@ -15226,8 +17652,9 @@ description: Result of parsing kitt.kcl "commentStart": 0, "end": 0, "start": 0, - "type": "CallExpression", - "type": "CallExpression" + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null }, "start": 0, "type": "VariableDeclarator" diff --git a/rust/kcl-lib/tests/kcl_samples/kitt/ops.snap b/rust/kcl-lib/tests/kcl_samples/kitt/ops.snap index a7e582991..685980d0e 100644 --- a/rust/kcl-lib/tests/kcl_samples/kitt/ops.snap +++ b/rust/kcl-lib/tests/kcl_samples/kitt/ops.snap @@ -2159,7 +2159,104 @@ description: Operations executed kitt.kcl "name": "pixelBox", "functionSourceRange": [], "unlabeledArg": null, - "labeledArgs": {} + "labeledArgs": { + "depth": { + "value": { + "type": "Number", + "value": 3.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "extrudeTag": { + "value": { + "type": "String", + "value": "end" + }, + "sourceRange": [] + }, + "height": { + "value": { + "type": "Number", + "value": 16.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "kitExtrude": { + "value": { + "type": "Solid", + "value": { + "artifactId": "[uuid]" + } + }, + "sourceRange": [] + }, + "positionY": { + "value": { + "type": "Number", + "value": -12.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "positionZ": { + "value": { + "type": "Number", + "value": 14.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "width": { + "value": { + "type": "Number", + "value": 24.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + } + } }, "sourceRange": [] }, @@ -2225,7 +2322,104 @@ description: Operations executed kitt.kcl "name": "pixelBox", "functionSourceRange": [], "unlabeledArg": null, - "labeledArgs": {} + "labeledArgs": { + "depth": { + "value": { + "type": "Number", + "value": 0.5, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "extrudeTag": { + "value": { + "type": "String", + "value": "start" + }, + "sourceRange": [] + }, + "height": { + "value": { + "type": "Number", + "value": 1.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "kitExtrude": { + "value": { + "type": "Solid", + "value": { + "artifactId": "[uuid]" + } + }, + "sourceRange": [] + }, + "positionY": { + "value": { + "type": "Number", + "value": -7.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "positionZ": { + "value": { + "type": "Number", + "value": 23.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "width": { + "value": { + "type": "Number", + "value": 1.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + } + } }, "sourceRange": [] }, @@ -2236,7 +2430,104 @@ description: Operations executed kitt.kcl "name": "pixelBox", "functionSourceRange": [], "unlabeledArg": null, - "labeledArgs": {} + "labeledArgs": { + "depth": { + "value": { + "type": "Number", + "value": 0.5, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "extrudeTag": { + "value": { + "type": "String", + "value": "start" + }, + "sourceRange": [] + }, + "height": { + "value": { + "type": "Number", + "value": 1.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "kitExtrude": { + "value": { + "type": "Solid", + "value": { + "artifactId": "[uuid]" + } + }, + "sourceRange": [] + }, + "positionY": { + "value": { + "type": "Number", + "value": -6.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "positionZ": { + "value": { + "type": "Number", + "value": 24.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "width": { + "value": { + "type": "Number", + "value": 3.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + } + } }, "sourceRange": [] }, @@ -2247,7 +2538,104 @@ description: Operations executed kitt.kcl "name": "pixelBox", "functionSourceRange": [], "unlabeledArg": null, - "labeledArgs": {} + "labeledArgs": { + "depth": { + "value": { + "type": "Number", + "value": 0.5, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "extrudeTag": { + "value": { + "type": "String", + "value": "start" + }, + "sourceRange": [] + }, + "height": { + "value": { + "type": "Number", + "value": 1.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "kitExtrude": { + "value": { + "type": "Solid", + "value": { + "artifactId": "[uuid]" + } + }, + "sourceRange": [] + }, + "positionY": { + "value": { + "type": "Number", + "value": -3.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "positionZ": { + "value": { + "type": "Number", + "value": 23.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "width": { + "value": { + "type": "Number", + "value": 1.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + } + } }, "sourceRange": [] }, @@ -2258,7 +2646,104 @@ description: Operations executed kitt.kcl "name": "pixelBox", "functionSourceRange": [], "unlabeledArg": null, - "labeledArgs": {} + "labeledArgs": { + "depth": { + "value": { + "type": "Number", + "value": 0.5, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "extrudeTag": { + "value": { + "type": "String", + "value": "start" + }, + "sourceRange": [] + }, + "height": { + "value": { + "type": "Number", + "value": 4.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "kitExtrude": { + "value": { + "type": "Solid", + "value": { + "artifactId": "[uuid]" + } + }, + "sourceRange": [] + }, + "positionY": { + "value": { + "type": "Number", + "value": 4.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "positionZ": { + "value": { + "type": "Number", + "value": 22.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "width": { + "value": { + "type": "Number", + "value": 2.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + } + } }, "sourceRange": [] }, @@ -2324,7 +2809,104 @@ description: Operations executed kitt.kcl "name": "pixelBox", "functionSourceRange": [], "unlabeledArg": null, - "labeledArgs": {} + "labeledArgs": { + "depth": { + "value": { + "type": "Number", + "value": 0.5, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "extrudeTag": { + "value": { + "type": "String", + "value": "start" + }, + "sourceRange": [] + }, + "height": { + "value": { + "type": "Number", + "value": 1.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "kitExtrude": { + "value": { + "type": "Solid", + "value": { + "artifactId": "[uuid]" + } + }, + "sourceRange": [] + }, + "positionY": { + "value": { + "type": "Number", + "value": -4.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "positionZ": { + "value": { + "type": "Number", + "value": 20.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "width": { + "value": { + "type": "Number", + "value": 1.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + } + } }, "sourceRange": [] }, @@ -2335,7 +2917,104 @@ description: Operations executed kitt.kcl "name": "pixelBox", "functionSourceRange": [], "unlabeledArg": null, - "labeledArgs": {} + "labeledArgs": { + "depth": { + "value": { + "type": "Number", + "value": 0.5, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "extrudeTag": { + "value": { + "type": "String", + "value": "start" + }, + "sourceRange": [] + }, + "height": { + "value": { + "type": "Number", + "value": 1.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "kitExtrude": { + "value": { + "type": "Solid", + "value": { + "artifactId": "[uuid]" + } + }, + "sourceRange": [] + }, + "positionY": { + "value": { + "type": "Number", + "value": -3.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "positionZ": { + "value": { + "type": "Number", + "value": 19.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "width": { + "value": { + "type": "Number", + "value": 1.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + } + } }, "sourceRange": [] }, @@ -2346,7 +3025,104 @@ description: Operations executed kitt.kcl "name": "pixelBox", "functionSourceRange": [], "unlabeledArg": null, - "labeledArgs": {} + "labeledArgs": { + "depth": { + "value": { + "type": "Number", + "value": 0.5, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "extrudeTag": { + "value": { + "type": "String", + "value": "start" + }, + "sourceRange": [] + }, + "height": { + "value": { + "type": "Number", + "value": 1.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "kitExtrude": { + "value": { + "type": "Solid", + "value": { + "artifactId": "[uuid]" + } + }, + "sourceRange": [] + }, + "positionY": { + "value": { + "type": "Number", + "value": 4.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "positionZ": { + "value": { + "type": "Number", + "value": 20.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "width": { + "value": { + "type": "Number", + "value": 1.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + } + } }, "sourceRange": [] }, @@ -2357,7 +3133,104 @@ description: Operations executed kitt.kcl "name": "pixelBox", "functionSourceRange": [], "unlabeledArg": null, - "labeledArgs": {} + "labeledArgs": { + "depth": { + "value": { + "type": "Number", + "value": 0.5, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "extrudeTag": { + "value": { + "type": "String", + "value": "start" + }, + "sourceRange": [] + }, + "height": { + "value": { + "type": "Number", + "value": 1.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "kitExtrude": { + "value": { + "type": "Solid", + "value": { + "artifactId": "[uuid]" + } + }, + "sourceRange": [] + }, + "positionY": { + "value": { + "type": "Number", + "value": 3.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "positionZ": { + "value": { + "type": "Number", + "value": 19.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "width": { + "value": { + "type": "Number", + "value": 1.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + } + } }, "sourceRange": [] }, @@ -2368,7 +3241,104 @@ description: Operations executed kitt.kcl "name": "pixelBox", "functionSourceRange": [], "unlabeledArg": null, - "labeledArgs": {} + "labeledArgs": { + "depth": { + "value": { + "type": "Number", + "value": 3.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "extrudeTag": { + "value": { + "type": "String", + "value": "end" + }, + "sourceRange": [] + }, + "height": { + "value": { + "type": "Number", + "value": 6.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "kitExtrude": { + "value": { + "type": "Solid", + "value": { + "artifactId": "[uuid]" + } + }, + "sourceRange": [] + }, + "positionY": { + "value": { + "type": "Number", + "value": -12.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "positionZ": { + "value": { + "type": "Number", + "value": 7.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "width": { + "value": { + "type": "Number", + "value": 24.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + } + } }, "sourceRange": [] }, @@ -2379,7 +3349,104 @@ description: Operations executed kitt.kcl "name": "pixelBox", "functionSourceRange": [], "unlabeledArg": null, - "labeledArgs": {} + "labeledArgs": { + "depth": { + "value": { + "type": "Number", + "value": 1.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "extrudeTag": { + "value": { + "type": "String", + "value": "end" + }, + "sourceRange": [] + }, + "height": { + "value": { + "type": "Number", + "value": 2.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "kitExtrude": { + "value": { + "type": "Solid", + "value": { + "artifactId": "[uuid]" + } + }, + "sourceRange": [] + }, + "positionY": { + "value": { + "type": "Number", + "value": -4.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "positionZ": { + "value": { + "type": "Number", + "value": 8.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "width": { + "value": { + "type": "Number", + "value": 8.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + } + } }, "sourceRange": [] }, @@ -2390,7 +3457,104 @@ description: Operations executed kitt.kcl "name": "pixelBox", "functionSourceRange": [], "unlabeledArg": null, - "labeledArgs": {} + "labeledArgs": { + "depth": { + "value": { + "type": "Number", + "value": -2.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "extrudeTag": { + "value": { + "type": "String", + "value": "end" + }, + "sourceRange": [] + }, + "height": { + "value": { + "type": "Number", + "value": 1.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "kitExtrude": { + "value": { + "type": "Solid", + "value": { + "artifactId": "[uuid]" + } + }, + "sourceRange": [] + }, + "positionY": { + "value": { + "type": "Number", + "value": -11.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "positionZ": { + "value": { + "type": "Number", + "value": 8.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "width": { + "value": { + "type": "Number", + "value": 5.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + } + } }, "sourceRange": [] }, @@ -2401,7 +3565,104 @@ description: Operations executed kitt.kcl "name": "pixelBox", "functionSourceRange": [], "unlabeledArg": null, - "labeledArgs": {} + "labeledArgs": { + "depth": { + "value": { + "type": "Number", + "value": -2.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "extrudeTag": { + "value": { + "type": "String", + "value": "end" + }, + "sourceRange": [] + }, + "height": { + "value": { + "type": "Number", + "value": 1.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "kitExtrude": { + "value": { + "type": "Solid", + "value": { + "artifactId": "[uuid]" + } + }, + "sourceRange": [] + }, + "positionY": { + "value": { + "type": "Number", + "value": -11.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "positionZ": { + "value": { + "type": "Number", + "value": 10.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "width": { + "value": { + "type": "Number", + "value": 5.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + } + } }, "sourceRange": [] }, @@ -2412,7 +3673,104 @@ description: Operations executed kitt.kcl "name": "pixelBox", "functionSourceRange": [], "unlabeledArg": null, - "labeledArgs": {} + "labeledArgs": { + "depth": { + "value": { + "type": "Number", + "value": -2.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "extrudeTag": { + "value": { + "type": "String", + "value": "end" + }, + "sourceRange": [] + }, + "height": { + "value": { + "type": "Number", + "value": 1.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "kitExtrude": { + "value": { + "type": "Solid", + "value": { + "artifactId": "[uuid]" + } + }, + "sourceRange": [] + }, + "positionY": { + "value": { + "type": "Number", + "value": 11.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "positionZ": { + "value": { + "type": "Number", + "value": 8.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "width": { + "value": { + "type": "Number", + "value": -5.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + } + } }, "sourceRange": [] }, @@ -2423,7 +3781,104 @@ description: Operations executed kitt.kcl "name": "pixelBox", "functionSourceRange": [], "unlabeledArg": null, - "labeledArgs": {} + "labeledArgs": { + "depth": { + "value": { + "type": "Number", + "value": 4.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "extrudeTag": { + "value": { + "type": "String", + "value": "end" + }, + "sourceRange": [] + }, + "height": { + "value": { + "type": "Number", + "value": 1.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "kitExtrude": { + "value": { + "type": "Solid", + "value": { + "artifactId": "[uuid]" + } + }, + "sourceRange": [] + }, + "positionY": { + "value": { + "type": "Number", + "value": -9.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "positionZ": { + "value": { + "type": "Number", + "value": 13.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "width": { + "value": { + "type": "Number", + "value": 2.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + } + } }, "sourceRange": [] }, @@ -2434,7 +3889,104 @@ description: Operations executed kitt.kcl "name": "pixelBox", "functionSourceRange": [], "unlabeledArg": null, - "labeledArgs": {} + "labeledArgs": { + "depth": { + "value": { + "type": "Number", + "value": -2.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "extrudeTag": { + "value": { + "type": "String", + "value": "end" + }, + "sourceRange": [] + }, + "height": { + "value": { + "type": "Number", + "value": 2.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "kitExtrude": { + "value": { + "type": "Solid", + "value": { + "artifactId": "[uuid]" + } + }, + "sourceRange": [] + }, + "positionY": { + "value": { + "type": "Number", + "value": 11.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "positionZ": { + "value": { + "type": "Number", + "value": 10.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "width": { + "value": { + "type": "Number", + "value": -1.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + } + } }, "sourceRange": [] }, @@ -2445,7 +3997,104 @@ description: Operations executed kitt.kcl "name": "pixelBox", "functionSourceRange": [], "unlabeledArg": null, - "labeledArgs": {} + "labeledArgs": { + "depth": { + "value": { + "type": "Number", + "value": -2.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "extrudeTag": { + "value": { + "type": "String", + "value": "end" + }, + "sourceRange": [] + }, + "height": { + "value": { + "type": "Number", + "value": 2.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "kitExtrude": { + "value": { + "type": "Solid", + "value": { + "artifactId": "[uuid]" + } + }, + "sourceRange": [] + }, + "positionY": { + "value": { + "type": "Number", + "value": 9.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "positionZ": { + "value": { + "type": "Number", + "value": 10.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "width": { + "value": { + "type": "Number", + "value": -1.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + } + } }, "sourceRange": [] }, @@ -2456,7 +4105,104 @@ description: Operations executed kitt.kcl "name": "pixelBox", "functionSourceRange": [], "unlabeledArg": null, - "labeledArgs": {} + "labeledArgs": { + "depth": { + "value": { + "type": "Number", + "value": -2.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "extrudeTag": { + "value": { + "type": "String", + "value": "end" + }, + "sourceRange": [] + }, + "height": { + "value": { + "type": "Number", + "value": 2.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "kitExtrude": { + "value": { + "type": "Solid", + "value": { + "artifactId": "[uuid]" + } + }, + "sourceRange": [] + }, + "positionY": { + "value": { + "type": "Number", + "value": 7.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "positionZ": { + "value": { + "type": "Number", + "value": 10.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "width": { + "value": { + "type": "Number", + "value": -1.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + } + } }, "sourceRange": [] }, @@ -2561,7 +4307,104 @@ description: Operations executed kitt.kcl "name": "pixelBox", "functionSourceRange": [], "unlabeledArg": null, - "labeledArgs": {} + "labeledArgs": { + "depth": { + "value": { + "type": "Number", + "value": 3.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "extrudeTag": { + "value": { + "type": "String", + "value": "end" + }, + "sourceRange": [] + }, + "height": { + "value": { + "type": "Number", + "value": 5.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "kitExtrude": { + "value": { + "type": "Solid", + "value": { + "artifactId": "[uuid]" + } + }, + "sourceRange": [] + }, + "positionY": { + "value": { + "type": "Number", + "value": 4.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "positionZ": { + "value": { + "type": "Number", + "value": -10.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "width": { + "value": { + "type": "Number", + "value": 5.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + } + } }, "sourceRange": [] }, @@ -2572,7 +4415,104 @@ description: Operations executed kitt.kcl "name": "pixelBox", "functionSourceRange": [], "unlabeledArg": null, - "labeledArgs": {} + "labeledArgs": { + "depth": { + "value": { + "type": "Number", + "value": 3.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "extrudeTag": { + "value": { + "type": "String", + "value": "end" + }, + "sourceRange": [] + }, + "height": { + "value": { + "type": "Number", + "value": 5.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "kitExtrude": { + "value": { + "type": "Solid", + "value": { + "artifactId": "[uuid]" + } + }, + "sourceRange": [] + }, + "positionY": { + "value": { + "type": "Number", + "value": -9.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "positionZ": { + "value": { + "type": "Number", + "value": -10.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "width": { + "value": { + "type": "Number", + "value": 5.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + } + } }, "sourceRange": [] }, @@ -2583,7 +4523,40 @@ description: Operations executed kitt.kcl "name": "kitLeg", "functionSourceRange": [], "unlabeledArg": null, - "labeledArgs": {} + "labeledArgs": { + "offsetFront": { + "value": { + "type": "Number", + "value": 0.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "offsetSide": { + "value": { + "type": "Number", + "value": 3.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + } + } }, "sourceRange": [] }, @@ -2594,7 +4567,40 @@ description: Operations executed kitt.kcl "name": "kitLeg", "functionSourceRange": [], "unlabeledArg": null, - "labeledArgs": {} + "labeledArgs": { + "offsetFront": { + "value": { + "type": "Number", + "value": 0.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "offsetSide": { + "value": { + "type": "Number", + "value": -10.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + } + } }, "sourceRange": [] }, @@ -2605,7 +4611,105 @@ description: Operations executed kitt.kcl "name": "pixelBox", "functionSourceRange": [], "unlabeledArg": null, - "labeledArgs": {} + "labeledArgs": { + "depth": { + "value": { + "type": "Number", + "value": 2.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "extrudeTag": { + "value": { + "type": "TagIdentifier", + "value": "seg01", + "artifact_id": "[uuid]" + }, + "sourceRange": [] + }, + "height": { + "value": { + "type": "Number", + "value": -8.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "kitExtrude": { + "value": { + "type": "Solid", + "value": { + "artifactId": "[uuid]" + } + }, + "sourceRange": [] + }, + "positionY": { + "value": { + "type": "Number", + "value": -12.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "positionZ": { + "value": { + "type": "Number", + "value": 14.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "width": { + "value": { + "type": "Number", + "value": 8.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + } + } }, "sourceRange": [] }, @@ -2616,7 +4720,105 @@ description: Operations executed kitt.kcl "name": "pixelBox", "functionSourceRange": [], "unlabeledArg": null, - "labeledArgs": {} + "labeledArgs": { + "depth": { + "value": { + "type": "Number", + "value": 2.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "extrudeTag": { + "value": { + "type": "TagIdentifier", + "value": "seg01", + "artifact_id": "[uuid]" + }, + "sourceRange": [] + }, + "height": { + "value": { + "type": "Number", + "value": -8.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "kitExtrude": { + "value": { + "type": "Solid", + "value": { + "artifactId": "[uuid]" + } + }, + "sourceRange": [] + }, + "positionY": { + "value": { + "type": "Number", + "value": 4.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "positionZ": { + "value": { + "type": "Number", + "value": 14.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "width": { + "value": { + "type": "Number", + "value": 8.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + } + } }, "sourceRange": [] }, @@ -2627,7 +4829,104 @@ description: Operations executed kitt.kcl "name": "pixelBox", "functionSourceRange": [], "unlabeledArg": null, - "labeledArgs": {} + "labeledArgs": { + "depth": { + "value": { + "type": "Number", + "value": 2.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "extrudeTag": { + "value": { + "type": "String", + "value": "end" + }, + "sourceRange": [] + }, + "height": { + "value": { + "type": "Number", + "value": -6.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "kitExtrude": { + "value": { + "type": "Solid", + "value": { + "artifactId": "[uuid]" + } + }, + "sourceRange": [] + }, + "positionY": { + "value": { + "type": "Number", + "value": -11.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "positionZ": { + "value": { + "type": "Number", + "value": 13.99, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "width": { + "value": { + "type": "Number", + "value": 6.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + } + } }, "sourceRange": [] }, @@ -2638,7 +4937,104 @@ description: Operations executed kitt.kcl "name": "pixelBox", "functionSourceRange": [], "unlabeledArg": null, - "labeledArgs": {} + "labeledArgs": { + "depth": { + "value": { + "type": "Number", + "value": 2.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "extrudeTag": { + "value": { + "type": "String", + "value": "end" + }, + "sourceRange": [] + }, + "height": { + "value": { + "type": "Number", + "value": -6.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "kitExtrude": { + "value": { + "type": "Solid", + "value": { + "artifactId": "[uuid]" + } + }, + "sourceRange": [] + }, + "positionY": { + "value": { + "type": "Number", + "value": 5.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "positionZ": { + "value": { + "type": "Number", + "value": 13.99, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "width": { + "value": { + "type": "Number", + "value": 6.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + } + } }, "sourceRange": [] }, @@ -2649,7 +5045,104 @@ description: Operations executed kitt.kcl "name": "pixelBox", "functionSourceRange": [], "unlabeledArg": null, - "labeledArgs": {} + "labeledArgs": { + "depth": { + "value": { + "type": "Number", + "value": 2.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "extrudeTag": { + "value": { + "type": "String", + "value": "end" + }, + "sourceRange": [] + }, + "height": { + "value": { + "type": "Number", + "value": -4.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "kitExtrude": { + "value": { + "type": "Solid", + "value": { + "artifactId": "[uuid]" + } + }, + "sourceRange": [] + }, + "positionY": { + "value": { + "type": "Number", + "value": -10.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "positionZ": { + "value": { + "type": "Number", + "value": 13.98, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "width": { + "value": { + "type": "Number", + "value": 4.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + } + } }, "sourceRange": [] }, @@ -2660,7 +5153,104 @@ description: Operations executed kitt.kcl "name": "pixelBox", "functionSourceRange": [], "unlabeledArg": null, - "labeledArgs": {} + "labeledArgs": { + "depth": { + "value": { + "type": "Number", + "value": 2.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "extrudeTag": { + "value": { + "type": "String", + "value": "end" + }, + "sourceRange": [] + }, + "height": { + "value": { + "type": "Number", + "value": -4.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "kitExtrude": { + "value": { + "type": "Solid", + "value": { + "artifactId": "[uuid]" + } + }, + "sourceRange": [] + }, + "positionY": { + "value": { + "type": "Number", + "value": 6.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "positionZ": { + "value": { + "type": "Number", + "value": 13.98, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "width": { + "value": { + "type": "Number", + "value": 4.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + } + } }, "sourceRange": [] }, @@ -2671,7 +5261,104 @@ description: Operations executed kitt.kcl "name": "pixelBox", "functionSourceRange": [], "unlabeledArg": null, - "labeledArgs": {} + "labeledArgs": { + "depth": { + "value": { + "type": "Number", + "value": 2.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "extrudeTag": { + "value": { + "type": "String", + "value": "end" + }, + "sourceRange": [] + }, + "height": { + "value": { + "type": "Number", + "value": -2.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "kitExtrude": { + "value": { + "type": "Solid", + "value": { + "artifactId": "[uuid]" + } + }, + "sourceRange": [] + }, + "positionY": { + "value": { + "type": "Number", + "value": -9.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "positionZ": { + "value": { + "type": "Number", + "value": 13.97, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "width": { + "value": { + "type": "Number", + "value": 2.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + } + } }, "sourceRange": [] }, @@ -2682,7 +5369,104 @@ description: Operations executed kitt.kcl "name": "pixelBox", "functionSourceRange": [], "unlabeledArg": null, - "labeledArgs": {} + "labeledArgs": { + "depth": { + "value": { + "type": "Number", + "value": 2.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "extrudeTag": { + "value": { + "type": "String", + "value": "end" + }, + "sourceRange": [] + }, + "height": { + "value": { + "type": "Number", + "value": -2.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "kitExtrude": { + "value": { + "type": "Solid", + "value": { + "artifactId": "[uuid]" + } + }, + "sourceRange": [] + }, + "positionY": { + "value": { + "type": "Number", + "value": 7.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "positionZ": { + "value": { + "type": "Number", + "value": 13.97, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "width": { + "value": { + "type": "Number", + "value": 2.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + } + } }, "sourceRange": [] }, @@ -2693,7 +5477,40 @@ description: Operations executed kitt.kcl "name": "kitEar", "functionSourceRange": [], "unlabeledArg": null, - "labeledArgs": {} + "labeledArgs": { + "earOffsetFront": { + "value": { + "type": "Number", + "value": 4.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "earOffsetSide": { + "value": { + "type": "Number", + "value": 1.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + } + } }, "sourceRange": [] }, @@ -2704,7 +5521,40 @@ description: Operations executed kitt.kcl "name": "kitEar", "functionSourceRange": [], "unlabeledArg": null, - "labeledArgs": {} + "labeledArgs": { + "earOffsetFront": { + "value": { + "type": "Number", + "value": 4.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "earOffsetSide": { + "value": { + "type": "Number", + "value": 17.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + } + } }, "sourceRange": [] }, @@ -2715,7 +5565,105 @@ description: Operations executed kitt.kcl "name": "pixelBox", "functionSourceRange": [], "unlabeledArg": null, - "labeledArgs": {} + "labeledArgs": { + "depth": { + "value": { + "type": "Number", + "value": -2.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "extrudeTag": { + "value": { + "type": "TagIdentifier", + "value": "seg02", + "artifact_id": "[uuid]" + }, + "sourceRange": [] + }, + "height": { + "value": { + "type": "Number", + "value": 1.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "kitExtrude": { + "value": { + "type": "Solid", + "value": { + "artifactId": "[uuid]" + } + }, + "sourceRange": [] + }, + "positionY": { + "value": { + "type": "Number", + "value": 27.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "positionZ": { + "value": { + "type": "Number", + "value": 13.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "width": { + "value": { + "type": "Number", + "value": 1.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + } + } }, "sourceRange": [] }, @@ -2726,7 +5674,105 @@ description: Operations executed kitt.kcl "name": "pixelBox", "functionSourceRange": [], "unlabeledArg": null, - "labeledArgs": {} + "labeledArgs": { + "depth": { + "value": { + "type": "Number", + "value": -2.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "extrudeTag": { + "value": { + "type": "TagIdentifier", + "value": "seg02", + "artifact_id": "[uuid]" + }, + "sourceRange": [] + }, + "height": { + "value": { + "type": "Number", + "value": 1.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "kitExtrude": { + "value": { + "type": "Solid", + "value": { + "artifactId": "[uuid]" + } + }, + "sourceRange": [] + }, + "positionY": { + "value": { + "type": "Number", + "value": 27.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "positionZ": { + "value": { + "type": "Number", + "value": 11.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "width": { + "value": { + "type": "Number", + "value": 1.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + } + } }, "sourceRange": [] }, @@ -2737,7 +5783,105 @@ description: Operations executed kitt.kcl "name": "pixelBox", "functionSourceRange": [], "unlabeledArg": null, - "labeledArgs": {} + "labeledArgs": { + "depth": { + "value": { + "type": "Number", + "value": -2.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "extrudeTag": { + "value": { + "type": "TagIdentifier", + "value": "seg02", + "artifact_id": "[uuid]" + }, + "sourceRange": [] + }, + "height": { + "value": { + "type": "Number", + "value": 1.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "kitExtrude": { + "value": { + "type": "Solid", + "value": { + "artifactId": "[uuid]" + } + }, + "sourceRange": [] + }, + "positionY": { + "value": { + "type": "Number", + "value": 25.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "positionZ": { + "value": { + "type": "Number", + "value": 14.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "width": { + "value": { + "type": "Number", + "value": 1.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + } + } }, "sourceRange": [] }, @@ -2748,7 +5892,105 @@ description: Operations executed kitt.kcl "name": "pixelBox", "functionSourceRange": [], "unlabeledArg": null, - "labeledArgs": {} + "labeledArgs": { + "depth": { + "value": { + "type": "Number", + "value": -2.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "extrudeTag": { + "value": { + "type": "TagIdentifier", + "value": "seg02", + "artifact_id": "[uuid]" + }, + "sourceRange": [] + }, + "height": { + "value": { + "type": "Number", + "value": 1.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "kitExtrude": { + "value": { + "type": "Solid", + "value": { + "artifactId": "[uuid]" + } + }, + "sourceRange": [] + }, + "positionY": { + "value": { + "type": "Number", + "value": 25.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "positionZ": { + "value": { + "type": "Number", + "value": 12.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "width": { + "value": { + "type": "Number", + "value": 1.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + } + } }, "sourceRange": [] }, @@ -2759,7 +6001,105 @@ description: Operations executed kitt.kcl "name": "pixelBox", "functionSourceRange": [], "unlabeledArg": null, - "labeledArgs": {} + "labeledArgs": { + "depth": { + "value": { + "type": "Number", + "value": -2.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "extrudeTag": { + "value": { + "type": "TagIdentifier", + "value": "seg02", + "artifact_id": "[uuid]" + }, + "sourceRange": [] + }, + "height": { + "value": { + "type": "Number", + "value": 1.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "kitExtrude": { + "value": { + "type": "Solid", + "value": { + "artifactId": "[uuid]" + } + }, + "sourceRange": [] + }, + "positionY": { + "value": { + "type": "Number", + "value": 25.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "positionZ": { + "value": { + "type": "Number", + "value": 10.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "width": { + "value": { + "type": "Number", + "value": 1.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + } + } }, "sourceRange": [] }, @@ -2770,7 +6110,105 @@ description: Operations executed kitt.kcl "name": "pixelBox", "functionSourceRange": [], "unlabeledArg": null, - "labeledArgs": {} + "labeledArgs": { + "depth": { + "value": { + "type": "Number", + "value": -2.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "extrudeTag": { + "value": { + "type": "TagIdentifier", + "value": "seg02", + "artifact_id": "[uuid]" + }, + "sourceRange": [] + }, + "height": { + "value": { + "type": "Number", + "value": 1.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "kitExtrude": { + "value": { + "type": "Solid", + "value": { + "artifactId": "[uuid]" + } + }, + "sourceRange": [] + }, + "positionY": { + "value": { + "type": "Number", + "value": 23.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "positionZ": { + "value": { + "type": "Number", + "value": 13.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "width": { + "value": { + "type": "Number", + "value": 1.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + } + } }, "sourceRange": [] }, @@ -2781,7 +6219,105 @@ description: Operations executed kitt.kcl "name": "pixelBox", "functionSourceRange": [], "unlabeledArg": null, - "labeledArgs": {} + "labeledArgs": { + "depth": { + "value": { + "type": "Number", + "value": -2.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "extrudeTag": { + "value": { + "type": "TagIdentifier", + "value": "seg02", + "artifact_id": "[uuid]" + }, + "sourceRange": [] + }, + "height": { + "value": { + "type": "Number", + "value": 1.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "kitExtrude": { + "value": { + "type": "Solid", + "value": { + "artifactId": "[uuid]" + } + }, + "sourceRange": [] + }, + "positionY": { + "value": { + "type": "Number", + "value": 23.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "positionZ": { + "value": { + "type": "Number", + "value": 11.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "width": { + "value": { + "type": "Number", + "value": 1.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + } + } }, "sourceRange": [] }, @@ -2792,7 +6328,105 @@ description: Operations executed kitt.kcl "name": "pixelBox", "functionSourceRange": [], "unlabeledArg": null, - "labeledArgs": {} + "labeledArgs": { + "depth": { + "value": { + "type": "Number", + "value": -2.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "extrudeTag": { + "value": { + "type": "TagIdentifier", + "value": "seg02", + "artifact_id": "[uuid]" + }, + "sourceRange": [] + }, + "height": { + "value": { + "type": "Number", + "value": 1.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "kitExtrude": { + "value": { + "type": "Solid", + "value": { + "artifactId": "[uuid]" + } + }, + "sourceRange": [] + }, + "positionY": { + "value": { + "type": "Number", + "value": 7.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "positionZ": { + "value": { + "type": "Number", + "value": 1.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "width": { + "value": { + "type": "Number", + "value": 4.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + } + } }, "sourceRange": [] }, @@ -2803,7 +6437,105 @@ description: Operations executed kitt.kcl "name": "pixelBox", "functionSourceRange": [], "unlabeledArg": null, - "labeledArgs": {} + "labeledArgs": { + "depth": { + "value": { + "type": "Number", + "value": -2.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "extrudeTag": { + "value": { + "type": "TagIdentifier", + "value": "seg02", + "artifact_id": "[uuid]" + }, + "sourceRange": [] + }, + "height": { + "value": { + "type": "Number", + "value": 1.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "kitExtrude": { + "value": { + "type": "Solid", + "value": { + "artifactId": "[uuid]" + } + }, + "sourceRange": [] + }, + "positionY": { + "value": { + "type": "Number", + "value": 7.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "positionZ": { + "value": { + "type": "Number", + "value": 3.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "width": { + "value": { + "type": "Number", + "value": 4.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + } + } }, "sourceRange": [] }, @@ -2814,7 +6546,105 @@ description: Operations executed kitt.kcl "name": "pixelBox", "functionSourceRange": [], "unlabeledArg": null, - "labeledArgs": {} + "labeledArgs": { + "depth": { + "value": { + "type": "Number", + "value": -2.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "extrudeTag": { + "value": { + "type": "TagIdentifier", + "value": "seg02", + "artifact_id": "[uuid]" + }, + "sourceRange": [] + }, + "height": { + "value": { + "type": "Number", + "value": 1.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "kitExtrude": { + "value": { + "type": "Solid", + "value": { + "artifactId": "[uuid]" + } + }, + "sourceRange": [] + }, + "positionY": { + "value": { + "type": "Number", + "value": 7.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "positionZ": { + "value": { + "type": "Number", + "value": 5.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "width": { + "value": { + "type": "Number", + "value": 4.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + } + } }, "sourceRange": [] }, diff --git a/rust/kcl-lib/tests/kcl_samples/kitt/program_memory.snap b/rust/kcl-lib/tests/kcl_samples/kitt/program_memory.snap index 74bacabc7..2e66ddb34 100644 --- a/rust/kcl-lib/tests/kcl_samples/kitt/program_memory.snap +++ b/rust/kcl-lib/tests/kcl_samples/kitt/program_memory.snap @@ -6342,7 +6342,7 @@ description: Variables in memory after executing kitt.kcl } } }, - "kitEyeHeihgt": { + "kitEyeHeight": { "type": "Number", "value": 23.0, "ty": { diff --git a/rust/kcl-lib/tests/kcl_samples/makeup-mirror/artifact_graph_flowchart.snap.md b/rust/kcl-lib/tests/kcl_samples/makeup-mirror/artifact_graph_flowchart.snap.md index 47ebd30d2..db485420b 100644 --- a/rust/kcl-lib/tests/kcl_samples/makeup-mirror/artifact_graph_flowchart.snap.md +++ b/rust/kcl-lib/tests/kcl_samples/makeup-mirror/artifact_graph_flowchart.snap.md @@ -36,27 +36,27 @@ flowchart LR 54[Solid2d] end subgraph path26 [Path] - 26["Path
[1228, 1283, 0]"] - 38["Segment
[1228, 1283, 0]"] + 26["Path
[1312, 1367, 0]"] + 38["Segment
[1312, 1367, 0]"] 47[Solid2d] end subgraph path27 [Path] - 27["Path
[1228, 1283, 0]"] - 37["Segment
[1228, 1283, 0]"] + 27["Path
[1312, 1367, 0]"] + 37["Segment
[1312, 1367, 0]"] 52[Solid2d] end subgraph path28 [Path] - 28["Path
[1676, 1739, 0]"] - 39["Segment
[1676, 1739, 0]"] + 28["Path
[1816, 1879, 0]"] + 39["Segment
[1816, 1879, 0]"] 45[Solid2d] end subgraph path29 [Path] - 29["Path
[1785, 1844, 0]"] - 40["Segment
[1852, 1876, 0]"] - 41["Segment
[1884, 1984, 0]"] - 42["Segment
[1992, 2016, 0]"] - 43["Segment
[2024, 2202, 0]"] - 44["Segment
[2210, 2217, 0]"] + 29["Path
[1925, 1984, 0]"] + 40["Segment
[1992, 2016, 0]"] + 41["Segment
[2024, 2124, 0]"] + 42["Segment
[2132, 2156, 0]"] + 43["Segment
[2164, 2342, 0]"] + 44["Segment
[2350, 2357, 0]"] 55[Solid2d] end 1["Plane
[547, 574, 0]"] @@ -66,10 +66,10 @@ flowchart LR 5["Plane
[547, 574, 0]"] 6["Plane
[547, 574, 0]"] 7["Plane
[547, 574, 0]"] - 8["Plane
[1200, 1220, 0]"] - 9["Plane
[1200, 1220, 0]"] - 10["Plane
[1612, 1662, 0]"] - 11["StartSketchOnPlane
[1596, 1663, 0]"] + 8["Plane
[1284, 1304, 0]"] + 9["Plane
[1284, 1304, 0]"] + 10["Plane
[1752, 1802, 0]"] + 11["StartSketchOnPlane
[1736, 1803, 0]"] 12["StartSketchOnPlane
[533, 575, 0]"] 13["StartSketchOnPlane
[533, 575, 0]"] 14["StartSketchOnPlane
[533, 575, 0]"] @@ -84,10 +84,10 @@ flowchart LR 60["Sweep Extrusion
[636, 665, 0]"] 61["Sweep Extrusion
[636, 665, 0]"] 62["Sweep Extrusion
[636, 665, 0]"] - 63["Sweep Extrusion
[1291, 1318, 0]"] - 64["Sweep Extrusion
[1291, 1318, 0]"] - 65["Sweep Extrusion
[1747, 1770, 0]"] - 66["Sweep Extrusion
[2225, 2248, 0]"] + 63["Sweep Extrusion
[1375, 1402, 0]"] + 64["Sweep Extrusion
[1375, 1402, 0]"] + 65["Sweep Extrusion
[1887, 1910, 0]"] + 66["Sweep Extrusion
[2365, 2388, 0]"] 67[Wall] 68[Wall] 69[Wall] diff --git a/rust/kcl-lib/tests/kcl_samples/makeup-mirror/ast.snap b/rust/kcl-lib/tests/kcl_samples/makeup-mirror/ast.snap index b488d5676..2da0e6f84 100644 --- a/rust/kcl-lib/tests/kcl_samples/makeup-mirror/ast.snap +++ b/rust/kcl-lib/tests/kcl_samples/makeup-mirror/ast.snap @@ -804,39 +804,69 @@ description: Result of parsing makeup-mirror.kcl "init": { "arguments": [ { - "commentStart": 0, - "end": 0, - "raw": "0", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 0.0, - "suffix": "None" + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "x", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "end": 0, + "raw": "0", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 0.0, + "suffix": "None" + } } }, { - "commentStart": 0, - "end": 0, - "raw": "0", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 0.0, - "suffix": "None" + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "y", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "end": 0, + "raw": "0", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 0.0, + "suffix": "None" + } } }, { - "commentStart": 0, - "end": 0, - "raw": "0", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 0.0, - "suffix": "None" + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "z", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "end": 0, + "raw": "0", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 0.0, + "suffix": "None" + } } } ], @@ -858,8 +888,9 @@ description: Result of parsing makeup-mirror.kcl "commentStart": 0, "end": 0, "start": 0, - "type": "CallExpression", - "type": "CallExpression" + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null }, "start": 0, "type": "VariableDeclarator" @@ -885,68 +916,98 @@ description: Result of parsing makeup-mirror.kcl "init": { "arguments": [ { - "commentStart": 0, - "end": 0, - "raw": "0", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 0.0, - "suffix": "None" + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "x", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "end": 0, + "raw": "0", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 0.0, + "suffix": "None" + } } }, { - "commentStart": 0, - "end": 0, - "raw": "0", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 0.0, - "suffix": "None" + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "y", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "end": 0, + "raw": "0", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 0.0, + "suffix": "None" + } } }, { - "commentStart": 0, - "end": 0, - "left": { - "abs_path": false, + "type": "LabeledArg", + "label": { "commentStart": 0, "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "hingeHeight", - "start": 0, - "type": "Identifier" - }, - "path": [], + "name": "z", "start": 0, - "type": "Name", - "type": "Name" + "type": "Identifier" }, - "operator": "+", - "right": { - "abs_path": false, + "arg": { "commentStart": 0, "end": 0, - "name": { + "left": { + "abs_path": false, "commentStart": 0, "end": 0, - "name": "hingeGap", + "name": { + "commentStart": 0, + "end": 0, + "name": "hingeHeight", + "start": 0, + "type": "Identifier" + }, + "path": [], "start": 0, - "type": "Identifier" + "type": "Name", + "type": "Name" + }, + "operator": "+", + "right": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "hingeGap", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" }, - "path": [], "start": 0, - "type": "Name", - "type": "Name" - }, - "start": 0, - "type": "BinaryExpression", - "type": "BinaryExpression" + "type": "BinaryExpression", + "type": "BinaryExpression" + } } ], "callee": { @@ -967,8 +1028,9 @@ description: Result of parsing makeup-mirror.kcl "commentStart": 0, "end": 0, "start": 0, - "type": "CallExpression", - "type": "CallExpression" + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null }, "start": 0, "type": "VariableDeclarator" @@ -994,108 +1056,138 @@ description: Result of parsing makeup-mirror.kcl "init": { "arguments": [ { - "commentStart": 0, - "end": 0, - "raw": "0", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 0.0, - "suffix": "None" + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "x", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "end": 0, + "raw": "0", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 0.0, + "suffix": "None" + } } }, { - "commentStart": 0, - "end": 0, - "raw": "0", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 0.0, - "suffix": "None" + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "y", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "end": 0, + "raw": "0", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 0.0, + "suffix": "None" + } } }, { - "commentStart": 0, - "end": 0, - "left": { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "z", + "start": 0, + "type": "Identifier" + }, + "arg": { "commentStart": 0, "end": 0, "left": { - "abs_path": false, "commentStart": 0, "end": 0, - "name": { + "left": { + "abs_path": false, "commentStart": 0, "end": 0, - "name": "hingeHeight", + "name": { + "commentStart": 0, + "end": 0, + "name": "hingeHeight", + "start": 0, + "type": "Identifier" + }, + "path": [], "start": 0, - "type": "Identifier" + "type": "Name", + "type": "Name" + }, + "operator": "*", + "right": { + "commentStart": 0, + "end": 0, + "raw": "2", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 2.0, + "suffix": "None" + } }, - "path": [], "start": 0, - "type": "Name", - "type": "Name" + "type": "BinaryExpression", + "type": "BinaryExpression" }, - "operator": "*", + "operator": "+", "right": { "commentStart": 0, "end": 0, - "raw": "2", + "left": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "hingeGap", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + }, + "operator": "*", + "right": { + "commentStart": 0, + "end": 0, + "raw": "2", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 2.0, + "suffix": "None" + } + }, "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 2.0, - "suffix": "None" - } + "type": "BinaryExpression", + "type": "BinaryExpression" }, "start": 0, "type": "BinaryExpression", "type": "BinaryExpression" - }, - "operator": "+", - "right": { - "commentStart": 0, - "end": 0, - "left": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "hingeGap", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - "operator": "*", - "right": { - "commentStart": 0, - "end": 0, - "raw": "2", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 2.0, - "suffix": "None" - } - }, - "start": 0, - "type": "BinaryExpression", - "type": "BinaryExpression" - }, - "start": 0, - "type": "BinaryExpression", - "type": "BinaryExpression" + } } ], "callee": { @@ -1116,8 +1208,9 @@ description: Result of parsing makeup-mirror.kcl "commentStart": 0, "end": 0, "start": 0, - "type": "CallExpression", - "type": "CallExpression" + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null }, "start": 0, "type": "VariableDeclarator" @@ -1143,72 +1236,102 @@ description: Result of parsing makeup-mirror.kcl "init": { "arguments": [ { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { + "type": "LabeledArg", + "label": { "commentStart": 0, "end": 0, - "name": "armLength", + "name": "x", "start": 0, "type": "Identifier" }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - { - "commentStart": 0, - "end": 0, - "raw": "0", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 0.0, - "suffix": "None" + "arg": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "armLength", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" } }, { - "commentStart": 0, - "end": 0, - "left": { - "abs_path": false, + "type": "LabeledArg", + "label": { "commentStart": 0, "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "hingeHeight", - "start": 0, - "type": "Identifier" - }, - "path": [], + "name": "y", "start": 0, - "type": "Name", - "type": "Name" + "type": "Identifier" }, - "operator": "+", - "right": { - "abs_path": false, + "arg": { "commentStart": 0, "end": 0, - "name": { + "raw": "0", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 0.0, + "suffix": "None" + } + } + }, + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "z", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "end": 0, + "left": { + "abs_path": false, "commentStart": 0, "end": 0, - "name": "hingeGap", + "name": { + "commentStart": 0, + "end": 0, + "name": "hingeHeight", + "start": 0, + "type": "Identifier" + }, + "path": [], "start": 0, - "type": "Identifier" + "type": "Name", + "type": "Name" + }, + "operator": "+", + "right": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "hingeGap", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" }, - "path": [], "start": 0, - "type": "Name", - "type": "Name" - }, - "start": 0, - "type": "BinaryExpression", - "type": "BinaryExpression" + "type": "BinaryExpression", + "type": "BinaryExpression" + } } ], "callee": { @@ -1229,8 +1352,9 @@ description: Result of parsing makeup-mirror.kcl "commentStart": 0, "end": 0, "start": 0, - "type": "CallExpression", - "type": "CallExpression" + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null }, "start": 0, "type": "VariableDeclarator" @@ -1256,112 +1380,142 @@ description: Result of parsing makeup-mirror.kcl "init": { "arguments": [ { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { + "type": "LabeledArg", + "label": { "commentStart": 0, "end": 0, - "name": "armLength", + "name": "x", "start": 0, "type": "Identifier" }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - { - "commentStart": 0, - "end": 0, - "raw": "0", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 0.0, - "suffix": "None" + "arg": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "armLength", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" } }, { - "commentStart": 0, - "end": 0, - "left": { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "y", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "end": 0, + "raw": "0", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 0.0, + "suffix": "None" + } + } + }, + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "z", + "start": 0, + "type": "Identifier" + }, + "arg": { "commentStart": 0, "end": 0, "left": { - "abs_path": false, "commentStart": 0, "end": 0, - "name": { + "left": { + "abs_path": false, "commentStart": 0, "end": 0, - "name": "hingeHeight", + "name": { + "commentStart": 0, + "end": 0, + "name": "hingeHeight", + "start": 0, + "type": "Identifier" + }, + "path": [], "start": 0, - "type": "Identifier" + "type": "Name", + "type": "Name" + }, + "operator": "*", + "right": { + "commentStart": 0, + "end": 0, + "raw": "2", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 2.0, + "suffix": "None" + } }, - "path": [], "start": 0, - "type": "Name", - "type": "Name" + "type": "BinaryExpression", + "type": "BinaryExpression" }, - "operator": "*", + "operator": "+", "right": { "commentStart": 0, "end": 0, - "raw": "2", + "left": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "hingeGap", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + }, + "operator": "*", + "right": { + "commentStart": 0, + "end": 0, + "raw": "2", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 2.0, + "suffix": "None" + } + }, "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 2.0, - "suffix": "None" - } + "type": "BinaryExpression", + "type": "BinaryExpression" }, "start": 0, "type": "BinaryExpression", "type": "BinaryExpression" - }, - "operator": "+", - "right": { - "commentStart": 0, - "end": 0, - "left": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "hingeGap", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - "operator": "*", - "right": { - "commentStart": 0, - "end": 0, - "raw": "2", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 2.0, - "suffix": "None" - } - }, - "start": 0, - "type": "BinaryExpression", - "type": "BinaryExpression" - }, - "start": 0, - "type": "BinaryExpression", - "type": "BinaryExpression" + } } ], "callee": { @@ -1382,8 +1536,9 @@ description: Result of parsing makeup-mirror.kcl "commentStart": 0, "end": 0, "start": 0, - "type": "CallExpression", - "type": "CallExpression" + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null }, "start": 0, "type": "VariableDeclarator" @@ -1409,23 +1564,15 @@ description: Result of parsing makeup-mirror.kcl "init": { "arguments": [ { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { + "type": "LabeledArg", + "label": { "commentStart": 0, "end": 0, - "name": "armLength", + "name": "x", "start": 0, "type": "Identifier" }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - { - "argument": { + "arg": { "abs_path": false, "commentStart": 0, "end": 0, @@ -1440,28 +1587,26 @@ description: Result of parsing makeup-mirror.kcl "start": 0, "type": "Name", "type": "Name" - }, - "commentStart": 0, - "end": 0, - "operator": "-", - "start": 0, - "type": "UnaryExpression", - "type": "UnaryExpression" + } }, { - "commentStart": 0, - "end": 0, - "left": { + "type": "LabeledArg", + "label": { "commentStart": 0, "end": 0, - "left": { + "name": "y", + "start": 0, + "type": "Identifier" + }, + "arg": { + "argument": { "abs_path": false, "commentStart": 0, "end": 0, "name": { "commentStart": 0, "end": 0, - "name": "hingeHeight", + "name": "armLength", "start": 0, "type": "Identifier" }, @@ -1470,63 +1615,103 @@ description: Result of parsing makeup-mirror.kcl "type": "Name", "type": "Name" }, - "operator": "*", - "right": { - "commentStart": 0, - "end": 0, - "raw": "2", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 2.0, - "suffix": "None" - } - }, + "commentStart": 0, + "end": 0, + "operator": "-", "start": 0, - "type": "BinaryExpression", - "type": "BinaryExpression" + "type": "UnaryExpression", + "type": "UnaryExpression" + } + }, + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "z", + "start": 0, + "type": "Identifier" }, - "operator": "+", - "right": { + "arg": { "commentStart": 0, "end": 0, "left": { - "abs_path": false, "commentStart": 0, "end": 0, - "name": { + "left": { + "abs_path": false, "commentStart": 0, "end": 0, - "name": "hingeGap", + "name": { + "commentStart": 0, + "end": 0, + "name": "hingeHeight", + "start": 0, + "type": "Identifier" + }, + "path": [], "start": 0, - "type": "Identifier" + "type": "Name", + "type": "Name" + }, + "operator": "*", + "right": { + "commentStart": 0, + "end": 0, + "raw": "2", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 2.0, + "suffix": "None" + } }, - "path": [], "start": 0, - "type": "Name", - "type": "Name" + "type": "BinaryExpression", + "type": "BinaryExpression" }, - "operator": "*", + "operator": "+", "right": { "commentStart": 0, "end": 0, - "raw": "2", + "left": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "hingeGap", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + }, + "operator": "*", + "right": { + "commentStart": 0, + "end": 0, + "raw": "2", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 2.0, + "suffix": "None" + } + }, "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 2.0, - "suffix": "None" - } + "type": "BinaryExpression", + "type": "BinaryExpression" }, "start": 0, "type": "BinaryExpression", "type": "BinaryExpression" - }, - "start": 0, - "type": "BinaryExpression", - "type": "BinaryExpression" + } } ], "callee": { @@ -1547,8 +1732,9 @@ description: Result of parsing makeup-mirror.kcl "commentStart": 0, "end": 0, "start": 0, - "type": "CallExpression", - "type": "CallExpression" + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null }, "start": 0, "type": "VariableDeclarator" @@ -1574,23 +1760,15 @@ description: Result of parsing makeup-mirror.kcl "init": { "arguments": [ { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { + "type": "LabeledArg", + "label": { "commentStart": 0, "end": 0, - "name": "armLength", + "name": "x", "start": 0, "type": "Identifier" }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - { - "argument": { + "arg": { "abs_path": false, "commentStart": 0, "end": 0, @@ -1605,28 +1783,26 @@ description: Result of parsing makeup-mirror.kcl "start": 0, "type": "Name", "type": "Name" - }, - "commentStart": 0, - "end": 0, - "operator": "-", - "start": 0, - "type": "UnaryExpression", - "type": "UnaryExpression" + } }, { - "commentStart": 0, - "end": 0, - "left": { + "type": "LabeledArg", + "label": { "commentStart": 0, "end": 0, - "left": { + "name": "y", + "start": 0, + "type": "Identifier" + }, + "arg": { + "argument": { "abs_path": false, "commentStart": 0, "end": 0, "name": { "commentStart": 0, "end": 0, - "name": "hingeHeight", + "name": "armLength", "start": 0, "type": "Identifier" }, @@ -1635,63 +1811,103 @@ description: Result of parsing makeup-mirror.kcl "type": "Name", "type": "Name" }, - "operator": "*", - "right": { - "commentStart": 0, - "end": 0, - "raw": "3", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 3.0, - "suffix": "None" - } - }, + "commentStart": 0, + "end": 0, + "operator": "-", "start": 0, - "type": "BinaryExpression", - "type": "BinaryExpression" + "type": "UnaryExpression", + "type": "UnaryExpression" + } + }, + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "z", + "start": 0, + "type": "Identifier" }, - "operator": "+", - "right": { + "arg": { "commentStart": 0, "end": 0, "left": { - "abs_path": false, "commentStart": 0, "end": 0, - "name": { + "left": { + "abs_path": false, "commentStart": 0, "end": 0, - "name": "hingeGap", + "name": { + "commentStart": 0, + "end": 0, + "name": "hingeHeight", + "start": 0, + "type": "Identifier" + }, + "path": [], "start": 0, - "type": "Identifier" + "type": "Name", + "type": "Name" + }, + "operator": "*", + "right": { + "commentStart": 0, + "end": 0, + "raw": "3", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 3.0, + "suffix": "None" + } }, - "path": [], "start": 0, - "type": "Name", - "type": "Name" + "type": "BinaryExpression", + "type": "BinaryExpression" }, - "operator": "*", + "operator": "+", "right": { "commentStart": 0, "end": 0, - "raw": "3", + "left": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "hingeGap", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + }, + "operator": "*", + "right": { + "commentStart": 0, + "end": 0, + "raw": "3", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 3.0, + "suffix": "None" + } + }, "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 3.0, - "suffix": "None" - } + "type": "BinaryExpression", + "type": "BinaryExpression" }, "start": 0, "type": "BinaryExpression", "type": "BinaryExpression" - }, - "start": 0, - "type": "BinaryExpression", - "type": "BinaryExpression" + } } ], "callee": { @@ -1712,8 +1928,9 @@ description: Result of parsing makeup-mirror.kcl "commentStart": 0, "end": 0, "start": 0, - "type": "CallExpression", - "type": "CallExpression" + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null }, "start": 0, "type": "VariableDeclarator" @@ -2057,47 +2274,110 @@ description: Result of parsing makeup-mirror.kcl "init": { "arguments": [ { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { + "type": "LabeledArg", + "label": { "commentStart": 0, "end": 0, - "name": "YZ", + "name": "plane", "start": 0, "type": "Identifier" }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - { - "commentStart": 0, - "end": 0, - "raw": "0", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 0.0, - "suffix": "None" + "arg": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "YZ", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" } }, { - "commentStart": 0, - "end": 0, - "left": { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "offset", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "end": 0, + "raw": "0", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 0.0, + "suffix": "None" + } + } + }, + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "altitude", + "start": 0, + "type": "Identifier" + }, + "arg": { "commentStart": 0, "end": 0, "left": { + "commentStart": 0, + "end": 0, + "left": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "hingeHeight", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + }, + "operator": "*", + "right": { + "commentStart": 0, + "end": 0, + "raw": "1.5", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 1.5, + "suffix": "None" + } + }, + "start": 0, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "operator": "+", + "right": { "abs_path": false, "commentStart": 0, "end": 0, "name": { "commentStart": 0, "end": 0, - "name": "hingeHeight", + "name": "hingeGap", "start": 0, "type": "Identifier" }, @@ -2106,43 +2386,10 @@ description: Result of parsing makeup-mirror.kcl "type": "Name", "type": "Name" }, - "operator": "*", - "right": { - "commentStart": 0, - "end": 0, - "raw": "1.5", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 1.5, - "suffix": "None" - } - }, "start": 0, "type": "BinaryExpression", "type": "BinaryExpression" - }, - "operator": "+", - "right": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "hingeGap", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - "start": 0, - "type": "BinaryExpression", - "type": "BinaryExpression" + } } ], "callee": { @@ -2163,8 +2410,9 @@ description: Result of parsing makeup-mirror.kcl "commentStart": 0, "end": 0, "start": 0, - "type": "CallExpression", - "type": "CallExpression" + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null }, "start": 0, "type": "VariableDeclarator" @@ -2190,116 +2438,146 @@ description: Result of parsing makeup-mirror.kcl "init": { "arguments": [ { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { + "type": "LabeledArg", + "label": { "commentStart": 0, "end": 0, - "name": "XZ", + "name": "plane", "start": 0, "type": "Identifier" }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { + "arg": { + "abs_path": false, "commentStart": 0, "end": 0, - "name": "armLength", + "name": { + "commentStart": 0, + "end": 0, + "name": "XZ", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } + }, + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "offset", "start": 0, "type": "Identifier" }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" + "arg": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "armLength", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } }, { - "commentStart": 0, - "end": 0, - "left": { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "altitude", + "start": 0, + "type": "Identifier" + }, + "arg": { "commentStart": 0, "end": 0, "left": { - "abs_path": false, "commentStart": 0, "end": 0, - "name": { + "left": { + "abs_path": false, "commentStart": 0, "end": 0, - "name": "hingeHeight", + "name": { + "commentStart": 0, + "end": 0, + "name": "hingeHeight", + "start": 0, + "type": "Identifier" + }, + "path": [], "start": 0, - "type": "Identifier" + "type": "Name", + "type": "Name" + }, + "operator": "*", + "right": { + "commentStart": 0, + "end": 0, + "raw": "2.5", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 2.5, + "suffix": "None" + } }, - "path": [], "start": 0, - "type": "Name", - "type": "Name" + "type": "BinaryExpression", + "type": "BinaryExpression" }, - "operator": "*", + "operator": "+", "right": { "commentStart": 0, "end": 0, - "raw": "2.5", + "left": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "hingeGap", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + }, + "operator": "*", + "right": { + "commentStart": 0, + "end": 0, + "raw": "2", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 2.0, + "suffix": "None" + } + }, "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 2.5, - "suffix": "None" - } + "type": "BinaryExpression", + "type": "BinaryExpression" }, "start": 0, "type": "BinaryExpression", "type": "BinaryExpression" - }, - "operator": "+", - "right": { - "commentStart": 0, - "end": 0, - "left": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "hingeGap", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - "operator": "*", - "right": { - "commentStart": 0, - "end": 0, - "raw": "2", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 2.0, - "suffix": "None" - } - }, - "start": 0, - "type": "BinaryExpression", - "type": "BinaryExpression" - }, - "start": 0, - "type": "BinaryExpression", - "type": "BinaryExpression" + } } ], "callee": { @@ -2320,8 +2598,9 @@ description: Result of parsing makeup-mirror.kcl "commentStart": 0, "end": 0, "start": 0, - "type": "CallExpression", - "type": "CallExpression" + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null }, "start": 0, "type": "VariableDeclarator" @@ -3562,57 +3841,93 @@ description: Result of parsing makeup-mirror.kcl "init": { "arguments": [ { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { + "type": "LabeledArg", + "label": { "commentStart": 0, "end": 0, - "name": "XZ", + "name": "plane", "start": 0, "type": "Identifier" }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { + "arg": { + "abs_path": false, "commentStart": 0, "end": 0, - "name": "armLength", + "name": { + "commentStart": 0, + "end": 0, + "name": "XZ", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } + }, + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "offsetX", "start": 0, "type": "Identifier" }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { + "arg": { + "abs_path": false, "commentStart": 0, "end": 0, - "name": "armLength", + "name": { + "commentStart": 0, + "end": 0, + "name": "armLength", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } + }, + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "offsetY", "start": 0, "type": "Identifier" }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" + "arg": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "armLength", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } }, { - "commentStart": 0, - "end": 0, - "left": { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "altitude", + "start": 0, + "type": "Identifier" + }, + "arg": { "commentStart": 0, "end": 0, "left": { @@ -3625,33 +3940,77 @@ description: Result of parsing makeup-mirror.kcl "commentStart": 0, "end": 0, "left": { - "abs_path": false, "commentStart": 0, "end": 0, - "name": { + "left": { + "abs_path": false, "commentStart": 0, "end": 0, - "name": "hingeHeight", + "name": { + "commentStart": 0, + "end": 0, + "name": "hingeHeight", + "start": 0, + "type": "Identifier" + }, + "path": [], "start": 0, - "type": "Identifier" + "type": "Name", + "type": "Name" + }, + "operator": "*", + "right": { + "commentStart": 0, + "end": 0, + "raw": "4", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 4.0, + "suffix": "None" + } }, - "path": [], "start": 0, - "type": "Name", - "type": "Name" + "type": "BinaryExpression", + "type": "BinaryExpression" }, - "operator": "*", + "operator": "+", "right": { "commentStart": 0, "end": 0, - "raw": "4", + "left": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "hingeGap", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + }, + "operator": "*", + "right": { + "commentStart": 0, + "end": 0, + "raw": "3", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 3.0, + "suffix": "None" + } + }, "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 4.0, - "suffix": "None" - } + "type": "BinaryExpression", + "type": "BinaryExpression" }, "start": 0, "type": "BinaryExpression", @@ -3659,40 +4018,20 @@ description: Result of parsing makeup-mirror.kcl }, "operator": "+", "right": { + "abs_path": false, "commentStart": 0, "end": 0, - "left": { - "abs_path": false, + "name": { "commentStart": 0, "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "hingeGap", - "start": 0, - "type": "Identifier" - }, - "path": [], + "name": "mirrorRadius", "start": 0, - "type": "Name", - "type": "Name" - }, - "operator": "*", - "right": { - "commentStart": 0, - "end": 0, - "raw": "3", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 3.0, - "suffix": "None" - } + "type": "Identifier" }, + "path": [], "start": 0, - "type": "BinaryExpression", - "type": "BinaryExpression" + "type": "Name", + "type": "Name" }, "start": 0, "type": "BinaryExpression", @@ -3706,7 +4045,7 @@ description: Result of parsing makeup-mirror.kcl "name": { "commentStart": 0, "end": 0, - "name": "mirrorRadius", + "name": "archToMirrorGap", "start": 0, "type": "Identifier" }, @@ -3727,7 +4066,7 @@ description: Result of parsing makeup-mirror.kcl "name": { "commentStart": 0, "end": 0, - "name": "archToMirrorGap", + "name": "archThickness", "start": 0, "type": "Identifier" }, @@ -3739,9 +4078,96 @@ description: Result of parsing makeup-mirror.kcl "start": 0, "type": "BinaryExpression", "type": "BinaryExpression" + } + }, + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "radius", + "start": 0, + "type": "Identifier" }, - "operator": "+", - "right": { + "arg": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "mirrorRadius", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } + }, + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "tiefe", + "start": 0, + "type": "Identifier" + }, + "arg": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "mirrorThickness", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } + }, + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "gestellR", + "start": 0, + "type": "Identifier" + }, + "arg": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "archRadius", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } + }, + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "gestellD", + "start": 0, + "type": "Identifier" + }, + "arg": { "abs_path": false, "commentStart": 0, "end": 0, @@ -3756,74 +4182,7 @@ description: Result of parsing makeup-mirror.kcl "start": 0, "type": "Name", "type": "Name" - }, - "start": 0, - "type": "BinaryExpression", - "type": "BinaryExpression" - }, - { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "mirrorRadius", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "mirrorThickness", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "archRadius", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "archThickness", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" + } } ], "callee": { @@ -3844,8 +4203,9 @@ description: Result of parsing makeup-mirror.kcl "commentStart": 0, "end": 0, "start": 0, - "type": "CallExpression", - "type": "CallExpression" + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null }, "start": 0, "type": "VariableDeclarator" diff --git a/rust/kcl-lib/tests/kcl_samples/makeup-mirror/ops.snap b/rust/kcl-lib/tests/kcl_samples/makeup-mirror/ops.snap index 4f9393450..6e3b98f48 100644 --- a/rust/kcl-lib/tests/kcl_samples/makeup-mirror/ops.snap +++ b/rust/kcl-lib/tests/kcl_samples/makeup-mirror/ops.snap @@ -549,7 +549,56 @@ description: Operations executed makeup-mirror.kcl "name": "hingeFn", "functionSourceRange": [], "unlabeledArg": null, - "labeledArgs": {} + "labeledArgs": { + "x": { + "value": { + "type": "Number", + "value": 0.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "y": { + "value": { + "type": "Number", + "value": 0.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "z": { + "value": { + "type": "Number", + "value": 0.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + } + } }, "sourceRange": [] }, @@ -560,7 +609,56 @@ description: Operations executed makeup-mirror.kcl "name": "hingeFn", "functionSourceRange": [], "unlabeledArg": null, - "labeledArgs": {} + "labeledArgs": { + "x": { + "value": { + "type": "Number", + "value": 0.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "y": { + "value": { + "type": "Number", + "value": 0.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "z": { + "value": { + "type": "Number", + "value": 24.5, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + } + } }, "sourceRange": [] }, @@ -571,7 +669,56 @@ description: Operations executed makeup-mirror.kcl "name": "hingeFn", "functionSourceRange": [], "unlabeledArg": null, - "labeledArgs": {} + "labeledArgs": { + "x": { + "value": { + "type": "Number", + "value": 0.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "y": { + "value": { + "type": "Number", + "value": 0.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "z": { + "value": { + "type": "Number", + "value": 49.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + } + } }, "sourceRange": [] }, @@ -582,7 +729,56 @@ description: Operations executed makeup-mirror.kcl "name": "hingeFn", "functionSourceRange": [], "unlabeledArg": null, - "labeledArgs": {} + "labeledArgs": { + "x": { + "value": { + "type": "Number", + "value": 170.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "y": { + "value": { + "type": "Number", + "value": 0.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "z": { + "value": { + "type": "Number", + "value": 24.5, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + } + } }, "sourceRange": [] }, @@ -593,7 +789,56 @@ description: Operations executed makeup-mirror.kcl "name": "hingeFn", "functionSourceRange": [], "unlabeledArg": null, - "labeledArgs": {} + "labeledArgs": { + "x": { + "value": { + "type": "Number", + "value": 170.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "y": { + "value": { + "type": "Number", + "value": 0.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "z": { + "value": { + "type": "Number", + "value": 49.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + } + } }, "sourceRange": [] }, @@ -604,7 +849,56 @@ description: Operations executed makeup-mirror.kcl "name": "hingeFn", "functionSourceRange": [], "unlabeledArg": null, - "labeledArgs": {} + "labeledArgs": { + "x": { + "value": { + "type": "Number", + "value": 170.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "y": { + "value": { + "type": "Number", + "value": -170.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "z": { + "value": { + "type": "Number", + "value": 49.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + } + } }, "sourceRange": [] }, @@ -615,7 +909,56 @@ description: Operations executed makeup-mirror.kcl "name": "hingeFn", "functionSourceRange": [], "unlabeledArg": null, - "labeledArgs": {} + "labeledArgs": { + "x": { + "value": { + "type": "Number", + "value": 170.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "y": { + "value": { + "type": "Number", + "value": -170.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "z": { + "value": { + "type": "Number", + "value": 73.5, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + } + } }, "sourceRange": [] }, @@ -720,7 +1063,47 @@ description: Operations executed makeup-mirror.kcl "name": "armFn", "functionSourceRange": [], "unlabeledArg": null, - "labeledArgs": {} + "labeledArgs": { + "altitude": { + "value": { + "type": "Number", + "value": 36.5, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "offset": { + "value": { + "type": "Number", + "value": 0.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "plane": { + "value": { + "type": "Plane", + "artifact_id": "[uuid]" + }, + "sourceRange": [] + } + } }, "sourceRange": [] }, @@ -731,7 +1114,47 @@ description: Operations executed makeup-mirror.kcl "name": "armFn", "functionSourceRange": [], "unlabeledArg": null, - "labeledArgs": {} + "labeledArgs": { + "altitude": { + "value": { + "type": "Number", + "value": 61.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "offset": { + "value": { + "type": "Number", + "value": 170.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "plane": { + "value": { + "type": "Plane", + "artifact_id": "[uuid]" + }, + "sourceRange": [] + } + } }, "sourceRange": [] }, @@ -851,7 +1274,127 @@ description: Operations executed makeup-mirror.kcl "name": "mirrorFn", "functionSourceRange": [], "unlabeledArg": null, - "labeledArgs": {} + "labeledArgs": { + "altitude": { + "value": { + "type": "Number", + "value": 188.5, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "gestellD": { + "value": { + "type": "Number", + "value": 1.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "gestellR": { + "value": { + "type": "Number", + "value": 90.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "offsetX": { + "value": { + "type": "Number", + "value": 170.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "offsetY": { + "value": { + "type": "Number", + "value": 170.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "plane": { + "value": { + "type": "Plane", + "artifact_id": "[uuid]" + }, + "sourceRange": [] + }, + "radius": { + "value": { + "type": "Number", + "value": 85.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "tiefe": { + "value": { + "type": "Number", + "value": 10.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + } + } }, "sourceRange": [] }, diff --git a/rust/kcl-lib/tests/kcl_samples/mounting-plate/artifact_graph_flowchart.snap.md b/rust/kcl-lib/tests/kcl_samples/mounting-plate/artifact_graph_flowchart.snap.md index d02a033bf..d2bf428b2 100644 --- a/rust/kcl-lib/tests/kcl_samples/mounting-plate/artifact_graph_flowchart.snap.md +++ b/rust/kcl-lib/tests/kcl_samples/mounting-plate/artifact_graph_flowchart.snap.md @@ -9,32 +9,32 @@ flowchart LR 20[Solid2d] end subgraph path3 [Path] - 3["Path
[1118, 1263, 0]"] - 12["Segment
[1118, 1263, 0]"] + 3["Path
[1132, 1277, 0]"] + 12["Segment
[1132, 1277, 0]"] 19[Solid2d] end subgraph path4 [Path] - 4["Path
[1288, 1432, 0]"] - 13["Segment
[1288, 1432, 0]"] + 4["Path
[1302, 1446, 0]"] + 13["Segment
[1302, 1446, 0]"] 22[Solid2d] end subgraph path5 [Path] - 5["Path
[1457, 1603, 0]"] - 14["Segment
[1457, 1603, 0]"] + 5["Path
[1471, 1617, 0]"] + 14["Segment
[1471, 1617, 0]"] 21[Solid2d] end subgraph path6 [Path] - 6["Path
[1628, 1773, 0]"] - 15["Segment
[1628, 1773, 0]"] + 6["Path
[1642, 1787, 0]"] + 15["Segment
[1642, 1787, 0]"] 17[Solid2d] end subgraph path7 [Path] - 7["Path
[1798, 1850, 0]"] - 16["Segment
[1798, 1850, 0]"] + 7["Path
[1812, 1864, 0]"] + 16["Segment
[1812, 1864, 0]"] 18[Solid2d] end 1["Plane
[541, 558, 0]"] - 23["Sweep Extrusion
[1857, 1889, 0]"] + 23["Sweep Extrusion
[1871, 1903, 0]"] 24[Wall] 25[Wall] 26[Wall] @@ -49,10 +49,10 @@ flowchart LR 35["SweepEdge Adjacent"] 36["SweepEdge Adjacent"] 37["SweepEdge Adjacent"] - 38["EdgeCut Fillet
[1895, 2160, 0]"] - 39["EdgeCut Fillet
[1895, 2160, 0]"] - 40["EdgeCut Fillet
[1895, 2160, 0]"] - 41["EdgeCut Fillet
[1895, 2160, 0]"] + 38["EdgeCut Fillet
[1909, 2174, 0]"] + 39["EdgeCut Fillet
[1909, 2174, 0]"] + 40["EdgeCut Fillet
[1909, 2174, 0]"] + 41["EdgeCut Fillet
[1909, 2174, 0]"] 1 --- 2 1 --- 3 1 --- 4 diff --git a/rust/kcl-lib/tests/kcl_samples/mounting-plate/ast.snap b/rust/kcl-lib/tests/kcl_samples/mounting-plate/ast.snap index dbca783eb..30cdd4bbc 100644 --- a/rust/kcl-lib/tests/kcl_samples/mounting-plate/ast.snap +++ b/rust/kcl-lib/tests/kcl_samples/mounting-plate/ast.snap @@ -1273,69 +1273,99 @@ description: Result of parsing mounting-plate.kcl "init": { "arguments": [ { - "commentStart": 0, - "elements": [ - { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "pos", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "elements": [ + { + "commentStart": 0, + "end": 0, + "raw": "0", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 0.0, + "suffix": "None" + } + }, + { + "commentStart": 0, + "end": 0, + "raw": "0", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 0.0, + "suffix": "None" + } + } + ], + "end": 0, + "start": 0, + "type": "ArrayExpression", + "type": "ArrayExpression" + } + }, + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "w", + "start": 0, + "type": "Identifier" + }, + "arg": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { "commentStart": 0, "end": 0, - "raw": "0", + "name": "plateWidth", "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 0.0, - "suffix": "None" - } + "type": "Identifier" }, - { + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } + }, + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "l", + "start": 0, + "type": "Identifier" + }, + "arg": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { "commentStart": 0, "end": 0, - "raw": "0", + "name": "plateLength", "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 0.0, - "suffix": "None" - } - } - ], - "end": 0, - "start": 0, - "type": "ArrayExpression", - "type": "ArrayExpression" - }, - { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "plateWidth", + "type": "Identifier" + }, + "path": [], "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "plateLength", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" + "type": "Name", + "type": "Name" + } } ], "callee": { @@ -1356,8 +1386,9 @@ description: Result of parsing mounting-plate.kcl "commentStart": 0, "end": 0, "start": 0, - "type": "CallExpression", - "type": "CallExpression" + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null }, "start": 0, "type": "VariableDeclarator" diff --git a/rust/kcl-lib/tests/kcl_samples/mounting-plate/ops.snap b/rust/kcl-lib/tests/kcl_samples/mounting-plate/ops.snap index 535e5383c..30085d16c 100644 --- a/rust/kcl-lib/tests/kcl_samples/mounting-plate/ops.snap +++ b/rust/kcl-lib/tests/kcl_samples/mounting-plate/ops.snap @@ -25,7 +25,74 @@ description: Operations executed mounting-plate.kcl "name": "rectShape", "functionSourceRange": [], "unlabeledArg": null, - "labeledArgs": {} + "labeledArgs": { + "l": { + "value": { + "type": "Number", + "value": 10.0, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "pos": { + "value": { + "type": "Array", + "value": [ + { + "type": "Number", + "value": 0.0, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + { + "type": "Number", + "value": 0.0, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + } + ] + }, + "sourceRange": [] + }, + "w": { + "value": { + "type": "Number", + "value": 6.0, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + } + } }, "sourceRange": [] }, diff --git a/rust/kcl-lib/tests/kcl_samples/walkie-talkie/artifact_graph_flowchart.snap.md b/rust/kcl-lib/tests/kcl_samples/walkie-talkie/artifact_graph_flowchart.snap.md index 3a04bc2ff..c939454cd 100644 --- a/rust/kcl-lib/tests/kcl_samples/walkie-talkie/artifact_graph_flowchart.snap.md +++ b/rust/kcl-lib/tests/kcl_samples/walkie-talkie/artifact_graph_flowchart.snap.md @@ -183,11 +183,11 @@ flowchart LR 2["Plane
[455, 472, 10]"] 3["Plane
[957, 974, 10]"] 4["Plane
[1418, 1435, 10]"] - 5["Plane
[2557, 2574, 10]"] - 6["Plane
[2627, 2644, 10]"] - 7["Plane
[2699, 2716, 10]"] - 8["Plane
[2770, 2787, 10]"] - 9["Plane
[2841, 2858, 10]"] + 5["Plane
[2567, 2584, 10]"] + 6["Plane
[2664, 2681, 10]"] + 7["Plane
[2763, 2780, 10]"] + 8["Plane
[2861, 2878, 10]"] + 9["Plane
[2959, 2976, 10]"] 10["Plane
[307, 324, 12]"] 11["Plane
[535, 574, 12]"] 12["Plane
[238, 255, 13]"] @@ -200,7 +200,7 @@ flowchart LR 158["Sweep Extrusion
[1749, 1792, 9]"] 159["Sweep Extrusion
[2151, 2194, 9]"] 160["Sweep Extrusion
[2446, 2479, 9]"] - 161["Sweep Extrusion
[2882, 2913, 10]"] + 161["Sweep Extrusion
[3017, 3048, 10]"] 162["Sweep Loft
[914, 957, 12]"] 163["Sweep Extrusion
[591, 643, 13]"] 164["Sweep Revolve
[522, 539, 14]"] diff --git a/rust/kcl-lib/tests/loop_tag/artifact_graph_flowchart.snap.md b/rust/kcl-lib/tests/loop_tag/artifact_graph_flowchart.snap.md index 70d8a10d4..9e1bec20f 100644 --- a/rust/kcl-lib/tests/loop_tag/artifact_graph_flowchart.snap.md +++ b/rust/kcl-lib/tests/loop_tag/artifact_graph_flowchart.snap.md @@ -1,61 +1,61 @@ ```mermaid flowchart LR subgraph path2 [Path] - 2["Path
[732, 768, 0]"] - 3["Segment
[922, 986, 0]"] - 4["Segment
[922, 986, 0]"] - 5["Segment
[922, 986, 0]"] - 6["Segment
[922, 986, 0]"] - 7["Segment
[922, 986, 0]"] - 8["Segment
[922, 986, 0]"] - 9["Segment
[922, 986, 0]"] - 10["Segment
[922, 986, 0]"] - 11["Segment
[922, 986, 0]"] - 12["Segment
[922, 986, 0]"] - 13["Segment
[922, 986, 0]"] - 14["Segment
[922, 986, 0]"] - 15["Segment
[922, 986, 0]"] - 16["Segment
[922, 986, 0]"] - 17["Segment
[922, 986, 0]"] - 18["Segment
[922, 986, 0]"] - 19["Segment
[922, 986, 0]"] - 20["Segment
[922, 986, 0]"] - 21["Segment
[922, 986, 0]"] - 22["Segment
[922, 986, 0]"] - 23["Segment
[922, 986, 0]"] - 24["Segment
[922, 986, 0]"] - 25["Segment
[922, 986, 0]"] - 26["Segment
[922, 986, 0]"] - 27["Segment
[922, 986, 0]"] - 28["Segment
[922, 986, 0]"] - 29["Segment
[922, 986, 0]"] - 30["Segment
[922, 986, 0]"] - 31["Segment
[922, 986, 0]"] - 32["Segment
[922, 986, 0]"] - 33["Segment
[922, 986, 0]"] - 34["Segment
[922, 986, 0]"] - 35["Segment
[922, 986, 0]"] - 36["Segment
[922, 986, 0]"] - 37["Segment
[922, 986, 0]"] - 38["Segment
[922, 986, 0]"] - 39["Segment
[922, 986, 0]"] - 40["Segment
[922, 986, 0]"] - 41["Segment
[922, 986, 0]"] - 42["Segment
[922, 986, 0]"] - 43["Segment
[922, 986, 0]"] - 44["Segment
[922, 986, 0]"] - 45["Segment
[922, 986, 0]"] - 46["Segment
[922, 986, 0]"] - 47["Segment
[922, 986, 0]"] - 48["Segment
[922, 986, 0]"] - 49["Segment
[922, 986, 0]"] - 50["Segment
[922, 986, 0]"] - 51["Segment
[922, 986, 0]"] - 52["Segment
[1050, 1068, 0]"] + 2["Path
[733, 769, 0]"] + 3["Segment
[923, 987, 0]"] + 4["Segment
[923, 987, 0]"] + 5["Segment
[923, 987, 0]"] + 6["Segment
[923, 987, 0]"] + 7["Segment
[923, 987, 0]"] + 8["Segment
[923, 987, 0]"] + 9["Segment
[923, 987, 0]"] + 10["Segment
[923, 987, 0]"] + 11["Segment
[923, 987, 0]"] + 12["Segment
[923, 987, 0]"] + 13["Segment
[923, 987, 0]"] + 14["Segment
[923, 987, 0]"] + 15["Segment
[923, 987, 0]"] + 16["Segment
[923, 987, 0]"] + 17["Segment
[923, 987, 0]"] + 18["Segment
[923, 987, 0]"] + 19["Segment
[923, 987, 0]"] + 20["Segment
[923, 987, 0]"] + 21["Segment
[923, 987, 0]"] + 22["Segment
[923, 987, 0]"] + 23["Segment
[923, 987, 0]"] + 24["Segment
[923, 987, 0]"] + 25["Segment
[923, 987, 0]"] + 26["Segment
[923, 987, 0]"] + 27["Segment
[923, 987, 0]"] + 28["Segment
[923, 987, 0]"] + 29["Segment
[923, 987, 0]"] + 30["Segment
[923, 987, 0]"] + 31["Segment
[923, 987, 0]"] + 32["Segment
[923, 987, 0]"] + 33["Segment
[923, 987, 0]"] + 34["Segment
[923, 987, 0]"] + 35["Segment
[923, 987, 0]"] + 36["Segment
[923, 987, 0]"] + 37["Segment
[923, 987, 0]"] + 38["Segment
[923, 987, 0]"] + 39["Segment
[923, 987, 0]"] + 40["Segment
[923, 987, 0]"] + 41["Segment
[923, 987, 0]"] + 42["Segment
[923, 987, 0]"] + 43["Segment
[923, 987, 0]"] + 44["Segment
[923, 987, 0]"] + 45["Segment
[923, 987, 0]"] + 46["Segment
[923, 987, 0]"] + 47["Segment
[923, 987, 0]"] + 48["Segment
[923, 987, 0]"] + 49["Segment
[923, 987, 0]"] + 50["Segment
[923, 987, 0]"] + 51["Segment
[923, 987, 0]"] + 52["Segment
[1051, 1069, 0]"] 53[Solid2d] end - 1["Plane
[709, 726, 0]"] - 54["Sweep Extrusion
[1122, 1160, 0]"] + 1["Plane
[710, 727, 0]"] + 54["Sweep Extrusion
[1123, 1161, 0]"] 55[Wall] 56[Wall] 57[Wall] diff --git a/rust/kcl-lib/tests/loop_tag/ast.snap b/rust/kcl-lib/tests/loop_tag/ast.snap index 0e850230b..5b0641237 100644 --- a/rust/kcl-lib/tests/loop_tag/ast.snap +++ b/rust/kcl-lib/tests/loop_tag/ast.snap @@ -474,7 +474,8 @@ description: Result of parsing loop_tag.kcl "name": "index", "start": 0, "type": "Identifier" - } + }, + "labeled": false } ], "start": 0, diff --git a/rust/kcl-lib/tests/loop_tag/input.kcl b/rust/kcl-lib/tests/loop_tag/input.kcl index 4e7af6ee5..c7e1f9f0c 100644 --- a/rust/kcl-lib/tests/loop_tag/input.kcl +++ b/rust/kcl-lib/tests/loop_tag/input.kcl @@ -12,7 +12,7 @@ numSides = 50 angleIncrement = 360 / numSides // Function to calculate the coordinates of a point on the circle -fn calculatePoint(index) { +fn calculatePoint(@index) { angle = index * angleIncrement x = radius * cos(angle) y = radius * sin(angle) diff --git a/rust/kcl-lib/tests/loop_tag/program_memory.snap b/rust/kcl-lib/tests/loop_tag/program_memory.snap index a7e15b8f4..8d588bce1 100644 --- a/rust/kcl-lib/tests/loop_tag/program_memory.snap +++ b/rust/kcl-lib/tests/loop_tag/program_memory.snap @@ -35,9 +35,9 @@ description: Variables in memory after executing loop_tag.kcl 0.0 ], "tag": { - "commentStart": 970, - "end": 985, - "start": 970, + "commentStart": 971, + "end": 986, + "start": 971, "type": "TagDeclarator", "value": "problematicTag" }, @@ -60,9 +60,9 @@ description: Variables in memory after executing loop_tag.kcl 1.2533 ], "tag": { - "commentStart": 970, - "end": 985, - "start": 970, + "commentStart": 971, + "end": 986, + "start": 971, "type": "TagDeclarator", "value": "problematicTag" }, @@ -85,9 +85,9 @@ description: Variables in memory after executing loop_tag.kcl 3.7402 ], "tag": { - "commentStart": 970, - "end": 985, - "start": 970, + "commentStart": 971, + "end": 986, + "start": 971, "type": "TagDeclarator", "value": "problematicTag" }, @@ -110,9 +110,9 @@ description: Variables in memory after executing loop_tag.kcl 7.4215 ], "tag": { - "commentStart": 970, - "end": 985, - "start": 970, + "commentStart": 971, + "end": 986, + "start": 971, "type": "TagDeclarator", "value": "problematicTag" }, @@ -135,9 +135,9 @@ description: Variables in memory after executing loop_tag.kcl 12.239 ], "tag": { - "commentStart": 970, - "end": 985, - "start": 970, + "commentStart": 971, + "end": 986, + "start": 971, "type": "TagDeclarator", "value": "problematicTag" }, @@ -160,9 +160,9 @@ description: Variables in memory after executing loop_tag.kcl 18.1169 ], "tag": { - "commentStart": 970, - "end": 985, - "start": 970, + "commentStart": 971, + "end": 986, + "start": 971, "type": "TagDeclarator", "value": "problematicTag" }, @@ -185,9 +185,9 @@ description: Variables in memory after executing loop_tag.kcl 24.9623 ], "tag": { - "commentStart": 970, - "end": 985, - "start": 970, + "commentStart": 971, + "end": 986, + "start": 971, "type": "TagDeclarator", "value": "problematicTag" }, @@ -210,9 +210,9 @@ description: Variables in memory after executing loop_tag.kcl 32.6675 ], "tag": { - "commentStart": 970, - "end": 985, - "start": 970, + "commentStart": 971, + "end": 986, + "start": 971, "type": "TagDeclarator", "value": "problematicTag" }, @@ -235,9 +235,9 @@ description: Variables in memory after executing loop_tag.kcl 41.1107 ], "tag": { - "commentStart": 970, - "end": 985, - "start": 970, + "commentStart": 971, + "end": 986, + "start": 971, "type": "TagDeclarator", "value": "problematicTag" }, @@ -260,9 +260,9 @@ description: Variables in memory after executing loop_tag.kcl 50.159 ], "tag": { - "commentStart": 970, - "end": 985, - "start": 970, + "commentStart": 971, + "end": 986, + "start": 971, "type": "TagDeclarator", "value": "problematicTag" }, @@ -285,9 +285,9 @@ description: Variables in memory after executing loop_tag.kcl 59.6696 ], "tag": { - "commentStart": 970, - "end": 985, - "start": 970, + "commentStart": 971, + "end": 986, + "start": 971, "type": "TagDeclarator", "value": "problematicTag" }, @@ -310,9 +310,9 @@ description: Variables in memory after executing loop_tag.kcl 69.4925 ], "tag": { - "commentStart": 970, - "end": 985, - "start": 970, + "commentStart": 971, + "end": 986, + "start": 971, "type": "TagDeclarator", "value": "problematicTag" }, @@ -335,9 +335,9 @@ description: Variables in memory after executing loop_tag.kcl 79.4727 ], "tag": { - "commentStart": 970, - "end": 985, - "start": 970, + "commentStart": 971, + "end": 986, + "start": 971, "type": "TagDeclarator", "value": "problematicTag" }, @@ -360,9 +360,9 @@ description: Variables in memory after executing loop_tag.kcl 89.453 ], "tag": { - "commentStart": 970, - "end": 985, - "start": 970, + "commentStart": 971, + "end": 986, + "start": 971, "type": "TagDeclarator", "value": "problematicTag" }, @@ -385,9 +385,9 @@ description: Variables in memory after executing loop_tag.kcl 99.2759 ], "tag": { - "commentStart": 970, - "end": 985, - "start": 970, + "commentStart": 971, + "end": 986, + "start": 971, "type": "TagDeclarator", "value": "problematicTag" }, @@ -410,9 +410,9 @@ description: Variables in memory after executing loop_tag.kcl 108.7864 ], "tag": { - "commentStart": 970, - "end": 985, - "start": 970, + "commentStart": 971, + "end": 986, + "start": 971, "type": "TagDeclarator", "value": "problematicTag" }, @@ -435,9 +435,9 @@ description: Variables in memory after executing loop_tag.kcl 117.8347 ], "tag": { - "commentStart": 970, - "end": 985, - "start": 970, + "commentStart": 971, + "end": 986, + "start": 971, "type": "TagDeclarator", "value": "problematicTag" }, @@ -460,9 +460,9 @@ description: Variables in memory after executing loop_tag.kcl 126.278 ], "tag": { - "commentStart": 970, - "end": 985, - "start": 970, + "commentStart": 971, + "end": 986, + "start": 971, "type": "TagDeclarator", "value": "problematicTag" }, @@ -485,9 +485,9 @@ description: Variables in memory after executing loop_tag.kcl 133.9831 ], "tag": { - "commentStart": 970, - "end": 985, - "start": 970, + "commentStart": 971, + "end": 986, + "start": 971, "type": "TagDeclarator", "value": "problematicTag" }, @@ -510,9 +510,9 @@ description: Variables in memory after executing loop_tag.kcl 140.8286 ], "tag": { - "commentStart": 970, - "end": 985, - "start": 970, + "commentStart": 971, + "end": 986, + "start": 971, "type": "TagDeclarator", "value": "problematicTag" }, @@ -535,9 +535,9 @@ description: Variables in memory after executing loop_tag.kcl 146.7064 ], "tag": { - "commentStart": 970, - "end": 985, - "start": 970, + "commentStart": 971, + "end": 986, + "start": 971, "type": "TagDeclarator", "value": "problematicTag" }, @@ -560,9 +560,9 @@ description: Variables in memory after executing loop_tag.kcl 151.524 ], "tag": { - "commentStart": 970, - "end": 985, - "start": 970, + "commentStart": 971, + "end": 986, + "start": 971, "type": "TagDeclarator", "value": "problematicTag" }, @@ -585,9 +585,9 @@ description: Variables in memory after executing loop_tag.kcl 155.2052 ], "tag": { - "commentStart": 970, - "end": 985, - "start": 970, + "commentStart": 971, + "end": 986, + "start": 971, "type": "TagDeclarator", "value": "problematicTag" }, @@ -610,9 +610,9 @@ description: Variables in memory after executing loop_tag.kcl 157.6921 ], "tag": { - "commentStart": 970, - "end": 985, - "start": 970, + "commentStart": 971, + "end": 986, + "start": 971, "type": "TagDeclarator", "value": "problematicTag" }, @@ -635,9 +635,9 @@ description: Variables in memory after executing loop_tag.kcl 158.9454 ], "tag": { - "commentStart": 970, - "end": 985, - "start": 970, + "commentStart": 971, + "end": 986, + "start": 971, "type": "TagDeclarator", "value": "problematicTag" }, @@ -660,9 +660,9 @@ description: Variables in memory after executing loop_tag.kcl 158.9454 ], "tag": { - "commentStart": 970, - "end": 985, - "start": 970, + "commentStart": 971, + "end": 986, + "start": 971, "type": "TagDeclarator", "value": "problematicTag" }, @@ -685,9 +685,9 @@ description: Variables in memory after executing loop_tag.kcl 157.6921 ], "tag": { - "commentStart": 970, - "end": 985, - "start": 970, + "commentStart": 971, + "end": 986, + "start": 971, "type": "TagDeclarator", "value": "problematicTag" }, @@ -710,9 +710,9 @@ description: Variables in memory after executing loop_tag.kcl 155.2052 ], "tag": { - "commentStart": 970, - "end": 985, - "start": 970, + "commentStart": 971, + "end": 986, + "start": 971, "type": "TagDeclarator", "value": "problematicTag" }, @@ -735,9 +735,9 @@ description: Variables in memory after executing loop_tag.kcl 151.524 ], "tag": { - "commentStart": 970, - "end": 985, - "start": 970, + "commentStart": 971, + "end": 986, + "start": 971, "type": "TagDeclarator", "value": "problematicTag" }, @@ -760,9 +760,9 @@ description: Variables in memory after executing loop_tag.kcl 146.7064 ], "tag": { - "commentStart": 970, - "end": 985, - "start": 970, + "commentStart": 971, + "end": 986, + "start": 971, "type": "TagDeclarator", "value": "problematicTag" }, @@ -785,9 +785,9 @@ description: Variables in memory after executing loop_tag.kcl 140.8286 ], "tag": { - "commentStart": 970, - "end": 985, - "start": 970, + "commentStart": 971, + "end": 986, + "start": 971, "type": "TagDeclarator", "value": "problematicTag" }, @@ -810,9 +810,9 @@ description: Variables in memory after executing loop_tag.kcl 133.9831 ], "tag": { - "commentStart": 970, - "end": 985, - "start": 970, + "commentStart": 971, + "end": 986, + "start": 971, "type": "TagDeclarator", "value": "problematicTag" }, @@ -835,9 +835,9 @@ description: Variables in memory after executing loop_tag.kcl 126.278 ], "tag": { - "commentStart": 970, - "end": 985, - "start": 970, + "commentStart": 971, + "end": 986, + "start": 971, "type": "TagDeclarator", "value": "problematicTag" }, @@ -860,9 +860,9 @@ description: Variables in memory after executing loop_tag.kcl 117.8347 ], "tag": { - "commentStart": 970, - "end": 985, - "start": 970, + "commentStart": 971, + "end": 986, + "start": 971, "type": "TagDeclarator", "value": "problematicTag" }, @@ -885,9 +885,9 @@ description: Variables in memory after executing loop_tag.kcl 108.7864 ], "tag": { - "commentStart": 970, - "end": 985, - "start": 970, + "commentStart": 971, + "end": 986, + "start": 971, "type": "TagDeclarator", "value": "problematicTag" }, @@ -910,9 +910,9 @@ description: Variables in memory after executing loop_tag.kcl 99.2759 ], "tag": { - "commentStart": 970, - "end": 985, - "start": 970, + "commentStart": 971, + "end": 986, + "start": 971, "type": "TagDeclarator", "value": "problematicTag" }, @@ -935,9 +935,9 @@ description: Variables in memory after executing loop_tag.kcl 89.453 ], "tag": { - "commentStart": 970, - "end": 985, - "start": 970, + "commentStart": 971, + "end": 986, + "start": 971, "type": "TagDeclarator", "value": "problematicTag" }, @@ -960,9 +960,9 @@ description: Variables in memory after executing loop_tag.kcl 79.4727 ], "tag": { - "commentStart": 970, - "end": 985, - "start": 970, + "commentStart": 971, + "end": 986, + "start": 971, "type": "TagDeclarator", "value": "problematicTag" }, @@ -985,9 +985,9 @@ description: Variables in memory after executing loop_tag.kcl 69.4925 ], "tag": { - "commentStart": 970, - "end": 985, - "start": 970, + "commentStart": 971, + "end": 986, + "start": 971, "type": "TagDeclarator", "value": "problematicTag" }, @@ -1010,9 +1010,9 @@ description: Variables in memory after executing loop_tag.kcl 59.6696 ], "tag": { - "commentStart": 970, - "end": 985, - "start": 970, + "commentStart": 971, + "end": 986, + "start": 971, "type": "TagDeclarator", "value": "problematicTag" }, @@ -1035,9 +1035,9 @@ description: Variables in memory after executing loop_tag.kcl 50.159 ], "tag": { - "commentStart": 970, - "end": 985, - "start": 970, + "commentStart": 971, + "end": 986, + "start": 971, "type": "TagDeclarator", "value": "problematicTag" }, @@ -1060,9 +1060,9 @@ description: Variables in memory after executing loop_tag.kcl 41.1107 ], "tag": { - "commentStart": 970, - "end": 985, - "start": 970, + "commentStart": 971, + "end": 986, + "start": 971, "type": "TagDeclarator", "value": "problematicTag" }, @@ -1085,9 +1085,9 @@ description: Variables in memory after executing loop_tag.kcl 32.6675 ], "tag": { - "commentStart": 970, - "end": 985, - "start": 970, + "commentStart": 971, + "end": 986, + "start": 971, "type": "TagDeclarator", "value": "problematicTag" }, @@ -1110,9 +1110,9 @@ description: Variables in memory after executing loop_tag.kcl 24.9623 ], "tag": { - "commentStart": 970, - "end": 985, - "start": 970, + "commentStart": 971, + "end": 986, + "start": 971, "type": "TagDeclarator", "value": "problematicTag" }, @@ -1135,9 +1135,9 @@ description: Variables in memory after executing loop_tag.kcl 18.1169 ], "tag": { - "commentStart": 970, - "end": 985, - "start": 970, + "commentStart": 971, + "end": 986, + "start": 971, "type": "TagDeclarator", "value": "problematicTag" }, @@ -1160,9 +1160,9 @@ description: Variables in memory after executing loop_tag.kcl 12.239 ], "tag": { - "commentStart": 970, - "end": 985, - "start": 970, + "commentStart": 971, + "end": 986, + "start": 971, "type": "TagDeclarator", "value": "problematicTag" }, @@ -1185,9 +1185,9 @@ description: Variables in memory after executing loop_tag.kcl 7.4215 ], "tag": { - "commentStart": 970, - "end": 985, - "start": 970, + "commentStart": 971, + "end": 986, + "start": 971, "type": "TagDeclarator", "value": "problematicTag" }, @@ -1210,9 +1210,9 @@ description: Variables in memory after executing loop_tag.kcl 3.7402 ], "tag": { - "commentStart": 970, - "end": 985, - "start": 970, + "commentStart": 971, + "end": 986, + "start": 971, "type": "TagDeclarator", "value": "problematicTag" }, @@ -1235,9 +1235,9 @@ description: Variables in memory after executing loop_tag.kcl 1.2533 ], "tag": { - "commentStart": 970, - "end": 985, - "start": 970, + "commentStart": 971, + "end": 986, + "start": 971, "type": "TagDeclarator", "value": "problematicTag" }, @@ -1343,9 +1343,9 @@ description: Variables in memory after executing loop_tag.kcl "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 970, - "end": 985, - "start": 970, + "commentStart": 971, + "end": 986, + "start": 971, "type": "TagDeclarator", "value": "problematicTag" }, @@ -1356,9 +1356,9 @@ description: Variables in memory after executing loop_tag.kcl "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 970, - "end": 985, - "start": 970, + "commentStart": 971, + "end": 986, + "start": 971, "type": "TagDeclarator", "value": "problematicTag" }, @@ -1369,9 +1369,9 @@ description: Variables in memory after executing loop_tag.kcl "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 970, - "end": 985, - "start": 970, + "commentStart": 971, + "end": 986, + "start": 971, "type": "TagDeclarator", "value": "problematicTag" }, @@ -1382,9 +1382,9 @@ description: Variables in memory after executing loop_tag.kcl "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 970, - "end": 985, - "start": 970, + "commentStart": 971, + "end": 986, + "start": 971, "type": "TagDeclarator", "value": "problematicTag" }, @@ -1395,9 +1395,9 @@ description: Variables in memory after executing loop_tag.kcl "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 970, - "end": 985, - "start": 970, + "commentStart": 971, + "end": 986, + "start": 971, "type": "TagDeclarator", "value": "problematicTag" }, @@ -1408,9 +1408,9 @@ description: Variables in memory after executing loop_tag.kcl "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 970, - "end": 985, - "start": 970, + "commentStart": 971, + "end": 986, + "start": 971, "type": "TagDeclarator", "value": "problematicTag" }, @@ -1421,9 +1421,9 @@ description: Variables in memory after executing loop_tag.kcl "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 970, - "end": 985, - "start": 970, + "commentStart": 971, + "end": 986, + "start": 971, "type": "TagDeclarator", "value": "problematicTag" }, @@ -1434,9 +1434,9 @@ description: Variables in memory after executing loop_tag.kcl "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 970, - "end": 985, - "start": 970, + "commentStart": 971, + "end": 986, + "start": 971, "type": "TagDeclarator", "value": "problematicTag" }, @@ -1447,9 +1447,9 @@ description: Variables in memory after executing loop_tag.kcl "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 970, - "end": 985, - "start": 970, + "commentStart": 971, + "end": 986, + "start": 971, "type": "TagDeclarator", "value": "problematicTag" }, @@ -1460,9 +1460,9 @@ description: Variables in memory after executing loop_tag.kcl "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 970, - "end": 985, - "start": 970, + "commentStart": 971, + "end": 986, + "start": 971, "type": "TagDeclarator", "value": "problematicTag" }, @@ -1473,9 +1473,9 @@ description: Variables in memory after executing loop_tag.kcl "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 970, - "end": 985, - "start": 970, + "commentStart": 971, + "end": 986, + "start": 971, "type": "TagDeclarator", "value": "problematicTag" }, @@ -1486,9 +1486,9 @@ description: Variables in memory after executing loop_tag.kcl "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 970, - "end": 985, - "start": 970, + "commentStart": 971, + "end": 986, + "start": 971, "type": "TagDeclarator", "value": "problematicTag" }, @@ -1499,9 +1499,9 @@ description: Variables in memory after executing loop_tag.kcl "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 970, - "end": 985, - "start": 970, + "commentStart": 971, + "end": 986, + "start": 971, "type": "TagDeclarator", "value": "problematicTag" }, @@ -1512,9 +1512,9 @@ description: Variables in memory after executing loop_tag.kcl "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 970, - "end": 985, - "start": 970, + "commentStart": 971, + "end": 986, + "start": 971, "type": "TagDeclarator", "value": "problematicTag" }, @@ -1525,9 +1525,9 @@ description: Variables in memory after executing loop_tag.kcl "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 970, - "end": 985, - "start": 970, + "commentStart": 971, + "end": 986, + "start": 971, "type": "TagDeclarator", "value": "problematicTag" }, @@ -1538,9 +1538,9 @@ description: Variables in memory after executing loop_tag.kcl "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 970, - "end": 985, - "start": 970, + "commentStart": 971, + "end": 986, + "start": 971, "type": "TagDeclarator", "value": "problematicTag" }, @@ -1551,9 +1551,9 @@ description: Variables in memory after executing loop_tag.kcl "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 970, - "end": 985, - "start": 970, + "commentStart": 971, + "end": 986, + "start": 971, "type": "TagDeclarator", "value": "problematicTag" }, @@ -1564,9 +1564,9 @@ description: Variables in memory after executing loop_tag.kcl "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 970, - "end": 985, - "start": 970, + "commentStart": 971, + "end": 986, + "start": 971, "type": "TagDeclarator", "value": "problematicTag" }, @@ -1577,9 +1577,9 @@ description: Variables in memory after executing loop_tag.kcl "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 970, - "end": 985, - "start": 970, + "commentStart": 971, + "end": 986, + "start": 971, "type": "TagDeclarator", "value": "problematicTag" }, @@ -1590,9 +1590,9 @@ description: Variables in memory after executing loop_tag.kcl "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 970, - "end": 985, - "start": 970, + "commentStart": 971, + "end": 986, + "start": 971, "type": "TagDeclarator", "value": "problematicTag" }, @@ -1603,9 +1603,9 @@ description: Variables in memory after executing loop_tag.kcl "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 970, - "end": 985, - "start": 970, + "commentStart": 971, + "end": 986, + "start": 971, "type": "TagDeclarator", "value": "problematicTag" }, @@ -1616,9 +1616,9 @@ description: Variables in memory after executing loop_tag.kcl "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 970, - "end": 985, - "start": 970, + "commentStart": 971, + "end": 986, + "start": 971, "type": "TagDeclarator", "value": "problematicTag" }, @@ -1629,9 +1629,9 @@ description: Variables in memory after executing loop_tag.kcl "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 970, - "end": 985, - "start": 970, + "commentStart": 971, + "end": 986, + "start": 971, "type": "TagDeclarator", "value": "problematicTag" }, @@ -1642,9 +1642,9 @@ description: Variables in memory after executing loop_tag.kcl "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 970, - "end": 985, - "start": 970, + "commentStart": 971, + "end": 986, + "start": 971, "type": "TagDeclarator", "value": "problematicTag" }, @@ -1655,9 +1655,9 @@ description: Variables in memory after executing loop_tag.kcl "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 970, - "end": 985, - "start": 970, + "commentStart": 971, + "end": 986, + "start": 971, "type": "TagDeclarator", "value": "problematicTag" }, @@ -1668,9 +1668,9 @@ description: Variables in memory after executing loop_tag.kcl "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 970, - "end": 985, - "start": 970, + "commentStart": 971, + "end": 986, + "start": 971, "type": "TagDeclarator", "value": "problematicTag" }, @@ -1681,9 +1681,9 @@ description: Variables in memory after executing loop_tag.kcl "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 970, - "end": 985, - "start": 970, + "commentStart": 971, + "end": 986, + "start": 971, "type": "TagDeclarator", "value": "problematicTag" }, @@ -1694,9 +1694,9 @@ description: Variables in memory after executing loop_tag.kcl "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 970, - "end": 985, - "start": 970, + "commentStart": 971, + "end": 986, + "start": 971, "type": "TagDeclarator", "value": "problematicTag" }, @@ -1707,9 +1707,9 @@ description: Variables in memory after executing loop_tag.kcl "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 970, - "end": 985, - "start": 970, + "commentStart": 971, + "end": 986, + "start": 971, "type": "TagDeclarator", "value": "problematicTag" }, @@ -1720,9 +1720,9 @@ description: Variables in memory after executing loop_tag.kcl "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 970, - "end": 985, - "start": 970, + "commentStart": 971, + "end": 986, + "start": 971, "type": "TagDeclarator", "value": "problematicTag" }, @@ -1733,9 +1733,9 @@ description: Variables in memory after executing loop_tag.kcl "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 970, - "end": 985, - "start": 970, + "commentStart": 971, + "end": 986, + "start": 971, "type": "TagDeclarator", "value": "problematicTag" }, @@ -1746,9 +1746,9 @@ description: Variables in memory after executing loop_tag.kcl "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 970, - "end": 985, - "start": 970, + "commentStart": 971, + "end": 986, + "start": 971, "type": "TagDeclarator", "value": "problematicTag" }, @@ -1759,9 +1759,9 @@ description: Variables in memory after executing loop_tag.kcl "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 970, - "end": 985, - "start": 970, + "commentStart": 971, + "end": 986, + "start": 971, "type": "TagDeclarator", "value": "problematicTag" }, @@ -1772,9 +1772,9 @@ description: Variables in memory after executing loop_tag.kcl "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 970, - "end": 985, - "start": 970, + "commentStart": 971, + "end": 986, + "start": 971, "type": "TagDeclarator", "value": "problematicTag" }, @@ -1785,9 +1785,9 @@ description: Variables in memory after executing loop_tag.kcl "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 970, - "end": 985, - "start": 970, + "commentStart": 971, + "end": 986, + "start": 971, "type": "TagDeclarator", "value": "problematicTag" }, @@ -1798,9 +1798,9 @@ description: Variables in memory after executing loop_tag.kcl "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 970, - "end": 985, - "start": 970, + "commentStart": 971, + "end": 986, + "start": 971, "type": "TagDeclarator", "value": "problematicTag" }, @@ -1811,9 +1811,9 @@ description: Variables in memory after executing loop_tag.kcl "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 970, - "end": 985, - "start": 970, + "commentStart": 971, + "end": 986, + "start": 971, "type": "TagDeclarator", "value": "problematicTag" }, @@ -1824,9 +1824,9 @@ description: Variables in memory after executing loop_tag.kcl "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 970, - "end": 985, - "start": 970, + "commentStart": 971, + "end": 986, + "start": 971, "type": "TagDeclarator", "value": "problematicTag" }, @@ -1837,9 +1837,9 @@ description: Variables in memory after executing loop_tag.kcl "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 970, - "end": 985, - "start": 970, + "commentStart": 971, + "end": 986, + "start": 971, "type": "TagDeclarator", "value": "problematicTag" }, @@ -1850,9 +1850,9 @@ description: Variables in memory after executing loop_tag.kcl "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 970, - "end": 985, - "start": 970, + "commentStart": 971, + "end": 986, + "start": 971, "type": "TagDeclarator", "value": "problematicTag" }, @@ -1863,9 +1863,9 @@ description: Variables in memory after executing loop_tag.kcl "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 970, - "end": 985, - "start": 970, + "commentStart": 971, + "end": 986, + "start": 971, "type": "TagDeclarator", "value": "problematicTag" }, @@ -1876,9 +1876,9 @@ description: Variables in memory after executing loop_tag.kcl "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 970, - "end": 985, - "start": 970, + "commentStart": 971, + "end": 986, + "start": 971, "type": "TagDeclarator", "value": "problematicTag" }, @@ -1889,9 +1889,9 @@ description: Variables in memory after executing loop_tag.kcl "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 970, - "end": 985, - "start": 970, + "commentStart": 971, + "end": 986, + "start": 971, "type": "TagDeclarator", "value": "problematicTag" }, @@ -1902,9 +1902,9 @@ description: Variables in memory after executing loop_tag.kcl "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 970, - "end": 985, - "start": 970, + "commentStart": 971, + "end": 986, + "start": 971, "type": "TagDeclarator", "value": "problematicTag" }, @@ -1915,9 +1915,9 @@ description: Variables in memory after executing loop_tag.kcl "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 970, - "end": 985, - "start": 970, + "commentStart": 971, + "end": 986, + "start": 971, "type": "TagDeclarator", "value": "problematicTag" }, @@ -1928,9 +1928,9 @@ description: Variables in memory after executing loop_tag.kcl "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 970, - "end": 985, - "start": 970, + "commentStart": 971, + "end": 986, + "start": 971, "type": "TagDeclarator", "value": "problematicTag" }, @@ -1941,9 +1941,9 @@ description: Variables in memory after executing loop_tag.kcl "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 970, - "end": 985, - "start": 970, + "commentStart": 971, + "end": 986, + "start": 971, "type": "TagDeclarator", "value": "problematicTag" }, @@ -1954,9 +1954,9 @@ description: Variables in memory after executing loop_tag.kcl "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 970, - "end": 985, - "start": 970, + "commentStart": 971, + "end": 986, + "start": 971, "type": "TagDeclarator", "value": "problematicTag" }, @@ -1967,9 +1967,9 @@ description: Variables in memory after executing loop_tag.kcl "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 970, - "end": 985, - "start": 970, + "commentStart": 971, + "end": 986, + "start": 971, "type": "TagDeclarator", "value": "problematicTag" }, @@ -1997,9 +1997,9 @@ description: Variables in memory after executing loop_tag.kcl 0.0 ], "tag": { - "commentStart": 970, - "end": 985, - "start": 970, + "commentStart": 971, + "end": 986, + "start": 971, "type": "TagDeclarator", "value": "problematicTag" }, @@ -2022,9 +2022,9 @@ description: Variables in memory after executing loop_tag.kcl 1.2533 ], "tag": { - "commentStart": 970, - "end": 985, - "start": 970, + "commentStart": 971, + "end": 986, + "start": 971, "type": "TagDeclarator", "value": "problematicTag" }, @@ -2047,9 +2047,9 @@ description: Variables in memory after executing loop_tag.kcl 3.7402 ], "tag": { - "commentStart": 970, - "end": 985, - "start": 970, + "commentStart": 971, + "end": 986, + "start": 971, "type": "TagDeclarator", "value": "problematicTag" }, @@ -2072,9 +2072,9 @@ description: Variables in memory after executing loop_tag.kcl 7.4215 ], "tag": { - "commentStart": 970, - "end": 985, - "start": 970, + "commentStart": 971, + "end": 986, + "start": 971, "type": "TagDeclarator", "value": "problematicTag" }, @@ -2097,9 +2097,9 @@ description: Variables in memory after executing loop_tag.kcl 12.239 ], "tag": { - "commentStart": 970, - "end": 985, - "start": 970, + "commentStart": 971, + "end": 986, + "start": 971, "type": "TagDeclarator", "value": "problematicTag" }, @@ -2122,9 +2122,9 @@ description: Variables in memory after executing loop_tag.kcl 18.1169 ], "tag": { - "commentStart": 970, - "end": 985, - "start": 970, + "commentStart": 971, + "end": 986, + "start": 971, "type": "TagDeclarator", "value": "problematicTag" }, @@ -2147,9 +2147,9 @@ description: Variables in memory after executing loop_tag.kcl 24.9623 ], "tag": { - "commentStart": 970, - "end": 985, - "start": 970, + "commentStart": 971, + "end": 986, + "start": 971, "type": "TagDeclarator", "value": "problematicTag" }, @@ -2172,9 +2172,9 @@ description: Variables in memory after executing loop_tag.kcl 32.6675 ], "tag": { - "commentStart": 970, - "end": 985, - "start": 970, + "commentStart": 971, + "end": 986, + "start": 971, "type": "TagDeclarator", "value": "problematicTag" }, @@ -2197,9 +2197,9 @@ description: Variables in memory after executing loop_tag.kcl 41.1107 ], "tag": { - "commentStart": 970, - "end": 985, - "start": 970, + "commentStart": 971, + "end": 986, + "start": 971, "type": "TagDeclarator", "value": "problematicTag" }, @@ -2222,9 +2222,9 @@ description: Variables in memory after executing loop_tag.kcl 50.159 ], "tag": { - "commentStart": 970, - "end": 985, - "start": 970, + "commentStart": 971, + "end": 986, + "start": 971, "type": "TagDeclarator", "value": "problematicTag" }, @@ -2247,9 +2247,9 @@ description: Variables in memory after executing loop_tag.kcl 59.6696 ], "tag": { - "commentStart": 970, - "end": 985, - "start": 970, + "commentStart": 971, + "end": 986, + "start": 971, "type": "TagDeclarator", "value": "problematicTag" }, @@ -2272,9 +2272,9 @@ description: Variables in memory after executing loop_tag.kcl 69.4925 ], "tag": { - "commentStart": 970, - "end": 985, - "start": 970, + "commentStart": 971, + "end": 986, + "start": 971, "type": "TagDeclarator", "value": "problematicTag" }, @@ -2297,9 +2297,9 @@ description: Variables in memory after executing loop_tag.kcl 79.4727 ], "tag": { - "commentStart": 970, - "end": 985, - "start": 970, + "commentStart": 971, + "end": 986, + "start": 971, "type": "TagDeclarator", "value": "problematicTag" }, @@ -2322,9 +2322,9 @@ description: Variables in memory after executing loop_tag.kcl 89.453 ], "tag": { - "commentStart": 970, - "end": 985, - "start": 970, + "commentStart": 971, + "end": 986, + "start": 971, "type": "TagDeclarator", "value": "problematicTag" }, @@ -2347,9 +2347,9 @@ description: Variables in memory after executing loop_tag.kcl 99.2759 ], "tag": { - "commentStart": 970, - "end": 985, - "start": 970, + "commentStart": 971, + "end": 986, + "start": 971, "type": "TagDeclarator", "value": "problematicTag" }, @@ -2372,9 +2372,9 @@ description: Variables in memory after executing loop_tag.kcl 108.7864 ], "tag": { - "commentStart": 970, - "end": 985, - "start": 970, + "commentStart": 971, + "end": 986, + "start": 971, "type": "TagDeclarator", "value": "problematicTag" }, @@ -2397,9 +2397,9 @@ description: Variables in memory after executing loop_tag.kcl 117.8347 ], "tag": { - "commentStart": 970, - "end": 985, - "start": 970, + "commentStart": 971, + "end": 986, + "start": 971, "type": "TagDeclarator", "value": "problematicTag" }, @@ -2422,9 +2422,9 @@ description: Variables in memory after executing loop_tag.kcl 126.278 ], "tag": { - "commentStart": 970, - "end": 985, - "start": 970, + "commentStart": 971, + "end": 986, + "start": 971, "type": "TagDeclarator", "value": "problematicTag" }, @@ -2447,9 +2447,9 @@ description: Variables in memory after executing loop_tag.kcl 133.9831 ], "tag": { - "commentStart": 970, - "end": 985, - "start": 970, + "commentStart": 971, + "end": 986, + "start": 971, "type": "TagDeclarator", "value": "problematicTag" }, @@ -2472,9 +2472,9 @@ description: Variables in memory after executing loop_tag.kcl 140.8286 ], "tag": { - "commentStart": 970, - "end": 985, - "start": 970, + "commentStart": 971, + "end": 986, + "start": 971, "type": "TagDeclarator", "value": "problematicTag" }, @@ -2497,9 +2497,9 @@ description: Variables in memory after executing loop_tag.kcl 146.7064 ], "tag": { - "commentStart": 970, - "end": 985, - "start": 970, + "commentStart": 971, + "end": 986, + "start": 971, "type": "TagDeclarator", "value": "problematicTag" }, @@ -2522,9 +2522,9 @@ description: Variables in memory after executing loop_tag.kcl 151.524 ], "tag": { - "commentStart": 970, - "end": 985, - "start": 970, + "commentStart": 971, + "end": 986, + "start": 971, "type": "TagDeclarator", "value": "problematicTag" }, @@ -2547,9 +2547,9 @@ description: Variables in memory after executing loop_tag.kcl 155.2052 ], "tag": { - "commentStart": 970, - "end": 985, - "start": 970, + "commentStart": 971, + "end": 986, + "start": 971, "type": "TagDeclarator", "value": "problematicTag" }, @@ -2572,9 +2572,9 @@ description: Variables in memory after executing loop_tag.kcl 157.6921 ], "tag": { - "commentStart": 970, - "end": 985, - "start": 970, + "commentStart": 971, + "end": 986, + "start": 971, "type": "TagDeclarator", "value": "problematicTag" }, @@ -2597,9 +2597,9 @@ description: Variables in memory after executing loop_tag.kcl 158.9454 ], "tag": { - "commentStart": 970, - "end": 985, - "start": 970, + "commentStart": 971, + "end": 986, + "start": 971, "type": "TagDeclarator", "value": "problematicTag" }, @@ -2622,9 +2622,9 @@ description: Variables in memory after executing loop_tag.kcl 158.9454 ], "tag": { - "commentStart": 970, - "end": 985, - "start": 970, + "commentStart": 971, + "end": 986, + "start": 971, "type": "TagDeclarator", "value": "problematicTag" }, @@ -2647,9 +2647,9 @@ description: Variables in memory after executing loop_tag.kcl 157.6921 ], "tag": { - "commentStart": 970, - "end": 985, - "start": 970, + "commentStart": 971, + "end": 986, + "start": 971, "type": "TagDeclarator", "value": "problematicTag" }, @@ -2672,9 +2672,9 @@ description: Variables in memory after executing loop_tag.kcl 155.2052 ], "tag": { - "commentStart": 970, - "end": 985, - "start": 970, + "commentStart": 971, + "end": 986, + "start": 971, "type": "TagDeclarator", "value": "problematicTag" }, @@ -2697,9 +2697,9 @@ description: Variables in memory after executing loop_tag.kcl 151.524 ], "tag": { - "commentStart": 970, - "end": 985, - "start": 970, + "commentStart": 971, + "end": 986, + "start": 971, "type": "TagDeclarator", "value": "problematicTag" }, @@ -2722,9 +2722,9 @@ description: Variables in memory after executing loop_tag.kcl 146.7064 ], "tag": { - "commentStart": 970, - "end": 985, - "start": 970, + "commentStart": 971, + "end": 986, + "start": 971, "type": "TagDeclarator", "value": "problematicTag" }, @@ -2747,9 +2747,9 @@ description: Variables in memory after executing loop_tag.kcl 140.8286 ], "tag": { - "commentStart": 970, - "end": 985, - "start": 970, + "commentStart": 971, + "end": 986, + "start": 971, "type": "TagDeclarator", "value": "problematicTag" }, @@ -2772,9 +2772,9 @@ description: Variables in memory after executing loop_tag.kcl 133.9831 ], "tag": { - "commentStart": 970, - "end": 985, - "start": 970, + "commentStart": 971, + "end": 986, + "start": 971, "type": "TagDeclarator", "value": "problematicTag" }, @@ -2797,9 +2797,9 @@ description: Variables in memory after executing loop_tag.kcl 126.278 ], "tag": { - "commentStart": 970, - "end": 985, - "start": 970, + "commentStart": 971, + "end": 986, + "start": 971, "type": "TagDeclarator", "value": "problematicTag" }, @@ -2822,9 +2822,9 @@ description: Variables in memory after executing loop_tag.kcl 117.8347 ], "tag": { - "commentStart": 970, - "end": 985, - "start": 970, + "commentStart": 971, + "end": 986, + "start": 971, "type": "TagDeclarator", "value": "problematicTag" }, @@ -2847,9 +2847,9 @@ description: Variables in memory after executing loop_tag.kcl 108.7864 ], "tag": { - "commentStart": 970, - "end": 985, - "start": 970, + "commentStart": 971, + "end": 986, + "start": 971, "type": "TagDeclarator", "value": "problematicTag" }, @@ -2872,9 +2872,9 @@ description: Variables in memory after executing loop_tag.kcl 99.2759 ], "tag": { - "commentStart": 970, - "end": 985, - "start": 970, + "commentStart": 971, + "end": 986, + "start": 971, "type": "TagDeclarator", "value": "problematicTag" }, @@ -2897,9 +2897,9 @@ description: Variables in memory after executing loop_tag.kcl 89.453 ], "tag": { - "commentStart": 970, - "end": 985, - "start": 970, + "commentStart": 971, + "end": 986, + "start": 971, "type": "TagDeclarator", "value": "problematicTag" }, @@ -2922,9 +2922,9 @@ description: Variables in memory after executing loop_tag.kcl 79.4727 ], "tag": { - "commentStart": 970, - "end": 985, - "start": 970, + "commentStart": 971, + "end": 986, + "start": 971, "type": "TagDeclarator", "value": "problematicTag" }, @@ -2947,9 +2947,9 @@ description: Variables in memory after executing loop_tag.kcl 69.4925 ], "tag": { - "commentStart": 970, - "end": 985, - "start": 970, + "commentStart": 971, + "end": 986, + "start": 971, "type": "TagDeclarator", "value": "problematicTag" }, @@ -2972,9 +2972,9 @@ description: Variables in memory after executing loop_tag.kcl 59.6696 ], "tag": { - "commentStart": 970, - "end": 985, - "start": 970, + "commentStart": 971, + "end": 986, + "start": 971, "type": "TagDeclarator", "value": "problematicTag" }, @@ -2997,9 +2997,9 @@ description: Variables in memory after executing loop_tag.kcl 50.159 ], "tag": { - "commentStart": 970, - "end": 985, - "start": 970, + "commentStart": 971, + "end": 986, + "start": 971, "type": "TagDeclarator", "value": "problematicTag" }, @@ -3022,9 +3022,9 @@ description: Variables in memory after executing loop_tag.kcl 41.1107 ], "tag": { - "commentStart": 970, - "end": 985, - "start": 970, + "commentStart": 971, + "end": 986, + "start": 971, "type": "TagDeclarator", "value": "problematicTag" }, @@ -3047,9 +3047,9 @@ description: Variables in memory after executing loop_tag.kcl 32.6675 ], "tag": { - "commentStart": 970, - "end": 985, - "start": 970, + "commentStart": 971, + "end": 986, + "start": 971, "type": "TagDeclarator", "value": "problematicTag" }, @@ -3072,9 +3072,9 @@ description: Variables in memory after executing loop_tag.kcl 24.9623 ], "tag": { - "commentStart": 970, - "end": 985, - "start": 970, + "commentStart": 971, + "end": 986, + "start": 971, "type": "TagDeclarator", "value": "problematicTag" }, @@ -3097,9 +3097,9 @@ description: Variables in memory after executing loop_tag.kcl 18.1169 ], "tag": { - "commentStart": 970, - "end": 985, - "start": 970, + "commentStart": 971, + "end": 986, + "start": 971, "type": "TagDeclarator", "value": "problematicTag" }, @@ -3122,9 +3122,9 @@ description: Variables in memory after executing loop_tag.kcl 12.239 ], "tag": { - "commentStart": 970, - "end": 985, - "start": 970, + "commentStart": 971, + "end": 986, + "start": 971, "type": "TagDeclarator", "value": "problematicTag" }, @@ -3147,9 +3147,9 @@ description: Variables in memory after executing loop_tag.kcl 7.4215 ], "tag": { - "commentStart": 970, - "end": 985, - "start": 970, + "commentStart": 971, + "end": 986, + "start": 971, "type": "TagDeclarator", "value": "problematicTag" }, @@ -3172,9 +3172,9 @@ description: Variables in memory after executing loop_tag.kcl 3.7402 ], "tag": { - "commentStart": 970, - "end": 985, - "start": 970, + "commentStart": 971, + "end": 986, + "start": 971, "type": "TagDeclarator", "value": "problematicTag" }, @@ -3197,9 +3197,9 @@ description: Variables in memory after executing loop_tag.kcl 1.2533 ], "tag": { - "commentStart": 970, - "end": 985, - "start": 970, + "commentStart": 971, + "end": 986, + "start": 971, "type": "TagDeclarator", "value": "problematicTag" }, @@ -3317,9 +3317,9 @@ description: Variables in memory after executing loop_tag.kcl 0.0 ], "tag": { - "commentStart": 970, - "end": 985, - "start": 970, + "commentStart": 971, + "end": 986, + "start": 971, "type": "TagDeclarator", "value": "problematicTag" }, @@ -3342,9 +3342,9 @@ description: Variables in memory after executing loop_tag.kcl 1.2533 ], "tag": { - "commentStart": 970, - "end": 985, - "start": 970, + "commentStart": 971, + "end": 986, + "start": 971, "type": "TagDeclarator", "value": "problematicTag" }, @@ -3367,9 +3367,9 @@ description: Variables in memory after executing loop_tag.kcl 3.7402 ], "tag": { - "commentStart": 970, - "end": 985, - "start": 970, + "commentStart": 971, + "end": 986, + "start": 971, "type": "TagDeclarator", "value": "problematicTag" }, @@ -3392,9 +3392,9 @@ description: Variables in memory after executing loop_tag.kcl 7.4215 ], "tag": { - "commentStart": 970, - "end": 985, - "start": 970, + "commentStart": 971, + "end": 986, + "start": 971, "type": "TagDeclarator", "value": "problematicTag" }, @@ -3417,9 +3417,9 @@ description: Variables in memory after executing loop_tag.kcl 12.239 ], "tag": { - "commentStart": 970, - "end": 985, - "start": 970, + "commentStart": 971, + "end": 986, + "start": 971, "type": "TagDeclarator", "value": "problematicTag" }, @@ -3442,9 +3442,9 @@ description: Variables in memory after executing loop_tag.kcl 18.1169 ], "tag": { - "commentStart": 970, - "end": 985, - "start": 970, + "commentStart": 971, + "end": 986, + "start": 971, "type": "TagDeclarator", "value": "problematicTag" }, @@ -3467,9 +3467,9 @@ description: Variables in memory after executing loop_tag.kcl 24.9623 ], "tag": { - "commentStart": 970, - "end": 985, - "start": 970, + "commentStart": 971, + "end": 986, + "start": 971, "type": "TagDeclarator", "value": "problematicTag" }, @@ -3492,9 +3492,9 @@ description: Variables in memory after executing loop_tag.kcl 32.6675 ], "tag": { - "commentStart": 970, - "end": 985, - "start": 970, + "commentStart": 971, + "end": 986, + "start": 971, "type": "TagDeclarator", "value": "problematicTag" }, @@ -3517,9 +3517,9 @@ description: Variables in memory after executing loop_tag.kcl 41.1107 ], "tag": { - "commentStart": 970, - "end": 985, - "start": 970, + "commentStart": 971, + "end": 986, + "start": 971, "type": "TagDeclarator", "value": "problematicTag" }, @@ -3542,9 +3542,9 @@ description: Variables in memory after executing loop_tag.kcl 50.159 ], "tag": { - "commentStart": 970, - "end": 985, - "start": 970, + "commentStart": 971, + "end": 986, + "start": 971, "type": "TagDeclarator", "value": "problematicTag" }, @@ -3567,9 +3567,9 @@ description: Variables in memory after executing loop_tag.kcl 59.6696 ], "tag": { - "commentStart": 970, - "end": 985, - "start": 970, + "commentStart": 971, + "end": 986, + "start": 971, "type": "TagDeclarator", "value": "problematicTag" }, @@ -3592,9 +3592,9 @@ description: Variables in memory after executing loop_tag.kcl 69.4925 ], "tag": { - "commentStart": 970, - "end": 985, - "start": 970, + "commentStart": 971, + "end": 986, + "start": 971, "type": "TagDeclarator", "value": "problematicTag" }, @@ -3617,9 +3617,9 @@ description: Variables in memory after executing loop_tag.kcl 79.4727 ], "tag": { - "commentStart": 970, - "end": 985, - "start": 970, + "commentStart": 971, + "end": 986, + "start": 971, "type": "TagDeclarator", "value": "problematicTag" }, @@ -3642,9 +3642,9 @@ description: Variables in memory after executing loop_tag.kcl 89.453 ], "tag": { - "commentStart": 970, - "end": 985, - "start": 970, + "commentStart": 971, + "end": 986, + "start": 971, "type": "TagDeclarator", "value": "problematicTag" }, @@ -3667,9 +3667,9 @@ description: Variables in memory after executing loop_tag.kcl 99.2759 ], "tag": { - "commentStart": 970, - "end": 985, - "start": 970, + "commentStart": 971, + "end": 986, + "start": 971, "type": "TagDeclarator", "value": "problematicTag" }, @@ -3692,9 +3692,9 @@ description: Variables in memory after executing loop_tag.kcl 108.7864 ], "tag": { - "commentStart": 970, - "end": 985, - "start": 970, + "commentStart": 971, + "end": 986, + "start": 971, "type": "TagDeclarator", "value": "problematicTag" }, @@ -3717,9 +3717,9 @@ description: Variables in memory after executing loop_tag.kcl 117.8347 ], "tag": { - "commentStart": 970, - "end": 985, - "start": 970, + "commentStart": 971, + "end": 986, + "start": 971, "type": "TagDeclarator", "value": "problematicTag" }, @@ -3742,9 +3742,9 @@ description: Variables in memory after executing loop_tag.kcl 126.278 ], "tag": { - "commentStart": 970, - "end": 985, - "start": 970, + "commentStart": 971, + "end": 986, + "start": 971, "type": "TagDeclarator", "value": "problematicTag" }, @@ -3767,9 +3767,9 @@ description: Variables in memory after executing loop_tag.kcl 133.9831 ], "tag": { - "commentStart": 970, - "end": 985, - "start": 970, + "commentStart": 971, + "end": 986, + "start": 971, "type": "TagDeclarator", "value": "problematicTag" }, @@ -3792,9 +3792,9 @@ description: Variables in memory after executing loop_tag.kcl 140.8286 ], "tag": { - "commentStart": 970, - "end": 985, - "start": 970, + "commentStart": 971, + "end": 986, + "start": 971, "type": "TagDeclarator", "value": "problematicTag" }, @@ -3817,9 +3817,9 @@ description: Variables in memory after executing loop_tag.kcl 146.7064 ], "tag": { - "commentStart": 970, - "end": 985, - "start": 970, + "commentStart": 971, + "end": 986, + "start": 971, "type": "TagDeclarator", "value": "problematicTag" }, @@ -3842,9 +3842,9 @@ description: Variables in memory after executing loop_tag.kcl 151.524 ], "tag": { - "commentStart": 970, - "end": 985, - "start": 970, + "commentStart": 971, + "end": 986, + "start": 971, "type": "TagDeclarator", "value": "problematicTag" }, @@ -3867,9 +3867,9 @@ description: Variables in memory after executing loop_tag.kcl 155.2052 ], "tag": { - "commentStart": 970, - "end": 985, - "start": 970, + "commentStart": 971, + "end": 986, + "start": 971, "type": "TagDeclarator", "value": "problematicTag" }, @@ -3892,9 +3892,9 @@ description: Variables in memory after executing loop_tag.kcl 157.6921 ], "tag": { - "commentStart": 970, - "end": 985, - "start": 970, + "commentStart": 971, + "end": 986, + "start": 971, "type": "TagDeclarator", "value": "problematicTag" }, @@ -3917,9 +3917,9 @@ description: Variables in memory after executing loop_tag.kcl 158.9454 ], "tag": { - "commentStart": 970, - "end": 985, - "start": 970, + "commentStart": 971, + "end": 986, + "start": 971, "type": "TagDeclarator", "value": "problematicTag" }, @@ -3942,9 +3942,9 @@ description: Variables in memory after executing loop_tag.kcl 158.9454 ], "tag": { - "commentStart": 970, - "end": 985, - "start": 970, + "commentStart": 971, + "end": 986, + "start": 971, "type": "TagDeclarator", "value": "problematicTag" }, @@ -3967,9 +3967,9 @@ description: Variables in memory after executing loop_tag.kcl 157.6921 ], "tag": { - "commentStart": 970, - "end": 985, - "start": 970, + "commentStart": 971, + "end": 986, + "start": 971, "type": "TagDeclarator", "value": "problematicTag" }, @@ -3992,9 +3992,9 @@ description: Variables in memory after executing loop_tag.kcl 155.2052 ], "tag": { - "commentStart": 970, - "end": 985, - "start": 970, + "commentStart": 971, + "end": 986, + "start": 971, "type": "TagDeclarator", "value": "problematicTag" }, @@ -4017,9 +4017,9 @@ description: Variables in memory after executing loop_tag.kcl 151.524 ], "tag": { - "commentStart": 970, - "end": 985, - "start": 970, + "commentStart": 971, + "end": 986, + "start": 971, "type": "TagDeclarator", "value": "problematicTag" }, @@ -4042,9 +4042,9 @@ description: Variables in memory after executing loop_tag.kcl 146.7064 ], "tag": { - "commentStart": 970, - "end": 985, - "start": 970, + "commentStart": 971, + "end": 986, + "start": 971, "type": "TagDeclarator", "value": "problematicTag" }, @@ -4067,9 +4067,9 @@ description: Variables in memory after executing loop_tag.kcl 140.8286 ], "tag": { - "commentStart": 970, - "end": 985, - "start": 970, + "commentStart": 971, + "end": 986, + "start": 971, "type": "TagDeclarator", "value": "problematicTag" }, @@ -4092,9 +4092,9 @@ description: Variables in memory after executing loop_tag.kcl 133.9831 ], "tag": { - "commentStart": 970, - "end": 985, - "start": 970, + "commentStart": 971, + "end": 986, + "start": 971, "type": "TagDeclarator", "value": "problematicTag" }, @@ -4117,9 +4117,9 @@ description: Variables in memory after executing loop_tag.kcl 126.278 ], "tag": { - "commentStart": 970, - "end": 985, - "start": 970, + "commentStart": 971, + "end": 986, + "start": 971, "type": "TagDeclarator", "value": "problematicTag" }, @@ -4142,9 +4142,9 @@ description: Variables in memory after executing loop_tag.kcl 117.8347 ], "tag": { - "commentStart": 970, - "end": 985, - "start": 970, + "commentStart": 971, + "end": 986, + "start": 971, "type": "TagDeclarator", "value": "problematicTag" }, @@ -4167,9 +4167,9 @@ description: Variables in memory after executing loop_tag.kcl 108.7864 ], "tag": { - "commentStart": 970, - "end": 985, - "start": 970, + "commentStart": 971, + "end": 986, + "start": 971, "type": "TagDeclarator", "value": "problematicTag" }, @@ -4192,9 +4192,9 @@ description: Variables in memory after executing loop_tag.kcl 99.2759 ], "tag": { - "commentStart": 970, - "end": 985, - "start": 970, + "commentStart": 971, + "end": 986, + "start": 971, "type": "TagDeclarator", "value": "problematicTag" }, @@ -4217,9 +4217,9 @@ description: Variables in memory after executing loop_tag.kcl 89.453 ], "tag": { - "commentStart": 970, - "end": 985, - "start": 970, + "commentStart": 971, + "end": 986, + "start": 971, "type": "TagDeclarator", "value": "problematicTag" }, @@ -4242,9 +4242,9 @@ description: Variables in memory after executing loop_tag.kcl 79.4727 ], "tag": { - "commentStart": 970, - "end": 985, - "start": 970, + "commentStart": 971, + "end": 986, + "start": 971, "type": "TagDeclarator", "value": "problematicTag" }, @@ -4267,9 +4267,9 @@ description: Variables in memory after executing loop_tag.kcl 69.4925 ], "tag": { - "commentStart": 970, - "end": 985, - "start": 970, + "commentStart": 971, + "end": 986, + "start": 971, "type": "TagDeclarator", "value": "problematicTag" }, @@ -4292,9 +4292,9 @@ description: Variables in memory after executing loop_tag.kcl 59.6696 ], "tag": { - "commentStart": 970, - "end": 985, - "start": 970, + "commentStart": 971, + "end": 986, + "start": 971, "type": "TagDeclarator", "value": "problematicTag" }, @@ -4317,9 +4317,9 @@ description: Variables in memory after executing loop_tag.kcl 50.159 ], "tag": { - "commentStart": 970, - "end": 985, - "start": 970, + "commentStart": 971, + "end": 986, + "start": 971, "type": "TagDeclarator", "value": "problematicTag" }, @@ -4342,9 +4342,9 @@ description: Variables in memory after executing loop_tag.kcl 41.1107 ], "tag": { - "commentStart": 970, - "end": 985, - "start": 970, + "commentStart": 971, + "end": 986, + "start": 971, "type": "TagDeclarator", "value": "problematicTag" }, @@ -4367,9 +4367,9 @@ description: Variables in memory after executing loop_tag.kcl 32.6675 ], "tag": { - "commentStart": 970, - "end": 985, - "start": 970, + "commentStart": 971, + "end": 986, + "start": 971, "type": "TagDeclarator", "value": "problematicTag" }, @@ -4392,9 +4392,9 @@ description: Variables in memory after executing loop_tag.kcl 24.9623 ], "tag": { - "commentStart": 970, - "end": 985, - "start": 970, + "commentStart": 971, + "end": 986, + "start": 971, "type": "TagDeclarator", "value": "problematicTag" }, @@ -4417,9 +4417,9 @@ description: Variables in memory after executing loop_tag.kcl 18.1169 ], "tag": { - "commentStart": 970, - "end": 985, - "start": 970, + "commentStart": 971, + "end": 986, + "start": 971, "type": "TagDeclarator", "value": "problematicTag" }, @@ -4442,9 +4442,9 @@ description: Variables in memory after executing loop_tag.kcl 12.239 ], "tag": { - "commentStart": 970, - "end": 985, - "start": 970, + "commentStart": 971, + "end": 986, + "start": 971, "type": "TagDeclarator", "value": "problematicTag" }, @@ -4467,9 +4467,9 @@ description: Variables in memory after executing loop_tag.kcl 7.4215 ], "tag": { - "commentStart": 970, - "end": 985, - "start": 970, + "commentStart": 971, + "end": 986, + "start": 971, "type": "TagDeclarator", "value": "problematicTag" }, @@ -4492,9 +4492,9 @@ description: Variables in memory after executing loop_tag.kcl 3.7402 ], "tag": { - "commentStart": 970, - "end": 985, - "start": 970, + "commentStart": 971, + "end": 986, + "start": 971, "type": "TagDeclarator", "value": "problematicTag" }, @@ -4517,9 +4517,9 @@ description: Variables in memory after executing loop_tag.kcl 1.2533 ], "tag": { - "commentStart": 970, - "end": 985, - "start": 970, + "commentStart": 971, + "end": 986, + "start": 971, "type": "TagDeclarator", "value": "problematicTag" }, diff --git a/rust/kcl-lib/tests/loop_tag/unparsed.snap b/rust/kcl-lib/tests/loop_tag/unparsed.snap index 369b68bae..f85f36e00 100644 --- a/rust/kcl-lib/tests/loop_tag/unparsed.snap +++ b/rust/kcl-lib/tests/loop_tag/unparsed.snap @@ -19,7 +19,7 @@ numSides = 50 angleIncrement = 360 / numSides // Function to calculate the coordinates of a point on the circle -fn calculatePoint(index) { +fn calculatePoint(@index) { angle = index * angleIncrement x = radius * cos(angle) y = radius * sin(angle) diff --git a/rust/kcl-lib/tests/misc/cube.kcl b/rust/kcl-lib/tests/misc/cube.kcl new file mode 100644 index 000000000..af78b233d --- /dev/null +++ b/rust/kcl-lib/tests/misc/cube.kcl @@ -0,0 +1,22 @@ +@settings(defaultLengthUnit = mm) + +fn cube(sideLength, center) { + l = sideLength / 2 + x = center[0] + y = center[1] + p0 = [-l + x, -l + y] + p1 = [-l + x, l + y] + p2 = [l + x, l + y] + p3 = [l + x, -l + y] + + return startSketchOn(XY) + |> startProfile(at = p0) + |> line(endAbsolute = p1) + |> line(endAbsolute = p2) + |> line(endAbsolute = p3) + |> line(endAbsolute = p0) + |> close() + |> extrude(length = sideLength) +} + +myCube = cube(sideLength = 40, center = [0, 0]) diff --git a/rust/kcl-lib/tests/multi_transform/artifact_graph_flowchart.snap.md b/rust/kcl-lib/tests/multi_transform/artifact_graph_flowchart.snap.md index c2e0ce920..9f89ac3ca 100644 --- a/rust/kcl-lib/tests/multi_transform/artifact_graph_flowchart.snap.md +++ b/rust/kcl-lib/tests/multi_transform/artifact_graph_flowchart.snap.md @@ -1,19 +1,19 @@ ```mermaid flowchart LR subgraph path2 [Path] - 2["Path
[132, 157, 0]"] + 2["Path
[133, 158, 0]"] end subgraph path3 [Path] - 3["Path
[163, 269, 0]"] - 4["Segment
[163, 269, 0]"] - 5["Segment
[163, 269, 0]"] - 6["Segment
[163, 269, 0]"] - 7["Segment
[163, 269, 0]"] - 8["Segment
[163, 269, 0]"] + 3["Path
[164, 270, 0]"] + 4["Segment
[164, 270, 0]"] + 5["Segment
[164, 270, 0]"] + 6["Segment
[164, 270, 0]"] + 7["Segment
[164, 270, 0]"] + 8["Segment
[164, 270, 0]"] 9[Solid2d] end - 1["Plane
[109, 126, 0]"] - 10["Sweep Extrusion
[275, 294, 0]"] + 1["Plane
[110, 127, 0]"] + 10["Sweep Extrusion
[276, 295, 0]"] 11[Wall] 12[Wall] 13[Wall] diff --git a/rust/kcl-lib/tests/multi_transform/ast.snap b/rust/kcl-lib/tests/multi_transform/ast.snap index 2f5183e48..1763a21a7 100644 --- a/rust/kcl-lib/tests/multi_transform/ast.snap +++ b/rust/kcl-lib/tests/multi_transform/ast.snap @@ -223,7 +223,8 @@ description: Result of parsing multi_transform.kcl "name": "i", "start": 0, "type": "Identifier" - } + }, + "labeled": false } ], "start": 0, diff --git a/rust/kcl-lib/tests/multi_transform/input.kcl b/rust/kcl-lib/tests/multi_transform/input.kcl index 351d57b37..d3b4679ac 100644 --- a/rust/kcl-lib/tests/multi_transform/input.kcl +++ b/rust/kcl-lib/tests/multi_transform/input.kcl @@ -1,4 +1,4 @@ -fn transform(i) { +fn transform(@i) { return [ { translate = [30 * i, 0, 0] }, { rotation = { angle = 45 * i } } diff --git a/rust/kcl-lib/tests/multi_transform/unparsed.snap b/rust/kcl-lib/tests/multi_transform/unparsed.snap index acc908239..68881b7f6 100644 --- a/rust/kcl-lib/tests/multi_transform/unparsed.snap +++ b/rust/kcl-lib/tests/multi_transform/unparsed.snap @@ -2,7 +2,7 @@ source: kcl-lib/src/simulation_tests.rs description: Result of unparsing multi_transform.kcl --- -fn transform(i) { +fn transform(@i) { return [ { translate = [30 * i, 0, 0] }, { rotation = { angle = 45 * i } } diff --git a/rust/kcl-lib/tests/outputs/serial_test_example_angle_to_match_length_x0.png b/rust/kcl-lib/tests/outputs/serial_test_example_angle_to_match_length_x0.png deleted file mode 100644 index 5e10b3a04..000000000 Binary files a/rust/kcl-lib/tests/outputs/serial_test_example_angle_to_match_length_x0.png and /dev/null differ diff --git a/rust/kcl-lib/tests/outputs/serial_test_example_angle_to_match_length_y0.png b/rust/kcl-lib/tests/outputs/serial_test_example_angle_to_match_length_y0.png deleted file mode 100644 index 01ba6d038..000000000 Binary files a/rust/kcl-lib/tests/outputs/serial_test_example_angle_to_match_length_y0.png and /dev/null differ diff --git a/rust/kcl-lib/tests/outputs/serial_test_example_angled_line_of_x_length0.png b/rust/kcl-lib/tests/outputs/serial_test_example_angled_line_of_x_length0.png deleted file mode 100644 index c9a36c911..000000000 Binary files a/rust/kcl-lib/tests/outputs/serial_test_example_angled_line_of_x_length0.png and /dev/null differ diff --git a/rust/kcl-lib/tests/outputs/serial_test_example_angled_line_of_y_length0.png b/rust/kcl-lib/tests/outputs/serial_test_example_angled_line_of_y_length0.png deleted file mode 100644 index 7fe8900e6..000000000 Binary files a/rust/kcl-lib/tests/outputs/serial_test_example_angled_line_of_y_length0.png and /dev/null differ diff --git a/rust/kcl-lib/tests/outputs/serial_test_example_angled_line_to_x0.png b/rust/kcl-lib/tests/outputs/serial_test_example_angled_line_to_x0.png deleted file mode 100644 index 5c056bc06..000000000 Binary files a/rust/kcl-lib/tests/outputs/serial_test_example_angled_line_to_x0.png and /dev/null differ diff --git a/rust/kcl-lib/tests/outputs/serial_test_example_angled_line_to_y0.png b/rust/kcl-lib/tests/outputs/serial_test_example_angled_line_to_y0.png deleted file mode 100644 index c6d65c6bd..000000000 Binary files a/rust/kcl-lib/tests/outputs/serial_test_example_angled_line_to_y0.png and /dev/null differ diff --git a/rust/kcl-lib/tests/outputs/serial_test_example_assert_gt0.png b/rust/kcl-lib/tests/outputs/serial_test_example_assert_gt0.png deleted file mode 100644 index 6148ae432..000000000 Binary files a/rust/kcl-lib/tests/outputs/serial_test_example_assert_gt0.png and /dev/null differ diff --git a/rust/kcl-lib/tests/outputs/serial_test_example_assert_gte0.png b/rust/kcl-lib/tests/outputs/serial_test_example_assert_gte0.png deleted file mode 100644 index 6148ae432..000000000 Binary files a/rust/kcl-lib/tests/outputs/serial_test_example_assert_gte0.png and /dev/null differ diff --git a/rust/kcl-lib/tests/outputs/serial_test_example_assert_lt0.png b/rust/kcl-lib/tests/outputs/serial_test_example_assert_lt0.png deleted file mode 100644 index 6148ae432..000000000 Binary files a/rust/kcl-lib/tests/outputs/serial_test_example_assert_lt0.png and /dev/null differ diff --git a/rust/kcl-lib/tests/outputs/serial_test_example_assert_lte0.png b/rust/kcl-lib/tests/outputs/serial_test_example_assert_lte0.png deleted file mode 100644 index 6148ae432..000000000 Binary files a/rust/kcl-lib/tests/outputs/serial_test_example_assert_lte0.png and /dev/null differ diff --git a/rust/kcl-lib/tests/outputs/serial_test_example_assert_order0.png b/rust/kcl-lib/tests/outputs/serial_test_example_assert_order0.png deleted file mode 100644 index 6148ae432..000000000 Binary files a/rust/kcl-lib/tests/outputs/serial_test_example_assert_order0.png and /dev/null differ diff --git a/rust/kcl-lib/tests/outputs/serial_test_example_atan0.png b/rust/kcl-lib/tests/outputs/serial_test_example_atan0.png deleted file mode 100644 index b6db63cd5..000000000 Binary files a/rust/kcl-lib/tests/outputs/serial_test_example_atan0.png and /dev/null differ diff --git a/rust/kcl-lib/tests/outputs/serial_test_example_e0.png b/rust/kcl-lib/tests/outputs/serial_test_example_e0.png deleted file mode 100644 index 5c79e062e..000000000 Binary files a/rust/kcl-lib/tests/outputs/serial_test_example_e0.png and /dev/null differ diff --git a/rust/kcl-lib/tests/outputs/serial_test_example_std-helix0.png b/rust/kcl-lib/tests/outputs/serial_test_example_fn_std-helix0.png similarity index 100% rename from rust/kcl-lib/tests/outputs/serial_test_example_std-helix0.png rename to rust/kcl-lib/tests/outputs/serial_test_example_fn_std-helix0.png diff --git a/rust/kcl-lib/tests/outputs/serial_test_example_std-helix1.png b/rust/kcl-lib/tests/outputs/serial_test_example_fn_std-helix1.png similarity index 100% rename from rust/kcl-lib/tests/outputs/serial_test_example_std-helix1.png rename to rust/kcl-lib/tests/outputs/serial_test_example_fn_std-helix1.png diff --git a/rust/kcl-lib/tests/outputs/serial_test_example_std-helix2.png b/rust/kcl-lib/tests/outputs/serial_test_example_fn_std-helix2.png similarity index 100% rename from rust/kcl-lib/tests/outputs/serial_test_example_std-helix2.png rename to rust/kcl-lib/tests/outputs/serial_test_example_fn_std-helix2.png diff --git a/rust/kcl-lib/tests/outputs/serial_test_example_std-helix3.png b/rust/kcl-lib/tests/outputs/serial_test_example_fn_std-helix3.png similarity index 100% rename from rust/kcl-lib/tests/outputs/serial_test_example_std-helix3.png rename to rust/kcl-lib/tests/outputs/serial_test_example_fn_std-helix3.png diff --git a/rust/kcl-lib/tests/outputs/serial_test_example_std-math-abs0.png b/rust/kcl-lib/tests/outputs/serial_test_example_fn_std-math-abs0.png similarity index 100% rename from rust/kcl-lib/tests/outputs/serial_test_example_std-math-abs0.png rename to rust/kcl-lib/tests/outputs/serial_test_example_fn_std-math-abs0.png diff --git a/rust/kcl-lib/tests/outputs/serial_test_example_std-math-acos0.png b/rust/kcl-lib/tests/outputs/serial_test_example_fn_std-math-acos0.png similarity index 100% rename from rust/kcl-lib/tests/outputs/serial_test_example_std-math-acos0.png rename to rust/kcl-lib/tests/outputs/serial_test_example_fn_std-math-acos0.png diff --git a/rust/kcl-lib/tests/outputs/serial_test_example_std-math-asin0.png b/rust/kcl-lib/tests/outputs/serial_test_example_fn_std-math-asin0.png similarity index 100% rename from rust/kcl-lib/tests/outputs/serial_test_example_std-math-asin0.png rename to rust/kcl-lib/tests/outputs/serial_test_example_fn_std-math-asin0.png diff --git a/rust/kcl-lib/tests/outputs/serial_test_example_std-math-atan20.png b/rust/kcl-lib/tests/outputs/serial_test_example_fn_std-math-atan20.png similarity index 100% rename from rust/kcl-lib/tests/outputs/serial_test_example_std-math-atan20.png rename to rust/kcl-lib/tests/outputs/serial_test_example_fn_std-math-atan20.png diff --git a/rust/kcl-lib/tests/outputs/serial_test_example_std-math-ceil0.png b/rust/kcl-lib/tests/outputs/serial_test_example_fn_std-math-ceil0.png similarity index 100% rename from rust/kcl-lib/tests/outputs/serial_test_example_std-math-ceil0.png rename to rust/kcl-lib/tests/outputs/serial_test_example_fn_std-math-ceil0.png diff --git a/rust/kcl-lib/tests/outputs/serial_test_example_std-math-cos0.png b/rust/kcl-lib/tests/outputs/serial_test_example_fn_std-math-cos0.png similarity index 100% rename from rust/kcl-lib/tests/outputs/serial_test_example_std-math-cos0.png rename to rust/kcl-lib/tests/outputs/serial_test_example_fn_std-math-cos0.png diff --git a/rust/kcl-lib/tests/outputs/serial_test_example_std-math-floor0.png b/rust/kcl-lib/tests/outputs/serial_test_example_fn_std-math-floor0.png similarity index 100% rename from rust/kcl-lib/tests/outputs/serial_test_example_std-math-floor0.png rename to rust/kcl-lib/tests/outputs/serial_test_example_fn_std-math-floor0.png diff --git a/rust/kcl-lib/tests/outputs/serial_test_example_std-math-ln0.png b/rust/kcl-lib/tests/outputs/serial_test_example_fn_std-math-ln0.png similarity index 100% rename from rust/kcl-lib/tests/outputs/serial_test_example_std-math-ln0.png rename to rust/kcl-lib/tests/outputs/serial_test_example_fn_std-math-ln0.png diff --git a/rust/kcl-lib/tests/outputs/serial_test_example_std-math-log0.png b/rust/kcl-lib/tests/outputs/serial_test_example_fn_std-math-log0.png similarity index 100% rename from rust/kcl-lib/tests/outputs/serial_test_example_std-math-log0.png rename to rust/kcl-lib/tests/outputs/serial_test_example_fn_std-math-log0.png diff --git a/rust/kcl-lib/tests/outputs/serial_test_example_std-math-log100.png b/rust/kcl-lib/tests/outputs/serial_test_example_fn_std-math-log100.png similarity index 100% rename from rust/kcl-lib/tests/outputs/serial_test_example_std-math-log100.png rename to rust/kcl-lib/tests/outputs/serial_test_example_fn_std-math-log100.png diff --git a/rust/kcl-lib/tests/outputs/serial_test_example_std-math-log20.png b/rust/kcl-lib/tests/outputs/serial_test_example_fn_std-math-log20.png similarity index 100% rename from rust/kcl-lib/tests/outputs/serial_test_example_std-math-log20.png rename to rust/kcl-lib/tests/outputs/serial_test_example_fn_std-math-log20.png diff --git a/rust/kcl-lib/tests/outputs/serial_test_example_std-math-max0.png b/rust/kcl-lib/tests/outputs/serial_test_example_fn_std-math-max0.png similarity index 100% rename from rust/kcl-lib/tests/outputs/serial_test_example_std-math-max0.png rename to rust/kcl-lib/tests/outputs/serial_test_example_fn_std-math-max0.png diff --git a/rust/kcl-lib/tests/outputs/serial_test_example_std-math-min0.png b/rust/kcl-lib/tests/outputs/serial_test_example_fn_std-math-min0.png similarity index 100% rename from rust/kcl-lib/tests/outputs/serial_test_example_std-math-min0.png rename to rust/kcl-lib/tests/outputs/serial_test_example_fn_std-math-min0.png diff --git a/rust/kcl-lib/tests/outputs/serial_test_example_std-math-polar0.png b/rust/kcl-lib/tests/outputs/serial_test_example_fn_std-math-polar0.png similarity index 100% rename from rust/kcl-lib/tests/outputs/serial_test_example_std-math-polar0.png rename to rust/kcl-lib/tests/outputs/serial_test_example_fn_std-math-polar0.png diff --git a/rust/kcl-lib/tests/outputs/serial_test_example_std-math-pow0.png b/rust/kcl-lib/tests/outputs/serial_test_example_fn_std-math-pow0.png similarity index 100% rename from rust/kcl-lib/tests/outputs/serial_test_example_std-math-pow0.png rename to rust/kcl-lib/tests/outputs/serial_test_example_fn_std-math-pow0.png diff --git a/rust/kcl-lib/tests/outputs/serial_test_example_Sketch1.png b/rust/kcl-lib/tests/outputs/serial_test_example_fn_std-math-rem0.png similarity index 100% rename from rust/kcl-lib/tests/outputs/serial_test_example_Sketch1.png rename to rust/kcl-lib/tests/outputs/serial_test_example_fn_std-math-rem0.png diff --git a/rust/kcl-lib/tests/outputs/serial_test_example_std-math-round0.png b/rust/kcl-lib/tests/outputs/serial_test_example_fn_std-math-round0.png similarity index 100% rename from rust/kcl-lib/tests/outputs/serial_test_example_std-math-round0.png rename to rust/kcl-lib/tests/outputs/serial_test_example_fn_std-math-round0.png diff --git a/rust/kcl-lib/tests/outputs/serial_test_example_std-math-sin0.png b/rust/kcl-lib/tests/outputs/serial_test_example_fn_std-math-sin0.png similarity index 100% rename from rust/kcl-lib/tests/outputs/serial_test_example_std-math-sin0.png rename to rust/kcl-lib/tests/outputs/serial_test_example_fn_std-math-sin0.png diff --git a/rust/kcl-lib/tests/outputs/serial_test_example_std-math-sqrt0.png b/rust/kcl-lib/tests/outputs/serial_test_example_fn_std-math-sqrt0.png similarity index 100% rename from rust/kcl-lib/tests/outputs/serial_test_example_std-math-sqrt0.png rename to rust/kcl-lib/tests/outputs/serial_test_example_fn_std-math-sqrt0.png diff --git a/rust/kcl-lib/tests/outputs/serial_test_example_std-math-tan0.png b/rust/kcl-lib/tests/outputs/serial_test_example_fn_std-math-tan0.png similarity index 100% rename from rust/kcl-lib/tests/outputs/serial_test_example_std-math-tan0.png rename to rust/kcl-lib/tests/outputs/serial_test_example_fn_std-math-tan0.png diff --git a/rust/kcl-lib/tests/outputs/serial_test_example_std-offsetPlane0.png b/rust/kcl-lib/tests/outputs/serial_test_example_fn_std-offsetPlane0.png similarity index 100% rename from rust/kcl-lib/tests/outputs/serial_test_example_std-offsetPlane0.png rename to rust/kcl-lib/tests/outputs/serial_test_example_fn_std-offsetPlane0.png diff --git a/rust/kcl-lib/tests/outputs/serial_test_example_std-offsetPlane1.png b/rust/kcl-lib/tests/outputs/serial_test_example_fn_std-offsetPlane1.png similarity index 100% rename from rust/kcl-lib/tests/outputs/serial_test_example_std-offsetPlane1.png rename to rust/kcl-lib/tests/outputs/serial_test_example_fn_std-offsetPlane1.png diff --git a/rust/kcl-lib/tests/outputs/serial_test_example_std-offsetPlane2.png b/rust/kcl-lib/tests/outputs/serial_test_example_fn_std-offsetPlane2.png similarity index 100% rename from rust/kcl-lib/tests/outputs/serial_test_example_std-offsetPlane2.png rename to rust/kcl-lib/tests/outputs/serial_test_example_fn_std-offsetPlane2.png diff --git a/rust/kcl-lib/tests/outputs/serial_test_example_std-offsetPlane3.png b/rust/kcl-lib/tests/outputs/serial_test_example_fn_std-offsetPlane3.png similarity index 100% rename from rust/kcl-lib/tests/outputs/serial_test_example_std-offsetPlane3.png rename to rust/kcl-lib/tests/outputs/serial_test_example_fn_std-offsetPlane3.png diff --git a/rust/kcl-lib/tests/outputs/serial_test_example_std-offsetPlane4.png b/rust/kcl-lib/tests/outputs/serial_test_example_fn_std-offsetPlane4.png similarity index 100% rename from rust/kcl-lib/tests/outputs/serial_test_example_std-offsetPlane4.png rename to rust/kcl-lib/tests/outputs/serial_test_example_fn_std-offsetPlane4.png diff --git a/rust/kcl-lib/tests/outputs/serial_test_example_std-revolve0.png b/rust/kcl-lib/tests/outputs/serial_test_example_fn_std-revolve0.png similarity index 100% rename from rust/kcl-lib/tests/outputs/serial_test_example_std-revolve0.png rename to rust/kcl-lib/tests/outputs/serial_test_example_fn_std-revolve0.png diff --git a/rust/kcl-lib/tests/outputs/serial_test_example_std-revolve1.png b/rust/kcl-lib/tests/outputs/serial_test_example_fn_std-revolve1.png similarity index 100% rename from rust/kcl-lib/tests/outputs/serial_test_example_std-revolve1.png rename to rust/kcl-lib/tests/outputs/serial_test_example_fn_std-revolve1.png diff --git a/rust/kcl-lib/tests/outputs/serial_test_example_std-revolve10.png b/rust/kcl-lib/tests/outputs/serial_test_example_fn_std-revolve10.png similarity index 100% rename from rust/kcl-lib/tests/outputs/serial_test_example_std-revolve10.png rename to rust/kcl-lib/tests/outputs/serial_test_example_fn_std-revolve10.png diff --git a/rust/kcl-lib/tests/outputs/serial_test_example_std-revolve11.png b/rust/kcl-lib/tests/outputs/serial_test_example_fn_std-revolve11.png similarity index 100% rename from rust/kcl-lib/tests/outputs/serial_test_example_std-revolve11.png rename to rust/kcl-lib/tests/outputs/serial_test_example_fn_std-revolve11.png diff --git a/rust/kcl-lib/tests/outputs/serial_test_example_std-revolve12.png b/rust/kcl-lib/tests/outputs/serial_test_example_fn_std-revolve12.png similarity index 100% rename from rust/kcl-lib/tests/outputs/serial_test_example_std-revolve12.png rename to rust/kcl-lib/tests/outputs/serial_test_example_fn_std-revolve12.png diff --git a/rust/kcl-lib/tests/outputs/serial_test_example_std-revolve2.png b/rust/kcl-lib/tests/outputs/serial_test_example_fn_std-revolve2.png similarity index 100% rename from rust/kcl-lib/tests/outputs/serial_test_example_std-revolve2.png rename to rust/kcl-lib/tests/outputs/serial_test_example_fn_std-revolve2.png diff --git a/rust/kcl-lib/tests/outputs/serial_test_example_std-revolve3.png b/rust/kcl-lib/tests/outputs/serial_test_example_fn_std-revolve3.png similarity index 100% rename from rust/kcl-lib/tests/outputs/serial_test_example_std-revolve3.png rename to rust/kcl-lib/tests/outputs/serial_test_example_fn_std-revolve3.png diff --git a/rust/kcl-lib/tests/outputs/serial_test_example_std-revolve4.png b/rust/kcl-lib/tests/outputs/serial_test_example_fn_std-revolve4.png similarity index 100% rename from rust/kcl-lib/tests/outputs/serial_test_example_std-revolve4.png rename to rust/kcl-lib/tests/outputs/serial_test_example_fn_std-revolve4.png diff --git a/rust/kcl-lib/tests/outputs/serial_test_example_std-revolve5.png b/rust/kcl-lib/tests/outputs/serial_test_example_fn_std-revolve5.png similarity index 100% rename from rust/kcl-lib/tests/outputs/serial_test_example_std-revolve5.png rename to rust/kcl-lib/tests/outputs/serial_test_example_fn_std-revolve5.png diff --git a/rust/kcl-lib/tests/outputs/serial_test_example_std-revolve6.png b/rust/kcl-lib/tests/outputs/serial_test_example_fn_std-revolve6.png similarity index 100% rename from rust/kcl-lib/tests/outputs/serial_test_example_std-revolve6.png rename to rust/kcl-lib/tests/outputs/serial_test_example_fn_std-revolve6.png diff --git a/rust/kcl-lib/tests/outputs/serial_test_example_std-revolve7.png b/rust/kcl-lib/tests/outputs/serial_test_example_fn_std-revolve7.png similarity index 100% rename from rust/kcl-lib/tests/outputs/serial_test_example_std-revolve7.png rename to rust/kcl-lib/tests/outputs/serial_test_example_fn_std-revolve7.png diff --git a/rust/kcl-lib/tests/outputs/serial_test_example_std-revolve8.png b/rust/kcl-lib/tests/outputs/serial_test_example_fn_std-revolve8.png similarity index 100% rename from rust/kcl-lib/tests/outputs/serial_test_example_std-revolve8.png rename to rust/kcl-lib/tests/outputs/serial_test_example_fn_std-revolve8.png diff --git a/rust/kcl-lib/tests/outputs/serial_test_example_std-revolve9.png b/rust/kcl-lib/tests/outputs/serial_test_example_fn_std-revolve9.png similarity index 100% rename from rust/kcl-lib/tests/outputs/serial_test_example_std-revolve9.png rename to rust/kcl-lib/tests/outputs/serial_test_example_fn_std-revolve9.png diff --git a/rust/kcl-lib/tests/outputs/serial_test_example_circle0.png b/rust/kcl-lib/tests/outputs/serial_test_example_fn_std-sketch-circle0.png similarity index 100% rename from rust/kcl-lib/tests/outputs/serial_test_example_circle0.png rename to rust/kcl-lib/tests/outputs/serial_test_example_fn_std-sketch-circle0.png diff --git a/rust/kcl-lib/tests/outputs/serial_test_example_circle1.png b/rust/kcl-lib/tests/outputs/serial_test_example_fn_std-sketch-circle1.png similarity index 100% rename from rust/kcl-lib/tests/outputs/serial_test_example_circle1.png rename to rust/kcl-lib/tests/outputs/serial_test_example_fn_std-sketch-circle1.png diff --git a/rust/kcl-lib/tests/outputs/serial_test_example_std-sketch-mirror2d0.png b/rust/kcl-lib/tests/outputs/serial_test_example_fn_std-sketch-mirror2d0.png similarity index 100% rename from rust/kcl-lib/tests/outputs/serial_test_example_std-sketch-mirror2d0.png rename to rust/kcl-lib/tests/outputs/serial_test_example_fn_std-sketch-mirror2d0.png diff --git a/rust/kcl-lib/tests/outputs/serial_test_example_std-sketch-mirror2d1.png b/rust/kcl-lib/tests/outputs/serial_test_example_fn_std-sketch-mirror2d1.png similarity index 100% rename from rust/kcl-lib/tests/outputs/serial_test_example_std-sketch-mirror2d1.png rename to rust/kcl-lib/tests/outputs/serial_test_example_fn_std-sketch-mirror2d1.png diff --git a/rust/kcl-lib/tests/outputs/serial_test_example_std-sketch-mirror2d2.png b/rust/kcl-lib/tests/outputs/serial_test_example_fn_std-sketch-mirror2d2.png similarity index 100% rename from rust/kcl-lib/tests/outputs/serial_test_example_std-sketch-mirror2d2.png rename to rust/kcl-lib/tests/outputs/serial_test_example_fn_std-sketch-mirror2d2.png diff --git a/rust/kcl-lib/tests/outputs/serial_test_example_std-sketch-mirror2d3.png b/rust/kcl-lib/tests/outputs/serial_test_example_fn_std-sketch-mirror2d3.png similarity index 100% rename from rust/kcl-lib/tests/outputs/serial_test_example_std-sketch-mirror2d3.png rename to rust/kcl-lib/tests/outputs/serial_test_example_fn_std-sketch-mirror2d3.png diff --git a/rust/kcl-lib/tests/outputs/serial_test_example_std-sketch-mirror2d4.png b/rust/kcl-lib/tests/outputs/serial_test_example_fn_std-sketch-mirror2d4.png similarity index 100% rename from rust/kcl-lib/tests/outputs/serial_test_example_std-sketch-mirror2d4.png rename to rust/kcl-lib/tests/outputs/serial_test_example_fn_std-sketch-mirror2d4.png diff --git a/rust/kcl-lib/tests/outputs/serial_test_example_std-solid-chamfer0.png b/rust/kcl-lib/tests/outputs/serial_test_example_fn_std-solid-chamfer0.png similarity index 100% rename from rust/kcl-lib/tests/outputs/serial_test_example_std-solid-chamfer0.png rename to rust/kcl-lib/tests/outputs/serial_test_example_fn_std-solid-chamfer0.png diff --git a/rust/kcl-lib/tests/outputs/serial_test_example_std-solid-chamfer1.png b/rust/kcl-lib/tests/outputs/serial_test_example_fn_std-solid-chamfer1.png similarity index 100% rename from rust/kcl-lib/tests/outputs/serial_test_example_std-solid-chamfer1.png rename to rust/kcl-lib/tests/outputs/serial_test_example_fn_std-solid-chamfer1.png diff --git a/rust/kcl-lib/tests/outputs/serial_test_example_std-solid-fillet0.png b/rust/kcl-lib/tests/outputs/serial_test_example_fn_std-solid-fillet0.png similarity index 100% rename from rust/kcl-lib/tests/outputs/serial_test_example_std-solid-fillet0.png rename to rust/kcl-lib/tests/outputs/serial_test_example_fn_std-solid-fillet0.png diff --git a/rust/kcl-lib/tests/outputs/serial_test_example_std-solid-fillet1.png b/rust/kcl-lib/tests/outputs/serial_test_example_fn_std-solid-fillet1.png similarity index 100% rename from rust/kcl-lib/tests/outputs/serial_test_example_std-solid-fillet1.png rename to rust/kcl-lib/tests/outputs/serial_test_example_fn_std-solid-fillet1.png diff --git a/rust/kcl-lib/tests/outputs/serial_test_example_Solid0.png b/rust/kcl-lib/tests/outputs/serial_test_example_fn_std-solid-hollow0.png similarity index 100% rename from rust/kcl-lib/tests/outputs/serial_test_example_Solid0.png rename to rust/kcl-lib/tests/outputs/serial_test_example_fn_std-solid-hollow0.png diff --git a/rust/kcl-lib/tests/outputs/serial_test_example_std-solid-hollow1.png b/rust/kcl-lib/tests/outputs/serial_test_example_fn_std-solid-hollow1.png similarity index 100% rename from rust/kcl-lib/tests/outputs/serial_test_example_std-solid-hollow1.png rename to rust/kcl-lib/tests/outputs/serial_test_example_fn_std-solid-hollow1.png diff --git a/rust/kcl-lib/tests/outputs/serial_test_example_std-solid-hollow2.png b/rust/kcl-lib/tests/outputs/serial_test_example_fn_std-solid-hollow2.png similarity index 100% rename from rust/kcl-lib/tests/outputs/serial_test_example_std-solid-hollow2.png rename to rust/kcl-lib/tests/outputs/serial_test_example_fn_std-solid-hollow2.png diff --git a/rust/kcl-lib/tests/outputs/serial_test_example_std-solid-shell0.png b/rust/kcl-lib/tests/outputs/serial_test_example_fn_std-solid-shell0.png similarity index 100% rename from rust/kcl-lib/tests/outputs/serial_test_example_std-solid-shell0.png rename to rust/kcl-lib/tests/outputs/serial_test_example_fn_std-solid-shell0.png diff --git a/rust/kcl-lib/tests/outputs/serial_test_example_std-solid-shell1.png b/rust/kcl-lib/tests/outputs/serial_test_example_fn_std-solid-shell1.png similarity index 100% rename from rust/kcl-lib/tests/outputs/serial_test_example_std-solid-shell1.png rename to rust/kcl-lib/tests/outputs/serial_test_example_fn_std-solid-shell1.png diff --git a/rust/kcl-lib/tests/outputs/serial_test_example_std-solid-shell2.png b/rust/kcl-lib/tests/outputs/serial_test_example_fn_std-solid-shell2.png similarity index 100% rename from rust/kcl-lib/tests/outputs/serial_test_example_std-solid-shell2.png rename to rust/kcl-lib/tests/outputs/serial_test_example_fn_std-solid-shell2.png diff --git a/rust/kcl-lib/tests/outputs/serial_test_example_std-solid-shell3.png b/rust/kcl-lib/tests/outputs/serial_test_example_fn_std-solid-shell3.png similarity index 100% rename from rust/kcl-lib/tests/outputs/serial_test_example_std-solid-shell3.png rename to rust/kcl-lib/tests/outputs/serial_test_example_fn_std-solid-shell3.png diff --git a/rust/kcl-lib/tests/outputs/serial_test_example_std-solid-shell4.png b/rust/kcl-lib/tests/outputs/serial_test_example_fn_std-solid-shell4.png similarity index 100% rename from rust/kcl-lib/tests/outputs/serial_test_example_std-solid-shell4.png rename to rust/kcl-lib/tests/outputs/serial_test_example_fn_std-solid-shell4.png diff --git a/rust/kcl-lib/tests/outputs/serial_test_example_std-solid-shell5.png b/rust/kcl-lib/tests/outputs/serial_test_example_fn_std-solid-shell5.png similarity index 100% rename from rust/kcl-lib/tests/outputs/serial_test_example_std-solid-shell5.png rename to rust/kcl-lib/tests/outputs/serial_test_example_fn_std-solid-shell5.png diff --git a/rust/kcl-lib/tests/outputs/serial_test_example_std-solid-shell6.png b/rust/kcl-lib/tests/outputs/serial_test_example_fn_std-solid-shell6.png similarity index 100% rename from rust/kcl-lib/tests/outputs/serial_test_example_std-solid-shell6.png rename to rust/kcl-lib/tests/outputs/serial_test_example_fn_std-solid-shell6.png diff --git a/rust/kcl-lib/tests/outputs/serial_test_example_std-units-toDegrees0.png b/rust/kcl-lib/tests/outputs/serial_test_example_fn_std-units-toDegrees0.png similarity index 100% rename from rust/kcl-lib/tests/outputs/serial_test_example_std-units-toDegrees0.png rename to rust/kcl-lib/tests/outputs/serial_test_example_fn_std-units-toDegrees0.png diff --git a/rust/kcl-lib/tests/outputs/serial_test_example_std-units-toRadians0.png b/rust/kcl-lib/tests/outputs/serial_test_example_fn_std-units-toRadians0.png similarity index 100% rename from rust/kcl-lib/tests/outputs/serial_test_example_std-units-toRadians0.png rename to rust/kcl-lib/tests/outputs/serial_test_example_fn_std-units-toRadians0.png diff --git a/rust/kcl-lib/tests/outputs/serial_test_example_from_cm0.png b/rust/kcl-lib/tests/outputs/serial_test_example_from_cm0.png deleted file mode 100644 index 6148ae432..000000000 Binary files a/rust/kcl-lib/tests/outputs/serial_test_example_from_cm0.png and /dev/null differ diff --git a/rust/kcl-lib/tests/outputs/serial_test_example_from_ft0.png b/rust/kcl-lib/tests/outputs/serial_test_example_from_ft0.png deleted file mode 100644 index 6148ae432..000000000 Binary files a/rust/kcl-lib/tests/outputs/serial_test_example_from_ft0.png and /dev/null differ diff --git a/rust/kcl-lib/tests/outputs/serial_test_example_from_inches0.png b/rust/kcl-lib/tests/outputs/serial_test_example_from_inches0.png deleted file mode 100644 index 6148ae432..000000000 Binary files a/rust/kcl-lib/tests/outputs/serial_test_example_from_inches0.png and /dev/null differ diff --git a/rust/kcl-lib/tests/outputs/serial_test_example_from_m0.png b/rust/kcl-lib/tests/outputs/serial_test_example_from_m0.png deleted file mode 100644 index 6148ae432..000000000 Binary files a/rust/kcl-lib/tests/outputs/serial_test_example_from_m0.png and /dev/null differ diff --git a/rust/kcl-lib/tests/outputs/serial_test_example_from_mm0.png b/rust/kcl-lib/tests/outputs/serial_test_example_from_mm0.png deleted file mode 100644 index 6148ae432..000000000 Binary files a/rust/kcl-lib/tests/outputs/serial_test_example_from_mm0.png and /dev/null differ diff --git a/rust/kcl-lib/tests/outputs/serial_test_example_from_yd0.png b/rust/kcl-lib/tests/outputs/serial_test_example_from_yd0.png deleted file mode 100644 index 6148ae432..000000000 Binary files a/rust/kcl-lib/tests/outputs/serial_test_example_from_yd0.png and /dev/null differ diff --git a/rust/kcl-lib/tests/outputs/serial_test_example_get_edge0.png b/rust/kcl-lib/tests/outputs/serial_test_example_get_edge0.png deleted file mode 100644 index 314ce69ad..000000000 Binary files a/rust/kcl-lib/tests/outputs/serial_test_example_get_edge0.png and /dev/null differ diff --git a/rust/kcl-lib/tests/outputs/serial_test_example_get_extrude_wall_transform0.png b/rust/kcl-lib/tests/outputs/serial_test_example_get_extrude_wall_transform0.png deleted file mode 100644 index ba35d22dc..000000000 Binary files a/rust/kcl-lib/tests/outputs/serial_test_example_get_extrude_wall_transform0.png and /dev/null differ diff --git a/rust/kcl-lib/tests/outputs/serial_test_example_hole0.png b/rust/kcl-lib/tests/outputs/serial_test_example_hole0.png deleted file mode 100644 index 29c490844..000000000 Binary files a/rust/kcl-lib/tests/outputs/serial_test_example_hole0.png and /dev/null differ diff --git a/rust/kcl-lib/tests/outputs/serial_test_example_hole1.png b/rust/kcl-lib/tests/outputs/serial_test_example_hole1.png deleted file mode 100644 index 399c5e7c4..000000000 Binary files a/rust/kcl-lib/tests/outputs/serial_test_example_hole1.png and /dev/null differ diff --git a/rust/kcl-lib/tests/outputs/serial_test_example_import0.png b/rust/kcl-lib/tests/outputs/serial_test_example_import0.png deleted file mode 100644 index c38b6868d..000000000 Binary files a/rust/kcl-lib/tests/outputs/serial_test_example_import0.png and /dev/null differ diff --git a/rust/kcl-lib/tests/outputs/serial_test_example_import1.png b/rust/kcl-lib/tests/outputs/serial_test_example_import1.png deleted file mode 100644 index 74b7216c1..000000000 Binary files a/rust/kcl-lib/tests/outputs/serial_test_example_import1.png and /dev/null differ diff --git a/rust/kcl-lib/tests/outputs/serial_test_example_import2.png b/rust/kcl-lib/tests/outputs/serial_test_example_import2.png deleted file mode 100644 index 9a8ab9c3c..000000000 Binary files a/rust/kcl-lib/tests/outputs/serial_test_example_import2.png and /dev/null differ diff --git a/rust/kcl-lib/tests/outputs/serial_test_example_import3.png b/rust/kcl-lib/tests/outputs/serial_test_example_import3.png deleted file mode 100644 index fdb439990..000000000 Binary files a/rust/kcl-lib/tests/outputs/serial_test_example_import3.png and /dev/null differ diff --git a/rust/kcl-lib/tests/outputs/serial_test_example_import4.png b/rust/kcl-lib/tests/outputs/serial_test_example_import4.png deleted file mode 100644 index 987fba8e6..000000000 Binary files a/rust/kcl-lib/tests/outputs/serial_test_example_import4.png and /dev/null differ diff --git a/rust/kcl-lib/tests/outputs/serial_test_example_import5.png b/rust/kcl-lib/tests/outputs/serial_test_example_import5.png deleted file mode 100644 index 4e87e466c..000000000 Binary files a/rust/kcl-lib/tests/outputs/serial_test_example_import5.png and /dev/null differ diff --git a/rust/kcl-lib/tests/outputs/serial_test_example_int0.png b/rust/kcl-lib/tests/outputs/serial_test_example_int0.png deleted file mode 100644 index c566903b3..000000000 Binary files a/rust/kcl-lib/tests/outputs/serial_test_example_int0.png and /dev/null differ diff --git a/rust/kcl-lib/tests/outputs/serial_test_example_line1.png b/rust/kcl-lib/tests/outputs/serial_test_example_line1.png deleted file mode 100644 index 77183632e..000000000 Binary files a/rust/kcl-lib/tests/outputs/serial_test_example_line1.png and /dev/null differ diff --git a/rust/kcl-lib/tests/outputs/serial_test_example_line_to0.png b/rust/kcl-lib/tests/outputs/serial_test_example_line_to0.png deleted file mode 100644 index b7311cc65..000000000 Binary files a/rust/kcl-lib/tests/outputs/serial_test_example_line_to0.png and /dev/null differ diff --git a/rust/kcl-lib/tests/outputs/serial_test_example_pi0.png b/rust/kcl-lib/tests/outputs/serial_test_example_pi0.png deleted file mode 100644 index 971c03c9d..000000000 Binary files a/rust/kcl-lib/tests/outputs/serial_test_example_pi0.png and /dev/null differ diff --git a/rust/kcl-lib/tests/outputs/serial_test_example_start_profile_at0.png b/rust/kcl-lib/tests/outputs/serial_test_example_start_profile_at0.png deleted file mode 100644 index a7cbc75e1..000000000 Binary files a/rust/kcl-lib/tests/outputs/serial_test_example_start_profile_at0.png and /dev/null differ diff --git a/rust/kcl-lib/tests/outputs/serial_test_example_start_profile_at1.png b/rust/kcl-lib/tests/outputs/serial_test_example_start_profile_at1.png deleted file mode 100644 index d6e57761f..000000000 Binary files a/rust/kcl-lib/tests/outputs/serial_test_example_start_profile_at1.png and /dev/null differ diff --git a/rust/kcl-lib/tests/outputs/serial_test_example_start_profile_at2.png b/rust/kcl-lib/tests/outputs/serial_test_example_start_profile_at2.png deleted file mode 100644 index 6362e805d..000000000 Binary files a/rust/kcl-lib/tests/outputs/serial_test_example_start_profile_at2.png and /dev/null differ diff --git a/rust/kcl-lib/tests/outputs/serial_test_example_std-math-rem0.png b/rust/kcl-lib/tests/outputs/serial_test_example_std-math-rem0.png deleted file mode 100644 index 6148ae432..000000000 Binary files a/rust/kcl-lib/tests/outputs/serial_test_example_std-math-rem0.png and /dev/null differ diff --git a/rust/kcl-lib/tests/outputs/serial_test_example_std-sketch-circle0.png b/rust/kcl-lib/tests/outputs/serial_test_example_std-sketch-circle0.png deleted file mode 100644 index 5bd912447..000000000 Binary files a/rust/kcl-lib/tests/outputs/serial_test_example_std-sketch-circle0.png and /dev/null differ diff --git a/rust/kcl-lib/tests/outputs/serial_test_example_std-sketch-circle1.png b/rust/kcl-lib/tests/outputs/serial_test_example_std-sketch-circle1.png deleted file mode 100644 index b085a4fc5..000000000 Binary files a/rust/kcl-lib/tests/outputs/serial_test_example_std-sketch-circle1.png and /dev/null differ diff --git a/rust/kcl-lib/tests/outputs/serial_test_example_tau0.png b/rust/kcl-lib/tests/outputs/serial_test_example_tau0.png deleted file mode 100644 index de171cb67..000000000 Binary files a/rust/kcl-lib/tests/outputs/serial_test_example_tau0.png and /dev/null differ diff --git a/rust/kcl-lib/tests/outputs/serial_test_example_Sketch0.png b/rust/kcl-lib/tests/outputs/serial_test_example_ty_std-types-Sketch0.png similarity index 100% rename from rust/kcl-lib/tests/outputs/serial_test_example_Sketch0.png rename to rust/kcl-lib/tests/outputs/serial_test_example_ty_std-types-Sketch0.png diff --git a/rust/kcl-lib/tests/outputs/serial_test_example_Solid1.png b/rust/kcl-lib/tests/outputs/serial_test_example_ty_std-types-Sketch1.png similarity index 100% rename from rust/kcl-lib/tests/outputs/serial_test_example_Solid1.png rename to rust/kcl-lib/tests/outputs/serial_test_example_ty_std-types-Sketch1.png diff --git a/rust/kcl-lib/tests/outputs/serial_test_example_std-solid-hollow0.png b/rust/kcl-lib/tests/outputs/serial_test_example_ty_std-types-Solid0.png similarity index 100% rename from rust/kcl-lib/tests/outputs/serial_test_example_std-solid-hollow0.png rename to rust/kcl-lib/tests/outputs/serial_test_example_ty_std-types-Solid0.png diff --git a/rust/kcl-lib/tests/outputs/serial_test_example_assert_equal0.png b/rust/kcl-lib/tests/outputs/serial_test_example_ty_std-types-Solid1.png similarity index 100% rename from rust/kcl-lib/tests/outputs/serial_test_example_assert_equal0.png rename to rust/kcl-lib/tests/outputs/serial_test_example_ty_std-types-Solid1.png diff --git a/rust/kcl-lib/tests/outputs/serial_test_example_x_line_to0.png b/rust/kcl-lib/tests/outputs/serial_test_example_x_line_to0.png deleted file mode 100644 index 0494b56e1..000000000 Binary files a/rust/kcl-lib/tests/outputs/serial_test_example_x_line_to0.png and /dev/null differ diff --git a/rust/kcl-lib/tests/outputs/serial_test_example_y_line_to0.png b/rust/kcl-lib/tests/outputs/serial_test_example_y_line_to0.png deleted file mode 100644 index 9282b8117..000000000 Binary files a/rust/kcl-lib/tests/outputs/serial_test_example_y_line_to0.png and /dev/null differ diff --git a/rust/kcl-lib/tests/pentagon_fillet_sugar/artifact_graph_flowchart.snap.md b/rust/kcl-lib/tests/pentagon_fillet_sugar/artifact_graph_flowchart.snap.md index ed49e32e2..3aab9389e 100644 --- a/rust/kcl-lib/tests/pentagon_fillet_sugar/artifact_graph_flowchart.snap.md +++ b/rust/kcl-lib/tests/pentagon_fillet_sugar/artifact_graph_flowchart.snap.md @@ -9,21 +9,21 @@ flowchart LR subgraph path5 [Path] 5["Path
[409, 460, 0]"] 10["Segment
[468, 582, 0]"] - 13["Segment
[590, 598, 0]"] + 13["Segment
[590, 597, 0]"] 14[Solid2d] end subgraph path6 [Path] 6["Path
[409, 460, 0]"] 11["Segment
[468, 582, 0]"] - 12["Segment
[590, 598, 0]"] + 12["Segment
[590, 597, 0]"] 15[Solid2d] end 1["Plane
[73, 90, 0]"] 2["StartSketchOnFace
[372, 401, 0]"] 3["StartSketchOnFace
[372, 401, 0]"] 16["Sweep Extrusion
[309, 341, 0]"] - 17["Sweep Extrusion
[641, 669, 0]"] - 18["Sweep Extrusion
[841, 869, 0]"] + 17["Sweep Extrusion
[651, 679, 0]"] + 18["Sweep Extrusion
[862, 890, 0]"] 19[Wall] 20[Wall] 21[Wall] @@ -43,10 +43,10 @@ flowchart LR 35["SweepEdge Adjacent"] 36["SweepEdge Adjacent"] 37["SweepEdge Adjacent"] - 38["EdgeCut Fillet
[675, 802, 0]"] - 39["EdgeCut Fillet
[675, 802, 0]"] - 40["EdgeCut Fillet
[875, 1002, 0]"] - 41["EdgeCut Fillet
[875, 1002, 0]"] + 38["EdgeCut Fillet
[685, 812, 0]"] + 39["EdgeCut Fillet
[685, 812, 0]"] + 40["EdgeCut Fillet
[896, 1023, 0]"] + 41["EdgeCut Fillet
[896, 1023, 0]"] 1 --- 4 22 x--> 2 23 x--> 3 diff --git a/rust/kcl-lib/tests/pentagon_fillet_sugar/ast.snap b/rust/kcl-lib/tests/pentagon_fillet_sugar/ast.snap index b865ec7ed..d929e89a9 100644 --- a/rust/kcl-lib/tests/pentagon_fillet_sugar/ast.snap +++ b/rust/kcl-lib/tests/pentagon_fillet_sugar/ast.snap @@ -917,15 +917,7 @@ description: Result of parsing pentagon_fillet_sugar.kcl "unlabeled": null }, { - "arguments": [ - { - "commentStart": 0, - "end": 0, - "start": 0, - "type": "PipeSubstitution", - "type": "PipeSubstitution" - } - ], + "arguments": [], "callee": { "abs_path": false, "commentStart": 0, @@ -1017,40 +1009,60 @@ description: Result of parsing pentagon_fillet_sugar.kcl "init": { "arguments": [ { - "argument": { + "type": "LabeledArg", + "label": { "commentStart": 0, "end": 0, - "raw": "200", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 200.0, - "suffix": "None" - } - }, - "commentStart": 0, - "end": 0, - "operator": "-", - "start": 0, - "type": "UnaryExpression", - "type": "UnaryExpression" - }, - { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "c", + "name": "x", "start": 0, "type": "Identifier" }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" + "arg": { + "argument": { + "commentStart": 0, + "end": 0, + "raw": "200", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 200.0, + "suffix": "None" + } + }, + "commentStart": 0, + "end": 0, + "operator": "-", + "start": 0, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + }, + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "face", + "start": 0, + "type": "Identifier" + }, + "arg": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "c", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } } ], "callee": { @@ -1071,8 +1083,9 @@ description: Result of parsing pentagon_fillet_sugar.kcl "commentStart": 0, "end": 0, "start": 0, - "type": "CallExpression", - "type": "CallExpression" + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null }, "start": 0, "type": "VariableDeclarator" @@ -1365,32 +1378,52 @@ description: Result of parsing pentagon_fillet_sugar.kcl "init": { "arguments": [ { - "commentStart": 0, - "end": 0, - "raw": "200", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 200.0, - "suffix": "None" - } - }, - { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { + "type": "LabeledArg", + "label": { "commentStart": 0, "end": 0, - "name": "a", + "name": "x", "start": 0, "type": "Identifier" }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" + "arg": { + "commentStart": 0, + "end": 0, + "raw": "200", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 200.0, + "suffix": "None" + } + } + }, + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "face", + "start": 0, + "type": "Identifier" + }, + "arg": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "a", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } } ], "callee": { @@ -1411,8 +1444,9 @@ description: Result of parsing pentagon_fillet_sugar.kcl "commentStart": 0, "end": 0, "start": 0, - "type": "CallExpression", - "type": "CallExpression" + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null }, "start": 0, "type": "VariableDeclarator" diff --git a/rust/kcl-lib/tests/pentagon_fillet_sugar/input.kcl b/rust/kcl-lib/tests/pentagon_fillet_sugar/input.kcl index 720347125..dad2bc07e 100644 --- a/rust/kcl-lib/tests/pentagon_fillet_sugar/input.kcl +++ b/rust/kcl-lib/tests/pentagon_fillet_sugar/input.kcl @@ -19,10 +19,10 @@ fn circl(x, face) { radius = radius, tag = $arc_tag, ) - |> close(%) + |> close() } -c1 = circl(-200, c) +c1 = circl(x = -200, face = c) plumbus1 = c1 |> extrude(length = plumbusLen) |> fillet( @@ -32,7 +32,7 @@ plumbus1 = c1 getOppositeEdge(c1.tags.arc_tag) ], ) -c2 = circl(200, a) +c2 = circl(x = 200, face = a) plumbus0 = c2 |> extrude(length = plumbusLen) |> fillet( diff --git a/rust/kcl-lib/tests/pentagon_fillet_sugar/ops.snap b/rust/kcl-lib/tests/pentagon_fillet_sugar/ops.snap index 9317b7b70..47015bc73 100644 --- a/rust/kcl-lib/tests/pentagon_fillet_sugar/ops.snap +++ b/rust/kcl-lib/tests/pentagon_fillet_sugar/ops.snap @@ -105,7 +105,32 @@ description: Operations executed pentagon_fillet_sugar.kcl "name": "circl", "functionSourceRange": [], "unlabeledArg": null, - "labeledArgs": {} + "labeledArgs": { + "face": { + "value": { + "type": "TagIdentifier", + "value": "c", + "artifact_id": "[uuid]" + }, + "sourceRange": [] + }, + "x": { + "value": { + "type": "Number", + "value": -200.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + } + } }, "sourceRange": [] }, @@ -197,7 +222,32 @@ description: Operations executed pentagon_fillet_sugar.kcl "name": "circl", "functionSourceRange": [], "unlabeledArg": null, - "labeledArgs": {} + "labeledArgs": { + "face": { + "value": { + "type": "TagIdentifier", + "value": "a", + "artifact_id": "[uuid]" + }, + "sourceRange": [] + }, + "x": { + "value": { + "type": "Number", + "value": 200.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + } + } }, "sourceRange": [] }, diff --git a/rust/kcl-lib/tests/pentagon_fillet_sugar/unparsed.snap b/rust/kcl-lib/tests/pentagon_fillet_sugar/unparsed.snap index ad50e8395..fc3e30d85 100644 --- a/rust/kcl-lib/tests/pentagon_fillet_sugar/unparsed.snap +++ b/rust/kcl-lib/tests/pentagon_fillet_sugar/unparsed.snap @@ -23,10 +23,10 @@ fn circl(x, face) { radius = radius, tag = $arc_tag, ) - |> close(%) + |> close() } -c1 = circl(-200, c) +c1 = circl(x = -200, face = c) plumbus1 = c1 |> extrude(length = plumbusLen) |> fillet( @@ -36,7 +36,7 @@ plumbus1 = c1 getOppositeEdge(c1.tags.arc_tag) ], ) -c2 = circl(200, a) +c2 = circl(x = 200, face = a) plumbus0 = c2 |> extrude(length = plumbusLen) |> fillet( diff --git a/rust/kcl-lib/tests/pipe_as_arg/artifact_commands.snap b/rust/kcl-lib/tests/pipe_as_arg/artifact_commands.snap index 58df7301f..52128f84d 100644 --- a/rust/kcl-lib/tests/pipe_as_arg/artifact_commands.snap +++ b/rust/kcl-lib/tests/pipe_as_arg/artifact_commands.snap @@ -28,388 +28,5 @@ description: Artifact commands pipe_as_arg.kcl "object_id": "[uuid]", "hidden": true } - }, - { - "cmdId": "[uuid]", - "range": [], - "command": { - "type": "make_plane", - "origin": { - "x": 0.0, - "y": 0.0, - "z": 0.0 - }, - "x_axis": { - "x": 1.0, - "y": 0.0, - "z": 0.0 - }, - "y_axis": { - "x": 0.0, - "y": 1.0, - "z": 0.0 - }, - "size": 60.0, - "clobber": false, - "hide": true - } - }, - { - "cmdId": "[uuid]", - "range": [], - "command": { - "type": "enable_sketch_mode", - "entity_id": "[uuid]", - "ortho": false, - "animated": false, - "adjust_camera": false, - "planar_normal": { - "x": 0.0, - "y": 0.0, - "z": 1.0 - } - } - }, - { - "cmdId": "[uuid]", - "range": [], - "command": { - "type": "move_path_pen", - "path": "[uuid]", - "to": { - "x": -200.0, - "y": -200.0, - "z": 0.0 - } - } - }, - { - "cmdId": "[uuid]", - "range": [], - "command": { - "type": "sketch_mode_disable" - } - }, - { - "cmdId": "[uuid]", - "range": [], - "command": { - "type": "start_path" - } - }, - { - "cmdId": "[uuid]", - "range": [], - "command": { - "type": "extend_path", - "path": "[uuid]", - "segment": { - "type": "line", - "end": { - "x": -200.0, - "y": 200.0, - "z": 0.0 - }, - "relative": false - } - } - }, - { - "cmdId": "[uuid]", - "range": [], - "command": { - "type": "extend_path", - "path": "[uuid]", - "segment": { - "type": "line", - "end": { - "x": 200.0, - "y": 200.0, - "z": 0.0 - }, - "relative": false - } - } - }, - { - "cmdId": "[uuid]", - "range": [], - "command": { - "type": "extend_path", - "path": "[uuid]", - "segment": { - "type": "line", - "end": { - "x": 200.0, - "y": -200.0, - "z": 0.0 - }, - "relative": false - } - } - }, - { - "cmdId": "[uuid]", - "range": [], - "command": { - "type": "extend_path", - "path": "[uuid]", - "segment": { - "type": "line", - "end": { - "x": -200.0, - "y": -200.0, - "z": 0.0 - }, - "relative": false - } - } - }, - { - "cmdId": "[uuid]", - "range": [], - "command": { - "type": "close_path", - "path_id": "[uuid]" - } - }, - { - "cmdId": "[uuid]", - "range": [], - "command": { - "type": "enable_sketch_mode", - "entity_id": "[uuid]", - "ortho": false, - "animated": false, - "adjust_camera": false, - "planar_normal": { - "x": 0.0, - "y": 0.0, - "z": 1.0 - } - } - }, - { - "cmdId": "[uuid]", - "range": [], - "command": { - "type": "extrude", - "target": "[uuid]", - "distance": 400.0, - "faces": null, - "opposite": "None" - } - }, - { - "cmdId": "[uuid]", - "range": [], - "command": { - "type": "object_bring_to_front", - "object_id": "[uuid]" - } - }, - { - "cmdId": "[uuid]", - "range": [], - "command": { - "type": "sketch_mode_disable" - } - }, - { - "cmdId": "[uuid]", - "range": [], - "command": { - "type": "solid3d_get_all_edge_faces", - "object_id": "[uuid]", - "edge_id": "[uuid]" - } - }, - { - "cmdId": "[uuid]", - "range": [], - "command": { - "type": "solid3d_get_all_edge_faces", - "object_id": "[uuid]", - "edge_id": "[uuid]" - } - }, - { - "cmdId": "[uuid]", - "range": [], - "command": { - "type": "solid3d_get_all_edge_faces", - "object_id": "[uuid]", - "edge_id": "[uuid]" - } - }, - { - "cmdId": "[uuid]", - "range": [], - "command": { - "type": "solid3d_get_all_edge_faces", - "object_id": "[uuid]", - "edge_id": "[uuid]" - } - }, - { - "cmdId": "[uuid]", - "range": [], - "command": { - "type": "solid3d_get_all_edge_faces", - "object_id": "[uuid]", - "edge_id": "[uuid]" - } - }, - { - "cmdId": "[uuid]", - "range": [], - "command": { - "type": "solid3d_get_all_edge_faces", - "object_id": "[uuid]", - "edge_id": "[uuid]" - } - }, - { - "cmdId": "[uuid]", - "range": [], - "command": { - "type": "solid3d_get_all_edge_faces", - "object_id": "[uuid]", - "edge_id": "[uuid]" - } - }, - { - "cmdId": "[uuid]", - "range": [], - "command": { - "type": "solid3d_get_all_edge_faces", - "object_id": "[uuid]", - "edge_id": "[uuid]" - } - }, - { - "cmdId": "[uuid]", - "range": [], - "command": { - "type": "solid3d_get_all_edge_faces", - "object_id": "[uuid]", - "edge_id": "[uuid]" - } - }, - { - "cmdId": "[uuid]", - "range": [], - "command": { - "type": "solid3d_get_all_edge_faces", - "object_id": "[uuid]", - "edge_id": "[uuid]" - } - }, - { - "cmdId": "[uuid]", - "range": [], - "command": { - "type": "solid3d_get_all_edge_faces", - "object_id": "[uuid]", - "edge_id": "[uuid]" - } - }, - { - "cmdId": "[uuid]", - "range": [], - "command": { - "type": "solid3d_get_all_edge_faces", - "object_id": "[uuid]", - "edge_id": "[uuid]" - } - }, - { - "cmdId": "[uuid]", - "range": [], - "command": { - "type": "solid3d_get_extrusion_face_info", - "object_id": "[uuid]", - "edge_id": "[uuid]" - } - }, - { - "cmdId": "[uuid]", - "range": [], - "command": { - "type": "solid3d_get_next_adjacent_edge", - "object_id": "[uuid]", - "edge_id": "[uuid]", - "face_id": "[uuid]" - } - }, - { - "cmdId": "[uuid]", - "range": [], - "command": { - "type": "solid3d_get_next_adjacent_edge", - "object_id": "[uuid]", - "edge_id": "[uuid]", - "face_id": "[uuid]" - } - }, - { - "cmdId": "[uuid]", - "range": [], - "command": { - "type": "solid3d_get_next_adjacent_edge", - "object_id": "[uuid]", - "edge_id": "[uuid]", - "face_id": "[uuid]" - } - }, - { - "cmdId": "[uuid]", - "range": [], - "command": { - "type": "solid3d_get_next_adjacent_edge", - "object_id": "[uuid]", - "edge_id": "[uuid]", - "face_id": "[uuid]" - } - }, - { - "cmdId": "[uuid]", - "range": [], - "command": { - "type": "solid3d_get_opposite_edge", - "object_id": "[uuid]", - "edge_id": "[uuid]", - "face_id": "[uuid]" - } - }, - { - "cmdId": "[uuid]", - "range": [], - "command": { - "type": "solid3d_get_opposite_edge", - "object_id": "[uuid]", - "edge_id": "[uuid]", - "face_id": "[uuid]" - } - }, - { - "cmdId": "[uuid]", - "range": [], - "command": { - "type": "solid3d_get_opposite_edge", - "object_id": "[uuid]", - "edge_id": "[uuid]", - "face_id": "[uuid]" - } - }, - { - "cmdId": "[uuid]", - "range": [], - "command": { - "type": "solid3d_get_opposite_edge", - "object_id": "[uuid]", - "edge_id": "[uuid]", - "face_id": "[uuid]" - } } ] diff --git a/rust/kcl-lib/tests/pipe_as_arg/artifact_graph_flowchart.snap.md b/rust/kcl-lib/tests/pipe_as_arg/artifact_graph_flowchart.snap.md index 745561a19..13e533509 100644 --- a/rust/kcl-lib/tests/pipe_as_arg/artifact_graph_flowchart.snap.md +++ b/rust/kcl-lib/tests/pipe_as_arg/artifact_graph_flowchart.snap.md @@ -1,82 +1,3 @@ ```mermaid flowchart LR - subgraph path2 [Path] - 2["Path
[202, 223, 0]"] - 3["Segment
[231, 253, 0]"] - 4["Segment
[261, 283, 0]"] - 5["Segment
[291, 313, 0]"] - 6["Segment
[321, 343, 0]"] - 7["Segment
[351, 359, 0]"] - 8[Solid2d] - end - 1["Plane
[177, 194, 0]"] - 9["Sweep Extrusion
[367, 391, 0]"] - 10[Wall] - 11[Wall] - 12[Wall] - 13[Wall] - 14["Cap Start"] - 15["Cap End"] - 16["SweepEdge Opposite"] - 17["SweepEdge Opposite"] - 18["SweepEdge Opposite"] - 19["SweepEdge Opposite"] - 20["SweepEdge Adjacent"] - 21["SweepEdge Adjacent"] - 22["SweepEdge Adjacent"] - 23["SweepEdge Adjacent"] - 1 --- 2 - 2 --- 3 - 2 --- 4 - 2 --- 5 - 2 --- 6 - 2 --- 7 - 2 --- 8 - 2 ---- 9 - 3 --- 13 - 3 x--> 14 - 3 --- 17 - 3 --- 20 - 4 --- 11 - 4 x--> 14 - 4 --- 18 - 4 --- 22 - 5 --- 10 - 5 x--> 14 - 5 --- 19 - 5 --- 21 - 6 --- 12 - 6 x--> 14 - 6 --- 16 - 6 --- 23 - 9 --- 10 - 9 --- 11 - 9 --- 12 - 9 --- 13 - 9 --- 14 - 9 --- 15 - 9 --- 16 - 9 --- 17 - 9 --- 18 - 9 --- 19 - 9 --- 20 - 9 --- 21 - 9 --- 22 - 9 --- 23 - 19 <--x 10 - 21 <--x 10 - 22 <--x 10 - 18 <--x 11 - 20 <--x 11 - 22 <--x 11 - 16 <--x 12 - 21 <--x 12 - 23 <--x 12 - 17 <--x 13 - 20 <--x 13 - 23 <--x 13 - 16 <--x 15 - 17 <--x 15 - 18 <--x 15 - 19 <--x 15 ``` diff --git a/rust/kcl-lib/tests/pipe_as_arg/ast.snap b/rust/kcl-lib/tests/pipe_as_arg/ast.snap index 06d8a6239..5f979a357 100644 --- a/rust/kcl-lib/tests/pipe_as_arg/ast.snap +++ b/rust/kcl-lib/tests/pipe_as_arg/ast.snap @@ -20,1019 +20,22 @@ description: Result of parsing pipe_as_arg.kcl "init": { "body": { "body": [ - { - "commentStart": 0, - "declaration": { - "commentStart": 0, - "end": 0, - "id": { - "commentStart": 0, - "end": 0, - "name": "l", - "start": 0, - "type": "Identifier" - }, - "init": { - "commentStart": 0, - "end": 0, - "left": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "length", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - "operator": "/", - "right": { - "commentStart": 0, - "end": 0, - "raw": "2", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 2.0, - "suffix": "None" - } - }, - "start": 0, - "type": "BinaryExpression", - "type": "BinaryExpression" - }, - "start": 0, - "type": "VariableDeclarator" - }, - "end": 0, - "kind": "const", - "start": 0, - "type": "VariableDeclaration", - "type": "VariableDeclaration" - }, - { - "commentStart": 0, - "declaration": { - "commentStart": 0, - "end": 0, - "id": { - "commentStart": 0, - "end": 0, - "name": "x", - "start": 0, - "type": "Identifier" - }, - "init": { - "commentStart": 0, - "computed": false, - "end": 0, - "object": { - "commentStart": 0, - "end": 0, - "name": "center", - "start": 0, - "type": "Identifier", - "type": "Identifier" - }, - "property": { - "commentStart": 0, - "end": 0, - "raw": "0", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 0.0, - "suffix": "None" - } - }, - "start": 0, - "type": "MemberExpression", - "type": "MemberExpression" - }, - "start": 0, - "type": "VariableDeclarator" - }, - "end": 0, - "kind": "const", - "start": 0, - "type": "VariableDeclaration", - "type": "VariableDeclaration" - }, - { - "commentStart": 0, - "declaration": { - "commentStart": 0, - "end": 0, - "id": { - "commentStart": 0, - "end": 0, - "name": "y", - "start": 0, - "type": "Identifier" - }, - "init": { - "commentStart": 0, - "computed": false, - "end": 0, - "object": { - "commentStart": 0, - "end": 0, - "name": "center", - "start": 0, - "type": "Identifier", - "type": "Identifier" - }, - "property": { - "commentStart": 0, - "end": 0, - "raw": "1", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 1.0, - "suffix": "None" - } - }, - "start": 0, - "type": "MemberExpression", - "type": "MemberExpression" - }, - "start": 0, - "type": "VariableDeclarator" - }, - "end": 0, - "kind": "const", - "start": 0, - "type": "VariableDeclaration", - "type": "VariableDeclaration" - }, - { - "commentStart": 0, - "declaration": { - "commentStart": 0, - "end": 0, - "id": { - "commentStart": 0, - "end": 0, - "name": "p0", - "start": 0, - "type": "Identifier" - }, - "init": { - "commentStart": 0, - "elements": [ - { - "commentStart": 0, - "end": 0, - "left": { - "argument": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "l", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - "commentStart": 0, - "end": 0, - "operator": "-", - "start": 0, - "type": "UnaryExpression", - "type": "UnaryExpression" - }, - "operator": "+", - "right": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "x", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - "start": 0, - "type": "BinaryExpression", - "type": "BinaryExpression" - }, - { - "commentStart": 0, - "end": 0, - "left": { - "argument": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "l", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - "commentStart": 0, - "end": 0, - "operator": "-", - "start": 0, - "type": "UnaryExpression", - "type": "UnaryExpression" - }, - "operator": "+", - "right": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "y", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - "start": 0, - "type": "BinaryExpression", - "type": "BinaryExpression" - } - ], - "end": 0, - "start": 0, - "type": "ArrayExpression", - "type": "ArrayExpression" - }, - "start": 0, - "type": "VariableDeclarator" - }, - "end": 0, - "kind": "const", - "start": 0, - "type": "VariableDeclaration", - "type": "VariableDeclaration" - }, - { - "commentStart": 0, - "declaration": { - "commentStart": 0, - "end": 0, - "id": { - "commentStart": 0, - "end": 0, - "name": "p1", - "start": 0, - "type": "Identifier" - }, - "init": { - "commentStart": 0, - "elements": [ - { - "commentStart": 0, - "end": 0, - "left": { - "argument": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "l", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - "commentStart": 0, - "end": 0, - "operator": "-", - "start": 0, - "type": "UnaryExpression", - "type": "UnaryExpression" - }, - "operator": "+", - "right": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "x", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - "start": 0, - "type": "BinaryExpression", - "type": "BinaryExpression" - }, - { - "commentStart": 0, - "end": 0, - "left": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "l", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - "operator": "+", - "right": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "y", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - "start": 0, - "type": "BinaryExpression", - "type": "BinaryExpression" - } - ], - "end": 0, - "start": 0, - "type": "ArrayExpression", - "type": "ArrayExpression" - }, - "start": 0, - "type": "VariableDeclarator" - }, - "end": 0, - "kind": "const", - "start": 0, - "type": "VariableDeclaration", - "type": "VariableDeclaration" - }, - { - "commentStart": 0, - "declaration": { - "commentStart": 0, - "end": 0, - "id": { - "commentStart": 0, - "end": 0, - "name": "p2", - "start": 0, - "type": "Identifier" - }, - "init": { - "commentStart": 0, - "elements": [ - { - "commentStart": 0, - "end": 0, - "left": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "l", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - "operator": "+", - "right": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "x", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - "start": 0, - "type": "BinaryExpression", - "type": "BinaryExpression" - }, - { - "commentStart": 0, - "end": 0, - "left": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "l", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - "operator": "+", - "right": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "y", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - "start": 0, - "type": "BinaryExpression", - "type": "BinaryExpression" - } - ], - "end": 0, - "start": 0, - "type": "ArrayExpression", - "type": "ArrayExpression" - }, - "start": 0, - "type": "VariableDeclarator" - }, - "end": 0, - "kind": "const", - "start": 0, - "type": "VariableDeclaration", - "type": "VariableDeclaration" - }, - { - "commentStart": 0, - "declaration": { - "commentStart": 0, - "end": 0, - "id": { - "commentStart": 0, - "end": 0, - "name": "p3", - "start": 0, - "type": "Identifier" - }, - "init": { - "commentStart": 0, - "elements": [ - { - "commentStart": 0, - "end": 0, - "left": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "l", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - "operator": "+", - "right": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "x", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - "start": 0, - "type": "BinaryExpression", - "type": "BinaryExpression" - }, - { - "commentStart": 0, - "end": 0, - "left": { - "argument": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "l", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - "commentStart": 0, - "end": 0, - "operator": "-", - "start": 0, - "type": "UnaryExpression", - "type": "UnaryExpression" - }, - "operator": "+", - "right": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "y", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - "start": 0, - "type": "BinaryExpression", - "type": "BinaryExpression" - } - ], - "end": 0, - "start": 0, - "type": "ArrayExpression", - "type": "ArrayExpression" - }, - "start": 0, - "type": "VariableDeclarator" - }, - "end": 0, - "kind": "const", - "start": 0, - "type": "VariableDeclaration", - "type": "VariableDeclaration" - }, { "argument": { - "body": [ - { - "arguments": [ - { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "XY", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - } - ], - "callee": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "startSketchOn", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name" - }, - "commentStart": 0, - "end": 0, - "start": 0, - "type": "CallExpression", - "type": "CallExpression" - }, - { - "arguments": [ - { - "type": "LabeledArg", - "label": { - "commentStart": 0, - "end": 0, - "name": "at", - "start": 0, - "type": "Identifier" - }, - "arg": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "p0", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - } - } - ], - "callee": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "startProfile", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name" - }, - "commentStart": 0, - "end": 0, - "start": 0, - "type": "CallExpressionKw", - "type": "CallExpressionKw", - "unlabeled": null - }, - { - "arguments": [ - { - "type": "LabeledArg", - "label": { - "commentStart": 0, - "end": 0, - "name": "endAbsolute", - "start": 0, - "type": "Identifier" - }, - "arg": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "p1", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - } - } - ], - "callee": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "line", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name" - }, - "commentStart": 0, - "end": 0, - "start": 0, - "type": "CallExpressionKw", - "type": "CallExpressionKw", - "unlabeled": null - }, - { - "arguments": [ - { - "type": "LabeledArg", - "label": { - "commentStart": 0, - "end": 0, - "name": "endAbsolute", - "start": 0, - "type": "Identifier" - }, - "arg": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "p2", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - } - } - ], - "callee": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "line", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name" - }, - "commentStart": 0, - "end": 0, - "start": 0, - "type": "CallExpressionKw", - "type": "CallExpressionKw", - "unlabeled": null - }, - { - "arguments": [ - { - "type": "LabeledArg", - "label": { - "commentStart": 0, - "end": 0, - "name": "endAbsolute", - "start": 0, - "type": "Identifier" - }, - "arg": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "p3", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - } - } - ], - "callee": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "line", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name" - }, - "commentStart": 0, - "end": 0, - "start": 0, - "type": "CallExpressionKw", - "type": "CallExpressionKw", - "unlabeled": null - }, - { - "arguments": [ - { - "type": "LabeledArg", - "label": { - "commentStart": 0, - "end": 0, - "name": "endAbsolute", - "start": 0, - "type": "Identifier" - }, - "arg": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "p0", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - } - } - ], - "callee": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "line", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name" - }, - "commentStart": 0, - "end": 0, - "start": 0, - "type": "CallExpressionKw", - "type": "CallExpressionKw", - "unlabeled": null - }, - { - "arguments": [ - { - "commentStart": 0, - "end": 0, - "start": 0, - "type": "PipeSubstitution", - "type": "PipeSubstitution" - } - ], - "callee": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "close", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name" - }, - "commentStart": 0, - "end": 0, - "start": 0, - "type": "CallExpression", - "type": "CallExpression" - }, - { - "arguments": [ - { - "type": "LabeledArg", - "label": { - "commentStart": 0, - "end": 0, - "name": "length", - "start": 0, - "type": "Identifier" - }, - "arg": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "length", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - } - } - ], - "callee": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "extrude", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name" - }, - "commentStart": 0, - "end": 0, - "start": 0, - "type": "CallExpressionKw", - "type": "CallExpressionKw", - "unlabeled": null - } - ], + "abs_path": false, "commentStart": 0, "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "length", + "start": 0, + "type": "Identifier" + }, + "path": [], "start": 0, - "type": "PipeExpression", - "type": "PipeExpression" + "type": "Name", + "type": "Name" }, "commentStart": 0, "end": 0, @@ -1043,22 +46,6 @@ description: Result of parsing pipe_as_arg.kcl ], "commentStart": 0, "end": 0, - "nonCodeMeta": { - "nonCodeNodes": { - "6": [ - { - "commentStart": 0, - "end": 0, - "start": 0, - "type": "NonCodeNode", - "value": { - "type": "newLine" - } - } - ] - }, - "startNodes": [] - }, "start": 0 }, "commentStart": 0, @@ -1172,7 +159,8 @@ description: Result of parsing pipe_as_arg.kcl "name": "x", "start": 0, "type": "Identifier" - } + }, + "labeled": false } ], "start": 0, @@ -1258,89 +246,109 @@ description: Result of parsing pipe_as_arg.kcl "init": { "arguments": [ { - "body": [ - { - "commentStart": 0, - "end": 0, - "raw": "200", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 200.0, - "suffix": "None" - } - }, - { - "arguments": [ - { - "commentStart": 0, - "end": 0, - "start": 0, - "type": "PipeSubstitution", - "type": "PipeSubstitution" - } - ], - "callee": { - "abs_path": false, + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "length", + "start": 0, + "type": "Identifier" + }, + "arg": { + "body": [ + { "commentStart": 0, "end": 0, - "name": { + "raw": "200", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 200.0, + "suffix": "None" + } + }, + { + "arguments": [ + { + "commentStart": 0, + "end": 0, + "start": 0, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "abs_path": false, "commentStart": 0, "end": 0, - "name": "double", + "name": { + "commentStart": 0, + "end": 0, + "name": "double", + "start": 0, + "type": "Identifier" + }, + "path": [], "start": 0, - "type": "Identifier" + "type": "Name" }, - "path": [], + "commentStart": 0, + "end": 0, "start": 0, - "type": "Name" - }, - "commentStart": 0, - "end": 0, - "start": 0, - "type": "CallExpression", - "type": "CallExpression" - } - ], - "commentStart": 0, - "end": 0, - "start": 0, - "type": "PipeExpression", - "type": "PipeExpression" + "type": "CallExpression", + "type": "CallExpression" + } + ], + "commentStart": 0, + "end": 0, + "start": 0, + "type": "PipeExpression", + "type": "PipeExpression" + } }, { - "commentStart": 0, - "elements": [ - { - "commentStart": 0, - "end": 0, - "raw": "0", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 0.0, - "suffix": "None" + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "center", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "elements": [ + { + "commentStart": 0, + "end": 0, + "raw": "0", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 0.0, + "suffix": "None" + } + }, + { + "commentStart": 0, + "end": 0, + "raw": "0", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 0.0, + "suffix": "None" + } } - }, - { - "commentStart": 0, - "end": 0, - "raw": "0", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 0.0, - "suffix": "None" - } - } - ], - "end": 0, - "start": 0, - "type": "ArrayExpression", - "type": "ArrayExpression" + ], + "end": 0, + "start": 0, + "type": "ArrayExpression", + "type": "ArrayExpression" + } } ], "callee": { @@ -1361,8 +369,9 @@ description: Result of parsing pipe_as_arg.kcl "commentStart": 0, "end": 0, "start": 0, - "type": "CallExpression", - "type": "CallExpression" + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null }, "start": 0, "type": "VariableDeclarator" diff --git a/rust/kcl-lib/tests/pipe_as_arg/input.kcl b/rust/kcl-lib/tests/pipe_as_arg/input.kcl index 5cbd93152..c5b42be62 100644 --- a/rust/kcl-lib/tests/pipe_as_arg/input.kcl +++ b/rust/kcl-lib/tests/pipe_as_arg/input.kcl @@ -1,28 +1,12 @@ fn cube(length, center) { - l = length / 2 - x = center[0] - y = center[1] - p0 = [-l + x, -l + y] - p1 = [-l + x, l + y] - p2 = [l + x, l + y] - p3 = [l + x, -l + y] - - return startSketchOn(XY) - |> startProfile(at = p0) - |> line(endAbsolute = p1) - |> line(endAbsolute = p2) - |> line(endAbsolute = p3) - |> line(endAbsolute = p0) - |> close(%) - |> extrude(length = length) + return length } -fn double(x) { +fn double(@x) { return x * 2 } fn width() { return 200 } -myCube = cube(200 - |> double(%), [0, 0]) +myCube = cube(length = 200 |> double(%), center = [0, 0]) diff --git a/rust/kcl-lib/tests/pipe_as_arg/ops.snap b/rust/kcl-lib/tests/pipe_as_arg/ops.snap index 732e831e2..20141fb5a 100644 --- a/rust/kcl-lib/tests/pipe_as_arg/ops.snap +++ b/rust/kcl-lib/tests/pipe_as_arg/ops.snap @@ -3,53 +3,6 @@ source: kcl-lib/src/simulation_tests.rs description: Operations executed pipe_as_arg.kcl --- [ - { - "labeledArgs": { - "planeOrSolid": { - "value": { - "type": "Plane", - "artifact_id": "[uuid]" - }, - "sourceRange": [] - } - }, - "name": "startSketchOn", - "sourceRange": [], - "type": "StdLibCall", - "unlabeledArg": null - }, - { - "labeledArgs": { - "length": { - "value": { - "type": "Number", - "value": 400.0, - "ty": { - "type": "Default", - "len": { - "type": "Mm" - }, - "angle": { - "type": "Degrees" - } - } - }, - "sourceRange": [] - } - }, - "name": "extrude", - "sourceRange": [], - "type": "StdLibCall", - "unlabeledArg": { - "value": { - "type": "Sketch", - "value": { - "artifactId": "[uuid]" - } - }, - "sourceRange": [] - } - }, { "type": "GroupBegin", "group": { @@ -57,7 +10,58 @@ description: Operations executed pipe_as_arg.kcl "name": "cube", "functionSourceRange": [], "unlabeledArg": null, - "labeledArgs": {} + "labeledArgs": { + "center": { + "value": { + "type": "Array", + "value": [ + { + "type": "Number", + "value": 0.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + { + "type": "Number", + "value": 0.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + } + ] + }, + "sourceRange": [] + }, + "length": { + "value": { + "type": "Number", + "value": 400.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + } + } }, "sourceRange": [] }, diff --git a/rust/kcl-lib/tests/pipe_as_arg/program_memory.snap b/rust/kcl-lib/tests/pipe_as_arg/program_memory.snap index 03a287531..4aba2f8a9 100644 --- a/rust/kcl-lib/tests/pipe_as_arg/program_memory.snap +++ b/rust/kcl-lib/tests/pipe_as_arg/program_memory.snap @@ -10,202 +10,16 @@ description: Variables in memory after executing pipe_as_arg.kcl "type": "Function" }, "myCube": { - "type": "Solid", - "value": { - "type": "Solid", - "id": "[uuid]", - "artifactId": "[uuid]", - "value": [ - { - "faceId": "[uuid]", - "id": "[uuid]", - "sourceRange": [], - "tag": null, - "type": "extrudePlane" - }, - { - "faceId": "[uuid]", - "id": "[uuid]", - "sourceRange": [], - "tag": null, - "type": "extrudePlane" - }, - { - "faceId": "[uuid]", - "id": "[uuid]", - "sourceRange": [], - "tag": null, - "type": "extrudePlane" - }, - { - "faceId": "[uuid]", - "id": "[uuid]", - "sourceRange": [], - "tag": null, - "type": "extrudePlane" - } - ], - "sketch": { - "type": "Sketch", - "id": "[uuid]", - "paths": [ - { - "__geoMeta": { - "id": "[uuid]", - "sourceRange": [] - }, - "from": [ - -200.0, - -200.0 - ], - "tag": null, - "to": [ - -200.0, - 200.0 - ], - "type": "ToPoint", - "units": { - "type": "Mm" - } - }, - { - "__geoMeta": { - "id": "[uuid]", - "sourceRange": [] - }, - "from": [ - -200.0, - 200.0 - ], - "tag": null, - "to": [ - 200.0, - 200.0 - ], - "type": "ToPoint", - "units": { - "type": "Mm" - } - }, - { - "__geoMeta": { - "id": "[uuid]", - "sourceRange": [] - }, - "from": [ - 200.0, - 200.0 - ], - "tag": null, - "to": [ - 200.0, - -200.0 - ], - "type": "ToPoint", - "units": { - "type": "Mm" - } - }, - { - "__geoMeta": { - "id": "[uuid]", - "sourceRange": [] - }, - "from": [ - 200.0, - -200.0 - ], - "tag": null, - "to": [ - -200.0, - -200.0 - ], - "type": "ToPoint", - "units": { - "type": "Mm" - } - }, - { - "__geoMeta": { - "id": "[uuid]", - "sourceRange": [] - }, - "from": [ - -200.0, - -200.0 - ], - "tag": null, - "to": [ - -200.0, - -200.0 - ], - "type": "ToPoint", - "units": { - "type": "Mm" - } - } - ], - "on": { - "artifactId": "[uuid]", - "id": "[uuid]", - "origin": { - "x": 0.0, - "y": 0.0, - "z": 0.0, - "units": { - "type": "Mm" - } - }, - "type": "plane", - "value": "XY", - "xAxis": { - "x": 1.0, - "y": 0.0, - "z": 0.0, - "units": { - "type": "Unknown" - } - }, - "yAxis": { - "x": 0.0, - "y": 1.0, - "z": 0.0, - "units": { - "type": "Unknown" - } - } - }, - "start": { - "from": [ - -200.0, - -200.0 - ], - "to": [ - -200.0, - -200.0 - ], - "units": { - "type": "Mm" - }, - "tag": null, - "__geoMeta": { - "id": "[uuid]", - "sourceRange": [] - } - }, - "artifactId": "[uuid]", - "originalId": "[uuid]", - "units": { - "type": "Mm" - } - }, - "height": 400.0, - "startCapId": "[uuid]", - "endCapId": "[uuid]", - "units": { + "type": "Number", + "value": 400.0, + "ty": { + "type": "Default", + "len": { "type": "Mm" }, - "sectional": false + "angle": { + "type": "Degrees" + } } }, "width": { diff --git a/rust/kcl-lib/tests/pipe_as_arg/rendered_model.png b/rust/kcl-lib/tests/pipe_as_arg/rendered_model.png index 0a12783a0..6148ae432 100644 Binary files a/rust/kcl-lib/tests/pipe_as_arg/rendered_model.png and b/rust/kcl-lib/tests/pipe_as_arg/rendered_model.png differ diff --git a/rust/kcl-lib/tests/pipe_as_arg/unparsed.snap b/rust/kcl-lib/tests/pipe_as_arg/unparsed.snap index 750543f10..f8dc9d574 100644 --- a/rust/kcl-lib/tests/pipe_as_arg/unparsed.snap +++ b/rust/kcl-lib/tests/pipe_as_arg/unparsed.snap @@ -3,30 +3,18 @@ source: kcl-lib/src/simulation_tests.rs description: Result of unparsing pipe_as_arg.kcl --- fn cube(length, center) { - l = length / 2 - x = center[0] - y = center[1] - p0 = [-l + x, -l + y] - p1 = [-l + x, l + y] - p2 = [l + x, l + y] - p3 = [l + x, -l + y] - - return startSketchOn(XY) - |> startProfile(at = p0) - |> line(endAbsolute = p1) - |> line(endAbsolute = p2) - |> line(endAbsolute = p3) - |> line(endAbsolute = p0) - |> close(%) - |> extrude(length = length) + return length } -fn double(x) { +fn double(@x) { return x * 2 } fn width() { return 200 } -myCube = cube(200 - |> double(%), [0, 0]) +myCube = cube( + length = 200 + |> double(%), + center = [0, 0], +) diff --git a/rust/kcl-lib/tests/pipe_substitution_inside_function_called_from_pipeline/ast.snap b/rust/kcl-lib/tests/pipe_substitution_inside_function_called_from_pipeline/ast.snap index dc6339e0d..95d4a68f6 100644 --- a/rust/kcl-lib/tests/pipe_substitution_inside_function_called_from_pipeline/ast.snap +++ b/rust/kcl-lib/tests/pipe_substitution_inside_function_called_from_pipeline/ast.snap @@ -50,7 +50,8 @@ description: Result of parsing pipe_substitution_inside_function_called_from_pip "name": "ignored", "start": 0, "type": "Identifier" - } + }, + "labeled": false } ], "start": 0, diff --git a/rust/kcl-lib/tests/pipe_substitution_inside_function_called_from_pipeline/input.kcl b/rust/kcl-lib/tests/pipe_substitution_inside_function_called_from_pipeline/input.kcl index b56efda1f..5b31ef8db 100644 --- a/rust/kcl-lib/tests/pipe_substitution_inside_function_called_from_pipeline/input.kcl +++ b/rust/kcl-lib/tests/pipe_substitution_inside_function_called_from_pipeline/input.kcl @@ -1,5 +1,5 @@ // Make sure pipe value doesn't leak into the function call. -fn f(ignored) { +fn f(@ignored) { return % } diff --git a/rust/kcl-lib/tests/pipe_substitution_inside_function_called_from_pipeline/unparsed.snap b/rust/kcl-lib/tests/pipe_substitution_inside_function_called_from_pipeline/unparsed.snap index 0aaa2fa15..b0ff74f85 100644 --- a/rust/kcl-lib/tests/pipe_substitution_inside_function_called_from_pipeline/unparsed.snap +++ b/rust/kcl-lib/tests/pipe_substitution_inside_function_called_from_pipeline/unparsed.snap @@ -3,7 +3,7 @@ source: kcl-lib/src/simulation_tests.rs description: Result of unparsing pipe_substitution_inside_function_called_from_pipeline.kcl --- // Make sure pipe value doesn't leak into the function call. -fn f(ignored) { +fn f(@ignored) { return % } diff --git a/rust/kcl-lib/tests/riddle_small/artifact_graph_flowchart.snap.md b/rust/kcl-lib/tests/riddle_small/artifact_graph_flowchart.snap.md index b248f75f4..296b2c9e9 100644 --- a/rust/kcl-lib/tests/riddle_small/artifact_graph_flowchart.snap.md +++ b/rust/kcl-lib/tests/riddle_small/artifact_graph_flowchart.snap.md @@ -1,15 +1,15 @@ ```mermaid flowchart LR subgraph path2 [Path] - 2["Path
[164, 191, 0]"] - 3["Segment
[197, 215, 0]"] - 4["Segment
[221, 240, 0]"] - 5["Segment
[246, 265, 0]"] - 6["Segment
[271, 279, 0]"] + 2["Path
[165, 192, 0]"] + 3["Segment
[198, 216, 0]"] + 4["Segment
[222, 241, 0]"] + 5["Segment
[247, 266, 0]"] + 6["Segment
[272, 280, 0]"] 7[Solid2d] end - 1["Plane
[141, 158, 0]"] - 8["Sweep Extrusion
[285, 304, 0]"] + 1["Plane
[142, 159, 0]"] + 8["Sweep Extrusion
[286, 305, 0]"] 9[Wall] 10[Wall] 11[Wall] diff --git a/rust/kcl-lib/tests/riddle_small/ast.snap b/rust/kcl-lib/tests/riddle_small/ast.snap index 29c7ad0f3..1c953c41b 100644 --- a/rust/kcl-lib/tests/riddle_small/ast.snap +++ b/rust/kcl-lib/tests/riddle_small/ast.snap @@ -156,7 +156,8 @@ description: Result of parsing riddle_small.kcl "name": "s", "start": 0, "type": "Identifier" - } + }, + "labeled": false } ], "start": 0, diff --git a/rust/kcl-lib/tests/riddle_small/input.kcl b/rust/kcl-lib/tests/riddle_small/input.kcl index eb583ecf8..5cea48d30 100644 --- a/rust/kcl-lib/tests/riddle_small/input.kcl +++ b/rust/kcl-lib/tests/riddle_small/input.kcl @@ -1,6 +1,6 @@ ANSWER = 41803 -fn t(s) { +fn t(@s) { return (ANSWER * s + 12345) % 214748 } diff --git a/rust/kcl-lib/tests/riddle_small/unparsed.snap b/rust/kcl-lib/tests/riddle_small/unparsed.snap index 961ad1c39..5f6b74abd 100644 --- a/rust/kcl-lib/tests/riddle_small/unparsed.snap +++ b/rust/kcl-lib/tests/riddle_small/unparsed.snap @@ -4,7 +4,7 @@ description: Result of unparsing riddle_small.kcl --- ANSWER = 41803 -fn t(s) { +fn t(@s) { return (ANSWER * s + 12345) % 214748 } diff --git a/rust/kcl-lib/tests/sketch_on_face_circle_tagged/artifact_graph_flowchart.snap.md b/rust/kcl-lib/tests/sketch_on_face_circle_tagged/artifact_graph_flowchart.snap.md index 88f9fc92b..a7e8e0d35 100644 --- a/rust/kcl-lib/tests/sketch_on_face_circle_tagged/artifact_graph_flowchart.snap.md +++ b/rust/kcl-lib/tests/sketch_on_face_circle_tagged/artifact_graph_flowchart.snap.md @@ -5,18 +5,18 @@ flowchart LR 5["Segment
[84, 106, 0]"] 6["Segment
[114, 136, 0]"] 7["Segment
[144, 167, 0]"] - 8["Segment
[215, 223, 0]"] + 8["Segment
[229, 237, 0]"] 11[Solid2d] end subgraph path4 [Path] - 4["Path
[303, 355, 0]"] - 9["Segment
[303, 355, 0]"] + 4["Path
[317, 369, 0]"] + 9["Segment
[317, 369, 0]"] 10[Solid2d] end 1["Plane
[29, 46, 0]"] - 2["StartSketchOnFace
[261, 297, 0]"] - 12["Sweep Extrusion
[229, 249, 0]"] - 13["Sweep Extrusion
[361, 380, 0]"] + 2["StartSketchOnFace
[275, 311, 0]"] + 12["Sweep Extrusion
[243, 263, 0]"] + 13["Sweep Extrusion
[375, 394, 0]"] 14[Wall] 15[Wall] 16[Wall] diff --git a/rust/kcl-lib/tests/sketch_on_face_circle_tagged/ast.snap b/rust/kcl-lib/tests/sketch_on_face_circle_tagged/ast.snap index 6b2ff86d1..aa6d387f5 100644 --- a/rust/kcl-lib/tests/sketch_on_face_circle_tagged/ast.snap +++ b/rust/kcl-lib/tests/sketch_on_face_circle_tagged/ast.snap @@ -463,48 +463,68 @@ description: Result of parsing sketch_on_face_circle_tagged.kcl { "arguments": [ { - "commentStart": 0, - "elements": [ - { - "commentStart": 0, - "end": 0, - "raw": "0", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 0.0, - "suffix": "None" + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "pos", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "elements": [ + { + "commentStart": 0, + "end": 0, + "raw": "0", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 0.0, + "suffix": "None" + } + }, + { + "commentStart": 0, + "end": 0, + "raw": "0", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 0.0, + "suffix": "None" + } } - }, - { - "commentStart": 0, - "end": 0, - "raw": "0", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 0.0, - "suffix": "None" - } - } - ], - "end": 0, - "start": 0, - "type": "ArrayExpression", - "type": "ArrayExpression" + ], + "end": 0, + "start": 0, + "type": "ArrayExpression", + "type": "ArrayExpression" + } }, { - "commentStart": 0, - "end": 0, - "raw": "20", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 20.0, - "suffix": "None" + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "scale", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "end": 0, + "raw": "20", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 20.0, + "suffix": "None" + } } } ], @@ -526,8 +546,9 @@ description: Result of parsing sketch_on_face_circle_tagged.kcl "commentStart": 0, "end": 0, "start": 0, - "type": "CallExpression", - "type": "CallExpression" + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null }, { "arguments": [ diff --git a/rust/kcl-lib/tests/sketch_on_face_circle_tagged/input.kcl b/rust/kcl-lib/tests/sketch_on_face_circle_tagged/input.kcl index faac37e54..ac8c9089a 100644 --- a/rust/kcl-lib/tests/sketch_on_face_circle_tagged/input.kcl +++ b/rust/kcl-lib/tests/sketch_on_face_circle_tagged/input.kcl @@ -7,7 +7,7 @@ fn cube(pos, scale) { return sg } -part001 = cube([0, 0], 20) +part001 = cube(pos = [0, 0], scale = 20) |> close(%) |> extrude(length = 20) diff --git a/rust/kcl-lib/tests/sketch_on_face_circle_tagged/ops.snap b/rust/kcl-lib/tests/sketch_on_face_circle_tagged/ops.snap index b70f3e7c6..66ecbd489 100644 --- a/rust/kcl-lib/tests/sketch_on_face_circle_tagged/ops.snap +++ b/rust/kcl-lib/tests/sketch_on_face_circle_tagged/ops.snap @@ -25,7 +25,58 @@ description: Operations executed sketch_on_face_circle_tagged.kcl "name": "cube", "functionSourceRange": [], "unlabeledArg": null, - "labeledArgs": {} + "labeledArgs": { + "pos": { + "value": { + "type": "Array", + "value": [ + { + "type": "Number", + "value": 0.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + { + "type": "Number", + "value": 0.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + } + ] + }, + "sourceRange": [] + }, + "scale": { + "value": { + "type": "Number", + "value": 20.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + } + } }, "sourceRange": [] }, diff --git a/rust/kcl-lib/tests/sketch_on_face_circle_tagged/program_memory.snap b/rust/kcl-lib/tests/sketch_on_face_circle_tagged/program_memory.snap index 2a979002b..1db537253 100644 --- a/rust/kcl-lib/tests/sketch_on_face_circle_tagged/program_memory.snap +++ b/rust/kcl-lib/tests/sketch_on_face_circle_tagged/program_memory.snap @@ -203,9 +203,9 @@ description: Variables in memory after executing sketch_on_face_circle_tagged.kc "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 345, - "end": 354, - "start": 345, + "commentStart": 359, + "end": 368, + "start": 359, "type": "TagDeclarator", "value": "myCircle" }, @@ -232,9 +232,9 @@ description: Variables in memory after executing sketch_on_face_circle_tagged.kc ], "radius": 5.0, "tag": { - "commentStart": 345, - "end": 354, - "start": 345, + "commentStart": 359, + "end": 368, + "start": 359, "type": "TagDeclarator", "value": "myCircle" }, diff --git a/rust/kcl-lib/tests/sketch_on_face_circle_tagged/unparsed.snap b/rust/kcl-lib/tests/sketch_on_face_circle_tagged/unparsed.snap index a96849a0e..6511b57ef 100644 --- a/rust/kcl-lib/tests/sketch_on_face_circle_tagged/unparsed.snap +++ b/rust/kcl-lib/tests/sketch_on_face_circle_tagged/unparsed.snap @@ -11,7 +11,7 @@ fn cube(pos, scale) { return sg } -part001 = cube([0, 0], 20) +part001 = cube(pos = [0, 0], scale = 20) |> close(%) |> extrude(length = 20) diff --git a/rust/kcl-lib/tests/sketch_on_face_end/artifact_graph_flowchart.snap.md b/rust/kcl-lib/tests/sketch_on_face_end/artifact_graph_flowchart.snap.md index d083432d7..a0d64a832 100644 --- a/rust/kcl-lib/tests/sketch_on_face_end/artifact_graph_flowchart.snap.md +++ b/rust/kcl-lib/tests/sketch_on_face_end/artifact_graph_flowchart.snap.md @@ -5,21 +5,21 @@ flowchart LR 5["Segment
[84, 106, 0]"] 6["Segment
[114, 136, 0]"] 7["Segment
[144, 167, 0]"] - 8["Segment
[215, 223, 0]"] + 8["Segment
[229, 237, 0]"] 14[Solid2d] end subgraph path4 [Path] - 4["Path
[303, 328, 0]"] - 9["Segment
[334, 353, 0]"] - 10["Segment
[359, 378, 0]"] - 11["Segment
[384, 404, 0]"] - 12["Segment
[410, 418, 0]"] + 4["Path
[317, 342, 0]"] + 9["Segment
[348, 367, 0]"] + 10["Segment
[373, 392, 0]"] + 11["Segment
[398, 418, 0]"] + 12["Segment
[424, 432, 0]"] 13[Solid2d] end 1["Plane
[29, 46, 0]"] - 2["StartSketchOnFace
[261, 297, 0]"] - 15["Sweep Extrusion
[229, 249, 0]"] - 16["Sweep Extrusion
[424, 443, 0]"] + 2["StartSketchOnFace
[275, 311, 0]"] + 15["Sweep Extrusion
[243, 263, 0]"] + 16["Sweep Extrusion
[438, 457, 0]"] 17[Wall] 18[Wall] 19[Wall] diff --git a/rust/kcl-lib/tests/sketch_on_face_end/ast.snap b/rust/kcl-lib/tests/sketch_on_face_end/ast.snap index f544205fc..5f3d4b503 100644 --- a/rust/kcl-lib/tests/sketch_on_face_end/ast.snap +++ b/rust/kcl-lib/tests/sketch_on_face_end/ast.snap @@ -463,48 +463,68 @@ description: Result of parsing sketch_on_face_end.kcl { "arguments": [ { - "commentStart": 0, - "elements": [ - { - "commentStart": 0, - "end": 0, - "raw": "0", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 0.0, - "suffix": "None" + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "pos", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "elements": [ + { + "commentStart": 0, + "end": 0, + "raw": "0", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 0.0, + "suffix": "None" + } + }, + { + "commentStart": 0, + "end": 0, + "raw": "0", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 0.0, + "suffix": "None" + } } - }, - { - "commentStart": 0, - "end": 0, - "raw": "0", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 0.0, - "suffix": "None" - } - } - ], - "end": 0, - "start": 0, - "type": "ArrayExpression", - "type": "ArrayExpression" + ], + "end": 0, + "start": 0, + "type": "ArrayExpression", + "type": "ArrayExpression" + } }, { - "commentStart": 0, - "end": 0, - "raw": "20", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 20.0, - "suffix": "None" + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "scale", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "end": 0, + "raw": "20", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 20.0, + "suffix": "None" + } } } ], @@ -526,8 +546,9 @@ description: Result of parsing sketch_on_face_end.kcl "commentStart": 0, "end": 0, "start": 0, - "type": "CallExpression", - "type": "CallExpression" + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null }, { "arguments": [ diff --git a/rust/kcl-lib/tests/sketch_on_face_end/input.kcl b/rust/kcl-lib/tests/sketch_on_face_end/input.kcl index 7668af2fe..dc28207b2 100644 --- a/rust/kcl-lib/tests/sketch_on_face_end/input.kcl +++ b/rust/kcl-lib/tests/sketch_on_face_end/input.kcl @@ -7,7 +7,7 @@ fn cube(pos, scale) { return sg } -part001 = cube([0, 0], 20) +part001 = cube(pos = [0, 0], scale = 20) |> close(%) |> extrude(length = 20) diff --git a/rust/kcl-lib/tests/sketch_on_face_end/ops.snap b/rust/kcl-lib/tests/sketch_on_face_end/ops.snap index e9a2e49cb..9a0e63dae 100644 --- a/rust/kcl-lib/tests/sketch_on_face_end/ops.snap +++ b/rust/kcl-lib/tests/sketch_on_face_end/ops.snap @@ -25,7 +25,58 @@ description: Operations executed sketch_on_face_end.kcl "name": "cube", "functionSourceRange": [], "unlabeledArg": null, - "labeledArgs": {} + "labeledArgs": { + "pos": { + "value": { + "type": "Array", + "value": [ + { + "type": "Number", + "value": 0.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + { + "type": "Number", + "value": 0.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + } + ] + }, + "sourceRange": [] + }, + "scale": { + "value": { + "type": "Number", + "value": 20.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + } + } }, "sourceRange": [] }, diff --git a/rust/kcl-lib/tests/sketch_on_face_end/unparsed.snap b/rust/kcl-lib/tests/sketch_on_face_end/unparsed.snap index 9c2d589b1..f3e49167d 100644 --- a/rust/kcl-lib/tests/sketch_on_face_end/unparsed.snap +++ b/rust/kcl-lib/tests/sketch_on_face_end/unparsed.snap @@ -11,7 +11,7 @@ fn cube(pos, scale) { return sg } -part001 = cube([0, 0], 20) +part001 = cube(pos = [0, 0], scale = 20) |> close(%) |> extrude(length = 20) diff --git a/rust/kcl-lib/tests/sketch_on_face_end_negative_extrude/artifact_graph_flowchart.snap.md b/rust/kcl-lib/tests/sketch_on_face_end_negative_extrude/artifact_graph_flowchart.snap.md index 0d88a7afb..c69af9076 100644 --- a/rust/kcl-lib/tests/sketch_on_face_end_negative_extrude/artifact_graph_flowchart.snap.md +++ b/rust/kcl-lib/tests/sketch_on_face_end_negative_extrude/artifact_graph_flowchart.snap.md @@ -5,21 +5,21 @@ flowchart LR 5["Segment
[84, 106, 0]"] 6["Segment
[114, 136, 0]"] 7["Segment
[144, 167, 0]"] - 8["Segment
[215, 223, 0]"] + 8["Segment
[229, 237, 0]"] 14[Solid2d] end subgraph path4 [Path] - 4["Path
[303, 328, 0]"] - 9["Segment
[334, 353, 0]"] - 10["Segment
[359, 378, 0]"] - 11["Segment
[384, 404, 0]"] - 12["Segment
[410, 418, 0]"] + 4["Path
[317, 342, 0]"] + 9["Segment
[348, 367, 0]"] + 10["Segment
[373, 392, 0]"] + 11["Segment
[398, 418, 0]"] + 12["Segment
[424, 432, 0]"] 13[Solid2d] end 1["Plane
[29, 46, 0]"] - 2["StartSketchOnFace
[261, 297, 0]"] - 15["Sweep Extrusion
[229, 249, 0]"] - 16["Sweep Extrusion
[424, 444, 0]"] + 2["StartSketchOnFace
[275, 311, 0]"] + 15["Sweep Extrusion
[243, 263, 0]"] + 16["Sweep Extrusion
[438, 458, 0]"] 17[Wall] 18[Wall] 19[Wall] diff --git a/rust/kcl-lib/tests/sketch_on_face_end_negative_extrude/ast.snap b/rust/kcl-lib/tests/sketch_on_face_end_negative_extrude/ast.snap index 56d327e69..79320517d 100644 --- a/rust/kcl-lib/tests/sketch_on_face_end_negative_extrude/ast.snap +++ b/rust/kcl-lib/tests/sketch_on_face_end_negative_extrude/ast.snap @@ -463,48 +463,68 @@ description: Result of parsing sketch_on_face_end_negative_extrude.kcl { "arguments": [ { - "commentStart": 0, - "elements": [ - { - "commentStart": 0, - "end": 0, - "raw": "0", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 0.0, - "suffix": "None" + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "pos", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "elements": [ + { + "commentStart": 0, + "end": 0, + "raw": "0", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 0.0, + "suffix": "None" + } + }, + { + "commentStart": 0, + "end": 0, + "raw": "0", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 0.0, + "suffix": "None" + } } - }, - { - "commentStart": 0, - "end": 0, - "raw": "0", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 0.0, - "suffix": "None" - } - } - ], - "end": 0, - "start": 0, - "type": "ArrayExpression", - "type": "ArrayExpression" + ], + "end": 0, + "start": 0, + "type": "ArrayExpression", + "type": "ArrayExpression" + } }, { - "commentStart": 0, - "end": 0, - "raw": "20", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 20.0, - "suffix": "None" + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "scale", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "end": 0, + "raw": "20", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 20.0, + "suffix": "None" + } } } ], @@ -526,8 +546,9 @@ description: Result of parsing sketch_on_face_end_negative_extrude.kcl "commentStart": 0, "end": 0, "start": 0, - "type": "CallExpression", - "type": "CallExpression" + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null }, { "arguments": [ diff --git a/rust/kcl-lib/tests/sketch_on_face_end_negative_extrude/input.kcl b/rust/kcl-lib/tests/sketch_on_face_end_negative_extrude/input.kcl index a33dc453b..1eb6136ab 100644 --- a/rust/kcl-lib/tests/sketch_on_face_end_negative_extrude/input.kcl +++ b/rust/kcl-lib/tests/sketch_on_face_end_negative_extrude/input.kcl @@ -7,7 +7,7 @@ fn cube(pos, scale) { return sg } -part001 = cube([0, 0], 20) +part001 = cube(pos = [0, 0], scale = 20) |> close(%) |> extrude(length = 20) diff --git a/rust/kcl-lib/tests/sketch_on_face_end_negative_extrude/ops.snap b/rust/kcl-lib/tests/sketch_on_face_end_negative_extrude/ops.snap index ef2abb2d4..26238fd94 100644 --- a/rust/kcl-lib/tests/sketch_on_face_end_negative_extrude/ops.snap +++ b/rust/kcl-lib/tests/sketch_on_face_end_negative_extrude/ops.snap @@ -25,7 +25,58 @@ description: Operations executed sketch_on_face_end_negative_extrude.kcl "name": "cube", "functionSourceRange": [], "unlabeledArg": null, - "labeledArgs": {} + "labeledArgs": { + "pos": { + "value": { + "type": "Array", + "value": [ + { + "type": "Number", + "value": 0.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + { + "type": "Number", + "value": 0.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + } + ] + }, + "sourceRange": [] + }, + "scale": { + "value": { + "type": "Number", + "value": 20.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + } + } }, "sourceRange": [] }, diff --git a/rust/kcl-lib/tests/sketch_on_face_end_negative_extrude/unparsed.snap b/rust/kcl-lib/tests/sketch_on_face_end_negative_extrude/unparsed.snap index 3b968e94d..ecc4c4825 100644 --- a/rust/kcl-lib/tests/sketch_on_face_end_negative_extrude/unparsed.snap +++ b/rust/kcl-lib/tests/sketch_on_face_end_negative_extrude/unparsed.snap @@ -11,7 +11,7 @@ fn cube(pos, scale) { return sg } -part001 = cube([0, 0], 20) +part001 = cube(pos = [0, 0], scale = 20) |> close(%) |> extrude(length = 20) diff --git a/rust/kcl-lib/tests/sketch_on_face_start/artifact_graph_flowchart.snap.md b/rust/kcl-lib/tests/sketch_on_face_start/artifact_graph_flowchart.snap.md index 7ffc24767..5c9b96399 100644 --- a/rust/kcl-lib/tests/sketch_on_face_start/artifact_graph_flowchart.snap.md +++ b/rust/kcl-lib/tests/sketch_on_face_start/artifact_graph_flowchart.snap.md @@ -5,21 +5,21 @@ flowchart LR 5["Segment
[84, 106, 0]"] 6["Segment
[114, 136, 0]"] 7["Segment
[144, 167, 0]"] - 8["Segment
[215, 223, 0]"] + 8["Segment
[229, 237, 0]"] 14[Solid2d] end subgraph path4 [Path] - 4["Path
[308, 333, 0]"] - 9["Segment
[339, 358, 0]"] - 10["Segment
[364, 383, 0]"] - 11["Segment
[389, 409, 0]"] - 12["Segment
[415, 423, 0]"] + 4["Path
[322, 347, 0]"] + 9["Segment
[353, 372, 0]"] + 10["Segment
[378, 397, 0]"] + 11["Segment
[403, 423, 0]"] + 12["Segment
[429, 437, 0]"] 13[Solid2d] end 1["Plane
[29, 46, 0]"] - 2["StartSketchOnFace
[268, 302, 0]"] - 15["Sweep Extrusion
[229, 249, 0]"] - 16["Sweep Extrusion
[429, 448, 0]"] + 2["StartSketchOnFace
[282, 316, 0]"] + 15["Sweep Extrusion
[243, 263, 0]"] + 16["Sweep Extrusion
[443, 462, 0]"] 17[Wall] 18[Wall] 19[Wall] diff --git a/rust/kcl-lib/tests/sketch_on_face_start/ast.snap b/rust/kcl-lib/tests/sketch_on_face_start/ast.snap index 767543dc2..e01341546 100644 --- a/rust/kcl-lib/tests/sketch_on_face_start/ast.snap +++ b/rust/kcl-lib/tests/sketch_on_face_start/ast.snap @@ -463,48 +463,68 @@ description: Result of parsing sketch_on_face_start.kcl { "arguments": [ { - "commentStart": 0, - "elements": [ - { - "commentStart": 0, - "end": 0, - "raw": "0", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 0.0, - "suffix": "None" + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "pos", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "elements": [ + { + "commentStart": 0, + "end": 0, + "raw": "0", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 0.0, + "suffix": "None" + } + }, + { + "commentStart": 0, + "end": 0, + "raw": "0", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 0.0, + "suffix": "None" + } } - }, - { - "commentStart": 0, - "end": 0, - "raw": "0", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 0.0, - "suffix": "None" - } - } - ], - "end": 0, - "start": 0, - "type": "ArrayExpression", - "type": "ArrayExpression" + ], + "end": 0, + "start": 0, + "type": "ArrayExpression", + "type": "ArrayExpression" + } }, { - "commentStart": 0, - "end": 0, - "raw": "20", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 20.0, - "suffix": "None" + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "scale", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "end": 0, + "raw": "20", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 20.0, + "suffix": "None" + } } } ], @@ -526,8 +546,9 @@ description: Result of parsing sketch_on_face_start.kcl "commentStart": 0, "end": 0, "start": 0, - "type": "CallExpression", - "type": "CallExpression" + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null }, { "arguments": [ diff --git a/rust/kcl-lib/tests/sketch_on_face_start/input.kcl b/rust/kcl-lib/tests/sketch_on_face_start/input.kcl index 93df3c8f0..fb5b9f9aa 100644 --- a/rust/kcl-lib/tests/sketch_on_face_start/input.kcl +++ b/rust/kcl-lib/tests/sketch_on_face_start/input.kcl @@ -7,7 +7,7 @@ fn cube(pos, scale) { return sg } -part001 = cube([0, 0], 20) +part001 = cube(pos = [0, 0], scale = 20) |> close(%) |> extrude(length = 20) as foo diff --git a/rust/kcl-lib/tests/sketch_on_face_start/ops.snap b/rust/kcl-lib/tests/sketch_on_face_start/ops.snap index 1ae907dde..714253506 100644 --- a/rust/kcl-lib/tests/sketch_on_face_start/ops.snap +++ b/rust/kcl-lib/tests/sketch_on_face_start/ops.snap @@ -25,7 +25,58 @@ description: Operations executed sketch_on_face_start.kcl "name": "cube", "functionSourceRange": [], "unlabeledArg": null, - "labeledArgs": {} + "labeledArgs": { + "pos": { + "value": { + "type": "Array", + "value": [ + { + "type": "Number", + "value": 0.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + { + "type": "Number", + "value": 0.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + } + ] + }, + "sourceRange": [] + }, + "scale": { + "value": { + "type": "Number", + "value": 20.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + } + } }, "sourceRange": [] }, diff --git a/rust/kcl-lib/tests/sketch_on_face_start/unparsed.snap b/rust/kcl-lib/tests/sketch_on_face_start/unparsed.snap index 6dd658d1b..eab366a6f 100644 --- a/rust/kcl-lib/tests/sketch_on_face_start/unparsed.snap +++ b/rust/kcl-lib/tests/sketch_on_face_start/unparsed.snap @@ -11,7 +11,7 @@ fn cube(pos, scale) { return sg } -part001 = cube([0, 0], 20) +part001 = cube(pos = [0, 0], scale = 20) |> close(%) |> extrude(length = 20) as foo diff --git a/rust/kcl-lib/tests/subtract_cylinder_from_cube/artifact_graph_flowchart.snap.md b/rust/kcl-lib/tests/subtract_cylinder_from_cube/artifact_graph_flowchart.snap.md index 0d7009b03..d9deddde4 100644 --- a/rust/kcl-lib/tests/subtract_cylinder_from_cube/artifact_graph_flowchart.snap.md +++ b/rust/kcl-lib/tests/subtract_cylinder_from_cube/artifact_graph_flowchart.snap.md @@ -9,15 +9,15 @@ flowchart LR 11[Solid2d] end subgraph path4 [Path] - 4["Path
[386, 421, 0]"] - 9["Segment
[386, 421, 0]"] + 4["Path
[395, 430, 0]"] + 9["Segment
[395, 430, 0]"] 10[Solid2d] end 1["Plane
[27, 44, 0]"] - 2["Plane
[363, 380, 0]"] + 2["Plane
[372, 389, 0]"] 12["Sweep Extrusion
[306, 326, 0]"] - 13["Sweep Extrusion
[427, 446, 0]"] - 14["CompositeSolid Subtract
[459, 495, 0]"] + 13["Sweep Extrusion
[436, 455, 0]"] + 14["CompositeSolid Subtract
[468, 504, 0]"] 15[Wall] 16[Wall] 17[Wall] diff --git a/rust/kcl-lib/tests/subtract_cylinder_from_cube/ast.snap b/rust/kcl-lib/tests/subtract_cylinder_from_cube/ast.snap index e6d0b7825..0503fffa8 100644 --- a/rust/kcl-lib/tests/subtract_cylinder_from_cube/ast.snap +++ b/rust/kcl-lib/tests/subtract_cylinder_from_cube/ast.snap @@ -753,37 +753,47 @@ description: Result of parsing subtract_cylinder_from_cube.kcl "init": { "arguments": [ { - "commentStart": 0, - "elements": [ - { - "commentStart": 0, - "end": 0, - "raw": "0", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 0.0, - "suffix": "None" + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "center", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "elements": [ + { + "commentStart": 0, + "end": 0, + "raw": "0", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 0.0, + "suffix": "None" + } + }, + { + "commentStart": 0, + "end": 0, + "raw": "0", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 0.0, + "suffix": "None" + } } - }, - { - "commentStart": 0, - "end": 0, - "raw": "0", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 0.0, - "suffix": "None" - } - } - ], - "end": 0, - "start": 0, - "type": "ArrayExpression", - "type": "ArrayExpression" + ], + "end": 0, + "start": 0, + "type": "ArrayExpression", + "type": "ArrayExpression" + } } ], "callee": { @@ -804,8 +814,9 @@ description: Result of parsing subtract_cylinder_from_cube.kcl "commentStart": 0, "end": 0, "start": 0, - "type": "CallExpression", - "type": "CallExpression" + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null }, "start": 0, "type": "VariableDeclarator" diff --git a/rust/kcl-lib/tests/subtract_cylinder_from_cube/input.kcl b/rust/kcl-lib/tests/subtract_cylinder_from_cube/input.kcl index d0f24117d..9b9af9fff 100644 --- a/rust/kcl-lib/tests/subtract_cylinder_from_cube/input.kcl +++ b/rust/kcl-lib/tests/subtract_cylinder_from_cube/input.kcl @@ -8,7 +8,7 @@ fn cube(center) { |> extrude(length = 10) } -part001 = cube([0, 0]) +part001 = cube(center = [0, 0]) part002 = startSketchOn(XY) |> circle(center = [2, 2], radius = 2) |> extrude(length = 5) diff --git a/rust/kcl-lib/tests/subtract_cylinder_from_cube/ops.snap b/rust/kcl-lib/tests/subtract_cylinder_from_cube/ops.snap index 66b969814..0c5f00166 100644 --- a/rust/kcl-lib/tests/subtract_cylinder_from_cube/ops.snap +++ b/rust/kcl-lib/tests/subtract_cylinder_from_cube/ops.snap @@ -57,7 +57,42 @@ description: Operations executed subtract_cylinder_from_cube.kcl "name": "cube", "functionSourceRange": [], "unlabeledArg": null, - "labeledArgs": {} + "labeledArgs": { + "center": { + "value": { + "type": "Array", + "value": [ + { + "type": "Number", + "value": 0.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + { + "type": "Number", + "value": 0.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + } + ] + }, + "sourceRange": [] + } + } }, "sourceRange": [] }, diff --git a/rust/kcl-lib/tests/subtract_cylinder_from_cube/unparsed.snap b/rust/kcl-lib/tests/subtract_cylinder_from_cube/unparsed.snap index 0f276364d..9ad56d457 100644 --- a/rust/kcl-lib/tests/subtract_cylinder_from_cube/unparsed.snap +++ b/rust/kcl-lib/tests/subtract_cylinder_from_cube/unparsed.snap @@ -12,7 +12,7 @@ fn cube(center) { |> extrude(length = 10) } -part001 = cube([0, 0]) +part001 = cube(center = [0, 0]) part002 = startSketchOn(XY) |> circle(center = [2, 2], radius = 2) |> extrude(length = 5) diff --git a/rust/kcl-lib/tests/subtract_doesnt_need_brackets/artifact_graph_flowchart.snap.md b/rust/kcl-lib/tests/subtract_doesnt_need_brackets/artifact_graph_flowchart.snap.md index 890fd1a3d..15802af18 100644 --- a/rust/kcl-lib/tests/subtract_doesnt_need_brackets/artifact_graph_flowchart.snap.md +++ b/rust/kcl-lib/tests/subtract_doesnt_need_brackets/artifact_graph_flowchart.snap.md @@ -1,26 +1,26 @@ ```mermaid flowchart LR subgraph path3 [Path] - 3["Path
[58, 113, 0]"] - 5["Segment
[121, 177, 0]"] - 8["Segment
[185, 241, 0]"] - 10["Segment
[249, 305, 0]"] - 11["Segment
[313, 320, 0]"] + 3["Path
[56, 107, 0]"] + 5["Segment
[115, 167, 0]"] + 8["Segment
[175, 227, 0]"] + 10["Segment
[235, 287, 0]"] + 11["Segment
[295, 302, 0]"] 13[Solid2d] end subgraph path4 [Path] - 4["Path
[58, 113, 0]"] - 6["Segment
[121, 177, 0]"] - 7["Segment
[185, 241, 0]"] - 9["Segment
[249, 305, 0]"] - 12["Segment
[313, 320, 0]"] + 4["Path
[56, 107, 0]"] + 6["Segment
[115, 167, 0]"] + 7["Segment
[175, 227, 0]"] + 9["Segment
[235, 287, 0]"] + 12["Segment
[295, 302, 0]"] 14[Solid2d] end - 1["Plane
[33, 50, 0]"] - 2["Plane
[33, 50, 0]"] - 15["Sweep Extrusion
[328, 348, 0]"] - 16["Sweep Extrusion
[328, 348, 0]"] - 17["CompositeSolid Subtract
[445, 479, 0]"] + 1["Plane
[31, 48, 0]"] + 2["Plane
[31, 48, 0]"] + 15["Sweep Extrusion
[310, 330, 0]"] + 16["Sweep Extrusion
[310, 330, 0]"] + 17["CompositeSolid Subtract
[455, 489, 0]"] 18[Wall] 19[Wall] 20[Wall] diff --git a/rust/kcl-lib/tests/subtract_doesnt_need_brackets/ast.snap b/rust/kcl-lib/tests/subtract_doesnt_need_brackets/ast.snap index b36956f19..7c64169f4 100644 --- a/rust/kcl-lib/tests/subtract_doesnt_need_brackets/ast.snap +++ b/rust/kcl-lib/tests/subtract_doesnt_need_brackets/ast.snap @@ -87,7 +87,7 @@ description: Result of parsing subtract_doesnt_need_brackets.kcl "object": { "commentStart": 0, "end": 0, - "name": "center", + "name": "pos", "start": 0, "type": "Identifier", "type": "Identifier" @@ -116,7 +116,7 @@ description: Result of parsing subtract_doesnt_need_brackets.kcl "name": { "commentStart": 0, "end": 0, - "name": "size", + "name": "scale", "start": 0, "type": "Identifier" }, @@ -139,7 +139,7 @@ description: Result of parsing subtract_doesnt_need_brackets.kcl "object": { "commentStart": 0, "end": 0, - "name": "center", + "name": "pos", "start": 0, "type": "Identifier", "type": "Identifier" @@ -168,7 +168,7 @@ description: Result of parsing subtract_doesnt_need_brackets.kcl "name": { "commentStart": 0, "end": 0, - "name": "size", + "name": "scale", "start": 0, "type": "Identifier" }, @@ -235,7 +235,7 @@ description: Result of parsing subtract_doesnt_need_brackets.kcl "object": { "commentStart": 0, "end": 0, - "name": "center", + "name": "pos", "start": 0, "type": "Identifier", "type": "Identifier" @@ -264,7 +264,7 @@ description: Result of parsing subtract_doesnt_need_brackets.kcl "name": { "commentStart": 0, "end": 0, - "name": "size", + "name": "scale", "start": 0, "type": "Identifier" }, @@ -287,7 +287,7 @@ description: Result of parsing subtract_doesnt_need_brackets.kcl "object": { "commentStart": 0, "end": 0, - "name": "center", + "name": "pos", "start": 0, "type": "Identifier", "type": "Identifier" @@ -316,7 +316,7 @@ description: Result of parsing subtract_doesnt_need_brackets.kcl "name": { "commentStart": 0, "end": 0, - "name": "size", + "name": "scale", "start": 0, "type": "Identifier" }, @@ -383,7 +383,7 @@ description: Result of parsing subtract_doesnt_need_brackets.kcl "object": { "commentStart": 0, "end": 0, - "name": "center", + "name": "pos", "start": 0, "type": "Identifier", "type": "Identifier" @@ -412,7 +412,7 @@ description: Result of parsing subtract_doesnt_need_brackets.kcl "name": { "commentStart": 0, "end": 0, - "name": "size", + "name": "scale", "start": 0, "type": "Identifier" }, @@ -435,7 +435,7 @@ description: Result of parsing subtract_doesnt_need_brackets.kcl "object": { "commentStart": 0, "end": 0, - "name": "center", + "name": "pos", "start": 0, "type": "Identifier", "type": "Identifier" @@ -464,7 +464,7 @@ description: Result of parsing subtract_doesnt_need_brackets.kcl "name": { "commentStart": 0, "end": 0, - "name": "size", + "name": "scale", "start": 0, "type": "Identifier" }, @@ -531,7 +531,7 @@ description: Result of parsing subtract_doesnt_need_brackets.kcl "object": { "commentStart": 0, "end": 0, - "name": "center", + "name": "pos", "start": 0, "type": "Identifier", "type": "Identifier" @@ -560,7 +560,7 @@ description: Result of parsing subtract_doesnt_need_brackets.kcl "name": { "commentStart": 0, "end": 0, - "name": "size", + "name": "scale", "start": 0, "type": "Identifier" }, @@ -583,7 +583,7 @@ description: Result of parsing subtract_doesnt_need_brackets.kcl "object": { "commentStart": 0, "end": 0, - "name": "center", + "name": "pos", "start": 0, "type": "Identifier", "type": "Identifier" @@ -612,7 +612,7 @@ description: Result of parsing subtract_doesnt_need_brackets.kcl "name": { "commentStart": 0, "end": 0, - "name": "size", + "name": "scale", "start": 0, "type": "Identifier" }, @@ -751,7 +751,7 @@ description: Result of parsing subtract_doesnt_need_brackets.kcl "identifier": { "commentStart": 0, "end": 0, - "name": "center", + "name": "pos", "start": 0, "type": "Identifier" } @@ -761,7 +761,7 @@ description: Result of parsing subtract_doesnt_need_brackets.kcl "identifier": { "commentStart": 0, "end": 0, - "name": "size", + "name": "scale", "start": 0, "type": "Identifier" } @@ -795,48 +795,68 @@ description: Result of parsing subtract_doesnt_need_brackets.kcl "init": { "arguments": [ { - "commentStart": 0, - "elements": [ - { - "commentStart": 0, - "end": 0, - "raw": "0", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 0.0, - "suffix": "None" + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "pos", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "elements": [ + { + "commentStart": 0, + "end": 0, + "raw": "0", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 0.0, + "suffix": "None" + } + }, + { + "commentStart": 0, + "end": 0, + "raw": "0", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 0.0, + "suffix": "None" + } } - }, - { - "commentStart": 0, - "end": 0, - "raw": "0", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 0.0, - "suffix": "None" - } - } - ], - "end": 0, - "start": 0, - "type": "ArrayExpression", - "type": "ArrayExpression" + ], + "end": 0, + "start": 0, + "type": "ArrayExpression", + "type": "ArrayExpression" + } }, { - "commentStart": 0, - "end": 0, - "raw": "10", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 10.0, - "suffix": "None" + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "scale", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "end": 0, + "raw": "10", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 10.0, + "suffix": "None" + } } } ], @@ -858,8 +878,9 @@ description: Result of parsing subtract_doesnt_need_brackets.kcl "commentStart": 0, "end": 0, "start": 0, - "type": "CallExpression", - "type": "CallExpression" + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null }, "start": 0, "type": "VariableDeclarator" @@ -887,48 +908,68 @@ description: Result of parsing subtract_doesnt_need_brackets.kcl { "arguments": [ { - "commentStart": 0, - "elements": [ - { - "commentStart": 0, - "end": 0, - "raw": "7", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 7.0, - "suffix": "None" + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "pos", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "elements": [ + { + "commentStart": 0, + "end": 0, + "raw": "7", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 7.0, + "suffix": "None" + } + }, + { + "commentStart": 0, + "end": 0, + "raw": "3", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 3.0, + "suffix": "None" + } } - }, - { - "commentStart": 0, - "end": 0, - "raw": "3", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 3.0, - "suffix": "None" - } - } - ], - "end": 0, - "start": 0, - "type": "ArrayExpression", - "type": "ArrayExpression" + ], + "end": 0, + "start": 0, + "type": "ArrayExpression", + "type": "ArrayExpression" + } }, { - "commentStart": 0, - "end": 0, - "raw": "5", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 5.0, - "suffix": "None" + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "scale", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "end": 0, + "raw": "5", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 5.0, + "suffix": "None" + } } } ], @@ -950,8 +991,9 @@ description: Result of parsing subtract_doesnt_need_brackets.kcl "commentStart": 0, "end": 0, "start": 0, - "type": "CallExpression", - "type": "CallExpression" + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null }, { "arguments": [ diff --git a/rust/kcl-lib/tests/subtract_doesnt_need_brackets/input.kcl b/rust/kcl-lib/tests/subtract_doesnt_need_brackets/input.kcl index 262b67e32..37230ba7b 100644 --- a/rust/kcl-lib/tests/subtract_doesnt_need_brackets/input.kcl +++ b/rust/kcl-lib/tests/subtract_doesnt_need_brackets/input.kcl @@ -1,15 +1,15 @@ -fn cube(center, size) { +fn cube(pos, scale) { return startSketchOn(XY) - |> startProfile(at = [center[0] - size, center[1] - size]) - |> line(endAbsolute = [center[0] + size, center[1] - size]) - |> line(endAbsolute = [center[0] + size, center[1] + size]) - |> line(endAbsolute = [center[0] - size, center[1] + size]) + |> startProfile(at = [pos[0] - scale, pos[1] - scale]) + |> line(endAbsolute = [pos[0] + scale, pos[1] - scale]) + |> line(endAbsolute = [pos[0] + scale, pos[1] + scale]) + |> line(endAbsolute = [pos[0] - scale, pos[1] + scale]) |> close() |> extrude(length = 10) } -part001 = cube([0, 0], 10) -part002 = cube([7, 3], 5) +part001 = cube(pos = [0, 0], scale = 10) +part002 = cube(pos = [7, 3], scale = 5) |> translate(z = 1) subtractedPart = subtract(part001, tools = part002) diff --git a/rust/kcl-lib/tests/subtract_doesnt_need_brackets/ops.snap b/rust/kcl-lib/tests/subtract_doesnt_need_brackets/ops.snap index cd52af6cb..fc28c1834 100644 --- a/rust/kcl-lib/tests/subtract_doesnt_need_brackets/ops.snap +++ b/rust/kcl-lib/tests/subtract_doesnt_need_brackets/ops.snap @@ -104,7 +104,58 @@ description: Operations executed subtract_doesnt_need_brackets.kcl "name": "cube", "functionSourceRange": [], "unlabeledArg": null, - "labeledArgs": {} + "labeledArgs": { + "pos": { + "value": { + "type": "Array", + "value": [ + { + "type": "Number", + "value": 0.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + { + "type": "Number", + "value": 0.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + } + ] + }, + "sourceRange": [] + }, + "scale": { + "value": { + "type": "Number", + "value": 10.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + } + } }, "sourceRange": [] }, @@ -115,7 +166,58 @@ description: Operations executed subtract_doesnt_need_brackets.kcl "name": "cube", "functionSourceRange": [], "unlabeledArg": null, - "labeledArgs": {} + "labeledArgs": { + "pos": { + "value": { + "type": "Array", + "value": [ + { + "type": "Number", + "value": 7.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + { + "type": "Number", + "value": 3.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + } + ] + }, + "sourceRange": [] + }, + "scale": { + "value": { + "type": "Number", + "value": 5.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + } + } }, "sourceRange": [] }, diff --git a/rust/kcl-lib/tests/subtract_doesnt_need_brackets/unparsed.snap b/rust/kcl-lib/tests/subtract_doesnt_need_brackets/unparsed.snap index 0c2094a45..102b03474 100644 --- a/rust/kcl-lib/tests/subtract_doesnt_need_brackets/unparsed.snap +++ b/rust/kcl-lib/tests/subtract_doesnt_need_brackets/unparsed.snap @@ -2,18 +2,18 @@ source: kcl-lib/src/simulation_tests.rs description: Result of unparsing subtract_doesnt_need_brackets.kcl --- -fn cube(center, size) { +fn cube(pos, scale) { return startSketchOn(XY) - |> startProfile(at = [center[0] - size, center[1] - size]) - |> line(endAbsolute = [center[0] + size, center[1] - size]) - |> line(endAbsolute = [center[0] + size, center[1] + size]) - |> line(endAbsolute = [center[0] - size, center[1] + size]) + |> startProfile(at = [pos[0] - scale, pos[1] - scale]) + |> line(endAbsolute = [pos[0] + scale, pos[1] - scale]) + |> line(endAbsolute = [pos[0] + scale, pos[1] + scale]) + |> line(endAbsolute = [pos[0] - scale, pos[1] + scale]) |> close() |> extrude(length = 10) } -part001 = cube([0, 0], 10) -part002 = cube([7, 3], 5) +part001 = cube(pos = [0, 0], scale = 10) +part002 = cube(pos = [7, 3], scale = 5) |> translate(z = 1) subtractedPart = subtract(part001, tools = part002) diff --git a/rust/kcl-lib/tests/union_cubes/artifact_graph_flowchart.snap.md b/rust/kcl-lib/tests/union_cubes/artifact_graph_flowchart.snap.md index 72922f5d5..e99ad4c23 100644 --- a/rust/kcl-lib/tests/union_cubes/artifact_graph_flowchart.snap.md +++ b/rust/kcl-lib/tests/union_cubes/artifact_graph_flowchart.snap.md @@ -1,26 +1,26 @@ ```mermaid flowchart LR subgraph path3 [Path] - 3["Path
[58, 113, 0]"] - 5["Segment
[121, 177, 0]"] - 8["Segment
[185, 241, 0]"] - 10["Segment
[249, 305, 0]"] - 11["Segment
[313, 320, 0]"] + 3["Path
[56, 107, 0]"] + 5["Segment
[115, 167, 0]"] + 8["Segment
[175, 227, 0]"] + 10["Segment
[235, 287, 0]"] + 11["Segment
[295, 302, 0]"] 13[Solid2d] end subgraph path4 [Path] - 4["Path
[58, 113, 0]"] - 6["Segment
[121, 177, 0]"] - 7["Segment
[185, 241, 0]"] - 9["Segment
[249, 305, 0]"] - 12["Segment
[313, 320, 0]"] + 4["Path
[56, 107, 0]"] + 6["Segment
[115, 167, 0]"] + 7["Segment
[175, 227, 0]"] + 9["Segment
[235, 287, 0]"] + 12["Segment
[295, 302, 0]"] 14[Solid2d] end - 1["Plane
[33, 50, 0]"] - 2["Plane
[33, 50, 0]"] - 15["Sweep Extrusion
[328, 354, 0]"] - 16["Sweep Extrusion
[328, 354, 0]"] - 17["CompositeSolid Union
[448, 473, 0]"] + 1["Plane
[31, 48, 0]"] + 2["Plane
[31, 48, 0]"] + 15["Sweep Extrusion
[310, 337, 0]"] + 16["Sweep Extrusion
[310, 337, 0]"] + 17["CompositeSolid Union
[459, 484, 0]"] 18[Wall] 19[Wall] 20[Wall] diff --git a/rust/kcl-lib/tests/union_cubes/ast.snap b/rust/kcl-lib/tests/union_cubes/ast.snap index 2d7ba3777..72433b6c6 100644 --- a/rust/kcl-lib/tests/union_cubes/ast.snap +++ b/rust/kcl-lib/tests/union_cubes/ast.snap @@ -87,7 +87,7 @@ description: Result of parsing union_cubes.kcl "object": { "commentStart": 0, "end": 0, - "name": "center", + "name": "pos", "start": 0, "type": "Identifier", "type": "Identifier" @@ -116,7 +116,7 @@ description: Result of parsing union_cubes.kcl "name": { "commentStart": 0, "end": 0, - "name": "size", + "name": "scale", "start": 0, "type": "Identifier" }, @@ -139,7 +139,7 @@ description: Result of parsing union_cubes.kcl "object": { "commentStart": 0, "end": 0, - "name": "center", + "name": "pos", "start": 0, "type": "Identifier", "type": "Identifier" @@ -168,7 +168,7 @@ description: Result of parsing union_cubes.kcl "name": { "commentStart": 0, "end": 0, - "name": "size", + "name": "scale", "start": 0, "type": "Identifier" }, @@ -235,7 +235,7 @@ description: Result of parsing union_cubes.kcl "object": { "commentStart": 0, "end": 0, - "name": "center", + "name": "pos", "start": 0, "type": "Identifier", "type": "Identifier" @@ -264,7 +264,7 @@ description: Result of parsing union_cubes.kcl "name": { "commentStart": 0, "end": 0, - "name": "size", + "name": "scale", "start": 0, "type": "Identifier" }, @@ -287,7 +287,7 @@ description: Result of parsing union_cubes.kcl "object": { "commentStart": 0, "end": 0, - "name": "center", + "name": "pos", "start": 0, "type": "Identifier", "type": "Identifier" @@ -316,7 +316,7 @@ description: Result of parsing union_cubes.kcl "name": { "commentStart": 0, "end": 0, - "name": "size", + "name": "scale", "start": 0, "type": "Identifier" }, @@ -383,7 +383,7 @@ description: Result of parsing union_cubes.kcl "object": { "commentStart": 0, "end": 0, - "name": "center", + "name": "pos", "start": 0, "type": "Identifier", "type": "Identifier" @@ -412,7 +412,7 @@ description: Result of parsing union_cubes.kcl "name": { "commentStart": 0, "end": 0, - "name": "size", + "name": "scale", "start": 0, "type": "Identifier" }, @@ -435,7 +435,7 @@ description: Result of parsing union_cubes.kcl "object": { "commentStart": 0, "end": 0, - "name": "center", + "name": "pos", "start": 0, "type": "Identifier", "type": "Identifier" @@ -464,7 +464,7 @@ description: Result of parsing union_cubes.kcl "name": { "commentStart": 0, "end": 0, - "name": "size", + "name": "scale", "start": 0, "type": "Identifier" }, @@ -531,7 +531,7 @@ description: Result of parsing union_cubes.kcl "object": { "commentStart": 0, "end": 0, - "name": "center", + "name": "pos", "start": 0, "type": "Identifier", "type": "Identifier" @@ -560,7 +560,7 @@ description: Result of parsing union_cubes.kcl "name": { "commentStart": 0, "end": 0, - "name": "size", + "name": "scale", "start": 0, "type": "Identifier" }, @@ -583,7 +583,7 @@ description: Result of parsing union_cubes.kcl "object": { "commentStart": 0, "end": 0, - "name": "center", + "name": "pos", "start": 0, "type": "Identifier", "type": "Identifier" @@ -612,7 +612,7 @@ description: Result of parsing union_cubes.kcl "name": { "commentStart": 0, "end": 0, - "name": "size", + "name": "scale", "start": 0, "type": "Identifier" }, @@ -712,7 +712,7 @@ description: Result of parsing union_cubes.kcl "name": { "commentStart": 0, "end": 0, - "name": "size", + "name": "scale", "start": 0, "type": "Identifier" }, @@ -775,7 +775,7 @@ description: Result of parsing union_cubes.kcl "identifier": { "commentStart": 0, "end": 0, - "name": "center", + "name": "pos", "start": 0, "type": "Identifier" } @@ -785,7 +785,7 @@ description: Result of parsing union_cubes.kcl "identifier": { "commentStart": 0, "end": 0, - "name": "size", + "name": "scale", "start": 0, "type": "Identifier" } @@ -819,48 +819,68 @@ description: Result of parsing union_cubes.kcl "init": { "arguments": [ { - "commentStart": 0, - "elements": [ - { - "commentStart": 0, - "end": 0, - "raw": "0", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 0.0, - "suffix": "None" + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "pos", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "elements": [ + { + "commentStart": 0, + "end": 0, + "raw": "0", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 0.0, + "suffix": "None" + } + }, + { + "commentStart": 0, + "end": 0, + "raw": "0", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 0.0, + "suffix": "None" + } } - }, - { - "commentStart": 0, - "end": 0, - "raw": "0", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 0.0, - "suffix": "None" - } - } - ], - "end": 0, - "start": 0, - "type": "ArrayExpression", - "type": "ArrayExpression" + ], + "end": 0, + "start": 0, + "type": "ArrayExpression", + "type": "ArrayExpression" + } }, { - "commentStart": 0, - "end": 0, - "raw": "10", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 10.0, - "suffix": "None" + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "scale", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "end": 0, + "raw": "10", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 10.0, + "suffix": "None" + } } } ], @@ -882,8 +902,9 @@ description: Result of parsing union_cubes.kcl "commentStart": 0, "end": 0, "start": 0, - "type": "CallExpression", - "type": "CallExpression" + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null }, "start": 0, "type": "VariableDeclarator" @@ -911,48 +932,68 @@ description: Result of parsing union_cubes.kcl { "arguments": [ { - "commentStart": 0, - "elements": [ - { - "commentStart": 0, - "end": 0, - "raw": "7", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 7.0, - "suffix": "None" + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "pos", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "elements": [ + { + "commentStart": 0, + "end": 0, + "raw": "7", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 7.0, + "suffix": "None" + } + }, + { + "commentStart": 0, + "end": 0, + "raw": "3", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 3.0, + "suffix": "None" + } } - }, - { - "commentStart": 0, - "end": 0, - "raw": "3", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 3.0, - "suffix": "None" - } - } - ], - "end": 0, - "start": 0, - "type": "ArrayExpression", - "type": "ArrayExpression" + ], + "end": 0, + "start": 0, + "type": "ArrayExpression", + "type": "ArrayExpression" + } }, { - "commentStart": 0, - "end": 0, - "raw": "5", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 5.0, - "suffix": "None" + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "scale", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "end": 0, + "raw": "5", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 5.0, + "suffix": "None" + } } } ], @@ -974,8 +1015,9 @@ description: Result of parsing union_cubes.kcl "commentStart": 0, "end": 0, "start": 0, - "type": "CallExpression", - "type": "CallExpression" + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null }, { "arguments": [ diff --git a/rust/kcl-lib/tests/union_cubes/input.kcl b/rust/kcl-lib/tests/union_cubes/input.kcl index 483681a95..8d1864797 100644 --- a/rust/kcl-lib/tests/union_cubes/input.kcl +++ b/rust/kcl-lib/tests/union_cubes/input.kcl @@ -1,15 +1,15 @@ -fn cube(center, size) { +fn cube(pos, scale) { return startSketchOn(XY) - |> startProfile(at = [center[0] - size, center[1] - size]) - |> line(endAbsolute = [center[0] + size, center[1] - size]) - |> line(endAbsolute = [center[0] + size, center[1] + size]) - |> line(endAbsolute = [center[0] - size, center[1] + size]) + |> startProfile(at = [pos[0] - scale, pos[1] - scale]) + |> line(endAbsolute = [pos[0] + scale, pos[1] - scale]) + |> line(endAbsolute = [pos[0] + scale, pos[1] + scale]) + |> line(endAbsolute = [pos[0] - scale, pos[1] + scale]) |> close() - |> extrude(length = 2 * size) + |> extrude(length = 2 * scale) } -part001 = cube([0, 0], 10) -part002 = cube([7, 3], 5) +part001 = cube(pos = [0, 0], scale = 10) +part002 = cube(pos = [7, 3], scale = 5) |> translate(z = 1) fullPart = union([part001, part002]) diff --git a/rust/kcl-lib/tests/union_cubes/ops.snap b/rust/kcl-lib/tests/union_cubes/ops.snap index e6a7fba8a..f7691e42e 100644 --- a/rust/kcl-lib/tests/union_cubes/ops.snap +++ b/rust/kcl-lib/tests/union_cubes/ops.snap @@ -104,7 +104,58 @@ description: Operations executed union_cubes.kcl "name": "cube", "functionSourceRange": [], "unlabeledArg": null, - "labeledArgs": {} + "labeledArgs": { + "pos": { + "value": { + "type": "Array", + "value": [ + { + "type": "Number", + "value": 0.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + { + "type": "Number", + "value": 0.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + } + ] + }, + "sourceRange": [] + }, + "scale": { + "value": { + "type": "Number", + "value": 10.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + } + } }, "sourceRange": [] }, @@ -115,7 +166,58 @@ description: Operations executed union_cubes.kcl "name": "cube", "functionSourceRange": [], "unlabeledArg": null, - "labeledArgs": {} + "labeledArgs": { + "pos": { + "value": { + "type": "Array", + "value": [ + { + "type": "Number", + "value": 7.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + { + "type": "Number", + "value": 3.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + } + ] + }, + "sourceRange": [] + }, + "scale": { + "value": { + "type": "Number", + "value": 5.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + } + } }, "sourceRange": [] }, diff --git a/rust/kcl-lib/tests/union_cubes/unparsed.snap b/rust/kcl-lib/tests/union_cubes/unparsed.snap index d32d14cec..e880eb802 100644 --- a/rust/kcl-lib/tests/union_cubes/unparsed.snap +++ b/rust/kcl-lib/tests/union_cubes/unparsed.snap @@ -2,18 +2,18 @@ source: kcl-lib/src/simulation_tests.rs description: Result of unparsing union_cubes.kcl --- -fn cube(center, size) { +fn cube(pos, scale) { return startSketchOn(XY) - |> startProfile(at = [center[0] - size, center[1] - size]) - |> line(endAbsolute = [center[0] + size, center[1] - size]) - |> line(endAbsolute = [center[0] + size, center[1] + size]) - |> line(endAbsolute = [center[0] - size, center[1] + size]) + |> startProfile(at = [pos[0] - scale, pos[1] - scale]) + |> line(endAbsolute = [pos[0] + scale, pos[1] - scale]) + |> line(endAbsolute = [pos[0] + scale, pos[1] + scale]) + |> line(endAbsolute = [pos[0] - scale, pos[1] + scale]) |> close() - |> extrude(length = 2 * size) + |> extrude(length = 2 * scale) } -part001 = cube([0, 0], 10) -part002 = cube([7, 3], 5) +part001 = cube(pos = [0, 0], scale = 10) +part002 = cube(pos = [7, 3], scale = 5) |> translate(z = 1) fullPart = union([part001, part002]) diff --git a/rust/kcl-wasm-lib/src/wasm.rs b/rust/kcl-wasm-lib/src/wasm.rs index 7beaa921b..c3fb21c43 100644 --- a/rust/kcl-wasm-lib/src/wasm.rs +++ b/rust/kcl-wasm-lib/src/wasm.rs @@ -1,10 +1,10 @@ //! Wasm bindings for `kcl`. use gloo_utils::format::JsValueSerdeExt; -use kcl_lib::{pretty::NumericSuffix, CoreDump, Program}; +use kcl_lib::{pretty::NumericSuffix, CoreDump, Program, SourceRange}; use wasm_bindgen::prelude::*; -// wasm_bindgen wrapper for execute +// wasm_bindgen wrapper for lint #[wasm_bindgen] pub async fn kcl_lint(program_ast_json: &str) -> Result { console_error_panic_hook::set_once(); @@ -18,6 +18,17 @@ pub async fn kcl_lint(program_ast_json: &str) -> Result { Ok(JsValue::from_serde(&findings).map_err(|e| e.to_string())?) } +#[wasm_bindgen] +pub async fn node_path_from_range(program_ast_json: &str, range_json: &str) -> Result { + console_error_panic_hook::set_once(); + + let program: Program = serde_json::from_str(program_ast_json).map_err(|e| e.to_string())?; + let range: SourceRange = serde_json::from_str(range_json).map_err(|e| e.to_string())?; + let node_path = program.node_path_from_range(range); + + JsValue::from_serde(&node_path).map_err(|e| e.to_string()) +} + #[wasm_bindgen] pub fn parse_wasm(kcl_program_source: &str) -> Result { console_error_panic_hook::set_once(); diff --git a/src/App.tsx b/src/App.tsx index e087d074e..4e501a20e 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -4,7 +4,6 @@ import { useHotkeys } from 'react-hotkeys-hook' import ModalContainer from 'react-modal-promise' import { useLoaderData, - useLocation, useNavigate, useRouteLoaderData, useSearchParams, @@ -27,20 +26,15 @@ import useHotkeyWrapper from '@src/lib/hotkeyWrapper' import { isDesktop } from '@src/lib/isDesktop' import { PATHS } from '@src/lib/paths' import { takeScreenshotOfVideoStreamCanvas } from '@src/lib/screenshot' -import { sceneInfra, codeManager, kclManager } from '@src/lib/singletons' +import { sceneInfra } from '@src/lib/singletons' import { maybeWriteToDisk } from '@src/lib/telemetry' -import type { IndexLoaderData } from '@src/lib/types' +import { type IndexLoaderData } from '@src/lib/types' import { engineStreamActor, useSettings, useToken } from '@src/lib/singletons' import { commandBarActor } from '@src/lib/singletons' import { EngineStreamTransition } from '@src/machines/engineStreamMachine' +import { onboardingPaths } from '@src/routes/Onboarding/paths' import { CommandBarOpenButton } from '@src/components/CommandBarOpenButton' import { ShareButton } from '@src/components/ShareButton' -import { - needsToOnboard, - ONBOARDING_TOAST_ID, - TutorialRequestToast, -} from '@src/routes/Onboarding/utils' -import { ONBOARDING_SUBPATHS } from '@src/lib/onboardingPaths' // CYCLIC REF sceneInfra.camControls.engineStreamActor = engineStreamActor @@ -64,7 +58,6 @@ export function App() { }) }) - const location = useLocation() const navigate = useNavigate() const filePath = useAbsoluteFilePath() const { onProjectOpen } = useLspContext() @@ -73,7 +66,7 @@ export function App() { const ref = useRef(null) // Stream related refs and data - const [searchParams] = useSearchParams() + let [searchParams] = useSearchParams() const pool = searchParams.get('pool') const projectName = project?.name || null @@ -83,10 +76,9 @@ export function App() { const loaderData = useRouteLoaderData(PATHS.FILE) as IndexLoaderData const lastCommandType = commands[commands.length - 1]?.type - // Run LSP file open hook when navigating between projects or files useEffect(() => { onProjectOpen({ name: projectName, path: projectPath }, file || null) - }, [onProjectOpen, projectName, projectPath, file]) + }, [projectName, projectPath]) useHotKeyListener() @@ -112,10 +104,9 @@ export function App() { toast.success('Your work is auto-saved in real-time') }) - const paneOpacity = [ - ONBOARDING_SUBPATHS.CAMERA, - ONBOARDING_SUBPATHS.STREAMING, - ].some((p) => p === onboardingStatus.current) + const paneOpacity = [onboardingPaths.CAMERA, onboardingPaths.STREAMING].some( + (p) => p === onboardingStatus.current + ) ? 'opacity-20' : '' @@ -141,7 +132,7 @@ export function App() { }) }, 500) } - }, [lastCommandType, loaderData?.project?.path]) + }, [lastCommandType]) useEffect(() => { // When leaving the modeling scene, cut the engine stream. @@ -150,32 +141,6 @@ export function App() { } }, []) - // Show a custom toast to users if they haven't done the onboarding - // and they're on the web - useEffect(() => { - const onboardingStatus = - settings.app.onboardingStatus.current || - settings.app.onboardingStatus.default - const needsOnboarded = needsToOnboard(location, onboardingStatus) - - if (!isDesktop() && needsOnboarded) { - toast.success( - () => - TutorialRequestToast({ - onboardingStatus: settings.app.onboardingStatus.current, - navigate, - codeManager, - kclManager, - }), - { - id: ONBOARDING_TOAST_ID, - duration: Number.POSITIVE_INFINITY, - icon: null, - } - ) - } - }, [location, settings.app.onboardingStatus, navigate]) - return (
{/* */} - + diff --git a/src/Auth.tsx b/src/Auth.tsx index 1e2c6477e..e7ea14fd4 100644 --- a/src/Auth.tsx +++ b/src/Auth.tsx @@ -7,7 +7,7 @@ export const Auth = ({ children }: React.PropsWithChildren) => { const isLoggingIn = authState.matches('checkIfLoggedIn') return isLoggingIn ? ( - + Loading Design Studio... ) : ( diff --git a/src/Router.tsx b/src/Router.tsx index e457870f2..f592783de 100644 --- a/src/Router.tsx +++ b/src/Router.tsx @@ -28,7 +28,7 @@ import useHotkeyWrapper from '@src/lib/hotkeyWrapper' import { isDesktop } from '@src/lib/isDesktop' import makeUrlPathRelative from '@src/lib/makeUrlPathRelative' import { PATHS } from '@src/lib/paths' -import { fileLoader, homeLoader } from '@src/lib/routeLoaders' +import { fileLoader, homeLoader, telemetryLoader } from '@src/lib/routeLoaders' import { codeManager, engineCommandManager, @@ -110,6 +110,7 @@ const router = createRouter([ }, { id: PATHS.FILE + 'TELEMETRY', + loader: telemetryLoader, children: [ { path: makeUrlPathRelative(PATHS.TELEMETRY), @@ -143,6 +144,7 @@ const router = createRouter([ }, { path: makeUrlPathRelative(PATHS.TELEMETRY), + loader: telemetryLoader, element: , }, ], diff --git a/src/components/CustomIcon.tsx b/src/components/CustomIcon.tsx index 0d918aef3..c69f7fe4c 100644 --- a/src/components/CustomIcon.tsx +++ b/src/components/CustomIcon.tsx @@ -854,14 +854,6 @@ const CustomIconMap = { /> ), - play: ( - - - - ), rotate: ( - // It makes sense to also call zoom to fit here, when a new file is - // loaded for the first time, but not overtaking the work kevin did - // so the camera isn't moving all the time. - engineCommandManager.sendSceneCommand({ - type: 'modeling_cmd_req', - cmd_id: uuidv4(), - cmd: { - type: 'zoom_to_fit', - object_ids: [], // leave empty to zoom to all objects - padding: 0.1, // padding around the objects - animated: false, // don't animate the zoom for now - }, - }) - ) + .then(async () => { + // Gotcha: Playwright E2E tests will be zoom_to_fit, when you try to recreate the e2e test manually + // your localhost will do view_isometric. Turn this boolean on to have the same experience when manually + // debugging e2e tests + + // We need a padding of 0.1 for zoom_to_fit for all E2E tests since they were originally + // written with zoom_to_fit with padding 0.1 + const padding = 0.1 + if (isPlaywright()) { + await engineStreamZoomToFit({ engineCommandManager, padding }) + } else { + // If the scene is empty you cannot use view_isometric, it will not move the camera + if (kclManager.isAstBodyEmpty(kclManager.ast)) { + await engineViewIsometricWithoutGeometryPresent({ + engineCommandManager, + unit: + kclManager.fileSettings.defaultLengthUnit || + DEFAULT_DEFAULT_LENGTH_UNIT, + }) + } else { + await engineViewIsometricWithGeometryPresent({ + engineCommandManager, + padding, + }) + } + } + }) .catch(trap) } diff --git a/src/components/FileTree.tsx b/src/components/FileTree.tsx index 09d86b5e5..ef0a616a5 100644 --- a/src/components/FileTree.tsx +++ b/src/components/FileTree.tsx @@ -558,14 +558,6 @@ function FileTreeContextMenu({ ) } -interface FileTreeProps { - className?: string - file?: IndexLoaderData['file'] - onNavigateToFile: ( - focusableElement?: HTMLElement | React.MutableRefObject - ) => void -} - export const FileTreeMenu = ({ onCreateFile, onCreateFolder, @@ -682,39 +674,6 @@ export const useFileTreeOperations = () => { } } -export const FileTree = ({ - className = '', - onNavigateToFile: closePanel, -}: FileTreeProps) => { - const { - createFile, - createFolder, - cloneFileOrDir, - openInNewWindow, - newTreeEntry, - } = useFileTreeOperations() - - return ( -
-
-

Files

- createFile({ dryRun: true })} - onCreateFolder={() => createFolder({ dryRun: true })} - /> -
- createFile({ dryRun: false, name })} - onCreateFolder={(name: string) => createFolder({ dryRun: false, name })} - onCloneFileOrFolder={(path: string) => cloneFileOrDir({ path })} - onOpenInNewWindow={(path: string) => openInNewWindow({ path })} - /> -
- ) -} - export const FileTreeInner = ({ onNavigateToFile, onCreateFile, diff --git a/src/components/HelpMenu.tsx b/src/components/HelpMenu.tsx index c76fd4f16..7274658a4 100644 --- a/src/components/HelpMenu.tsx +++ b/src/components/HelpMenu.tsx @@ -1,46 +1,49 @@ import { Popover } from '@headlessui/react' -import { type NavigateFunction, useLocation } from 'react-router-dom' +import { useLocation, useNavigate } from 'react-router-dom' import { CustomIcon } from '@src/components/CustomIcon' +import { useLspContext } from '@src/components/LspProvider' import Tooltip from '@src/components/Tooltip' import { useAbsoluteFilePath } from '@src/hooks/useAbsoluteFilePath' import { useMenuListener } from '@src/hooks/useMenu' +import { createAndOpenNewTutorialProject } from '@src/lib/desktopFS' import { openExternalBrowserIfDesktop } from '@src/lib/openWindow' import { PATHS } from '@src/lib/paths' -import { codeManager, kclManager } from '@src/lib/singletons' +import { reportRejection } from '@src/lib/trap' +import { settingsActor } from '@src/lib/singletons' import type { WebContentSendPayload } from '@src/menu/channels' -import { - acceptOnboarding, - catchOnboardingWarnError, -} from '@src/routes/Onboarding/utils' -import { ONBOARDING_SUBPATHS } from '@src/lib/onboardingPaths' const HelpMenuDivider = () => (
) -export function HelpMenu({ - navigate = () => {}, -}: { - navigate?: NavigateFunction -}) { +export function HelpMenu(props: React.PropsWithChildren) { const location = useLocation() + const { onProjectOpen } = useLspContext() const filePath = useAbsoluteFilePath() + const isInProject = location.pathname.includes(PATHS.FILE) + const navigate = useNavigate() const resetOnboardingWorkflow = () => { - const props = { - onboardingStatus: ONBOARDING_SUBPATHS.INDEX, - navigate, - codeManager, - kclManager, + settingsActor.send({ + type: 'set.app.onboardingStatus', + data: { + value: '', + level: 'user', + }, + }) + if (isInProject) { + navigate(filePath + PATHS.ONBOARDING.INDEX) + } else { + createAndOpenNewTutorialProject({ + onProjectOpen, + navigate, + }).catch(reportRejection) } - acceptOnboarding(props).catch((reason) => - catchOnboardingWarnError(reason, props) - ) } const cb = (data: WebContentSendPayload) => { - if (data.menuLabel === 'Help.Replay onboarding tutorial') { + if (data.menuLabel === 'Help.Reset onboarding') { resetOnboardingWorkflow() } } @@ -65,81 +68,71 @@ export function HelpMenu({ as="ul" className="absolute right-0 left-auto flex flex-col w-64 gap-1 p-0 py-2 m-0 mb-1 text-sm border border-solid rounded shadow-lg bottom-full align-stretch text-chalkboard-10 dark:text-inherit bg-chalkboard-110 dark:bg-chalkboard-100 border-chalkboard-110 dark:border-chalkboard-80" > - {({ close }) => ( - <> - - Report a bug - - - Request a feature - - - Ask the community - - - - KCL code samples - - - KCL docs - - - - Release notes - - { - const targetPath = location.pathname.includes(PATHS.FILE) - ? filePath + PATHS.SETTINGS_KEYBINDINGS - : PATHS.HOME + PATHS.SETTINGS_KEYBINDINGS - navigate(targetPath) - }} - data-testid="keybindings-button" - > - Keyboard shortcuts - - { - close() - resetOnboardingWorkflow() - }} - > - Replay onboarding tutorial - - - )} + + Report a bug + + + Request a feature + + + Ask the community + + + + KCL code samples + + + KCL docs + + + + Release notes + + { + const targetPath = location.pathname.includes(PATHS.FILE) + ? filePath + PATHS.SETTINGS_KEYBINDINGS + : PATHS.HOME + PATHS.SETTINGS_KEYBINDINGS + navigate(targetPath) + }} + data-testid="keybindings-button" + > + Keyboard shortcuts + + + Reset onboarding + ) diff --git a/src/components/LowerRightControls.tsx b/src/components/LowerRightControls.tsx index 219ae2334..42d539e8d 100644 --- a/src/components/LowerRightControls.tsx +++ b/src/components/LowerRightControls.tsx @@ -1,4 +1,5 @@ -import { Link, type NavigateFunction, useLocation } from 'react-router-dom' +import { Link, useLocation } from 'react-router-dom' + import { CustomIcon } from '@src/components/CustomIcon' import { HelpMenu } from '@src/components/HelpMenu' import { NetworkHealthIndicator } from '@src/components/NetworkHealthIndicator' @@ -11,10 +12,8 @@ import { APP_VERSION, getReleaseUrl } from '@src/routes/utils' export function LowerRightControls({ children, - navigate = () => {}, }: { children?: React.ReactNode - navigate?: NavigateFunction }) { const location = useLocation() const filePath = useAbsoluteFilePath() @@ -73,7 +72,7 @@ export function LowerRightControls({ {!location.pathname.startsWith(PATHS.HOME) && ( )} - + ) diff --git a/src/components/ModelingMachineProvider.tsx b/src/components/ModelingMachineProvider.tsx index 9473124c2..a945d7b4b 100644 --- a/src/components/ModelingMachineProvider.tsx +++ b/src/components/ModelingMachineProvider.tsx @@ -1807,7 +1807,7 @@ export const ModelingMachineProvider = ({ const MB20 = 2 ** 20 * 20 if (uploadSize > MB20) { toast.error( - "Your project exceeds 20Mb, this will slow down Text-to-CAD\nPlease remove any unnecessary files" + 'Your project exceeds 20Mb, this will slow down Text-to-CAD\nPlease remove any unnecessary files' ) } } @@ -1818,7 +1818,6 @@ export const ModelingMachineProvider = ({ token, artifactGraph: kclManager.artifactGraph, projectName: context.project.name, - basePath, }) }), }, diff --git a/src/components/ModelingSidebar/ModelingPane.tsx b/src/components/ModelingSidebar/ModelingPane.tsx index 264da072a..b919b8ff0 100644 --- a/src/components/ModelingSidebar/ModelingPane.tsx +++ b/src/components/ModelingSidebar/ModelingPane.tsx @@ -6,7 +6,7 @@ import { ActionIcon } from '@src/components/ActionIcon' import type { CustomIconName } from '@src/components/CustomIcon' import Tooltip from '@src/components/Tooltip' import { useSettings } from '@src/lib/singletons' -import { ONBOARDING_SUBPATHS } from '@src/lib/onboardingPaths' +import { onboardingPaths } from '@src/routes/Onboarding/paths' import styles from './ModelingPane.module.css' @@ -71,7 +71,7 @@ export const ModelingPane = ({ const settings = useSettings() const onboardingStatus = settings.app.onboardingStatus const pointerEventsCssClass = - onboardingStatus.current === ONBOARDING_SUBPATHS.CAMERA + onboardingStatus.current === onboardingPaths.CAMERA ? 'pointer-events-none ' : 'pointer-events-auto ' return ( diff --git a/src/components/ModelingSidebar/ModelingSidebar.tsx b/src/components/ModelingSidebar/ModelingSidebar.tsx index 7e4d18450..6e5eb2f68 100644 --- a/src/components/ModelingSidebar/ModelingSidebar.tsx +++ b/src/components/ModelingSidebar/ModelingSidebar.tsx @@ -24,7 +24,7 @@ import { SIDEBAR_BUTTON_SUFFIX } from '@src/lib/constants' import { isDesktop } from '@src/lib/isDesktop' import { useSettings } from '@src/lib/singletons' import { commandBarActor } from '@src/lib/singletons' -import { ONBOARDING_SUBPATHS } from '@src/lib/onboardingPaths' +import { onboardingPaths } from '@src/routes/Onboarding/paths' import { reportRejection } from '@src/lib/trap' import { refreshPage } from '@src/lib/utils' import { hotkeyDisplay } from '@src/lib/hotkeyWrapper' @@ -53,7 +53,7 @@ export function ModelingSidebar({ paneOpacity }: ModelingSidebarProps) { const onboardingStatus = settings.app.onboardingStatus const { send, context } = useModelingContext() const pointerEventsCssClass = - onboardingStatus.current === ONBOARDING_SUBPATHS.CAMERA || + onboardingStatus.current === onboardingPaths.CAMERA || context.store?.openPanes.length === 0 ? 'pointer-events-none ' : 'pointer-events-auto ' diff --git a/src/components/Providers/SystemIOProviderDesktop.tsx b/src/components/Providers/SystemIOProviderDesktop.tsx index 5dc4a8261..a20b6a25e 100644 --- a/src/components/Providers/SystemIOProviderDesktop.tsx +++ b/src/components/Providers/SystemIOProviderDesktop.tsx @@ -1,10 +1,5 @@ import { useFileSystemWatcher } from '@src/hooks/useFileSystemWatcher' -import { - PATHS, - joinRouterPaths, - joinOSPaths, - safeEncodeForRouterPaths, -} from '@src/lib/paths' +import { PATHS } from '@src/lib/paths' import { systemIOActor, useSettings, useToken } from '@src/lib/singletons' import { useHasListedProjects, @@ -40,14 +35,14 @@ export function SystemIOMachineLogicListenerDesktop() { if (!requestedProjectName.name) { return } - const projectPathWithoutSpecificKCLFile = joinOSPaths( - projectDirectoryPath, + let projectPathWithoutSpecificKCLFile = + projectDirectoryPath + + window.electron.path.sep + requestedProjectName.name - ) - const requestedPath = joinRouterPaths( - PATHS.FILE, - safeEncodeForRouterPaths(projectPathWithoutSpecificKCLFile) - ) + + const requestedPath = `${PATHS.FILE}/${encodeURIComponent( + projectPathWithoutSpecificKCLFile + )}` navigate(requestedPath) }, [requestedProjectName]) } @@ -57,16 +52,12 @@ export function SystemIOMachineLogicListenerDesktop() { if (!requestedFileName.file || !requestedFileName.project) { return } - const filePath = joinOSPaths( + const projectPath = window.electron.join( projectDirectoryPath, - requestedFileName.project, - requestedFileName.file - ) - const requestedPath = joinRouterPaths( - PATHS.FILE, - safeEncodeForRouterPaths(filePath), - requestedFileName.subRoute || '' + requestedFileName.project ) + const filePath = window.electron.join(projectPath, requestedFileName.file) + const requestedPath = `${PATHS.FILE}/${encodeURIComponent(filePath)}` navigate(requestedPath) }, [requestedFileName]) } diff --git a/src/components/RouteProvider.tsx b/src/components/RouteProvider.tsx index 3cb61cfc4..b18f55743 100644 --- a/src/components/RouteProvider.tsx +++ b/src/components/RouteProvider.tsx @@ -7,6 +7,8 @@ import { useRouteLoaderData, } from 'react-router-dom' +import type { OnboardingStatus } from '@rust/kcl-lib/bindings/OnboardingStatus' + import { useAuthNavigation } from '@src/hooks/useAuthNavigation' import { useFileSystemWatcher } from '@src/hooks/useFileSystemWatcher' import { getAppSettingsFilePath } from '@src/lib/desktop' @@ -16,7 +18,7 @@ import { markOnce } from '@src/lib/performance' import { loadAndValidateSettings } from '@src/lib/settings/settingsUtils' import { trap } from '@src/lib/trap' import type { IndexLoaderData } from '@src/lib/types' -import { settingsActor } from '@src/lib/singletons' +import { settingsActor, useSettings } from '@src/lib/singletons' export const RouteProviderContext = createContext({}) @@ -30,6 +32,7 @@ export function RouteProvider({ children }: { children: ReactNode }) { const navigation = useNavigation() const navigate = useNavigate() const location = useLocation() + const settings = useSettings() useEffect(() => { // On initialization, the react-router-dom does not send a 'loading' state event. @@ -43,9 +46,35 @@ export function RouteProvider({ children }: { children: ReactNode }) { markOnce('code/willLoadHome') } else if (isFile) { markOnce('code/willLoadFile') + + /** + * TODO: Move to XState. This block has been moved from routerLoaders + * and is borrowing the `isFile` logic from the rest of this + * telemetry-focused `useEffect`. Once `appMachine` knows about + * the current route and navigation, this can be moved into settingsMachine + * to fire as soon as the user settings have been read. + */ + const onboardingStatus: OnboardingStatus = + settings.app.onboardingStatus.current || '' + // '' is the initial state, 'completed' and 'dismissed' are the final states + const needsToOnboard = + onboardingStatus.length === 0 || + !(onboardingStatus === 'completed' || onboardingStatus === 'dismissed') + const shouldRedirectToOnboarding = isFile && needsToOnboard + + if ( + shouldRedirectToOnboarding && + settingsActor.getSnapshot().matches('idle') + ) { + navigate( + (first ? location.pathname : navigation.location?.pathname) + + PATHS.ONBOARDING.INDEX + + onboardingStatus.slice(1) + ) + } } setFirstState(false) - }, [first, navigation, location.pathname]) + }, [navigation]) useEffect(() => { if (!isDesktop()) return diff --git a/src/components/Settings/AllSettingsFields.tsx b/src/components/Settings/AllSettingsFields.tsx index ec39dc220..9e50f2e8e 100644 --- a/src/components/Settings/AllSettingsFields.tsx +++ b/src/components/Settings/AllSettingsFields.tsx @@ -6,12 +6,16 @@ import { useLocation, useNavigate } from 'react-router-dom' import { Fragment } from 'react/jsx-runtime' import { ActionButton } from '@src/components/ActionButton' +import { useLspContext } from '@src/components/LspProvider' import { SettingsFieldInput } from '@src/components/Settings/SettingsFieldInput' import { SettingsSection } from '@src/components/Settings/SettingsSection' -import { getSettingsFolderPaths } from '@src/lib/desktopFS' +import { useDotDotSlash } from '@src/hooks/useDotDotSlash' +import { + createAndOpenNewTutorialProject, + getSettingsFolderPaths, +} from '@src/lib/desktopFS' import { isDesktop } from '@src/lib/isDesktop' import { openExternalBrowserIfDesktop } from '@src/lib/openWindow' -import { ONBOARDING_SUBPATHS } from '@src/lib/onboardingPaths' import { PATHS } from '@src/lib/paths' import type { Setting } from '@src/lib/settings/initialSettings' import type { @@ -24,17 +28,9 @@ import { } from '@src/lib/settings/settingsUtils' import { reportRejection } from '@src/lib/trap' import { toSync } from '@src/lib/utils' -import { - codeManager, - kclManager, - settingsActor, - useSettings, -} from '@src/lib/singletons' +import { settingsActor, useSettings } from '@src/lib/singletons' import { APP_VERSION, IS_NIGHTLY, getReleaseUrl } from '@src/routes/utils' -import { - acceptOnboarding, - catchOnboardingWarnError, -} from '@src/routes/Onboarding/utils' +import { waitFor } from 'xstate' interface AllSettingsFieldsProps { searchParamTab: SettingsLevel @@ -48,6 +44,8 @@ export const AllSettingsFields = forwardRef( ) => { const location = useLocation() const navigate = useNavigate() + const { onProjectOpen } = useLspContext() + const dotDotSlash = useDotDotSlash() const context = useSettings() const projectPath = useMemo(() => { @@ -65,18 +63,26 @@ export const AllSettingsFields = forwardRef( : undefined return projectPath - }, [location.pathname, isFileSettings]) + }, [location.pathname]) async function restartOnboarding() { - const props = { - onboardingStatus: ONBOARDING_SUBPATHS.INDEX, - navigate, - codeManager, - kclManager, + settingsActor.send({ + type: `set.app.onboardingStatus`, + data: { level: 'user', value: '' }, + }) + await waitFor(settingsActor, (s) => s.matches('idle'), { + timeout: 10_000, + }).catch(reportRejection) + + if (isFileSettings) { + // If we're in a project, first navigate to the onboarding start here + // so we can trigger the warning screen if necessary + navigate(dotDotSlash(1) + PATHS.ONBOARDING.INDEX) + } else { + // If we're in the global settings, create a new project and navigate + // to the onboarding start in that project + await createAndOpenNewTutorialProject({ onProjectOpen, navigate }) } - acceptOnboarding(props).catch((reason) => - catchOnboardingWarnError(reason, props) - ) } return ( diff --git a/src/components/ShareButton.tsx b/src/components/ShareButton.tsx index 92bfe08a6..35f93dfce 100644 --- a/src/components/ShareButton.tsx +++ b/src/components/ShareButton.tsx @@ -4,6 +4,7 @@ import usePlatform from '@src/hooks/usePlatform' import { hotkeyDisplay } from '@src/lib/hotkeyWrapper' import { commandBarActor } from '@src/lib/singletons' import { useHotkeys } from 'react-hotkeys-hook' +import { useKclContext } from '@src/lang/KclProvider' const shareHotkey = 'mod+alt+s' const onShareClick = () => @@ -19,11 +20,16 @@ export const ShareButton = () => { scopes: ['modeling'], }) + const kclContext = useKclContext() + const disabled = kclContext.ast.body.some((n) => n.type === 'ImportStatement') + return ( ) diff --git a/src/components/ToastTextToCad.tsx b/src/components/ToastTextToCad.tsx index 4fc97e0dc..ef45357c5 100644 --- a/src/components/ToastTextToCad.tsx +++ b/src/components/ToastTextToCad.tsx @@ -29,10 +29,18 @@ import { PATHS } from '@src/lib/paths' import { codeManager, kclManager, systemIOActor } from '@src/lib/singletons' import { sendTelemetry } from '@src/lib/textToCadTelemetry' import { reportRejection } from '@src/lib/trap' -import { SystemIOMachineEvents } from '@src/machines/systemIO/utils' -import { useProjectDirectoryPath } from '@src/machines/systemIO/hooks' +import { + SystemIOMachineEvents, + SystemIOMachineStates, + NAVIGATION_COMPLETE_EVENT, +} from '@src/machines/systemIO/utils' +import { + useProjectDirectoryPath, + useRequestedProjectName, +} from '@src/machines/systemIO/hooks' import { commandBarActor } from '@src/lib/singletons' import type { FileMeta } from '@src/lib/types' +import type { RequestedKCLFile } from '@src/machines/systemIO/utils' const CANVAS_SIZE = 128 const PROMPT_TRUNCATE_LENGTH = 128 @@ -490,6 +498,7 @@ export function ToastPromptToEditCadSuccess({ token?: string }) { const modelId = data.id + const requestedProjectName = useRequestedProjectName() return (
@@ -518,22 +527,34 @@ export function ToastPromptToEditCadSuccess({ data-negative-button={'reject'} name={'Reject'} onClick={() => { - sendTelemetry(modelId, 'rejected', token).catch(reportRejection) - // revert to before the prompt-to-edit - if (isDesktop()) { - for (const file of oldFiles) { - if (file.type !== 'kcl') { - // only need to write the kcl files - // as the endpoint would have never overwritten other file types - continue + void (async () => { + sendTelemetry(modelId, 'rejected', token).catch(reportRejection) + // revert to before the prompt-to-edit + if (isDesktop()) { + const requestedFiles: RequestedKCLFile[] = [] + for (const file of oldFiles) { + if (file.type !== 'kcl') { + // only need to write the kcl files + // as the endpoint would have never overwritten other file types + continue + } + requestedFiles.push({ + requestedCode: file.fileContents, + requestedFileName: file.relPath, + requestedProjectName: requestedProjectName.name, + }) } - window.electron.writeFile(file.absPath, file.fileContents) + toast.dismiss(toastId) + await writeOverFilesAndExecute({ + requestedFiles: requestedFiles, + projectName: requestedProjectName.name, + }) + } else { + codeManager.updateCodeEditor(oldCode) + kclManager.executeCode().catch(reportRejection) + toast.dismiss(toastId) } - } else { - codeManager.updateCodeEditor(oldCode) - kclManager.executeCode().catch(reportRejection) - } - toast.dismiss(toastId) + })() }} > {'Reject'} @@ -568,3 +589,50 @@ export function ToastPromptToEditCadSuccess({
) } + +export const writeOverFilesAndExecute = async ({ + requestedFiles, + projectName, +}: { + requestedFiles: RequestedKCLFile[] + projectName: string +}) => { + // Create a promise that resolves when the bulk create operation completes + const bulkCreatePromise = new Promise((resolve) => { + const subscription = systemIOActor.subscribe((state) => { + if (state.matches(SystemIOMachineStates.idle)) { + subscription.unsubscribe() + resolve(undefined) + } + }) + }) + + // Create a promise that resolves when navigation completes + const navigationPromise = new Promise((resolve) => { + const handleNavigationComplete = (event: CustomEvent) => { + window.removeEventListener( + NAVIGATION_COMPLETE_EVENT, + handleNavigationComplete as EventListener + ) + resolve() + } + window.addEventListener( + NAVIGATION_COMPLETE_EVENT, + handleNavigationComplete as EventListener + ) + }) + + systemIOActor.send({ + type: SystemIOMachineEvents.bulkCreateKCLFilesAndNavigateToProject, + data: { + files: requestedFiles, + requestedProjectName: projectName, + override: true, + }, + }) + + // Wait for both the bulk create operation and navigation to complete + await Promise.all([bulkCreatePromise, navigationPromise]) + + await kclManager.executeCode() +} diff --git a/src/lang/KclSingleton.ts b/src/lang/KclSingleton.ts index 86ee4377b..2a8480e93 100644 --- a/src/lang/KclSingleton.ts +++ b/src/lang/KclSingleton.ts @@ -738,6 +738,18 @@ export class KclManager { return ast.start === 0 && ast.end === 0 && ast.body.length === 0 } + /** + * Determines if there is no code to execute. If there is a @settings annotation + * that adds to the overall ast.start and ast.end but not the body which is the program + * + * + * If you need to know if there is any program code or not, use this function otherwise + * use _isAstEmpty + */ + isAstBodyEmpty(ast: Node) { + return ast.body.length === 0 + } + get fileSettings() { return this._fileSettings } diff --git a/src/lang/queryAstNodePathUtils.ts b/src/lang/queryAstNodePathUtils.ts index 6c1b9000d..c1d393ee2 100644 --- a/src/lang/queryAstNodePathUtils.ts +++ b/src/lang/queryAstNodePathUtils.ts @@ -2,7 +2,11 @@ import type { ImportStatement } from '@rust/kcl-lib/bindings/ImportStatement' import type { Node } from '@rust/kcl-lib/bindings/Node' import type { TypeDeclaration } from '@rust/kcl-lib/bindings/TypeDeclaration' -import { ARG_INDEX_FIELD, LABELED_ARG_FIELD } from '@src/lang/queryAstConstants' +import { + ARG_INDEX_FIELD, + LABELED_ARG_FIELD, + UNLABELED_ARG, +} from '@src/lang/queryAstConstants' import type { Expr, ExpressionStatement, @@ -38,6 +42,7 @@ function moreNodePathFromSourceRange( if ( (_node.type === 'Name' || _node.type === 'Literal' || + _node.type === 'Identifier' || _node.type === 'TagDeclarator') && isInRange ) { @@ -64,12 +69,20 @@ function moreNodePathFromSourceRange( } if (_node.type === 'CallExpressionKw' && isInRange) { - const { callee, arguments: args } = _node + const { callee, arguments: args, unlabeled } = _node if (callee.type === 'Name' && callee.start <= start && callee.end >= end) { path.push(['callee', 'CallExpressionKw']) return path } - if (args.length > 0) { + if ( + unlabeled !== null && + unlabeled.start <= start && + unlabeled.end >= end + ) { + path.push(['unlabeled', UNLABELED_ARG]) + return moreNodePathFromSourceRange(unlabeled, sourceRange, path) + } + if (args && args.length > 0) { for (let argIndex = 0; argIndex < args.length; argIndex++) { const arg = args[argIndex].arg if (arg.start <= start && arg.end >= end) { @@ -156,19 +169,6 @@ function moreNodePathFromSourceRange( } } } - if (_node.type === 'VariableDeclaration' && isInRange) { - const declaration = _node.declaration - - if (declaration.start <= start && declaration.end >= end) { - const init = declaration.init - if (init.start <= start && init.end >= end) { - path.push(['declaration', 'VariableDeclaration']) - path.push(['init', '']) - return moreNodePathFromSourceRange(init, sourceRange, path) - } - } - return path - } if (_node.type === 'UnaryExpression' && isInRange) { const { argument } = _node if (argument.start <= start && argument.end >= end) { @@ -257,6 +257,29 @@ function moreNodePathFromSourceRange( return path } + if (_node.type === 'LabelledExpression' && isInRange) { + const { expr, label } = _node + if (expr.start <= start && expr.end >= end) { + path.push(['expr', 'LabelledExpression']) + return moreNodePathFromSourceRange(expr, sourceRange, path) + } + if (label.start <= start && label.end >= end) { + path.push(['label', 'LabelledExpression']) + return moreNodePathFromSourceRange(label, sourceRange, path) + } + return path + } + + if (_node.type === 'AscribedExpression' && isInRange) { + const { expr } = _node + if (expr.start <= start && expr.end >= end) { + path.push(['expr', 'AscribedExpression']) + return moreNodePathFromSourceRange(expr, sourceRange, path) + } + // TODO: Check the type annotation. + return path + } + if (_node.type === 'ImportStatement' && isInRange) { if (_node.selector && _node.selector.type === 'List') { path.push(['selector', 'ImportStatement']) diff --git a/src/lang/wasm.test.ts b/src/lang/wasm.test.ts index c47ec4591..bfef3e9f3 100644 --- a/src/lang/wasm.test.ts +++ b/src/lang/wasm.test.ts @@ -2,10 +2,18 @@ import type { Node } from '@rust/kcl-lib/bindings/Node' import type { Program } from '@rust/kcl-lib/bindings/Program' import type { ParseResult } from '@src/lang/wasm' -import { formatNumber, parse, errFromErrWithOutputs } from '@src/lang/wasm' +import { + formatNumber, + parse, + errFromErrWithOutputs, + rustImplPathToNode, + assertParse, +} from '@src/lang/wasm' import { initPromise } from '@src/lang/wasmUtils' import { enginelessExecutor } from '@src/lib/testHelpers' import { err } from '@src/lib/trap' +import { topLevelRange } from '@src/lang/util' +import { getNodePathFromSourceRange } from '@src/lang/queryAstNodePathUtils' beforeEach(async () => { await initPromise @@ -44,3 +52,17 @@ describe('test errFromErrWithOutputs', () => { ) }) }) + +it('converts Rust NodePath to PathToNode', async () => { + // Convenience for making a SourceRange. + const sr = topLevelRange + + const ast = assertParse(`x = 1 + 2 +y = foo(center = [3, 4])`) + expect(await rustImplPathToNode(ast, sr(4, 5))).toStrictEqual( + getNodePathFromSourceRange(ast, sr(4, 5)) + ) + expect(await rustImplPathToNode(ast, sr(31, 32))).toStrictEqual( + getNodePathFromSourceRange(ast, sr(31, 32)) + ) +}) diff --git a/src/lang/wasm.ts b/src/lang/wasm.ts index d0fabe904..223dcae97 100644 --- a/src/lang/wasm.ts +++ b/src/lang/wasm.ts @@ -16,6 +16,7 @@ import type { MetaSettings } from '@rust/kcl-lib/bindings/MetaSettings' import type { UnitAngle, UnitLength } from '@rust/kcl-lib/bindings/ModelingCmd' import type { ModulePath } from '@rust/kcl-lib/bindings/ModulePath' import type { Node } from '@rust/kcl-lib/bindings/Node' +import type { NodePath } from '@rust/kcl-lib/bindings/NodePath' import type { NumericSuffix } from '@rust/kcl-lib/bindings/NumericSuffix' import type { Operation } from '@rust/kcl-lib/bindings/Operation' import type { Program } from '@rust/kcl-lib/bindings/Program' @@ -26,7 +27,6 @@ import type { UnitAngle as UnitAng } from '@rust/kcl-lib/bindings/UnitAngle' import type { UnitLen } from '@rust/kcl-lib/bindings/UnitLen' import { KCLError } from '@src/lang/errors' -import { getNodePathFromSourceRange } from '@src/lang/queryAstNodePathUtils' import { type Artifact, defaultArtifactGraph, @@ -54,6 +54,7 @@ import { is_points_ccw, kcl_lint, kcl_settings, + node_path_from_range, parse_app_settings, parse_project_settings, parse_wasm, @@ -61,6 +62,11 @@ import { serialize_configuration, serialize_project_configuration, } from '@src/lib/wasm_lib_wrapper' +import { + ARG_INDEX_FIELD, + LABELED_ARG_FIELD, + UNLABELED_ARG, +} from '@src/lang/queryAstConstants' export type { ArrayExpression } from '@rust/kcl-lib/bindings/ArrayExpression' export type { @@ -294,19 +300,13 @@ export function emptyExecState(): ExecState { } } -export function execStateFromRust( - execOutcome: RustExecOutcome, - program: Node -): ExecState { +export function execStateFromRust(execOutcome: RustExecOutcome): ExecState { const artifactGraph = rustArtifactGraphToMap(execOutcome.artifactGraph) - // We haven't ported pathToNode logic to Rust yet, so we need to fill it in. + // Translate NodePath to PathToNode. for (const [_id, artifact] of artifactGraph) { if (!artifact) continue if (!('codeRef' in artifact)) continue - const pathToNode = getNodePathFromSourceRange( - program, - sourceRangeFromRust(artifact.codeRef.range) - ) + const pathToNode = pathToNodeFromRustNodePath(artifact.codeRef.nodePath) artifact.codeRef.pathToNode = pathToNode } @@ -406,6 +406,35 @@ export const kclLint = async (ast: Program): Promise> => { } } +export async function rustImplPathToNode( + ast: Program, + range: SourceRange +): Promise { + const nodePath = await nodePathFromRange(ast, range) + if (!nodePath) { + // When a NodePath can't be found, we use an empty PathToNode. + return [] + } + return pathToNodeFromRustNodePath(nodePath) +} + +async function nodePathFromRange( + ast: Program, + range: SourceRange +): Promise { + try { + const nodePath: NodePath | null = await node_path_from_range( + JSON.stringify(ast), + JSON.stringify(range) + ) + return nodePath + } catch (e: any) { + return Promise.reject( + new Error('Caught error getting node path from range', { cause: e }) + ) + } +} + export const recast = (ast: Program): string | Error => { return recast_wasm(JSON.stringify(ast)) } @@ -490,6 +519,143 @@ export async function coreDump( } } +function pathToNodeFromRustNodePath(nodePath: NodePath): PathToNode { + const pathToNode: PathToNode = [] + for (const step of nodePath.steps) { + switch (step.type) { + case 'ProgramBodyItem': + pathToNode.push(['body', '']) + pathToNode.push([step.index, 'index']) + break + case 'CallCallee': + pathToNode.push(['callee', 'CallExpression']) + break + case 'CallArg': + pathToNode.push(['arguments', 'CallExpression']) + pathToNode.push([step.index, 'index']) + break + case 'CallKwCallee': + pathToNode.push(['callee', 'CallExpressionKw']) + break + case 'CallKwUnlabeledArg': + pathToNode.push(['unlabeled', UNLABELED_ARG]) + break + case 'CallKwArg': + pathToNode.push(['arguments', 'CallExpressionKw']) + pathToNode.push([step.index, ARG_INDEX_FIELD]) + pathToNode.push(['arg', LABELED_ARG_FIELD]) + break + case 'BinaryLeft': + pathToNode.push(['left', 'BinaryExpression']) + break + case 'BinaryRight': + pathToNode.push(['right', 'BinaryExpression']) + break + case 'UnaryArg': + pathToNode.push(['argument', 'UnaryExpression']) + break + case 'PipeBodyItem': + pathToNode.push(['body', 'PipeExpression']) + pathToNode.push([step.index, 'index']) + break + case 'ArrayElement': + pathToNode.push(['elements', 'ArrayExpression']) + pathToNode.push([step.index, 'index']) + break + case 'ArrayRangeStart': + pathToNode.push(['startElement', 'ArrayRangeExpression']) + break + case 'ArrayRangeEnd': + pathToNode.push(['endElement', 'ArrayRangeExpression']) + break + case 'ObjectProperty': + pathToNode.push(['properties', 'ObjectExpression']) + pathToNode.push([step.index, 'index']) + break + case 'ObjectPropertyKey': + pathToNode.push(['key', 'Property']) + break + case 'ObjectPropertyValue': + pathToNode.push(['value', 'Property']) + break + case 'ExpressionStatementExpr': + pathToNode.push(['expression', 'ExpressionStatement']) + break + case 'VariableDeclarationDeclaration': + pathToNode.push(['declaration', 'VariableDeclaration']) + break + case 'VariableDeclarationInit': + pathToNode.push(['init', '']) + break + case 'FunctionExpressionParam': + pathToNode.push(['params', 'FunctionExpression']) + pathToNode.push([step.index, 'index']) + break + case 'FunctionExpressionBody': + pathToNode.push(['body', 'FunctionExpression']) + break + case 'FunctionExpressionBodyItem': + pathToNode.push(['body', 'FunctionExpression']) + pathToNode.push([step.index, 'index']) + break + case 'ReturnStatementArg': + pathToNode.push(['argument', 'ReturnStatement']) + break + case 'MemberExpressionObject': + pathToNode.push(['object', 'MemberExpression']) + break + case 'MemberExpressionProperty': + pathToNode.push(['property', 'MemberExpression']) + break + case 'IfExpressionCondition': + pathToNode.push(['cond', 'IfExpression']) + break + case 'IfExpressionThen': + pathToNode.push(['then_val', 'IfExpression']) + pathToNode.push(['body', 'IfExpression']) + break + case 'IfExpressionElseIf': + pathToNode.push(['else_ifs', 'IfExpression']) + pathToNode.push([step.index, 'index']) + break + case 'IfExpressionElseIfCond': + pathToNode.push(['cond', 'IfExpression']) + break + case 'IfExpressionElseIfBody': + pathToNode.push(['then_val', 'IfExpression']) + pathToNode.push(['body', 'IfExpression']) + break + case 'IfExpressionElse': + pathToNode.push(['final_else', 'IfExpression']) + pathToNode.push(['body', 'IfExpression']) + break + case 'ImportStatementItem': + pathToNode.push(['selector', 'ImportStatement']) + pathToNode.push(['items', 'ImportSelector']) + pathToNode.push([step.index, 'index']) + break + case 'ImportStatementItemName': + pathToNode.push(['name', 'ImportItem']) + break + case 'ImportStatementItemAlias': + pathToNode.push(['alias', 'ImportItem']) + break + case 'LabeledExpressionExpr': + pathToNode.push(['expr', 'LabeledExpression']) + break + case 'LabeledExpressionLabel': + pathToNode.push(['label', 'LabeledExpression']) + break + case 'AscribedExpressionExpr': + pathToNode.push(['expr', 'AscribedExpression']) + break + default: + const _exhaustiveCheck: never = step + } + } + return pathToNode +} + export function defaultAppSettings(): DeepPartial | Error { return default_app_settings() } diff --git a/src/lib/constants.ts b/src/lib/constants.ts index adbdb6950..b438fd9dd 100644 --- a/src/lib/constants.ts +++ b/src/lib/constants.ts @@ -2,7 +2,6 @@ import type { Models } from '@kittycad/lib/dist/types/src' import type { UnitAngle, UnitLength } from '@rust/kcl-lib/bindings/ModelingCmd' -export const IS_PLAYWRIGHT_KEY = 'playwright' export const APP_NAME = 'Design Studio' /** Search string in new project names to increment as an index */ export const INDEX_IDENTIFIER = '$n' @@ -188,3 +187,6 @@ export type ExecutionType = | typeof EXECUTION_TYPE_REAL | typeof EXECUTION_TYPE_MOCK | typeof EXECUTION_TYPE_NONE + +/** Key for setting window.localStorage.setItem and .getItem to determine if the runtime is playwright for browsers */ +export const IS_PLAYWRIGHT_KEY = 'playwright' diff --git a/src/lib/desktopFS.ts b/src/lib/desktopFS.ts index e12225129..29bb9d8ef 100644 --- a/src/lib/desktopFS.ts +++ b/src/lib/desktopFS.ts @@ -1,6 +1,18 @@ import { relevantFileExtensions } from '@src/lang/wasmUtils' -import { FILE_EXT, INDEX_IDENTIFIER, MAX_PADDING } from '@src/lib/constants' +import { + FILE_EXT, + INDEX_IDENTIFIER, + MAX_PADDING, + ONBOARDING_PROJECT_NAME, +} from '@src/lib/constants' +import { + createNewProjectDirectory, + listProjects, + readAppSettingsFile, +} from '@src/lib/desktop' +import { bracket } from '@src/lib/exampleKcl' import { isDesktop } from '@src/lib/isDesktop' +import { PATHS } from '@src/lib/paths' import type { FileEntry } from '@src/lib/project' export const isHidden = (fileOrDir: FileEntry) => @@ -120,6 +132,65 @@ export async function getSettingsFolderPaths(projectPath?: string) { } } +export async function createAndOpenNewTutorialProject({ + onProjectOpen, + navigate, +}: { + onProjectOpen: ( + project: { + name: string | null + path: string | null + } | null, + file: FileEntry | null + ) => void + navigate: (path: string) => void +}) { + // Create a new project with the onboarding project name + const configuration = await readAppSettingsFile() + const projects = await listProjects(configuration) + const nextIndex = getNextProjectIndex(ONBOARDING_PROJECT_NAME, projects) + const name = interpolateProjectNameWithIndex( + ONBOARDING_PROJECT_NAME, + nextIndex + ) + + // Delete the tutorial project if it already exists. + if (isDesktop()) { + if (configuration.settings?.project?.directory === undefined) { + return Promise.reject(new Error('configuration settings are undefined')) + } + + const fullPath = window.electron.join( + configuration.settings.project.directory, + name + ) + if (window.electron.exists(fullPath)) { + await window.electron.rm(fullPath) + } + } + + const newProject = await createNewProjectDirectory( + name, + bracket, + configuration + ) + + // Prep the LSP and navigate to the onboarding start + onProjectOpen( + { + name: newProject.name, + path: newProject.path, + }, + null + ) + navigate( + `${PATHS.FILE}/${encodeURIComponent(newProject.default_file)}${ + PATHS.ONBOARDING.INDEX + }` + ) + return newProject +} + /** * Get the next available file name by appending a hyphen and number to the end of the name */ diff --git a/src/lib/isPlaywright.ts b/src/lib/isPlaywright.ts new file mode 100644 index 000000000..7828c5e97 --- /dev/null +++ b/src/lib/isPlaywright.ts @@ -0,0 +1,10 @@ +import { IS_PLAYWRIGHT_KEY } from '@src/lib/constants' + +export function isPlaywright(): boolean { + // ? checks for browser + const electronRunTimePlaywright = + window?.electron?.process?.env.IS_PLAYWRIGHT == 'true' + const browserRuntimePlaywright = + localStorage.getItem(IS_PLAYWRIGHT_KEY) === 'true' + return electronRunTimePlaywright || browserRuntimePlaywright +} diff --git a/src/lib/paths.ts b/src/lib/paths.ts index 7d921d6a4..45bb8d096 100644 --- a/src/lib/paths.ts +++ b/src/lib/paths.ts @@ -1,7 +1,5 @@ import type { PlatformPath } from 'path' - import type { Configuration } from '@rust/kcl-lib/bindings/Configuration' - import { IS_PLAYWRIGHT_KEY } from '@src/lib/constants' import { @@ -14,7 +12,7 @@ import { isDesktop } from '@src/lib/isDesktop' import { readLocalStorageAppSettingsFile } from '@src/lib/settings/settingsUtils' import { err } from '@src/lib/trap' import type { DeepPartial } from '@src/lib/types' -import { ONBOARDING_SUBPATHS } from '@src/lib/onboardingPaths' +import { onboardingPaths } from '@src/routes/Onboarding/paths' const prependRoutes = (routesObject: Record) => (prepend: string) => { @@ -27,7 +25,7 @@ const prependRoutes = } type OnboardingPaths = { - [K in keyof typeof ONBOARDING_SUBPATHS]: `/onboarding${(typeof ONBOARDING_SUBPATHS)[K]}` + [K in keyof typeof onboardingPaths]: `/onboarding${(typeof onboardingPaths)[K]}` } const SETTINGS = '/settings' @@ -48,9 +46,7 @@ export const PATHS = { SETTINGS_PROJECT: `${SETTINGS}?tab=project` as const, SETTINGS_KEYBINDINGS: `${SETTINGS}?tab=keybindings` as const, SIGN_IN: '/signin', - ONBOARDING: prependRoutes(ONBOARDING_SUBPATHS)( - '/onboarding' - ) as OnboardingPaths, + ONBOARDING: prependRoutes(onboardingPaths)('/onboarding') as OnboardingPaths, TELEMETRY: '/telemetry', } as const export const BROWSER_PATH = `%2F${BROWSER_PROJECT_NAME}%2F${BROWSER_FILE_NAME}${FILE_EXT}` @@ -138,56 +134,3 @@ export function parseProjectRoute( currentFilePath: currentFilePath, } } - -/** - * Joins any number of arguments of strings to create a Router level path that is safe - * A path will be created of the format /value/value1/value2 - * Filters out '/', '' - * Removes all leading and ending slashes, this allows you to pass '//dog//','//cat//' it will resolve to - * /dog/cat - */ -export function joinRouterPaths(...parts: string[]): string { - return ( - '/' + - parts - .map((part) => part.replace(/^\/+|\/+$/g, '')) // Remove leading/trailing slashes - .filter((part) => part.length > 0) // Remove empty segments - .join('/') - ) -} - -/** - * Joins any number of arguments of strings to create a OS level path that is safe - * A path will be created of the format /value/value1/value2 - * or \value\value1\value2 for POSIX OSes like Windows - * Filters out the separator slashes - * Removes all leading and ending slashes, this allows you to pass '//dog//','//cat//' it will resolve to - * /dog/cat - * or \dog\cat on POSIX - */ -export function joinOSPaths(...parts: string[]): string { - const sep = window.electron?.sep || '/' - const regexSep = sep === '/' ? '/' : '\\' - return ( - (sep === '\\' ? '' : sep) + // Windows absolute paths should not be prepended with a separator, they start with the drive name - parts - .map((part) => - part.replace(new RegExp(`^${regexSep}+|${regexSep}+$`, 'g'), '') - ) // Remove leading/trailing slashes - .filter((part) => part.length > 0) // Remove empty segments - .join(sep) - ) -} - -export function safeEncodeForRouterPaths(dynamicValue: string): string { - return `${encodeURIComponent(dynamicValue)}` -} - -/** - * /dog/cat/house.kcl gives you house.kcl - * \dog\cat\house.kcl gives you house.kcl - * Works on all OS! - */ -export function getStringAfterLastSeparator(path: string): string { - return path.split(window.electron.sep).pop() || '' -} diff --git a/src/lib/promptToEdit.tsx b/src/lib/promptToEdit.tsx index 90be2f561..67cee69c8 100644 --- a/src/lib/promptToEdit.tsx +++ b/src/lib/promptToEdit.tsx @@ -4,8 +4,6 @@ import type { Models } from '@kittycad/lib' import { VITE_KC_API_BASE_URL } from '@src/env' import { diffLines } from 'diff' import toast from 'react-hot-toast' -import { Client } from '@kittycad/lib' -import { ml } from '@kittycad/lib' import type { TextToCadMultiFileIteration_type } from '@kittycad/lib/dist/types/src/models' import { getCookie, TOKEN_PERSIST_KEY } from '@src/machines/authMachine' import { COOKIE_NAME } from '@src/lib/constants' @@ -14,7 +12,10 @@ import { openExternalBrowserIfDesktop } from '@src/lib/openWindow' import { ActionButton } from '@src/components/ActionButton' import { CustomIcon } from '@src/components/CustomIcon' -import { ToastPromptToEditCadSuccess } from '@src/components/ToastTextToCad' +import { + ToastPromptToEditCadSuccess, + writeOverFilesAndExecute, +} from '@src/components/ToastTextToCad' import { modelingMachineEvent } from '@src/editor/manager' import { getArtifactOfTypes } from '@src/lang/std/artifactGraph' import { topLevelRange } from '@src/lang/util' @@ -26,6 +27,7 @@ import { err, reportRejection } from '@src/lib/trap' import { uuidv4 } from '@src/lib/utils' import type { File as KittyCadLibFile } from '@kittycad/lib/dist/types/src/models' import type { FileMeta } from '@src/lib/types' +import type { RequestedKCLFile } from '@src/machines/systemIO/utils' type KclFileMetaMap = { [execStateFileNamesIndex: number]: Extract @@ -52,6 +54,52 @@ function convertAppRangeToApiRange( } } +type TextToCadErrorResponse = { + error_code: string + message: string +} + +async function submitTextToCadRequest( + body: { + prompt: string + source_ranges: Models['SourceRangePrompt_type'][] + project_name?: string + kcl_version: string + }, + files: KittyCadLibFile[], + token: string +): Promise { + const formData = new FormData() + formData.append('body', JSON.stringify(body)) + + files.forEach((file) => { + formData.append('files', file.data, file.name) + }) + + const response = await fetch( + `${VITE_KC_API_BASE_URL}/ml/text-to-cad/multi-file/iteration`, + { + method: 'POST', + headers: { + Authorization: `Bearer ${token}`, + }, + body: formData, + } + ) + + if (!response.ok) { + return new Error(`HTTP error! status: ${response.status}`) + } + + const data = await response.json() + if ('error_code' in data) { + const errorData = data as TextToCadErrorResponse + return new Error(errorData.message || 'Unknown error') + } + + return data as TextToCadMultiFileIteration_type +} + export async function submitPromptToEditToQueue({ prompt, selections, @@ -72,8 +120,6 @@ export async function submitPromptToEditToQueue({ ? token : getCookie(COOKIE_NAME) || localStorage?.getItem(TOKEN_PERSIST_KEY) || '' - const client = new Client(_token) - const kclFilesMap: KclFileMetaMap = {} const endPointFiles: KittyCadLibFile[] = [] projectFiles.forEach((file) => { @@ -93,9 +139,8 @@ export async function submitPromptToEditToQueue({ // If no selection, use whole file if (selections === null) { - return ml.create_text_to_cad_multi_file_iteration({ - client, - body: { + return submitTextToCadRequest( + { prompt, source_ranges: [], project_name: @@ -104,8 +149,9 @@ export async function submitPromptToEditToQueue({ : undefined, kcl_version: kclManager.kclVersion, }, - files: endPointFiles, - }) + endPointFiles, + _token + ) } // Handle manual code selections and artifact selections differently @@ -239,9 +285,8 @@ See later source ranges for more context. about the sweep`, } return prompts }) - return ml.create_text_to_cad_multi_file_iteration({ - client, - body: { + return submitTextToCadRequest( + { prompt, source_ranges: ranges, project_name: @@ -250,8 +295,9 @@ See later source ranges for more context. about the sweep`, : undefined, kcl_version: kclManager.kclVersion, }, - files: endPointFiles, - }) + endPointFiles, + _token + ) } export async function getPromptToEditResult( @@ -307,10 +353,12 @@ export async function doPromptEdit({ projectName, }) } catch (e: any) { + toast.dismiss(toastId) return new Error(e.message) } - if ('error_code' in submitResult) { - return new Error(submitResult.message) + if (submitResult instanceof Error) { + toast.dismiss(toastId) + return submitResult } const textToCadComplete = new Promise< @@ -324,7 +372,11 @@ export async function doPromptEdit({ while (timeElapsed < MAX_CHECK_TIMEOUT) { const check = await getPromptToEditResult(submitResult.id, token) - if (check instanceof Error || check.status === 'failed') { + if ( + check instanceof Error || + check.status === 'failed' || + check.error + ) { reject(check) return } else if (check.status === 'completed') { @@ -363,7 +415,6 @@ export async function promptToEditFlow({ token, artifactGraph, projectName, - basePath, }: { prompt: string selections: Selections @@ -371,7 +422,6 @@ export async function promptToEditFlow({ token?: string artifactGraph: ArtifactGraph projectName: string - basePath: string }) { const result = await doPromptEdit({ prompt, @@ -381,15 +431,13 @@ export async function promptToEditFlow({ artifactGraph, projectName, }) - if (err(result)) return Promise.reject(result) + if (err(result)) { + toast.error('Failed to modify.') + return Promise.reject(result) + } const oldCodeWebAppOnly = codeManager.code - // TODO remove once endpoint isn't returning fake data. - const outputs: TextToCadMultiFileIteration_type['outputs'] = {} - Object.entries(result.outputs).forEach(([key, value]) => { - outputs[key] = value + '\n// yoyo a comment' - }) - if (!isDesktop() && Object.values(outputs).length > 1) { + if (!isDesktop() && Object.values(result.outputs).length > 1) { const toastId = uuidv4() toast.error( (t) => ( @@ -437,17 +485,23 @@ export async function promptToEditFlow({ ) return } - if (isDesktop()) { - // write all of the outputs to disk - for (const [relativePath, fileContents] of Object.entries(outputs)) { - window.electron.writeFile( - window.electron.join(basePath, relativePath), - fileContents - ) + const requestedFiles: RequestedKCLFile[] = [] + + for (const [relativePath, fileContents] of Object.entries(result.outputs)) { + requestedFiles.push({ + requestedCode: fileContents, + requestedFileName: relativePath, + requestedProjectName: projectName, + }) } + + await writeOverFilesAndExecute({ + requestedFiles, + projectName, + }) } else { - const newCode = outputs['main.kcl'] + const newCode = result.outputs['main.kcl'] codeManager.updateCodeEditor(newCode) const diff = reBuildNewCodeWithRanges(oldCodeWebAppOnly, newCode) const ranges: SelectionRange[] = diff.insertRanges.map((range) => diff --git a/src/lib/routeLoaders.ts b/src/lib/routeLoaders.ts index 020efedfb..255f2db59 100644 --- a/src/lib/routeLoaders.ts +++ b/src/lib/routeLoaders.ts @@ -21,6 +21,13 @@ import type { IndexLoaderData, } from '@src/lib/types' import { settingsActor } from '@src/lib/singletons' +import { NAVIGATION_COMPLETE_EVENT } from '@src/machines/systemIO/utils' + +export const telemetryLoader: LoaderFunction = async ({ + params, +}): Promise => { + return null +} export const fileLoader: LoaderFunction = async ( routerData @@ -83,6 +90,7 @@ export const fileLoader: LoaderFunction = async ( // We pass true on the end here to clear the code editor history. // This way undo and redo are not super weird when opening new files. codeManager.updateCodeStateEditor(code, true) + window.dispatchEvent(new CustomEvent(NAVIGATION_COMPLETE_EVENT)) } // Set the file system manager to the project path diff --git a/src/lib/rustContext.ts b/src/lib/rustContext.ts index 5d2792066..4b1dbedae 100644 --- a/src/lib/rustContext.ts +++ b/src/lib/rustContext.ts @@ -87,7 +87,7 @@ export default class RustContext { JSON.stringify(settings) ) /* Set the default planes, safe to call after execute. */ - const outcome = execStateFromRust(result, node) + const outcome = execStateFromRust(result) this._defaultPlanes = outcome.defaultPlanes @@ -161,29 +161,13 @@ export default class RustContext { ): Promise { const instance = await this._checkInstance() - const ast: Node = { - body: [], - shebang: null, - start: 0, - end: 0, - moduleId: 0, - nonCodeMeta: { - nonCodeNodes: {}, - startNodes: [], - }, - innerAttrs: [], - outerAttrs: [], - preComments: [], - commentStart: 0, - } - try { const result = await instance.bustCacheAndResetScene( JSON.stringify(settings), path ) /* Set the default planes, safe to call after execute. */ - const outcome = execStateFromRust(result, ast) + const outcome = execStateFromRust(result) this._defaultPlanes = outcome.defaultPlanes diff --git a/src/lib/toolbar.ts b/src/lib/toolbar.ts index 135707220..089d3d23d 100644 --- a/src/lib/toolbar.ts +++ b/src/lib/toolbar.ts @@ -678,10 +678,6 @@ export const toolbarConfig: Record = { status: 'available', disabled: (state) => state.matches('Sketch no face'), title: 'Center rectangle', - hotkey: (state) => - state.matches({ Sketch: 'Center Rectangle tool' }) - ? ['Esc', 'C'] - : 'C', description: 'Start drawing a rectangle from its center', links: [], isActive: (state) => { diff --git a/src/lib/utils.ts b/src/lib/utils.ts index 5e3f5dc9d..2fed50c17 100644 --- a/src/lib/utils.ts +++ b/src/lib/utils.ts @@ -5,6 +5,14 @@ import type { CallExpressionKw, SourceRange } from '@src/lang/wasm' import { isDesktop } from '@src/lib/isDesktop' import type { AsyncFn } from '@src/lib/types' +import * as THREE from 'three' + +import type { EngineCommandManager } from '@src/lang/std/engineConnection' +import type { + CameraViewState_type, + UnitLength_type, +} from '@kittycad/lib/dist/types/src/models' + export const uuidv4 = v4 /** @@ -532,3 +540,132 @@ export function getInVariableCase(name: string, prefixIfDigit = 'm') { return likelyPascalCase.slice(0, 1).toLowerCase() + likelyPascalCase.slice(1) } + +export function computeIsometricQuaternionForEmptyScene() { + // Create the direction vector you want to look from + const isoDir = new THREE.Vector3(1, 1, 1).normalize() // isometric look direction + + // Target is the point you want to look at (e.g., origin) + const target = new THREE.Vector3(0, 0, 0) + + // Compute quaternion for isometric view + const up = new THREE.Vector3(0, 0, 1) // default up direction + const quaternion = new THREE.Quaternion() + quaternion.setFromUnitVectors(new THREE.Vector3(0, 0, 1), isoDir) // align -Z with isoDir + + // Align up vector using a lookAt matrix + const m = new THREE.Matrix4() + m.lookAt(new THREE.Vector3().addVectors(target, isoDir), target, up) + quaternion.setFromRotationMatrix(m) + return quaternion +} + +export async function engineStreamZoomToFit({ + engineCommandManager, + padding, +}: { + engineCommandManager: EngineCommandManager + padding: number +}) { + // It makes sense to also call zoom to fit here, when a new file is + // loaded for the first time, but not overtaking the work kevin did + // so the camera isn't moving all the time. + await engineCommandManager.sendSceneCommand({ + type: 'modeling_cmd_req', + cmd_id: uuidv4(), + cmd: { + type: 'zoom_to_fit', + object_ids: [], // leave empty to zoom to all objects + padding, // padding around the objects + animated: false, // don't animate the zoom for now + }, + }) +} + +export async function engineViewIsometricWithGeometryPresent({ + engineCommandManager, + padding, +}: { + engineCommandManager: EngineCommandManager + padding: number +}) { + /** + * Default all users to view_isometric when loading into the engine. + * This works for perspective projection and orthographic projection + * This does not change the projection of the camera only the view direction which makes + * it safe to use with either projection defaulted + */ + await engineCommandManager.sendSceneCommand({ + type: 'modeling_cmd_req', + cmd_id: uuidv4(), + cmd: { + type: 'view_isometric', + padding, // padding around the objects + }, + }) + + /** + * HACK: We need to update the gizmo, the command above doesn't trigger gizmo + * to render which makes the axis point in an old direction. + */ + await engineCommandManager.sendSceneCommand({ + type: 'modeling_cmd_req', + cmd_id: uuidv4(), + cmd: { + type: 'default_camera_get_settings', + }, + }) +} + +export async function engineViewIsometricWithoutGeometryPresent({ + engineCommandManager, + unit, +}: { + engineCommandManager: EngineCommandManager + unit?: UnitLength_type +}) { + // If you load an empty scene with any file unit it will have an eye offset of this + const MAGIC_ENGINE_EYE_OFFSET = 1378.0057 + const quat = computeIsometricQuaternionForEmptyScene() + const isometricView: CameraViewState_type = { + pivot_rotation: { + x: quat.x, + y: quat.y, + z: quat.z, + w: quat.w, + }, + pivot_position: { + x: 0, + y: 0, + z: 0, + }, + eye_offset: MAGIC_ENGINE_EYE_OFFSET, + fov_y: 45, + ortho_scale_factor: 1.4063792, + is_ortho: true, + ortho_scale_enabled: true, + world_coord_system: 'right_handed_up_z', + } + await engineCommandManager.sendSceneCommand({ + type: 'modeling_cmd_req', + cmd_id: uuidv4(), + cmd: { + type: 'default_camera_set_view', + view: { + ...isometricView, + }, + }, + }) + + /** + * HACK: We need to update the gizmo, the command above doesn't trigger gizmo + * to render which makes the axis point in an old direction. + */ + await engineCommandManager.sendSceneCommand({ + type: 'modeling_cmd_req', + cmd_id: uuidv4(), + cmd: { + type: 'default_camera_get_settings', + }, + }) +} diff --git a/src/lib/wasm_lib_wrapper.ts b/src/lib/wasm_lib_wrapper.ts index d4f82e927..dc557b996 100644 --- a/src/lib/wasm_lib_wrapper.ts +++ b/src/lib/wasm_lib_wrapper.ts @@ -20,6 +20,7 @@ import type { is_points_ccw as IsPointsCcw, kcl_lint as KclLint, kcl_settings as KclSettings, + node_path_from_range as NodePathFromRange, parse_app_settings as ParseAppSettings, parse_project_settings as ParseProjectSettings, parse_wasm as ParseWasm, @@ -60,6 +61,9 @@ export const format_number: typeof FormatNumber = (...args) => { export const kcl_lint: typeof KclLint = (...args) => { return getModule().kcl_lint(...args) } +export const node_path_from_range: typeof NodePathFromRange = (...args) => { + return getModule().node_path_from_range(...args) +} export const is_points_ccw: typeof IsPointsCcw = (...args) => { return getModule().is_points_ccw(...args) } diff --git a/src/machines/modelingMachine.ts b/src/machines/modelingMachine.ts index 7ab10afeb..0b1420ee0 100644 --- a/src/machines/modelingMachine.ts +++ b/src/machines/modelingMachine.ts @@ -2423,7 +2423,9 @@ export const modelingMachine = setup({ 'VariableDeclarator' ) if (err(extrudeNode)) { - return new Error("Couldn't find extrude node", { cause: extrudeNode }) + return new Error("Couldn't find extrude node", { + cause: extrudeNode, + }) } // Perform the shell op @@ -3314,10 +3316,7 @@ export const modelingMachine = setup({ 'Artifact graph emptied': 'hidePlanes', }, - entry: [ - 'show default planes', - 'reset camera position', - ], + entry: ['show default planes'], description: `We want to disable selections and hover highlights here, because users can't do anything with that information until they actually add something to the scene. The planes are just for orientation here.`, exit: 'set selection filter to defaults', }, diff --git a/src/machines/systemIO/systemIOMachine.ts b/src/machines/systemIO/systemIOMachine.ts index 93984de03..2fd66c3d9 100644 --- a/src/machines/systemIO/systemIOMachine.ts +++ b/src/machines/systemIO/systemIOMachine.ts @@ -1,6 +1,9 @@ import { DEFAULT_PROJECT_NAME } from '@src/lib/constants' import type { Project } from '@src/lib/project' -import type { SystemIOContext } from '@src/machines/systemIO/utils' +import type { + SystemIOContext, + RequestedKCLFile, +} from '@src/machines/systemIO/utils' import { NO_PROJECT_DIRECTORY, SystemIOMachineActions, @@ -43,11 +46,7 @@ export const systemIOMachine = setup({ } | { type: SystemIOMachineEvents.navigateToFile - data: { - requestedProjectName: string - requestedFileName: string - requestedSubRoute?: string - } + data: { requestedProjectName: string; requestedFileName: string } } | { type: SystemIOMachineEvents.createProject @@ -73,13 +72,26 @@ export const systemIOMachine = setup({ requestedCode: string } } + | { + type: SystemIOMachineEvents.bulkCreateKCLFiles + data: { + files: RequestedKCLFile[] + } + } + | { + type: SystemIOMachineEvents.bulkCreateKCLFilesAndNavigateToProject + data: { + files: RequestedKCLFile[] + requestedProjectName: string + override?: boolean + } + } | { type: SystemIOMachineEvents.importFileFromURL data: { requestedProjectName: string requestedFileName: string requestedCode: string - requestedSubRoute?: string } } | { @@ -122,9 +134,7 @@ export const systemIOMachine = setup({ [SystemIOMachineActions.setRequestedProjectName]: assign({ requestedProjectName: ({ event }) => { assertEvent(event, SystemIOMachineEvents.navigateToProject) - return { - name: event.data.requestedProjectName, - } + return { name: event.data.requestedProjectName } }, }), [SystemIOMachineActions.setRequestedFileName]: assign({ @@ -133,7 +143,6 @@ export const systemIOMachine = setup({ return { project: event.data.requestedProjectName, file: event.data.requestedFileName, - subRoute: event.data.requestedSubRoute, } }, }), @@ -232,15 +241,13 @@ export const systemIOMachine = setup({ requestedFileName: string requestedCode: string rootContext: AppMachineContext - requestedSubRoute?: string } }): Promise<{ message: string fileName: string projectName: string - subRoute: string }> => { - return { message: '', fileName: '', projectName: '', subRoute: '' } + return { message: '', fileName: '', projectName: '' } } ), [SystemIOMachineActors.checkReadWrite]: fromPromise( @@ -272,6 +279,41 @@ export const systemIOMachine = setup({ return { message: '', fileName: '', projectName: '' } } ), + [SystemIOMachineActors.bulkCreateKCLFiles]: fromPromise( + async ({ + input, + }: { + input: { + context: SystemIOContext + files: RequestedKCLFile[] + rootContext: AppMachineContext + } + }): Promise<{ + message: string + fileName: string + projectName: string + }> => { + return { message: '', fileName: '', projectName: '' } + } + ), + [SystemIOMachineActors.bulkCreateKCLFilesAndNavigateToProject]: fromPromise( + async ({ + input, + }: { + input: { + context: SystemIOContext + files: RequestedKCLFile[] + rootContext: AppMachineContext + requestedProjectName: string + } + }): Promise<{ + message: string + fileName: string + projectName: string + }> => { + return { message: '', fileName: '', projectName: '' } + } + ), }, }).createMachine({ initial: SystemIOMachineStates.idle, @@ -340,6 +382,13 @@ export const systemIOMachine = setup({ [SystemIOMachineEvents.deleteKCLFile]: { target: SystemIOMachineStates.deletingKCLFile, }, + [SystemIOMachineEvents.bulkCreateKCLFiles]: { + target: SystemIOMachineStates.bulkCreatingKCLFiles, + }, + [SystemIOMachineEvents.bulkCreateKCLFilesAndNavigateToProject]: { + target: + SystemIOMachineStates.bulkCreatingKCLFilesAndNavigateToProject, + }, }, }, [SystemIOMachineStates.readingFolders]: { @@ -468,7 +517,6 @@ export const systemIOMachine = setup({ context, requestedProjectName: event.data.requestedProjectName, requestedFileName: event.data.requestedFileName, - requestedSubRoute: event.data.requestedSubRoute, requestedCode: event.data.requestedCode, rootContext: self.system.get('root').getSnapshot().context, } @@ -487,7 +535,6 @@ export const systemIOMachine = setup({ return { project: event.output.projectName, file, - subRoute: event.output.subRoute, } }, }), @@ -542,5 +589,60 @@ export const systemIOMachine = setup({ }, }, }, + [SystemIOMachineStates.bulkCreatingKCLFiles]: { + invoke: { + id: SystemIOMachineActors.bulkCreateKCLFiles, + src: SystemIOMachineActors.bulkCreateKCLFiles, + input: ({ context, event, self }) => { + assertEvent(event, SystemIOMachineEvents.bulkCreateKCLFiles) + return { + context, + files: event.data.files, + rootContext: self.system.get('root').getSnapshot().context, + } + }, + onDone: { + target: SystemIOMachineStates.readingFolders, + }, + onError: { + target: SystemIOMachineStates.idle, + actions: [SystemIOMachineActions.toastError], + }, + }, + }, + [SystemIOMachineStates.bulkCreatingKCLFilesAndNavigateToProject]: { + invoke: { + id: SystemIOMachineActors.bulkCreateKCLFilesAndNavigateToProject, + src: SystemIOMachineActors.bulkCreateKCLFilesAndNavigateToProject, + input: ({ context, event, self }) => { + assertEvent( + event, + SystemIOMachineEvents.bulkCreateKCLFilesAndNavigateToProject + ) + return { + context, + files: event.data.files, + rootContext: self.system.get('root').getSnapshot().context, + requestedProjectName: event.data.requestedProjectName, + override: event.data.override, + } + }, + onDone: { + target: SystemIOMachineStates.readingFolders, + actions: [ + assign({ + requestedProjectName: ({ event }) => { + return { name: event.output.projectName } + }, + }), + SystemIOMachineActions.toastSuccess, + ], + }, + onError: { + target: SystemIOMachineStates.idle, + actions: [SystemIOMachineActions.toastError], + }, + }, + }, }, }) diff --git a/src/machines/systemIO/systemIOMachineDesktop.ts b/src/machines/systemIO/systemIOMachineDesktop.ts index 4a382477b..7d31ac888 100644 --- a/src/machines/systemIO/systemIOMachineDesktop.ts +++ b/src/machines/systemIO/systemIOMachineDesktop.ts @@ -14,7 +14,10 @@ import { } from '@src/lib/desktopFS' import type { Project } from '@src/lib/project' import { systemIOMachine } from '@src/machines/systemIO/systemIOMachine' -import type { SystemIOContext } from '@src/machines/systemIO/utils' +import type { + RequestedKCLFile, + SystemIOContext, +} from '@src/machines/systemIO/utils' import { NO_PROJECT_DIRECTORY, SystemIOMachineActors, @@ -22,6 +25,69 @@ import { import { fromPromise } from 'xstate' import type { AppMachineContext } from '@src/lib/types' +const sharedBulkCreateWorkflow = async ({ + input, +}: { + input: { + context: SystemIOContext + files: RequestedKCLFile[] + rootContext: AppMachineContext + override?: boolean + } +}) => { + const configuration = await readAppSettingsFile() + for (let fileIndex = 0; fileIndex < input.files.length; fileIndex++) { + const file = input.files[fileIndex] + const requestedProjectName = file.requestedProjectName + const requestedFileName = file.requestedFileName + const requestedCode = file.requestedCode + const folders = input.context.folders + + let newProjectName = requestedProjectName + + if (!newProjectName) { + newProjectName = getUniqueProjectName( + input.context.defaultProjectFolderName, + input.context.folders + ) + } + + const needsInterpolated = doesProjectNameNeedInterpolated(newProjectName) + if (needsInterpolated) { + const nextIndex = getNextProjectIndex(newProjectName, folders) + newProjectName = interpolateProjectNameWithIndex( + newProjectName, + nextIndex + ) + } + + const baseDir = window.electron.join( + input.context.projectDirectoryPath, + newProjectName + ) + // If override is true, use the requested filename directly + const fileName = input.override + ? requestedFileName + : getNextFileName({ + entryName: requestedFileName, + baseDir, + }).name + + // Create the project around the file if newProject + await createNewProjectDirectory( + newProjectName, + requestedCode, + configuration, + fileName + ) + } + return { + message: 'Batch create success', + fileName: '', + projectName: '', + } +} + export const systemIOMachineDesktop = systemIOMachine.provide({ actors: { [SystemIOMachineActors.readFoldersFromProjectDirectory]: fromPromise( @@ -158,7 +224,6 @@ export const systemIOMachineDesktop = systemIOMachine.provide({ requestedFileName: string requestedCode: string rootContext: AppMachineContext - requestedSubRoute?: string } }) => { const requestedProjectName = input.requestedProjectName @@ -207,7 +272,6 @@ export const systemIOMachineDesktop = systemIOMachine.provide({ message: 'File created successfully', fileName: newFileName, projectName: newProjectName, - subRoute: input.requestedSubRoute || '', } } ), @@ -253,5 +317,40 @@ export const systemIOMachineDesktop = systemIOMachine.provide({ } } ), + [SystemIOMachineActors.bulkCreateKCLFiles]: fromPromise( + async ({ + input, + }: { + input: { + context: SystemIOContext + files: RequestedKCLFile[] + rootContext: AppMachineContext + } + }) => { + return await sharedBulkCreateWorkflow({ input }) + } + ), + [SystemIOMachineActors.bulkCreateKCLFilesAndNavigateToProject]: fromPromise( + async ({ + input, + }: { + input: { + context: SystemIOContext + files: RequestedKCLFile[] + rootContext: AppMachineContext + requestedProjectName: string + override?: boolean + } + }) => { + const message = await sharedBulkCreateWorkflow({ + input: { + ...input, + override: input.override, + }, + }) + message.projectName = input.requestedProjectName + return message + } + ), }, }) diff --git a/src/machines/systemIO/systemIOMachineWeb.ts b/src/machines/systemIO/systemIOMachineWeb.ts index 67034695e..cac7ef9ad 100644 --- a/src/machines/systemIO/systemIOMachineWeb.ts +++ b/src/machines/systemIO/systemIOMachineWeb.ts @@ -20,7 +20,6 @@ export const systemIOMachineWeb = systemIOMachine.provide({ requestedFileName: string requestedCode: string rootContext: AppMachineContext - requestedSubRoute?: string } }) => { // Browser version doesn't navigate, just overwrites the current file @@ -44,7 +43,6 @@ export const systemIOMachineWeb = systemIOMachine.provide({ message: 'File overwritten successfully', fileName: input.requestedFileName, projectName: '', - subRoute: input.requestedSubRoute || '', } } ), diff --git a/src/machines/systemIO/utils.ts b/src/machines/systemIO/utils.ts index a07605d6e..29e2813c1 100644 --- a/src/machines/systemIO/utils.ts +++ b/src/machines/systemIO/utils.ts @@ -8,9 +8,10 @@ export enum SystemIOMachineActors { deleteProject = 'delete project', createKCLFile = 'create kcl file', checkReadWrite = 'check read write', - /** TODO: rename this event to be more generic, like `createKCLFileAndNavigate` */ importFileFromURL = 'import file from URL', deleteKCLFile = 'delete kcl delete', + bulkCreateKCLFiles = 'bulk create kcl files', + bulkCreateKCLFilesAndNavigateToProject = 'bulk create kcl files and navigate to project', } export enum SystemIOMachineStates { @@ -22,9 +23,10 @@ export enum SystemIOMachineStates { deletingProject = 'deletingProject', creatingKCLFile = 'creatingKCLFile', checkingReadWrite = 'checkingReadWrite', - /** TODO: rename this event to be more generic, like `createKCLFileAndNavigate` */ importFileFromURL = 'importFileFromURL', deletingKCLFile = 'deletingKCLFile', + bulkCreatingKCLFiles = 'bulkCreatingKCLFiles', + bulkCreatingKCLFilesAndNavigateToProject = 'bulkCreatingKCLFilesAndNavigateToProject', } const donePrefix = 'xstate.done.actor.' @@ -43,11 +45,12 @@ export enum SystemIOMachineEvents { createKCLFile = 'create kcl file', setDefaultProjectFolderName = 'set default project folder name', done_checkReadWrite = donePrefix + 'check read write', - /** TODO: rename this event to be more generic, like `createKCLFileAndNavigate` */ importFileFromURL = 'import file from URL', done_importFileFromURL = donePrefix + 'import file from URL', generateTextToCAD = 'generate text to CAD', deleteKCLFile = 'delete kcl file', + bulkCreateKCLFiles = 'bulk create kcl files', + bulkCreateKCLFilesAndNavigateToProject = 'bulk create kcl files and navigate to project', } export enum SystemIOMachineActions { @@ -77,7 +80,7 @@ export type SystemIOContext = { * this is required to prevent chokidar from spamming invalid events during initialization. */ hasListedProjects: boolean requestedProjectName: { name: string } - requestedFileName: { project: string; file: string; subRoute?: string } + requestedFileName: { project: string; file: string } canReadWriteProjectDirectory: { value: boolean; error: unknown } clearURLParams: { value: boolean } requestedTextToCadGeneration: { @@ -89,3 +92,12 @@ export type SystemIOContext = { project: string } } + +export type RequestedKCLFile = { + requestedProjectName: string + requestedFileName: string + requestedCode: string +} + +// Custom event for navigation completion +export const NAVIGATION_COMPLETE_EVENT = 'navigation-complete' diff --git a/src/menu/channels.ts b/src/menu/channels.ts index 6312fa8db..f9ba9f5d8 100644 --- a/src/menu/channels.ts +++ b/src/menu/channels.ts @@ -6,7 +6,7 @@ import type { Channel } from '@src/channels' export type MenuLabels = | 'Help.Command Palette...' | 'Help.Report a bug' - | 'Help.Replay onboarding tutorial' + | 'Help.Reset onboarding' | 'Edit.Rename project' | 'Edit.Delete project' | 'Edit.Change project directory' diff --git a/src/menu/helpRole.ts b/src/menu/helpRole.ts index b6941994a..de7a1c1af 100644 --- a/src/menu/helpRole.ts +++ b/src/menu/helpRole.ts @@ -84,11 +84,11 @@ export const helpRole = ( }, { type: 'separator' }, { - id: 'Help.Replay onboarding tutorial', - label: 'Replay onboarding tutorial', + id: 'Help.Reset onboarding', + label: 'Reset onboarding', click: () => { typeSafeWebContentsSend(mainWindow, 'menu-action-clicked', { - menuLabel: 'Help.Replay onboarding tutorial', + menuLabel: 'Help.Reset onboarding', }) }, }, diff --git a/src/menu/roles.ts b/src/menu/roles.ts index 5ead00a0f..8b51ad1da 100644 --- a/src/menu/roles.ts +++ b/src/menu/roles.ts @@ -45,7 +45,7 @@ type HelpRoleLabel = | 'Ask the community discourse' | 'KCL code samples' | 'KCL docs' - | 'Replay onboarding tutorial' + | 'Reset onboarding' | 'Show release notes' | 'Manage account' | 'Get started with Text-to-CAD' diff --git a/src/routes/Home.tsx b/src/routes/Home.tsx index aed35b0b8..475c05ed0 100644 --- a/src/routes/Home.tsx +++ b/src/routes/Home.tsx @@ -1,13 +1,8 @@ import type { FormEvent, HTMLProps } from 'react' -import { useEffect, useRef } from 'react' +import { useEffect } from 'react' import { toast } from 'react-hot-toast' import { useHotkeys } from 'react-hotkeys-hook' -import { - Link, - useLocation, - useNavigate, - useSearchParams, -} from 'react-router-dom' +import { Link, useNavigate, useSearchParams } from 'react-router-dom' import { ActionButton } from '@src/components/ActionButton' import { AppHeader } from '@src/components/AppHeader' @@ -24,7 +19,7 @@ import { isDesktop } from '@src/lib/isDesktop' import { PATHS } from '@src/lib/paths' import { markOnce } from '@src/lib/performance' import type { Project } from '@src/lib/project' -import { codeManager, kclManager } from '@src/lib/singletons' +import { kclManager } from '@src/lib/singletons' import { getNextSearchParams, getSortFunction, @@ -44,12 +39,6 @@ import { } from '@src/machines/systemIO/utils' import type { WebContentSendPayload } from '@src/menu/channels' import { openExternalBrowserIfDesktop } from '@src/lib/openWindow' -import { - acceptOnboarding, - needsToOnboard, - onDismissOnboardingInvite, -} from '@src/routes/Onboarding/utils' -import Tooltip from '@src/components/Tooltip' type ReadWriteProjectState = { value: boolean @@ -80,10 +69,8 @@ const Home = () => { }) }) - const location = useLocation() const navigate = useNavigate() const settings = useSettings() - const onboardingStatus = settings.app.onboardingStatus.current // Menu listeners const cb = (data: WebContentSendPayload) => { @@ -195,7 +182,6 @@ const Home = () => { splitKey: '|', } ) - const ref = useRef(null) const projects = useFolders() const [searchParams, setSearchParams] = useSearchParams() const { searchResults, query, setQuery } = useProjectSearch(projects) @@ -204,9 +190,9 @@ const Home = () => { 'flex items-center p-2 gap-2 leading-tight border-transparent dark:border-transparent enabled:dark:border-transparent enabled:hover:border-primary/50 enabled:dark:hover:border-inherit active:border-primary dark:bg-transparent hover:bg-transparent' return ( -
+
-
+
{ readWriteProjectDir={readWriteProjectDir} className="col-start-2 -col-end-1" /> -
) @@ -399,53 +349,55 @@ function HomeHeader({ return (
-
+

Projects

-
+
- Sort by - setSearchParams(getNextSearchParams(sort, 'name'))} - iconStart={{ - icon: getSortIcon(sort, 'name'), - bgClassName: 'bg-transparent', - iconClassName: !sort.includes('name') - ? '!text-chalkboard-90 dark:!text-chalkboard-30' - : '', - }} - > - Name - - - setSearchParams(getNextSearchParams(sort, 'modified')) - } - iconStart={{ - icon: sort ? getSortIcon(sort, 'modified') : 'arrowDown', - bgClassName: 'bg-transparent', - iconClassName: !isSortByModified - ? '!text-chalkboard-90 dark:!text-chalkboard-30' - : '', - }} - > - Last Modified - +
+ Sort by + setSearchParams(getNextSearchParams(sort, 'name'))} + iconStart={{ + icon: getSortIcon(sort, 'name'), + bgClassName: 'bg-transparent', + iconClassName: !sort.includes('name') + ? '!text-chalkboard-90 dark:!text-chalkboard-30' + : '', + }} + > + Name + + + setSearchParams(getNextSearchParams(sort, 'modified')) + } + iconStart={{ + icon: sort ? getSortIcon(sort, 'modified') : 'arrowDown', + bgClassName: 'bg-transparent', + iconClassName: !isSortByModified + ? '!text-chalkboard-90 dark:!text-chalkboard-30' + : '', + }} + > + Last Modified + +

@@ -502,7 +454,7 @@ function ProjectGrid({ ) : ( <> {searchResults.length > 0 ? ( -

    +
      {searchResults.sort(getSortFunction(sort)).map((project) => ( ) : (

      - No Projects found + No projects found {projects.length === 0 ? ', ready to make your first one?' : ` with the search term "${query}"`} diff --git a/src/routes/Onboarding/Camera.tsx b/src/routes/Onboarding/Camera.tsx index 199e26bed..211cd8e7b 100644 --- a/src/routes/Onboarding/Camera.tsx +++ b/src/routes/Onboarding/Camera.tsx @@ -1,11 +1,18 @@ import { SettingsSection } from '@src/components/Settings/SettingsSection' import type { CameraSystem } from '@src/lib/cameraControls' import { cameraMouseDragGuards, cameraSystems } from '@src/lib/cameraControls' -import { ONBOARDING_SUBPATHS } from '@src/lib/onboardingPaths' import { settingsActor, useSettings } from '@src/lib/singletons' -import { OnboardingButtons } from '@src/routes/Onboarding/utils' +import { onboardingPaths } from '@src/routes/Onboarding/paths' + +import { + OnboardingButtons, + useDismiss, + useNextClick, +} from '@src/routes/Onboarding/utils' export default function Units() { + useDismiss() + useNextClick(onboardingPaths.STREAMING) const { modeling: { mouseControls }, } = useSettings() @@ -59,7 +66,7 @@ export default function Units() {

diff --git a/src/routes/Onboarding/CmdK.tsx b/src/routes/Onboarding/CmdK.tsx index 161f29742..7dc2e4e2c 100644 --- a/src/routes/Onboarding/CmdK.tsx +++ b/src/routes/Onboarding/CmdK.tsx @@ -1,7 +1,8 @@ import { COMMAND_PALETTE_HOTKEY } from '@src/components/CommandBar/CommandBar' import usePlatform from '@src/hooks/usePlatform' import { hotkeyDisplay } from '@src/lib/hotkeyWrapper' -import { ONBOARDING_SUBPATHS } from '@src/lib/onboardingPaths' +import { onboardingPaths } from '@src/routes/Onboarding/paths' + import { OnboardingButtons, kbdClasses } from '@src/routes/Onboarding/utils' export default function CmdK() { @@ -36,7 +37,7 @@ export default function CmdK() { . You can control settings, authentication, and file management from the command bar, as well as a growing number of modeling commands.

- +
) diff --git a/src/routes/Onboarding/CodeEditor.tsx b/src/routes/Onboarding/CodeEditor.tsx index 597885016..e0e4e47fb 100644 --- a/src/routes/Onboarding/CodeEditor.tsx +++ b/src/routes/Onboarding/CodeEditor.tsx @@ -1,4 +1,5 @@ -import { ONBOARDING_SUBPATHS } from '@src/lib/onboardingPaths' +import { onboardingPaths } from '@src/routes/Onboarding/paths' + import { OnboardingButtons, kbdClasses, @@ -69,7 +70,7 @@ export default function OnboardingCodeEditor() { pressing Shift + C.

- +
) diff --git a/src/routes/Onboarding/Export.tsx b/src/routes/Onboarding/Export.tsx index a7274c06f..5d14b4d87 100644 --- a/src/routes/Onboarding/Export.tsx +++ b/src/routes/Onboarding/Export.tsx @@ -1,5 +1,6 @@ import { APP_NAME } from '@src/lib/constants' -import { ONBOARDING_SUBPATHS } from '@src/lib/onboardingPaths' +import { onboardingPaths } from '@src/routes/Onboarding/paths' + import { OnboardingButtons } from '@src/routes/Onboarding/utils' export default function Export() { @@ -49,7 +50,7 @@ export default function Export() { !

- +
) diff --git a/src/routes/Onboarding/FutureWork.tsx b/src/routes/Onboarding/FutureWork.tsx index 0fbd75855..fa2756adf 100644 --- a/src/routes/Onboarding/FutureWork.tsx +++ b/src/routes/Onboarding/FutureWork.tsx @@ -1,9 +1,11 @@ import { useEffect } from 'react' + import { useModelingContext } from '@src/hooks/useModelingContext' import { APP_NAME } from '@src/lib/constants' import { sceneInfra } from '@src/lib/singletons' +import { onboardingPaths } from '@src/routes/Onboarding/paths' + import { OnboardingButtons, useDemoCode } from '@src/routes/Onboarding/utils' -import { ONBOARDING_SUBPATHS } from '@src/lib/onboardingPaths' export default function FutureWork() { const { send } = useModelingContext() @@ -56,7 +58,7 @@ export default function FutureWork() {

💚 The Zoo Team

diff --git a/src/routes/Onboarding/InteractiveNumbers.tsx b/src/routes/Onboarding/InteractiveNumbers.tsx index a6b336ac2..d5217f085 100644 --- a/src/routes/Onboarding/InteractiveNumbers.tsx +++ b/src/routes/Onboarding/InteractiveNumbers.tsx @@ -1,5 +1,6 @@ import { bracketWidthConstantLine } from '@src/lib/exampleKcl' -import { ONBOARDING_SUBPATHS } from '@src/lib/onboardingPaths' +import { onboardingPaths } from '@src/routes/Onboarding/paths' + import { OnboardingButtons, kbdClasses, @@ -84,9 +85,7 @@ export default function OnboardingInteractiveNumbers() { your ideas for how to make it better.

- + ) diff --git a/src/routes/Onboarding/Introduction.tsx b/src/routes/Onboarding/Introduction.tsx index e89d7bf43..ceb0eeb17 100644 --- a/src/routes/Onboarding/Introduction.tsx +++ b/src/routes/Onboarding/Introduction.tsx @@ -1,11 +1,124 @@ -import { APP_NAME } from '@src/lib/constants' -import { isDesktop } from '@src/lib/isDesktop' -import { Themes, getSystemTheme } from '@src/lib/theme' -import { useSettings } from '@src/lib/singletons' -import { OnboardingButtons, useDemoCode } from '@src/routes/Onboarding/utils' -import { ONBOARDING_SUBPATHS } from '@src/lib/onboardingPaths' +import { useEffect, useState } from 'react' +import { useNavigate, useRouteLoaderData } from 'react-router-dom' -export default function Introduction() { +import { useLspContext } from '@src/components/LspProvider' +import { useFileContext } from '@src/hooks/useFileContext' +import { isKclEmptyOrOnlySettings } from '@src/lang/wasm' +import { APP_NAME } from '@src/lib/constants' +import { createAndOpenNewTutorialProject } from '@src/lib/desktopFS' +import { bracket } from '@src/lib/exampleKcl' +import { isDesktop } from '@src/lib/isDesktop' +import { PATHS } from '@src/lib/paths' +import { codeManager, kclManager } from '@src/lib/singletons' +import { Themes, getSystemTheme } from '@src/lib/theme' +import { reportRejection } from '@src/lib/trap' +import type { IndexLoaderData } from '@src/lib/types' +import { useSettings } from '@src/lib/singletons' +import { onboardingPaths } from '@src/routes/Onboarding/paths' + +import { OnboardingButtons, useDemoCode } from '@src/routes/Onboarding/utils' + +/** + * Show either a welcome screen or a warning screen + * depending on if the user has code in the editor. + */ +export default function OnboardingIntroduction() { + const [shouldShowWarning, setShouldShowWarning] = useState( + !isKclEmptyOrOnlySettings(codeManager.code) && codeManager.code !== bracket + ) + + return shouldShowWarning ? ( + + ) : ( + + ) +} + +interface OnboardingResetWarningProps { + setShouldShowWarning: (arg: boolean) => void +} + +function OnboardingResetWarning(props: OnboardingResetWarningProps) { + return ( +
+
+ {!isDesktop() ? ( + + ) : ( + + )} +
+
+ ) +} + +function OnboardingWarningDesktop(props: OnboardingResetWarningProps) { + const navigate = useNavigate() + const loaderData = useRouteLoaderData(PATHS.FILE) as IndexLoaderData + const { context: fileContext } = useFileContext() + const { onProjectClose, onProjectOpen } = useLspContext() + + async function onAccept() { + onProjectClose( + loaderData.file || null, + fileContext.project.path || null, + false + ) + await createAndOpenNewTutorialProject({ onProjectOpen, navigate }) + props.setShouldShowWarning(false) + } + + return ( + <> +

+ Would you like to create a new project? +

+
+

+ You have some content in this project that we don't want to overwrite. + If you would like to create a new project, please click the button + below. +

+
+ { + onAccept().catch(reportRejection) + }} + /> + + ) +} + +function OnboardingWarningWeb(props: OnboardingResetWarningProps) { + useEffect(() => { + async function beforeNavigate() { + // We do want to update both the state and editor here. + codeManager.updateCodeStateEditor(bracket) + await codeManager.writeToFile() + + await kclManager.executeCode() + props.setShouldShowWarning(false) + } + return () => { + beforeNavigate().catch(reportRejection) + } + }, []) + return ( + <> +

+ Replaying onboarding resets your code +

+

+ We see you have some of your own code written in this project. Please + save it somewhere else before continuing the onboarding. +

+ + + ) +} + +function OnboardingIntroductionInner() { // Reset the code to the bracket code useDemoCode() @@ -69,7 +182,7 @@ export default function Introduction() {

diff --git a/src/routes/Onboarding/ParametricModeling.tsx b/src/routes/Onboarding/ParametricModeling.tsx index 189d00449..a3fb6fa24 100644 --- a/src/routes/Onboarding/ParametricModeling.tsx +++ b/src/routes/Onboarding/ParametricModeling.tsx @@ -2,8 +2,9 @@ import { bracketThicknessCalculationLine } from '@src/lib/exampleKcl' import { isDesktop } from '@src/lib/isDesktop' import { Themes, getSystemTheme } from '@src/lib/theme' import { useSettings } from '@src/lib/singletons' +import { onboardingPaths } from '@src/routes/Onboarding/paths' + import { OnboardingButtons, useDemoCode } from '@src/routes/Onboarding/utils' -import { ONBOARDING_SUBPATHS } from '@src/lib/onboardingPaths' export default function OnboardingParametricModeling() { useDemoCode() @@ -71,9 +72,7 @@ export default function OnboardingParametricModeling() { - + ) diff --git a/src/routes/Onboarding/ProjectMenu.tsx b/src/routes/Onboarding/ProjectMenu.tsx index 6e73d9a79..b8f3ee3d4 100644 --- a/src/routes/Onboarding/ProjectMenu.tsx +++ b/src/routes/Onboarding/ProjectMenu.tsx @@ -1,5 +1,6 @@ import { isDesktop } from '@src/lib/isDesktop' -import { ONBOARDING_SUBPATHS } from '@src/lib/onboardingPaths' +import { onboardingPaths } from '@src/routes/Onboarding/paths' + import { OnboardingButtons } from '@src/routes/Onboarding/utils' export default function ProjectMenu() { @@ -55,7 +56,7 @@ export default function ProjectMenu() { )} - + ) diff --git a/src/routes/Onboarding/Sketching.tsx b/src/routes/Onboarding/Sketching.tsx index 652557048..e24c76c1a 100644 --- a/src/routes/Onboarding/Sketching.tsx +++ b/src/routes/Onboarding/Sketching.tsx @@ -1,7 +1,9 @@ import { useEffect } from 'react' + import { codeManager, kclManager } from '@src/lib/singletons' +import { onboardingPaths } from '@src/routes/Onboarding/paths' + import { OnboardingButtons } from '@src/routes/Onboarding/utils' -import { ONBOARDING_SUBPATHS } from '@src/lib/onboardingPaths' export default function Sketching() { useEffect(() => { @@ -40,7 +42,7 @@ export default function Sketching() { always just modifying and generating code in Zoo Design Studio.

diff --git a/src/routes/Onboarding/Streaming.tsx b/src/routes/Onboarding/Streaming.tsx index 1583ad922..ef052be59 100644 --- a/src/routes/Onboarding/Streaming.tsx +++ b/src/routes/Onboarding/Streaming.tsx @@ -1,4 +1,5 @@ -import { ONBOARDING_SUBPATHS } from '@src/lib/onboardingPaths' +import { onboardingPaths } from '@src/routes/Onboarding/paths' + import { OnboardingButtons } from '@src/routes/Onboarding/utils' export default function Streaming() { @@ -40,7 +41,7 @@ export default function Streaming() {

diff --git a/src/routes/Onboarding/Units.tsx b/src/routes/Onboarding/Units.tsx index b56a1cde6..cbccf8e17 100644 --- a/src/routes/Onboarding/Units.tsx +++ b/src/routes/Onboarding/Units.tsx @@ -4,12 +4,13 @@ import { ActionButton } from '@src/components/ActionButton' import { SettingsSection } from '@src/components/Settings/SettingsSection' import { type BaseUnit, baseUnitsUnion } from '@src/lib/settings/settingsTypes' import { settingsActor, useSettings } from '@src/lib/singletons' -import { ONBOARDING_SUBPATHS } from '@src/lib/onboardingPaths' +import { onboardingPaths } from '@src/routes/Onboarding/paths' + import { useDismiss, useNextClick } from '@src/routes/Onboarding/utils' export default function Units() { const dismiss = useDismiss() - const next = useNextClick(ONBOARDING_SUBPATHS.CAMERA) + const next = useNextClick(onboardingPaths.CAMERA) const { modeling: { defaultUnit }, } = useSettings() diff --git a/src/routes/Onboarding/UserMenu.tsx b/src/routes/Onboarding/UserMenu.tsx index 533479349..e3e03fee9 100644 --- a/src/routes/Onboarding/UserMenu.tsx +++ b/src/routes/Onboarding/UserMenu.tsx @@ -1,7 +1,9 @@ import { useEffect, useState } from 'react' + import { useUser } from '@src/lib/singletons' +import { onboardingPaths } from '@src/routes/Onboarding/paths' + import { OnboardingButtons } from '@src/routes/Onboarding/utils' -import { ONBOARDING_SUBPATHS } from '@src/lib/onboardingPaths' export default function UserMenu() { const user = useUser() @@ -46,7 +48,7 @@ export default function UserMenu() { only apply to the current project.

- + ) diff --git a/src/routes/Onboarding/index.tsx b/src/routes/Onboarding/index.tsx index dbf7be278..1652d70ac 100644 --- a/src/routes/Onboarding/index.tsx +++ b/src/routes/Onboarding/index.tsx @@ -14,8 +14,8 @@ import ProjectMenu from '@src/routes/Onboarding/ProjectMenu' import Sketching from '@src/routes/Onboarding/Sketching' import Streaming from '@src/routes/Onboarding/Streaming' import UserMenu from '@src/routes/Onboarding/UserMenu' +import { onboardingPaths } from '@src/routes/Onboarding/paths' import { useDismiss } from '@src/routes/Onboarding/utils' -import { ONBOARDING_SUBPATHS } from '@src/lib/onboardingPaths' export const onboardingRoutes = [ { @@ -23,48 +23,48 @@ export const onboardingRoutes = [ element: , }, { - path: makeUrlPathRelative(ONBOARDING_SUBPATHS.CAMERA), + path: makeUrlPathRelative(onboardingPaths.CAMERA), element: , }, { - path: makeUrlPathRelative(ONBOARDING_SUBPATHS.STREAMING), + path: makeUrlPathRelative(onboardingPaths.STREAMING), element: , }, { - path: makeUrlPathRelative(ONBOARDING_SUBPATHS.EDITOR), + path: makeUrlPathRelative(onboardingPaths.EDITOR), element: , }, { - path: makeUrlPathRelative(ONBOARDING_SUBPATHS.PARAMETRIC_MODELING), + path: makeUrlPathRelative(onboardingPaths.PARAMETRIC_MODELING), element: , }, { - path: makeUrlPathRelative(ONBOARDING_SUBPATHS.INTERACTIVE_NUMBERS), + path: makeUrlPathRelative(onboardingPaths.INTERACTIVE_NUMBERS), element: , }, { - path: makeUrlPathRelative(ONBOARDING_SUBPATHS.COMMAND_K), + path: makeUrlPathRelative(onboardingPaths.COMMAND_K), element: , }, { - path: makeUrlPathRelative(ONBOARDING_SUBPATHS.USER_MENU), + path: makeUrlPathRelative(onboardingPaths.USER_MENU), element: , }, { - path: makeUrlPathRelative(ONBOARDING_SUBPATHS.PROJECT_MENU), + path: makeUrlPathRelative(onboardingPaths.PROJECT_MENU), element: , }, { - path: makeUrlPathRelative(ONBOARDING_SUBPATHS.EXPORT), + path: makeUrlPathRelative(onboardingPaths.EXPORT), element: , }, // Export / conversion API { - path: makeUrlPathRelative(ONBOARDING_SUBPATHS.SKETCHING), + path: makeUrlPathRelative(onboardingPaths.SKETCHING), element: , }, { - path: makeUrlPathRelative(ONBOARDING_SUBPATHS.FUTURE_WORK), + path: makeUrlPathRelative(onboardingPaths.FUTURE_WORK), element: , }, ] diff --git a/src/lib/onboardingPaths.ts b/src/routes/Onboarding/paths.ts similarity index 83% rename from src/lib/onboardingPaths.ts rename to src/routes/Onboarding/paths.ts index 95abdb1ca..f8a069331 100644 --- a/src/lib/onboardingPaths.ts +++ b/src/routes/Onboarding/paths.ts @@ -1,6 +1,6 @@ import type { OnboardingStatus } from '@rust/kcl-lib/bindings/OnboardingStatus' -export const ONBOARDING_SUBPATHS: Record = { +export const onboardingPaths: Record = { INDEX: '/', CAMERA: '/camera', STREAMING: '/streaming', @@ -11,6 +11,7 @@ export const ONBOARDING_SUBPATHS: Record = { USER_MENU: '/user-menu', PROJECT_MENU: '/project-menu', EXPORT: '/export', + MOVE: '/move', SKETCHING: '/sketching', FUTURE_WORK: '/future-work', } as const diff --git a/src/routes/Onboarding/utils.tsx b/src/routes/Onboarding/utils.tsx index 5a72b4716..30309ad87 100644 --- a/src/routes/Onboarding/utils.tsx +++ b/src/routes/Onboarding/utils.tsx @@ -1,9 +1,5 @@ import { useCallback, useEffect } from 'react' -import { - type NavigateFunction, - type useLocation, - useNavigate, -} from 'react-router-dom' +import { useNavigate } from 'react-router-dom' import { waitFor } from 'xstate' import { ActionButton } from '@src/components/ActionButton' @@ -15,39 +11,30 @@ import { NetworkHealthState } from '@src/hooks/useNetworkStatus' import { EngineConnectionStateType } from '@src/lang/std/engineConnection' import { bracket } from '@src/lib/exampleKcl' import makeUrlPathRelative from '@src/lib/makeUrlPathRelative' -import { joinRouterPaths, PATHS } from '@src/lib/paths' -import { - codeManager, - editorManager, - kclManager, - systemIOActor, -} from '@src/lib/singletons' +import { PATHS } from '@src/lib/paths' +import { codeManager, editorManager, kclManager } from '@src/lib/singletons' import { reportRejection, trap } from '@src/lib/trap' import { settingsActor } from '@src/lib/singletons' -import { isKclEmptyOrOnlySettings, parse, resultIsOk } from '@src/lang/wasm' +import { onboardingRoutes } from '@src/routes/Onboarding' +import { onboardingPaths } from '@src/routes/Onboarding/paths' +import { parse, resultIsOk } from '@src/lang/wasm' import { updateModelingState } from '@src/lang/modelingWorkflows' -import { - DEFAULT_PROJECT_KCL_FILE, - EXECUTION_TYPE_REAL, - ONBOARDING_PROJECT_NAME, -} from '@src/lib/constants' -import toast from 'react-hot-toast' -import type CodeManager from '@src/lang/codeManager' -import type { OnboardingStatus } from '@rust/kcl-lib/bindings/OnboardingStatus' -import { isDesktop } from '@src/lib/isDesktop' -import type { KclManager } from '@src/lang/KclSingleton' -import { Logo } from '@src/components/Logo' -import { SystemIOMachineEvents } from '@src/machines/systemIO/utils' -import { ONBOARDING_SUBPATHS } from '@src/lib/onboardingPaths' +import { EXECUTION_TYPE_REAL } from '@src/lib/constants' export const kbdClasses = 'py-0.5 px-1 text-sm rounded bg-chalkboard-10 dark:bg-chalkboard-100 border border-chalkboard-50 border-b-2' // Get the 1-indexed step number of the current onboarding step function useStepNumber( - slug?: (typeof ONBOARDING_SUBPATHS)[keyof typeof ONBOARDING_SUBPATHS] + slug?: (typeof onboardingPaths)[keyof typeof onboardingPaths] ) { - return slug ? Object.values(ONBOARDING_SUBPATHS).indexOf(slug) + 1 : -1 + return slug + ? slug === onboardingPaths.INDEX + ? 1 + : onboardingRoutes.findIndex( + (r) => r.path === makeUrlPathRelative(slug) + ) + 1 + : 1 } export function useDemoCode() { @@ -93,7 +80,7 @@ export function useNextClick(newStatus: string) { data: { level: 'user', value: newStatus }, }) navigate(filePath + PATHS.ONBOARDING.INDEX.slice(0, -1) + newStatus) - }, [filePath, newStatus, navigate]) + }, [filePath, newStatus, settingsActor.send, navigate]) } export function useDismiss() { @@ -107,17 +94,9 @@ export function useDismiss() { data: { level: 'user', value: 'dismissed' }, }) waitFor(settingsActor, (state) => state.matches('idle')) - .then(() => { - navigate(filePath) - toast.success( - 'Click the question mark in the lower-right corner if you ever want to redo the tutorial!', - { - duration: 5_000, - } - ) - }) + .then(() => navigate(filePath)) .catch(reportRejection) - }, [send, filePath, navigate]) + }, [send]) return settingsCallback } @@ -128,31 +107,32 @@ export function OnboardingButtons({ onNextOverride, ...props }: { - currentSlug?: (typeof ONBOARDING_SUBPATHS)[keyof typeof ONBOARDING_SUBPATHS] + currentSlug?: (typeof onboardingPaths)[keyof typeof onboardingPaths] className?: string dismissClassName?: string onNextOverride?: () => void } & React.HTMLAttributes) { - const onboardingPathsArray = Object.values(ONBOARDING_SUBPATHS) const dismiss = useDismiss() const stepNumber = useStepNumber(currentSlug) const previousStep = - !stepNumber || stepNumber <= 1 ? null : onboardingPathsArray[stepNumber] - const goToPrevious = useNextClick(previousStep ?? ONBOARDING_SUBPATHS.INDEX) + !stepNumber || stepNumber === 0 ? null : onboardingRoutes[stepNumber - 2] + const goToPrevious = useNextClick( + onboardingPaths.INDEX + (previousStep?.path ?? '') + ) const nextStep = - !stepNumber || stepNumber === onboardingPathsArray.length + !stepNumber || stepNumber === onboardingRoutes.length ? null - : onboardingPathsArray[stepNumber] - const goToNext = useNextClick(nextStep + ONBOARDING_SUBPATHS.INDEX) + : onboardingRoutes[stepNumber] + const goToNext = useNextClick(onboardingPaths.INDEX + (nextStep?.path ?? '')) return ( <>
(previousStep ? goToPrevious() : dismiss())} + onClick={() => + previousStep?.path || previousStep?.index + ? goToPrevious() + : dismiss() + } iconStart={{ icon: previousStep ? 'arrowLeft' : 'close', className: 'text-chalkboard-10', @@ -178,18 +162,18 @@ export function OnboardingButtons({ className="hover:border-destroy-40 hover:bg-destroy-10/50 dark:hover:bg-destroy-80/50" data-testid="onboarding-prev" > - {previousStep ? 'Back' : 'Dismiss'} + {previousStep ? `Back` : 'Dismiss'} {stepNumber !== undefined && (

- {stepNumber} / {onboardingPathsArray.length} + {stepNumber} / {onboardingRoutes.length}

)} { - if (nextStep) { + if (nextStep?.path) { onNextOverride ? onNextOverride() : goToNext() } else { dismiss() @@ -202,221 +186,9 @@ export function OnboardingButtons({ className="dark:hover:bg-chalkboard-80/50" data-testid="onboarding-next" > - {nextStep ? 'Next' : 'Finish'} + {nextStep ? `Next` : 'Finish'}
) } - -export interface OnboardingUtilDeps { - onboardingStatus: OnboardingStatus - codeManager: CodeManager - kclManager: KclManager - navigate: NavigateFunction -} - -export const ERROR_MUST_WARN = 'Must warn user before overwrite' - -/** - * Accept to begin the onboarding tutorial, - * depending on the platform and the state of the user's code. - */ -export async function acceptOnboarding(deps: OnboardingUtilDeps) { - if (isDesktop()) { - /** TODO: rename this event to be more generic, like `createKCLFileAndNavigate` */ - systemIOActor.send({ - type: SystemIOMachineEvents.importFileFromURL, - data: { - requestedProjectName: ONBOARDING_PROJECT_NAME, - requestedFileName: DEFAULT_PROJECT_KCL_FILE, - requestedCode: bracket, - requestedSubRoute: joinRouterPaths( - PATHS.ONBOARDING.INDEX, - deps.onboardingStatus - ), - }, - }) - return Promise.resolve() - } - - const isCodeResettable = hasResetReadyCode(deps.codeManager) - if (isCodeResettable) { - return resetCodeAndAdvanceOnboarding(deps) - } - - return Promise.reject(new Error(ERROR_MUST_WARN)) -} - -/** - * Given that the user has accepted overwriting their web editor, - * advance to the next step and clear their editor. - */ -export async function resetCodeAndAdvanceOnboarding({ - onboardingStatus, - codeManager, - kclManager, - navigate, -}: OnboardingUtilDeps) { - // We do want to update both the state and editor here. - codeManager.updateCodeStateEditor(bracket) - codeManager.writeToFile().catch(reportRejection) - kclManager.executeCode().catch(reportRejection) - // TODO: this is not navigating to the correct `/onboarding/blah` path yet - navigate( - makeUrlPathRelative( - `${PATHS.ONBOARDING.INDEX}${makeUrlPathRelative(onboardingStatus)}` - ) - ) -} - -function hasResetReadyCode(codeManager: CodeManager) { - return ( - isKclEmptyOrOnlySettings(codeManager.code) || codeManager.code === bracket - ) -} - -export function needsToOnboard( - location: ReturnType, - onboardingStatus: OnboardingStatus -) { - return ( - !location.pathname.includes(PATHS.ONBOARDING.INDEX) && - (onboardingStatus.length === 0 || - !(onboardingStatus === 'completed' || onboardingStatus === 'dismissed')) - ) -} - -export const ONBOARDING_TOAST_ID = 'onboarding-toast' - -export function onDismissOnboardingInvite() { - settingsActor.send({ - type: 'set.app.onboardingStatus', - data: { level: 'user', value: 'dismissed' }, - }) - toast.dismiss(ONBOARDING_TOAST_ID) - toast.success( - 'Click the question mark in the lower-right corner if you ever want to do the tutorial!', - { - duration: 5_000, - } - ) -} - -export function TutorialRequestToast(props: OnboardingUtilDeps) { - function onAccept() { - acceptOnboarding(props) - .then(() => { - toast.dismiss(ONBOARDING_TOAST_ID) - }) - .catch((reason) => catchOnboardingWarnError(reason, props)) - } - - return ( -
- -
-
-

Welcome to Zoo Design Studio

-

- Would you like a tutorial to show you around the app? -

-
-
- - Not right now - - - Get started - -
-
-
- ) -} - -/** - * Helper function to catch the `ERROR_MUST_WARN` error from - * `acceptOnboarding` and show a warning toast. - */ -export async function catchOnboardingWarnError( - err: Error, - props: OnboardingUtilDeps -) { - if (err instanceof Error && err.message === ERROR_MUST_WARN) { - toast.success(TutorialWebConfirmationToast(props), { - id: ONBOARDING_TOAST_ID, - duration: Number.POSITIVE_INFINITY, - icon: null, - }) - } else { - toast.dismiss(ONBOARDING_TOAST_ID) - return reportRejection(err) - } -} - -export function TutorialWebConfirmationToast(props: OnboardingUtilDeps) { - function onAccept() { - toast.dismiss(ONBOARDING_TOAST_ID) - resetCodeAndAdvanceOnboarding(props).catch(reportRejection) - } - - return ( -
- -
-
-

The welcome tutorial resets your code in the browser

-

- We see you have some of your own code written in this project. - Please save it somewhere else before continuing the onboarding. -

-
-
- - I'll save it - - - Overwrite and begin - -
-
-
- ) -} diff --git a/src/routes/SignIn.tsx b/src/routes/SignIn.tsx index fd14429ef..67e48f30f 100644 --- a/src/routes/SignIn.tsx +++ b/src/routes/SignIn.tsx @@ -26,9 +26,7 @@ const SignIn = () => { if (isDesktop()) { window.electron.createFallbackMenu().catch(reportRejection) // Disable these since they cannot be accessed within the sign in page. - window.electron - .disableMenu('Help.Replay onboarding tutorial') - .catch(reportRejection) + window.electron.disableMenu('Help.Reset onboarding').catch(reportRejection) window.electron.disableMenu('Help.Show all commands').catch(reportRejection) } diff --git a/src/routes/utils.ts b/src/routes/utils.ts index bd8bcbd9a..441bc164a 100644 --- a/src/routes/utils.ts +++ b/src/routes/utils.ts @@ -1,6 +1,5 @@ import { NODE_ENV } from '@src/env' import { isDesktop } from '@src/lib/isDesktop' - import { IS_PLAYWRIGHT_KEY } from '@src/lib/constants' const isTestEnv = window?.localStorage.getItem(IS_PLAYWRIGHT_KEY) === 'true' diff --git a/vite.config.ts b/vite.config.ts index ba923f83e..ecdbba756 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -6,85 +6,90 @@ import version from 'vite-plugin-package-version' import topLevelAwait from 'vite-plugin-top-level-await' import viteTsconfigPaths from 'vite-tsconfig-paths' import { configDefaults, defineConfig } from 'vitest/config' +import MillionLint from '@million/lint' -const config = defineConfig({ - server: { - open: true, - port: 3000, - watch: { - ignored: [ - '**/target/**', - '**/dist/**', - '**/build/**', - '**/test-results/**', - '**/playwright-report/**', - ], - }, - }, - test: { - globals: true, - pool: 'forks', - poolOptions: { - forks: { - maxForks: 2, - minForks: 1, +export default defineConfig(({ command, mode }) => { + const runMillion = process.env.RUN_MILLION + + return { + server: { + open: true, + port: 3000, + watch: { + ignored: [ + '**/target/**', + '**/dist/**', + '**/build/**', + '**/test-results/**', + '**/playwright-report/**', + ], }, }, - setupFiles: ['src/setupTests.ts', '@vitest/web-worker'], - environment: 'happy-dom', - coverage: { - provider: 'istanbul', // or 'v8' - }, - exclude: [...configDefaults.exclude, '**/e2e/**/*.spec.*', 'rust'], - deps: { - optimizer: { - web: { - include: ['vitest-canvas-mock'], + test: { + globals: true, + pool: 'forks', + poolOptions: { + forks: { + maxForks: 2, + minForks: 1, }, }, + setupFiles: ['src/setupTests.ts', '@vitest/web-worker'], + environment: 'happy-dom', + coverage: { + provider: 'istanbul', // or 'v8' + }, + exclude: [...configDefaults.exclude, '**/e2e/**/*.spec.*', 'rust'], + deps: { + optimizer: { + web: { + include: ['vitest-canvas-mock'], + }, + }, + }, + clearMocks: true, + restoreMocks: true, + mockReset: true, + reporters: process.env.GITHUB_ACTIONS + ? ['dot', 'github-actions'] + : // Gotcha: 'hanging-process' is very noisey, turn off by default on localhost + // : ['verbose', 'hanging-process'], + ['verbose'], + testTimeout: 1000, + hookTimeout: 1000, + teardownTimeout: 1000, }, - clearMocks: true, - restoreMocks: true, - mockReset: true, - reporters: process.env.GITHUB_ACTIONS - ? ['dot', 'github-actions'] - : // Gotcha: 'hanging-process' is very noisey, turn off by default on localhost - // : ['verbose', 'hanging-process'], - ['verbose'], - testTimeout: 1000, - hookTimeout: 1000, - teardownTimeout: 1000, - }, - build: { - outDir: 'build', - }, - resolve: { - alias: { - '@kittycad/codemirror-lsp-client': '/packages/codemirror-lsp-client/src', - '@kittycad/codemirror-lang-kcl': '/packages/codemirror-lang-kcl/src', - '@rust': '/rust', - '@e2e': '/e2e', - '@src': '/src', - '@public': '/public', - '@root': '/', + build: { + outDir: 'build', }, - }, - plugins: [ - react(), - viteTsconfigPaths(), - eslint(), - version(), - lezer(), - topLevelAwait({ - // The export name of top-level await promise for each chunk module - promiseExportName: '__tla', - // The function to generate import names of top-level await promise in each chunk module - promiseImportName: (i) => `__tla_${i}`, - }), - ], - worker: { - plugins: () => [viteTsconfigPaths()], - }, + resolve: { + alias: { + '@kittycad/codemirror-lsp-client': + '/packages/codemirror-lsp-client/src', + '@kittycad/codemirror-lang-kcl': '/packages/codemirror-lang-kcl/src', + '@rust': '/rust', + '@e2e': '/e2e', + '@src': '/src', + '@public': '/public', + '@root': '/', + }, + }, + plugins: [ + react(), + viteTsconfigPaths(), + eslint(), + version(), + lezer(), + topLevelAwait({ + // The export name of top-level await promise for each chunk module + promiseExportName: '__tla', + // The function to generate import names of top-level await promise in each chunk module + promiseImportName: (i) => `__tla_${i}`, + }), + runMillion && MillionLint.vite(), + ], + worker: { + plugins: () => [viteTsconfigPaths()], + }, + } }) - -export default config